Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.cpp	(revision 83704)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.cpp	(revision 83705)
@@ -24,4 +24,5 @@
 #include "UIChooserNodeGlobal.h"
 #include "UIChooserNodeMachine.h"
+#include "UICloudNetworkingStuff.h"
 #include "UIExtraDataManager.h"
 #include "UIMessageCenter.h"
@@ -398,4 +399,25 @@
 }
 
+void UIChooserAbstractModel::sltCloudMachineRegistered(const QString &strProviderShortName, const QString &strProfileName,
+                                                       const QUuid &uMachineId, const bool fRegistered)
+{
+    /* Existing VM unregistered? */
+    if (!fRegistered)
+    {
+        /* Remove machine-items with passed id: */
+        invisibleRoot()->removeAllNodes(uMachineId);
+        /// @todo make sure there is fake item if no real item exist, never wipe out empty groups ..
+    }
+    /* New VM registered? */
+    else
+    {
+        /* Add new machine-item: */
+        const QString strGroupName = QString("/%1/%2").arg(strProviderShortName, strProfileName);
+        const CCloudMachine comMachine = cloudMachineById(strProviderShortName, strProfileName, uMachineId);
+        addCloudMachineIntoTheTree(strGroupName, comMachine, true /* make it visible */);
+        /// @todo make sure there is no fake item if at least one real item exists ..
+    }
+}
+
 void UIChooserAbstractModel::sltSessionStateChanged(const QUuid &uMachineId, const KSessionState)
 {
@@ -552,7 +574,7 @@
 
     /* Which VM we are loading: */
-    const QUuid uMachineId = comMachine.GetId();
+    const QUuid uId = comMachine.GetId();
     LogRelFlow(("UIChooserModel: Loading local VM with ID={%s}...\n",
-                toOldStyleUuid(uMachineId).toUtf8().constData()));
+                toOldStyleUuid(uId).toUtf8().constData()));
     /* Is that machine accessible? */
     if (comMachine.GetAccessible())
@@ -578,5 +600,5 @@
         }
         /* Update group definitions: */
-        m_groups[toOldStyleUuid(uMachineId)] = groupList;
+        m_groups[toOldStyleUuid(uId)] = groupList;
     }
     /* Inaccessible machine: */
@@ -585,8 +607,34 @@
         /* VM is accessible: */
         LogRelFlow(("UIChooserModel:  Local VM {%s} is inaccessible.\n",
-                    toOldStyleUuid(uMachineId).toUtf8().constData()));
+                    toOldStyleUuid(uId).toUtf8().constData()));
         /* Create machine-item with main-root group-item as parent: */
         createLocalMachineNode(invisibleRoot(), comMachine);
     }
+}
+
+void UIChooserAbstractModel::addCloudMachineIntoTheTree(const QString &strGroup,
+                                                        const CCloudMachine &comMachine,
+                                                        bool fMakeItVisible /* = false */)
+{
+    /* Make sure passed VM is not NULL: */
+    if (comMachine.isNull())
+        LogRelFlow(("UIChooserModel: ERROR: Passed cloud VM is NULL!\n"));
+    AssertReturnVoid(!comMachine.isNull());
+
+    /* Which VM we are loading: */
+    const QUuid uId = comMachine.GetId();
+    LogRelFlow(("UIChooserModel: Loading cloud VM with ID={%s}...\n",
+                toOldStyleUuid(uId).toUtf8().constData()));
+    /* Acquire VM name: */
+    QString strName = comMachine.GetName();
+    if (strName.isEmpty())
+        strName = uId.toString();
+    LogRelFlow(("UIChooserModel:  Creating node for cloud VM {%s} in group {%s}.\n",
+                strName.toUtf8().constData(), strGroup.toUtf8().constData()));
+    /* Create machine-item with found group-item as parent: */
+    createCloudMachineNode(getCloudGroupNode(strGroup, invisibleRoot(), fMakeItVisible), comMachine);
+    /* Update group definitions: */
+    const QStringList groupList(strGroup);
+    m_groups[toOldStyleUuid(uId)] = groupList;
 }
 
@@ -632,4 +680,39 @@
                                fAllGroupsOpened || shouldGroupNodeBeOpened(pParentNode, strSecondSubName));
     return strSecondSuffix.isEmpty() ? pNewGroupNode : getLocalGroupNode(strFirstSuffix, pNewGroupNode, fAllGroupsOpened);
+}
+
+UIChooserNode *UIChooserAbstractModel::getCloudGroupNode(const QString &strName, UIChooserNode *pParentNode, bool fAllGroupsOpened)
+{
+    /* Check passed stuff: */
+    if (pParentNode->name() == strName)
+        return pParentNode;
+
+    /* Prepare variables: */
+    const QString strFirstSubName = strName.section('/', 0, 0);
+    const QString strFirstSuffix = strName.section('/', 1, -1);
+    const QString strSecondSubName = strFirstSuffix.section('/', 0, 0);
+
+    /* Passed group name equal to first sub-name: */
+    if (pParentNode->name() == strFirstSubName)
+    {
+        /* Make sure first-suffix is NOT empty: */
+        AssertMsg(!strFirstSuffix.isEmpty(), ("Invalid group name!"));
+        /* Trying to get group node among our children: */
+        foreach (UIChooserNode *pGroupNode, pParentNode->nodes(UIChooserNodeType_Group))
+        {
+            if (   pGroupNode->toGroupNode()->groupType() != UIChooserNodeGroupType_Local
+                && pGroupNode->name() == strSecondSubName)
+            {
+                UIChooserNode *pFoundNode = getCloudGroupNode(strFirstSuffix, pGroupNode, fAllGroupsOpened);
+                if (UIChooserNodeGroup *pFoundGroupNode = pFoundNode->toGroupNode())
+                    if (fAllGroupsOpened && pFoundGroupNode->isClosed())
+                        pFoundGroupNode->open();
+                return pFoundNode;
+            }
+        }
+    }
+
+    /* Found nothing? Returning parent: */
+    AssertFailedReturn(pParentNode);
 }
 
@@ -794,9 +877,21 @@
 void UIChooserAbstractModel::createLocalMachineNode(UIChooserNode *pParentNode, const CMachine &comMachine)
 {
-    /* Create machine node: */
     new UIChooserNodeMachine(pParentNode,
                              false /* favorite */,
                              getDesiredNodePosition(pParentNode, UIChooserNodeType_Machine, toOldStyleUuid(comMachine.GetId())),
                              comMachine);
+}
+
+void UIChooserAbstractModel::createCloudMachineNode(UIChooserNode *pParentNode, const CCloudMachine &comMachine)
+{
+    UIChooserNodeMachine *pNode = new UIChooserNodeMachine(pParentNode,
+                                                           false /* favorite */,
+                                                           getDesiredNodePosition(pParentNode,
+                                                                                  UIChooserNodeType_Machine,
+                                                                                  toOldStyleUuid(comMachine.GetId())),
+                                                           comMachine);
+    /* Request for async node update if necessary: */
+    if (!comMachine.GetAccessible())
+        pNode->cache()->toCloud()->updateInfoAsync(false /* delayed? */);
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.h	(revision 83704)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.h	(revision 83705)
@@ -35,4 +35,5 @@
 class UIChooser;
 class UIChooserNode;
+class CCloudMachine;
 class CMachine;
 #ifdef VBOX_GUI_WITH_CLOUD_VMS
@@ -134,4 +135,9 @@
         /** Handles local machine registering/unregistering for machine with certain @a uMachineId. */
         virtual void sltLocalMachineRegistered(const QUuid &uMachineId, const bool fRegistered);
+        /** Handles cloud machine registering/unregistering for machine with certain @a uMachineId.
+          * @param  strProviderShortName  Brings provider short name.
+          * @param  strProfileName        Brings profile name. */
+        virtual void sltCloudMachineRegistered(const QString &strProviderShortName, const QString &strProfileName,
+                                               const QUuid &uMachineId, const bool fRegistered);
         /** Handles session @a enmState change for machine with certain @a uMachineId. */
         virtual void sltSessionStateChanged(const QUuid &uMachineId, const KSessionState enmState);
@@ -176,4 +182,6 @@
         /** Adds local machine item based on certain @a comMachine and optionally @a fMakeItVisible. */
         void addLocalMachineIntoTheTree(const CMachine &comMachine, bool fMakeItVisible = false);
+        /** Adds cloud machine item based on certain @a comMachine and optionally @a fMakeItVisible, into @a strGroup. */
+        void addCloudMachineIntoTheTree(const QString &strGroup, const CCloudMachine &comMachine, bool fMakeItVisible = false);
 
         /** Acquires local group node, creates one if necessary.
@@ -182,4 +190,9 @@
           * @param  fAllGroupsOpened  Brings whether we should open all the groups till the required one. */
         UIChooserNode *getLocalGroupNode(const QString &strName, UIChooserNode *pParentNode, bool fAllGroupsOpened);
+        /** Acquires cloud group node, never create new, returns root if nothing found.
+          * @param  strName           Brings the name of group we looking for.
+          * @param  pParentNode       Brings the parent we starting to look for a group from.
+          * @param  fAllGroupsOpened  Brings whether we should open all the groups till the required one. */
+        UIChooserNode *getCloudGroupNode(const QString &strName, UIChooserNode *pParentNode, bool fAllGroupsOpened);
 
         /** Returns whether group node with certain @a strName should be opened, searching starting from the passed @a pParentItem. */
@@ -199,4 +212,6 @@
         /** Creates local machine node based on certain @a comMachine as a child of specified @a pParentNode. */
         void createLocalMachineNode(UIChooserNode *pParentNode, const CMachine &comMachine);
+        /** Creates cloud machine node based on certain @a comMachine as a child of specified @a pParentNode. */
+        void createCloudMachineNode(UIChooserNode *pParentNode, const CCloudMachine &comMachine);
     /** @} */
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserModel.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserModel.cpp	(revision 83704)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserModel.cpp	(revision 83705)
@@ -696,4 +696,44 @@
 }
 
+void UIChooserModel::sltCloudMachineRegistered(const QString &strProviderName, const QString &strProfileName,
+                                               const QUuid &uId, const bool fRegistered)
+{
+    /* Call to base-class: */
+    UIChooserAbstractModel::sltCloudMachineRegistered(strProviderName, strProfileName, uId, fRegistered);
+
+    /* Existing VM unregistered? */
+    if (!fRegistered)
+    {
+        /* Update tree for main root: */
+        updateNavigationItemList();
+        updateLayout();
+
+        /* Make sure selected-item present, if possible: */
+        if (!firstSelectedItem() && !navigationItems().isEmpty())
+        {
+            setSelectedItem(navigationItems().first());
+            emit sigSelectionInvalidated();
+        }
+        /* Make sure current-item present, if possible: */
+        else if (!currentItem() && firstSelectedItem())
+            setCurrentItem(firstSelectedItem());
+        /* Notify about selected-item change: */
+        emit sigSelectionChanged();
+    }
+    /* New VM registered? */
+    else
+    {
+        /* Rebuild tree for main root: */
+        buildTreeForMainRoot();
+        updateNavigationItemList();
+        updateLayout();
+
+        /* Select newly added item: */
+        setSelectedItem(root()->searchForItem(uId.toString(),
+                                              UIChooserItemSearchFlag_Machine |
+                                              UIChooserItemSearchFlag_ExactId));
+    }
+}
+
 void UIChooserModel::sltReloadMachine(const QUuid &uId)
 {
@@ -940,19 +980,11 @@
 
         // WORKAROUND:
-        // Hehey! Now we have to inject created VM nodes and then rebuild tree for the main root node ourselves
-        // cause there is no corresponding event yet. Later this to be done in corresponding event handler instead.
+        // Hehey! Now we have to inject created VM nodes and then rebuild tree for the main root node
+        // ourselves cause there is no corresponding event yet. So we are calling actual handler to do that.
         foreach (const CCloudMachine &comMachine, pWizard->machines())
-            new UIChooserNodeMachine(pGroup->node(),
-                                     false /* favorite */,
-                                     pGroup->node()->nodes().size() /* position */,
-                                     comMachine);
-        // Remember first selected item definition:
-        const QString strDefinition = firstSelectedItem()->definition();
-        // Rebuild tree for main root:
-        buildTreeForMainRoot();
-        updateNavigationItemList();
-        updateLayout();
-        // Restore selection:
-        setSelectedItem(strDefinition);
+            sltCloudMachineRegistered(pGroup->parentItem()->name() /* provider name */,
+                                      pGroup->name() /* profile name */,
+                                      comMachine.GetId() /* machine ID */,
+                                      true /* registered? */);
 
         delete pWizard;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserModel.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserModel.h	(revision 83704)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserModel.h	(revision 83705)
@@ -249,4 +249,9 @@
         /** Handles local machine registering/unregistering for machine with certain @a uId. */
         virtual void sltLocalMachineRegistered(const QUuid &uId, const bool fRegistered) /* override */;
+        /** Handles cloud machine registering/unregistering for machine with certain @a uId.
+          * @param  strProviderName  Brings provider short name.
+          * @param  strProfileName   Brings profile name. */
+        virtual void sltCloudMachineRegistered(const QString &strProviderName, const QString &strProfileName,
+                                               const QUuid &uId, const bool fRegistered);
     /** @} */
 
