Index: /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 74852)
+++ /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 74853)
@@ -339,4 +339,5 @@
 VBOX_GUI_INC_DIRS = \
 	./src \
+	./src/cloud \
 	./src/converter \
 	./src/extensions \
@@ -680,4 +681,6 @@
 #
 VirtualBox_QT_MOCHDRS = \
+	src/cloud/UICloudProfileDetailsWidget.h \
+	src/cloud/UICloudProfileManager.h \
 	src/globals/UIStarter.h \
 	src/hostnetwork/UIHostNetworkDetailsWidget.h \
@@ -1371,4 +1374,6 @@
 VirtualBox_SOURCES = \
 	src/main.cpp \
+	src/cloud/UICloudProfileDetailsWidget.cpp \
+	src/cloud/UICloudProfileManager.cpp \
 	src/globals/UIStarter.cpp \
 	src/hostnetwork/UIHostNetworkDetailsWidget.cpp \
Index: /trunk/src/VBox/Frontends/VirtualBox/src/cloud/UICloudProfileDetailsWidget.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/cloud/UICloudProfileDetailsWidget.cpp	(revision 74853)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/cloud/UICloudProfileDetailsWidget.cpp	(revision 74853)
@@ -0,0 +1,165 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UICloudProfileDetailsWidget class implementation.
+ */
+
+/*
+ * Copyright (C) 2009-2018 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifdef VBOX_WITH_PRECOMPILED_HEADERS
+# include <precomp.h>
+#else  /* !VBOX_WITH_PRECOMPILED_HEADERS */
+
+/* Qt includes: */
+# include <QPushButton>
+# include <QTableWidget>
+# include <QVBoxLayout>
+
+/* GUI includes: */
+# include "QIDialogButtonBox.h"
+# include "UICloudProfileDetailsWidget.h"
+
+/* Other VBox includes: */
+# include "iprt/assert.h"
+
+#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
+
+
+UICloudProfileDetailsWidget::UICloudProfileDetailsWidget(EmbedTo enmEmbedding, QWidget *pParent /* = 0 */)
+    : QIWithRetranslateUI<QWidget>(pParent)
+    , m_enmEmbedding(enmEmbedding)
+    , m_pTableWidget(0)
+    , m_pButtonBox(0)
+{
+    /* Prepare: */
+    prepare();
+}
+
+void UICloudProfileDetailsWidget::setData(const UIDataCloudProfile &data)
+{
+    /* Cache old/new data: */
+    m_oldData = data;
+    m_newData = m_oldData;
+
+    /* Load data: */
+    loadData();
+}
+
+void UICloudProfileDetailsWidget::retranslateUi()
+{
+    /* Translate table-widget: */
+    m_pTableWidget->setToolTip(tr("Contains cloud profile settings"));
+
+    /* Retranslate validation: */
+    retranslateValidation();
+}
+
+void UICloudProfileDetailsWidget::sltTableChanged()
+{
+    /// @todo handle profile settings table change!
+}
+
+void UICloudProfileDetailsWidget::sltHandleButtonBoxClick(QAbstractButton *pButton)
+{
+    /* Make sure button-box exists: */
+    AssertPtrReturnVoid(m_pButtonBox);
+
+    /* Disable buttons first of all: */
+    m_pButtonBox->button(QDialogButtonBox::Cancel)->setEnabled(false);
+    m_pButtonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+
+    /* Compare with known buttons: */
+    if (pButton == m_pButtonBox->button(QDialogButtonBox::Cancel))
+        emit sigDataChangeRejected();
+    else
+    if (pButton == m_pButtonBox->button(QDialogButtonBox::Ok))
+        emit sigDataChangeAccepted();
+}
+
+void UICloudProfileDetailsWidget::prepare()
+{
+    /* Prepare widgets: */
+    prepareWidgets();
+
+    /* Apply language settings: */
+    retranslateUi();
+
+    /* Update button states finally: */
+    updateButtonStates();
+}
+
+void UICloudProfileDetailsWidget::prepareWidgets()
+{
+    /* Create layout: */
+    QVBoxLayout *pLayout = new QVBoxLayout(this);
+    if (pLayout)
+    {
+        /* Configure layout: */
+        pLayout->setContentsMargins(0, 0, 0, 0);
+
+        /* Create tab-widget: */
+        m_pTableWidget = new QTableWidget;
+        if (m_pTableWidget)
+        {
+            /* Add into layout: */
+            pLayout->addWidget(m_pTableWidget);
+        }
+    }
+}
+
+void UICloudProfileDetailsWidget::loadData()
+{
+    /// @todo load profile settings table data!
+}
+
+void UICloudProfileDetailsWidget::revalidate(QWidget *pWidget /* = 0 */)
+{
+    /// @todo validate profile settings table!
+
+    /* Retranslate validation: */
+    retranslateValidation(pWidget);
+}
+
+void UICloudProfileDetailsWidget::retranslateValidation(QWidget *pWidget /* = 0 */)
+{
+    Q_UNUSED(pWidget);
+
+    /// @todo retranslate profile settings vaidation!
+}
+
+void UICloudProfileDetailsWidget::updateButtonStates()
+{
+    /// @todo update that printf as well!
+#if 0
+    if (m_oldData != m_newData)
+        printf("Interface: %s, %s, %s, %s;  DHCP server: %d, %s, %s, %s, %s\n",
+               m_newData.m_interface.m_strAddress.toUtf8().constData(),
+               m_newData.m_interface.m_strMask.toUtf8().constData(),
+               m_newData.m_interface.m_strAddress6.toUtf8().constData(),
+               m_newData.m_interface.m_strPrefixLength6.toUtf8().constData(),
+               (int)m_newData.m_dhcpserver.m_fEnabled,
+               m_newData.m_dhcpserver.m_strAddress.toUtf8().constData(),
+               m_newData.m_dhcpserver.m_strMask.toUtf8().constData(),
+               m_newData.m_dhcpserver.m_strLowerAddress.toUtf8().constData(),
+               m_newData.m_dhcpserver.m_strUpperAddress.toUtf8().constData());
+#endif
+
+    /* Update 'Apply' / 'Reset' button states: */
+    if (m_pButtonBox)
+    {
+        m_pButtonBox->button(QDialogButtonBox::Cancel)->setEnabled(m_oldData != m_newData);
+        m_pButtonBox->button(QDialogButtonBox::Ok)->setEnabled(m_oldData != m_newData);
+    }
+
+    /* Notify listeners as well: */
+    emit sigDataChanged(m_oldData != m_newData);
+}
Index: /trunk/src/VBox/Frontends/VirtualBox/src/cloud/UICloudProfileDetailsWidget.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/cloud/UICloudProfileDetailsWidget.h	(revision 74853)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/cloud/UICloudProfileDetailsWidget.h	(revision 74853)
@@ -0,0 +1,150 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UICloudProfileDetailsWidget class declaration.
+ */
+
+/*
+ * Copyright (C) 2009-2018 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifndef ___UICloudProfileDetailsWidget_h___
+#define ___UICloudProfileDetailsWidget_h___
+
+/* Qt includes: */
+#include <QWidget>
+
+/* GUI includes: */
+#include "QIManagerDialog.h"
+#include "QIWithRetranslateUI.h"
+
+/* Forward declarations: */
+class QAbstractButton;
+class QTableWidget;
+class QIDialogButtonBox;
+
+
+/** Cloud Profile data structure. */
+struct UIDataCloudProfile
+{
+    /** Constructs data. */
+    UIDataCloudProfile()
+        : m_strName(QString())
+    {}
+
+    /** Returns whether the @a other passed data is equal to this one. */
+    bool equal(const UIDataCloudProfile &other) const
+    {
+        return true
+               && (m_strName == other.m_strName)
+               ;
+    }
+
+    /** Returns whether the @a other passed data is equal to this one. */
+    bool operator==(const UIDataCloudProfile &other) const { return equal(other); }
+    /** Returns whether the @a other passed data is different from this one. */
+    bool operator!=(const UIDataCloudProfile &other) const { return !equal(other); }
+
+    /** Holds the snapshot name. */
+    QString  m_strName;
+};
+
+
+/** Cloud Profile details widget. */
+class UICloudProfileDetailsWidget : public QIWithRetranslateUI<QWidget>
+{
+    Q_OBJECT;
+
+signals:
+
+    /** Notifies listeners about data changed and whether it @a fDiffers. */
+    void sigDataChanged(bool fDiffers);
+
+    /** Notifies listeners about data change rejected and should be reseted. */
+    void sigDataChangeRejected();
+    /** Notifies listeners about data change accepted and should be applied. */
+    void sigDataChangeAccepted();
+
+public:
+
+    /** Constructs cloud profile details widget passing @a pParent to the base-class.
+      * @param  enmEmbedding  Brings embedding type. */
+    UICloudProfileDetailsWidget(EmbedTo enmEmbedding, QWidget *pParent = 0);
+
+    /** Returns the cloud profile data. */
+    const UIDataCloudProfile &data() const { return m_newData; }
+    /** Defines the cloud profile @a data. */
+    void setData(const UIDataCloudProfile &data);
+
+protected:
+
+    /** Handles translation event. */
+    virtual void retranslateUi() /* override */;
+
+private slots:
+
+    /** @name Change handling stuff.
+      * @{ */
+        /** Handles table change. */
+        void sltTableChanged();
+
+        /** Handles button-box button click. */
+        void sltHandleButtonBoxClick(QAbstractButton *pButton);
+    /** @} */
+
+private:
+
+    /** @name Prepare/cleanup cascade.
+      * @{ */
+        /** Prepares all. */
+        void prepare();
+        /** Prepares widgets. */
+        void prepareWidgets();
+    /** @} */
+
+    /** @name Loading stuff.
+      * @{ */
+        /** Loads data. */
+        void loadData();
+    /** @} */
+
+    /** @name Change handling stuff.
+      * @{ */
+        /** Revalidates changes for passed @a pWidget. */
+        void revalidate(QWidget *pWidget = 0);
+        /** Retranslates validation for passed @a pWidget. */
+        void retranslateValidation(QWidget *pWidget = 0);
+        /** Updates button states. */
+        void updateButtonStates();
+    /** @} */
+
+    /** @name General variables.
+      * @{ */
+        /** Holds the parent widget embedding type. */
+        const EmbedTo  m_enmEmbedding;
+
+        /** Holds the old data copy. */
+        UIDataCloudProfile  m_oldData;
+        /** Holds the new data copy. */
+        UIDataCloudProfile  m_newData;
+    /** @} */
+
+    /** @name Interface variables.
+      * @{ */
+        /** Holds the automatic interface configuration button. */
+        QTableWidget *m_pTableWidget;
+
+        /** Holds the server button-box instance. */
+        QIDialogButtonBox *m_pButtonBox;
+    /** @} */
+};
+
+
+#endif /* !___UICloudProfileDetailsWidget_h___ */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/cloud/UICloudProfileManager.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/cloud/UICloudProfileManager.cpp	(revision 74853)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/cloud/UICloudProfileManager.cpp	(revision 74853)
@@ -0,0 +1,526 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UICloudProfileManager class implementation.
+ */
+
+/*
+ * Copyright (C) 2009-2018 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifdef VBOX_WITH_PRECOMPILED_HEADERS
+# include <precomp.h>
+#else  /* !VBOX_WITH_PRECOMPILED_HEADERS */
+
+/* Qt includes: */
+# include <QPushButton>
+# include <QVBoxLayout>
+
+/* GUI includes: */
+# include "QIDialogButtonBox.h"
+# include "QITreeWidget.h"
+# include "VBoxGlobal.h"
+# include "UIActionPoolSelector.h"
+# include "UIExtraDataManager.h"
+# include "UIIconPool.h"
+# include "UICloudProfileDetailsWidget.h"
+# include "UICloudProfileManager.h"
+# include "UIToolBar.h"
+# ifdef VBOX_WS_MAC
+#  include "UIWindowMenuManager.h"
+# endif
+
+/* COM includes: */
+#include "CCloudProfile.h"
+
+#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
+
+
+/** Tree-widget column tags. */
+enum
+{
+    Column_Name,
+    /// @todo rest of columns?
+    Column_Max,
+};
+
+
+/** Cloud Profile Manager tree-widget item. */
+class UIItemCloudProfile : public QITreeWidgetItem, public UIDataCloudProfile
+{
+public:
+
+    /** Updates item fields from data. */
+    void updateFields();
+
+    /** Returns item name. */
+    QString name() const { return m_strName; }
+};
+
+
+/*********************************************************************************************************************************
+*   Class UIItemCloudProfile implementation.                                                                                     *
+*********************************************************************************************************************************/
+
+void UIItemCloudProfile::updateFields()
+{
+    /* Compose item fields: */
+    setText(Column_Name, m_strName);
+    /// @todo assign rest of field values!
+
+    /* Compose item tool-tip: */
+    /// @todo assign tool-tips!
+}
+
+
+/*********************************************************************************************************************************
+*   Class UICloudProfileManagerWidget implementation.                                                                            *
+*********************************************************************************************************************************/
+
+UICloudProfileManagerWidget::UICloudProfileManagerWidget(EmbedTo enmEmbedding, UIActionPool *pActionPool,
+                                                         bool fShowToolbar /* = true */, QWidget *pParent /* = 0 */)
+    : QIWithRetranslateUI<QWidget>(pParent)
+    , m_enmEmbedding(enmEmbedding)
+    , m_pActionPool(pActionPool)
+    , m_fShowToolbar(fShowToolbar)
+    , m_pToolBar(0)
+    , m_pTreeWidget(0)
+    , m_pDetailsWidget(0)
+{
+    /* Prepare: */
+    prepare();
+}
+
+QMenu *UICloudProfileManagerWidget::menu() const
+{
+    /// @todo implement menu action!
+    return 0;
+}
+
+void UICloudProfileManagerWidget::retranslateUi()
+{
+    /* Adjust toolbar: */
+#ifdef VBOX_WS_MAC
+    // WORKAROUND:
+    // There is a bug in Qt Cocoa which result in showing a "more arrow" when
+    // the necessary size of the toolbar is increased. Also for some languages
+    // the with doesn't match if the text increase. So manually adjust the size
+    // after changing the text.
+    if (m_pToolBar)
+        m_pToolBar->updateLayout();
+#endif
+
+    /* Translate tree-widget: */
+    /// @todo assign tree-widget column names!
+}
+
+void UICloudProfileManagerWidget::resizeEvent(QResizeEvent *pEvent)
+{
+    /* Call to base-class: */
+    QIWithRetranslateUI<QWidget>::resizeEvent(pEvent);
+
+    /* Adjust tree-widget: */
+    sltAdjustTreeWidget();
+}
+
+void UICloudProfileManagerWidget::showEvent(QShowEvent *pEvent)
+{
+    /* Call to base-class: */
+    QIWithRetranslateUI<QWidget>::showEvent(pEvent);
+
+    /* Adjust tree-widget: */
+    sltAdjustTreeWidget();
+}
+
+void UICloudProfileManagerWidget::sltResetCloudProfileDetailsChanges()
+{
+    /* Just push the current item data there again: */
+    sltHandleCurrentItemChange();
+}
+
+void UICloudProfileManagerWidget::sltApplyCloudProfileDetailsChanges()
+{
+    /* Get profile item: */
+    UIItemCloudProfile *pItem = static_cast<UIItemCloudProfile*>(m_pTreeWidget->currentItem());
+    AssertMsgReturnVoid(pItem, ("Current item must not be null!\n"));
+
+    /// @todo apply cloud profile details!
+}
+
+void UICloudProfileManagerWidget::sltCreateCloudProfile()
+{
+    /// @todo create cloud profile!
+}
+
+void UICloudProfileManagerWidget::sltRemoveCloudProfile()
+{
+    /// @todo remove cloud profile!
+}
+
+void UICloudProfileManagerWidget::sltToggleCloudProfileDetailsVisibility(bool fVisible)
+{
+    /* Save the setting: */
+    /// @todo implement extra-data setter!
+    /* Show/hide details area and Apply button: */
+    m_pDetailsWidget->setVisible(fVisible);
+    /* Notify external lsiteners: */
+    emit sigCloudProfileDetailsVisibilityChanged(fVisible);
+}
+
+void UICloudProfileManagerWidget::sltRefreshCloudProfiles()
+{
+    // Not implemented.
+    AssertMsgFailed(("Not implemented!"));
+}
+
+void UICloudProfileManagerWidget::sltAdjustTreeWidget()
+{
+    /* Calculate the total tree-widget width: */
+    const int iTotal = m_pTreeWidget->viewport()->width();
+
+    /// @todo calculate proposed column widths!
+
+    /* Apply the proposal: */
+    m_pTreeWidget->setColumnWidth(Column_Name, iTotal /*- iWidth1 - iWidth2 - iWidth3*/);
+}
+
+void UICloudProfileManagerWidget::sltHandleItemChange(QTreeWidgetItem *pItem)
+{
+    /* Get profile item: */
+    UIItemCloudProfile *pChangedItem = static_cast<UIItemCloudProfile*>(pItem);
+    AssertMsgReturnVoid(pChangedItem, ("Changed item must not be null!\n"));
+
+    /// @todo handle item change!
+}
+
+void UICloudProfileManagerWidget::sltHandleCurrentItemChange()
+{
+    /* Get profile item: */
+    UIItemCloudProfile *pItem = static_cast<UIItemCloudProfile*>(m_pTreeWidget->currentItem());
+
+    /* Update actions availability: */
+    /// @todo implement % enable/disable actions!
+
+    /* If there is an item => update details data: */
+    if (pItem)
+        m_pDetailsWidget->setData(*pItem);
+    else
+    {
+        /* Otherwise => clear details and close the area: */
+        m_pDetailsWidget->setData(UIDataCloudProfile());
+        sltToggleCloudProfileDetailsVisibility(false);
+    }
+}
+
+void UICloudProfileManagerWidget::sltHandleContextMenuRequest(const QPoint &position)
+{
+    /* Compose temporary context-menu: */
+    QMenu menu;
+    /// @todo implement & insert actions!
+
+    /* And show it: */
+    menu.exec(m_pTreeWidget->mapToGlobal(position));
+}
+
+void UICloudProfileManagerWidget::prepare()
+{
+    /* Prepare actions: */
+    prepareActions();
+    /* Prepare widgets: */
+    prepareWidgets();
+
+    /* Load settings: */
+    loadSettings();
+
+    /* Apply language settings: */
+    retranslateUi();
+
+    /* Load cloud profiles: */
+    loadCloudProfiles();
+}
+
+void UICloudProfileManagerWidget::prepareActions()
+{
+    /* Connect actions: */
+    /// @todo implement & connect actions!
+}
+
+void UICloudProfileManagerWidget::prepareWidgets()
+{
+    /* Create main-layout: */
+    new QVBoxLayout(this);
+    if (layout())
+    {
+        /* Configure layout: */
+        layout()->setContentsMargins(0, 0, 0, 0);
+#ifdef VBOX_WS_MAC
+        layout()->setSpacing(10);
+#else
+        layout()->setSpacing(qApp->style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing) / 2);
+#endif
+
+        /* Prepare toolbar, if requested: */
+        if (m_fShowToolbar)
+            prepareToolBar();
+        /* Prepare tree-widget: */
+        prepareTreeWidget();
+        /* Prepare details-widget: */
+        prepareDetailsWidget();
+    }
+}
+
+void UICloudProfileManagerWidget::prepareToolBar()
+{
+    /* Create toolbar: */
+    m_pToolBar = new UIToolBar(parentWidget());
+    if (m_pToolBar)
+    {
+        /* Configure toolbar: */
+        const int iIconMetric = (int)(QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize) * 1.375);
+        m_pToolBar->setIconSize(QSize(iIconMetric, iIconMetric));
+        m_pToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+
+        /* Add toolbar actions: */
+        /// @todo implement & add actions!
+
+#ifdef VBOX_WS_MAC
+        /* Check whether we are embedded into a stack: */
+        if (m_enmEmbedding == EmbedTo_Stack)
+        {
+            /* Add into layout: */
+            layout()->addWidget(m_pToolBar);
+        }
+#else
+        /* Add into layout: */
+        layout()->addWidget(m_pToolBar);
+#endif
+    }
+}
+
+void UICloudProfileManagerWidget::prepareTreeWidget()
+{
+    /* Create tree-widget: */
+    m_pTreeWidget = new QITreeWidget;
+    if (m_pTreeWidget)
+    {
+        /* Configure tree-widget: */
+        m_pTreeWidget->setRootIsDecorated(false);
+        m_pTreeWidget->setAlternatingRowColors(true);
+        m_pTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
+        m_pTreeWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+        m_pTreeWidget->setColumnCount(Column_Max);
+        m_pTreeWidget->setSortingEnabled(true);
+        m_pTreeWidget->sortByColumn(Column_Name, Qt::AscendingOrder);
+        m_pTreeWidget->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
+        connect(m_pTreeWidget, &QITreeWidget::currentItemChanged,
+                this, &UICloudProfileManagerWidget::sltHandleCurrentItemChange);
+        connect(m_pTreeWidget, &QITreeWidget::customContextMenuRequested,
+                this, &UICloudProfileManagerWidget::sltHandleContextMenuRequest);
+        connect(m_pTreeWidget, &QITreeWidget::itemChanged,
+                this, &UICloudProfileManagerWidget::sltHandleItemChange);
+        /// @todo implement & connect actions!
+
+        /* Add into layout: */
+        layout()->addWidget(m_pTreeWidget);
+    }
+}
+
+void UICloudProfileManagerWidget::prepareDetailsWidget()
+{
+    /* Create details-widget: */
+    m_pDetailsWidget = new UICloudProfileDetailsWidget(m_enmEmbedding);
+    if (m_pDetailsWidget)
+    {
+        /* Configure details-widget: */
+        m_pDetailsWidget->setVisible(false);
+        m_pDetailsWidget->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+        connect(m_pDetailsWidget, &UICloudProfileDetailsWidget::sigDataChanged,
+                this, &UICloudProfileManagerWidget::sigCloudProfileDetailsDataChanged);
+        connect(m_pDetailsWidget, &UICloudProfileDetailsWidget::sigDataChangeRejected,
+                this, &UICloudProfileManagerWidget::sltResetCloudProfileDetailsChanges);
+        connect(m_pDetailsWidget, &UICloudProfileDetailsWidget::sigDataChangeAccepted,
+                this, &UICloudProfileManagerWidget::sltApplyCloudProfileDetailsChanges);
+
+        /* Add into layout: */
+        layout()->addWidget(m_pDetailsWidget);
+    }
+}
+
+void UICloudProfileManagerWidget::loadSettings()
+{
+    /* Details action/widget: */
+    /// @todo implement extra-data getter!
+}
+
+void UICloudProfileManagerWidget::loadCloudProfiles()
+{
+    /* Clear tree first of all: */
+    m_pTreeWidget->clear();
+
+    /// @todo load cloud profiles!
+}
+
+void UICloudProfileManagerWidget::loadCloudProfile(const CCloudProfile &comProfile, UIDataCloudProfile &data)
+{
+    Q_UNUSED(comProfile);
+    Q_UNUSED(data);
+
+    /// @todo load cloud profile!
+}
+
+void UICloudProfileManagerWidget::createItemForCloudProfile(const UIDataCloudProfile &data, bool fChooseItem)
+{
+    /* Create new item: */
+    UIItemCloudProfile *pItem = new UIItemCloudProfile;
+    if (pItem)
+    {
+        /* Configure item: */
+        pItem->UIDataCloudProfile::operator=(data);
+        pItem->updateFields();
+        /* Add item to the tree: */
+        m_pTreeWidget->addTopLevelItem(pItem);
+        /* And choose it as current if necessary: */
+        if (fChooseItem)
+            m_pTreeWidget->setCurrentItem(pItem);
+    }
+}
+
+void UICloudProfileManagerWidget::updateItemForCloudProfile(const UIDataCloudProfile &data, bool fChooseItem, UIItemCloudProfile *pItem)
+{
+    /* Update passed item: */
+    if (pItem)
+    {
+        /* Configure item: */
+        pItem->UIDataCloudProfile::operator=(data);
+        pItem->updateFields();
+        /* And choose it as current if necessary: */
+        if (fChooseItem)
+            m_pTreeWidget->setCurrentItem(pItem);
+    }
+}
+
+
+/*********************************************************************************************************************************
+*   Class UICloudProfileManagerFactory implementation.                                                                            *
+*********************************************************************************************************************************/
+
+UICloudProfileManagerFactory::UICloudProfileManagerFactory(UIActionPool *pActionPool /* = 0 */)
+    : m_pActionPool(pActionPool)
+{
+}
+
+void UICloudProfileManagerFactory::create(QIManagerDialog *&pDialog, QWidget *pCenterWidget)
+{
+    pDialog = new UICloudProfileManager(pCenterWidget, m_pActionPool);
+}
+
+
+/*********************************************************************************************************************************
+*   Class UICloudProfileManager implementation.                                                                                   *
+*********************************************************************************************************************************/
+
+UICloudProfileManager::UICloudProfileManager(QWidget *pCenterWidget, UIActionPool *pActionPool)
+    : QIWithRetranslateUI<QIManagerDialog>(pCenterWidget)
+    , m_pActionPool(pActionPool)
+{
+}
+
+void UICloudProfileManager::sltHandleButtonBoxClick(QAbstractButton *pButton)
+{
+    /* Disable buttons first of all: */
+    button(ButtonType_Reset)->setEnabled(false);
+    button(ButtonType_Apply)->setEnabled(false);
+
+    /* Compare with known buttons: */
+    if (pButton == button(ButtonType_Reset))
+        emit sigDataChangeRejected();
+    else
+    if (pButton == button(ButtonType_Apply))
+        emit sigDataChangeAccepted();
+}
+
+void UICloudProfileManager::retranslateUi()
+{
+    /* Translate window title: */
+    setWindowTitle(tr("Cloud Profile Manager"));
+
+    /* Translate buttons: */
+    button(ButtonType_Reset)->setText(tr("Reset"));
+    button(ButtonType_Apply)->setText(tr("Apply"));
+    button(ButtonType_Close)->setText(tr("Close"));
+    button(ButtonType_Reset)->setStatusTip(tr("Reset changes in current cloud profile details"));
+    button(ButtonType_Apply)->setStatusTip(tr("Apply changes in current cloud profile details"));
+    button(ButtonType_Close)->setStatusTip(tr("Close dialog without saving"));
+    button(ButtonType_Reset)->setShortcut(QString("Ctrl+Backspace"));
+    button(ButtonType_Apply)->setShortcut(QString("Ctrl+Return"));
+    button(ButtonType_Close)->setShortcut(Qt::Key_Escape);
+    button(ButtonType_Reset)->setToolTip(tr("Reset Changes (%1)").arg(button(ButtonType_Reset)->shortcut().toString()));
+    button(ButtonType_Apply)->setToolTip(tr("Apply Changes (%1)").arg(button(ButtonType_Apply)->shortcut().toString()));
+    button(ButtonType_Close)->setToolTip(tr("Close Window (%1)").arg(button(ButtonType_Close)->shortcut().toString()));
+}
+
+void UICloudProfileManager::configure()
+{
+    /* Apply window icons: */
+    /// @todo apply proper cloud profile manager icons!
+    setWindowIcon(UIIconPool::iconSetFull(":/host_iface_manager_32px.png", ":/host_iface_manager_16px.png"));
+}
+
+void UICloudProfileManager::configureCentralWidget()
+{
+    /* Create widget: */
+    UICloudProfileManagerWidget *pWidget = new UICloudProfileManagerWidget(EmbedTo_Dialog, m_pActionPool, true, this);
+    if (pWidget)
+    {
+        /* Configure widget: */
+        setWidget(pWidget);
+        setWidgetMenu(pWidget->menu());
+#ifdef VBOX_WS_MAC
+        setWidgetToolbar(pWidget->toolbar());
+#endif
+        connect(this, &UICloudProfileManager::sigDataChangeRejected,
+                pWidget, &UICloudProfileManagerWidget::sltResetCloudProfileDetailsChanges);
+        connect(this, &UICloudProfileManager::sigDataChangeAccepted,
+                pWidget, &UICloudProfileManagerWidget::sltApplyCloudProfileDetailsChanges);
+
+        /* Add into layout: */
+        centralWidget()->layout()->addWidget(pWidget);
+    }
+}
+
+void UICloudProfileManager::configureButtonBox()
+{
+    /* Configure button-box: */
+    connect(widget(), &UICloudProfileManagerWidget::sigCloudProfileDetailsVisibilityChanged,
+            button(ButtonType_Apply), &QPushButton::setVisible);
+    connect(widget(), &UICloudProfileManagerWidget::sigCloudProfileDetailsVisibilityChanged,
+            button(ButtonType_Reset), &QPushButton::setVisible);
+    connect(widget(), &UICloudProfileManagerWidget::sigCloudProfileDetailsDataChanged,
+            button(ButtonType_Apply), &QPushButton::setEnabled);
+    connect(widget(), &UICloudProfileManagerWidget::sigCloudProfileDetailsDataChanged,
+            button(ButtonType_Reset), &QPushButton::setEnabled);
+    connect(buttonBox(), &QIDialogButtonBox::clicked,
+            this, &UICloudProfileManager::sltHandleButtonBoxClick);
+    // WORKAROUND:
+    // Since we connected signals later than extra-data loaded
+    // for signals above, we should handle that stuff here again:
+    /// @todo implement extra-data getter!
+}
+
+void UICloudProfileManager::finalize()
+{
+    /* Apply language settings: */
+    retranslateUi();
+}
+
+UICloudProfileManagerWidget *UICloudProfileManager::widget()
+{
+    return qobject_cast<UICloudProfileManagerWidget*>(QIManagerDialog::widget());
+}
Index: /trunk/src/VBox/Frontends/VirtualBox/src/cloud/UICloudProfileManager.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/cloud/UICloudProfileManager.h	(revision 74853)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/cloud/UICloudProfileManager.h	(revision 74853)
@@ -0,0 +1,260 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UICloudProfileManager class declaration.
+ */
+
+/*
+ * Copyright (C) 2009-2018 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifndef ___UICloudProfileManager_h___
+#define ___UICloudProfileManager_h___
+
+/* GUI includes: */
+#include "QIManagerDialog.h"
+#include "QIWithRetranslateUI.h"
+
+/* Forward declarations: */
+class QAbstractButton;
+class QTreeWidgetItem;
+class QITreeWidget;
+class UIActionPool;
+class UICloudProfileDetailsWidget;
+class UIItemCloudProfile;
+class UIToolBar;
+struct UIDataCloudProfile;
+class CCloudProfile;
+
+
+/** QWidget extension providing GUI with the pane to control cloud profile related functionality. */
+class UICloudProfileManagerWidget : public QIWithRetranslateUI<QWidget>
+{
+    Q_OBJECT;
+
+signals:
+
+    /** Notifies listeners about cloud profile details-widget @a fVisible. */
+    void sigCloudProfileDetailsVisibilityChanged(bool fVisible);
+    /** Notifies listeners about cloud profile details data @a fDiffers. */
+    void sigCloudProfileDetailsDataChanged(bool fDiffers);
+
+public:
+
+    /** Constructs Cloud Profile Manager widget.
+      * @param  enmEmbedding  Brings the type of widget embedding.
+      * @param  pActionPool   Brings the action-pool reference.
+      * @param  fShowToolbar  Brings whether we should create/show toolbar. */
+    UICloudProfileManagerWidget(EmbedTo enmEmbedding, UIActionPool *pActionPool,
+                                bool fShowToolbar = true, QWidget *pParent = 0);
+
+    /** Returns the menu. */
+    QMenu *menu() const;
+
+#ifdef VBOX_WS_MAC
+    /** Returns the toolbar. */
+    UIToolBar *toolbar() const { return m_pToolBar; }
+#endif
+
+protected:
+
+    /** @name Event-handling stuff.
+      * @{ */
+        /** Handles translation event. */
+        virtual void retranslateUi() /* override */;
+
+        /** Handles resize @a pEvent. */
+        virtual void resizeEvent(QResizeEvent *pEvent) /* override */;
+
+        /** Handles show @a pEvent. */
+        virtual void showEvent(QShowEvent *pEvent) /* override */;
+    /** @} */
+
+public slots:
+
+    /** @name Details-widget stuff.
+      * @{ */
+        /** Handles command to reset cloud profile details changes. */
+        void sltResetCloudProfileDetailsChanges();
+        /** Handles command to apply cloud profile details changes. */
+        void sltApplyCloudProfileDetailsChanges();
+    /** @} */
+
+private slots:
+
+    /** @name Menu/action stuff.
+      * @{ */
+        /** Handles command to create cloud profile. */
+        void sltCreateCloudProfile();
+        /** Handles command to remove cloud profile. */
+        void sltRemoveCloudProfile();
+        /** Handles command to make cloud profile details @a fVisible. */
+        void sltToggleCloudProfileDetailsVisibility(bool fVisible);
+        /** Handles command to refresh cloud profiles. */
+        void sltRefreshCloudProfiles();
+    /** @} */
+
+    /** @name Tree-widget stuff.
+      * @{ */
+        /** Handles command to adjust tree-widget. */
+        void sltAdjustTreeWidget();
+
+        /** Handles tree-widget @a pItem change. */
+        void sltHandleItemChange(QTreeWidgetItem *pItem);
+        /** Handles tree-widget current item change. */
+        void sltHandleCurrentItemChange();
+        /** Handles context menu request for tree-widget @a position. */
+        void sltHandleContextMenuRequest(const QPoint &position);
+    /** @} */
+
+private:
+
+    /** @name Prepare/cleanup cascade.
+      * @{ */
+        /** Prepares all. */
+        void prepare();
+        /** Prepares actions. */
+        void prepareActions();
+        /** Prepares widgets. */
+        void prepareWidgets();
+        /** Prepares toolbar. */
+        void prepareToolBar();
+        /** Prepares tree-widget. */
+        void prepareTreeWidget();
+        /** Prepares details-widget. */
+        void prepareDetailsWidget();
+        /** Load settings: */
+        void loadSettings();
+    /** @} */
+
+    /** @name Loading stuff.
+      * @{ */
+        /** Loads cloud profiles. */
+        void loadCloudProfiles();
+        /** Loads host @a comInterface data to passed @a data container. */
+        void loadCloudProfile(const CCloudProfile &comInterface, UIDataCloudProfile &data);
+    /** @} */
+
+    /** @name Tree-widget stuff.
+      * @{ */
+        /** Creates a new tree-widget item on the basis of passed @a data, @a fChooseItem if requested. */
+        void createItemForCloudProfile(const UIDataCloudProfile &data, bool fChooseItem);
+        /** Updates the passed tree-widget item on the basis of passed @a data, @a fChooseItem if requested. */
+        void updateItemForCloudProfile(const UIDataCloudProfile &data, bool fChooseItem, UIItemCloudProfile *pItem);
+    /** @} */
+
+    /** @name General variables.
+      * @{ */
+        /** Holds the widget embedding type. */
+        const EmbedTo m_enmEmbedding;
+        /** Holds the action-pool reference. */
+        UIActionPool *m_pActionPool;
+        /** Holds whether we should create/show toolbar. */
+        const bool    m_fShowToolbar;
+    /** @} */
+
+    /** @name Toolbar and menu variables.
+      * @{ */
+        /** Holds the toolbar instance. */
+        UIToolBar *m_pToolBar;
+    /** @} */
+
+    /** @name Splitter variables.
+      * @{ */
+        /** Holds the tree-widget instance. */
+        QITreeWidget *m_pTreeWidget;
+        /** Holds the details-widget instance. */
+        UICloudProfileDetailsWidget *m_pDetailsWidget;
+    /** @} */
+};
+
+
+/** QIManagerDialogFactory extension used as a factory for Cloud Profile Manager dialog. */
+class UICloudProfileManagerFactory : public QIManagerDialogFactory
+{
+public:
+
+    /** Constructs Cloud Profile Manager factory acquiring additional arguments.
+      * @param  pActionPool  Brings the action-pool reference. */
+    UICloudProfileManagerFactory(UIActionPool *pActionPool = 0);
+
+protected:
+
+    /** Creates derived @a pDialog instance.
+      * @param  pCenterWidget  Brings the widget reference to center according to. */
+    virtual void create(QIManagerDialog *&pDialog, QWidget *pCenterWidget) /* override */;
+
+    /** Holds the action-pool reference. */
+    UIActionPool *m_pActionPool;
+};
+
+
+/** QIManagerDialog extension providing GUI with the dialog to control cloud profile related functionality. */
+class UICloudProfileManager : public QIWithRetranslateUI<QIManagerDialog>
+{
+    Q_OBJECT;
+
+signals:
+
+    /** Notifies listeners about data change rejected and should be reseted. */
+    void sigDataChangeRejected();
+    /** Notifies listeners about data change accepted and should be applied. */
+    void sigDataChangeAccepted();
+
+private slots:
+
+    /** @name Button-box stuff.
+      * @{ */
+        /** Handles button-box button click. */
+        void sltHandleButtonBoxClick(QAbstractButton *pButton);
+    /** @} */
+
+private:
+
+    /** Constructs Cloud Profile Manager dialog.
+      * @param  pCenterWidget  Brings the widget reference to center according to.
+      * @param  pActionPool    Brings the action-pool reference. */
+    UICloudProfileManager(QWidget *pCenterWidget, UIActionPool *pActionPool);
+
+    /** @name Event-handling stuff.
+      * @{ */
+        /** Handles translation event. */
+        virtual void retranslateUi() /* override */;
+    /** @} */
+
+    /** @name Prepare/cleanup cascade.
+      * @{ */
+        /** Configures all. */
+        virtual void configure() /* override */;
+        /** Configures central-widget. */
+        virtual void configureCentralWidget() /* override */;
+        /** Configures button-box. */
+        virtual void configureButtonBox() /* override */;
+        /** Perform final preparations. */
+        virtual void finalize() /* override */;
+    /** @} */
+
+    /** @name Widget stuff.
+      * @{ */
+        /** Returns the widget. */
+        virtual UICloudProfileManagerWidget *widget() /* override */;
+    /** @} */
+
+    /** @name Action related variables.
+      * @{ */
+        /** Holds the action-pool reference. */
+        UIActionPool *m_pActionPool;
+    /** @} */
+
+    /** Allow factory access to private/protected members: */
+    friend class UICloudProfileManagerFactory;
+};
+
+#endif /* !___UICloudProfileManager_h___ */
