Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.cpp	(revision 86610)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.cpp	(revision 86611)
@@ -713,7 +713,7 @@
 }
 
-void UIChooserAbstractModel::sltCloudMachineRegistered(const QString &strProviderShortName,
-                                                       const QString &strProfileName,
-                                                       const CCloudMachine &comMachine)
+void UIChooserAbstractModel::sltCloudMachinesUnregistered(const QString &strProviderShortName,
+                                                          const QString &strProfileName,
+                                                          const QList<QUuid> &ids)
 {
     /* Search for profile node: */
@@ -725,6 +725,52 @@
         return;
 
+    /* Remove machine-items with passed id: */
+    foreach (const QUuid &uId, ids)
+        pProfileNode->removeAllNodes(uId);
+
+    /* If there are no items left => add fake cloud VM node: */
+    if (pProfileNode->nodes(UIChooserNodeType_Machine).isEmpty())
+        new UIChooserNodeMachine(pProfileNode /* parent */,
+                                 0 /* position */,
+                                 UIFakeCloudVirtualMachineItemState_Done);
+}
+
+void UIChooserAbstractModel::sltCloudMachineRegistered(const QString &strProviderShortName,
+                                                       const QString &strProfileName,
+                                                       const CCloudMachine &comMachine)
+{
+    /* Search for profile node: */
+    const QString strProfileNodeName = QString("/%1/%2").arg(strProviderShortName, strProfileName);
+    QList<UIChooserNode*> profileNodes;
+    invisibleRoot()->searchForNodes(strProfileNodeName, UIChooserItemSearchFlag_CloudProfile | UIChooserItemSearchFlag_ExactId, profileNodes);
+    UIChooserNode *pProfileNode = profileNodes.value(0);
+    if (!pProfileNode)
+        return;
+
     /* Add new machine-item: */
     addCloudMachineIntoTheTree(strProfileNodeName, comMachine, true /* make it visible? */);
+
+    /* Search for possible fake node: */
+    QList<UIChooserNode*> fakeNodes;
+    pProfileNode->searchForNodes(QUuid().toString(), UIChooserItemSearchFlag_Machine | UIChooserItemSearchFlag_ExactId, fakeNodes);
+    /* Delete fake node if present: */
+    delete fakeNodes.value(0);
+}
+
+void UIChooserAbstractModel::sltCloudMachinesRegistered(const QString &strProviderShortName,
+                                                        const QString &strProfileName,
+                                                        const QVector<CCloudMachine> &machines)
+{
+    /* Search for profile node: */
+    const QString strProfileNodeName = QString("/%1/%2").arg(strProviderShortName, strProfileName);
+    QList<UIChooserNode*> profileNodes;
+    invisibleRoot()->searchForNodes(strProfileNodeName, UIChooserItemSearchFlag_CloudProfile | UIChooserItemSearchFlag_ExactId, profileNodes);
+    UIChooserNode *pProfileNode = profileNodes.value(0);
+    if (!pProfileNode)
+        return;
+
+    /* Add new machine-items: */
+    foreach (const CCloudMachine &comMachine, machines)
+        addCloudMachineIntoTheTree(strProfileNodeName, comMachine, false /* make it visible? */);
 
     /* Search for possible fake node: */
@@ -752,32 +798,39 @@
         return;
 
-    /* Search for fake node: */
-    QList<UIChooserNode*> fakeNodes;
-    pProfileNode->searchForNodes(QUuid().toString(), UIChooserItemSearchFlag_Machine | UIChooserItemSearchFlag_ExactId, fakeNodes);
-    UIChooserNode *pFakeNode = fakeNodes.value(0);
-    if (!pFakeNode)
-        return;
-
-    /* And if we have at least one cloud machine: */
-    const QVector<CCloudMachine> machines = pAcquiringTask->result();
-    if (!machines.isEmpty())
-    {
-        /* Remove fake node: */
-        delete pFakeNode;
-
-        /* Add real cloud VM nodes: */
-        foreach (const CCloudMachine &comCloudMachine, machines)
-            createCloudMachineNode(pProfileNode, comCloudMachine);
-    }
-    else
-    {
-        /* Otherwise toggle and update "Empty" node: */
-        UIChooserNodeMachine *pFakeMachineNode = pFakeNode->toMachineNode();
-        AssertReturnVoid(pFakeMachineNode && pFakeMachineNode->cacheType() == UIVirtualMachineItemType_CloudFake);
-        UIVirtualMachineItemCloud *pFakeCloudMachineItem = pFakeMachineNode->cache()->toCloud();
-        AssertPtrReturnVoid(pFakeCloudMachineItem);
-        pFakeCloudMachineItem->setFakeCloudItemState(UIFakeCloudVirtualMachineItemState_Done);
-        pFakeCloudMachineItem->setFakeCloudItemErrorMessage(pAcquiringTask->errorInfo());
-    }
+    /* Compose old set of machine IDs: */
+    QSet<QUuid> oldIDs;
+    foreach (UIChooserNode *pNode, pProfileNode->nodes(UIChooserNodeType_Machine))
+    {
+        AssertPtrReturnVoid(pNode);
+        UIChooserNodeMachine *pNodeMachine = pNode->toMachineNode();
+        AssertPtrReturnVoid(pNodeMachine);
+        if (pNodeMachine->cacheType() != UIVirtualMachineItemType_CloudReal)
+            continue;
+        oldIDs << pNodeMachine->id();
+    }
+    /* Compose new set of machine IDs and map of machines: */
+    QSet<QUuid> newIDs;
+    QMap<QUuid, CCloudMachine> newMachines;
+    foreach (const CCloudMachine &comMachine, pAcquiringTask->result())
+    {
+        QUuid uId;
+        AssertReturnVoid(cloudMachineId(comMachine, uId));
+        newMachines[uId] = comMachine;
+        newIDs << uId;
+    }
+
+    /* Calculate set of unregistered/registered IDs: */
+    const QSet<QUuid> unregisteredIDs = oldIDs - newIDs;
+    const QSet<QUuid> registeredIDs = newIDs - oldIDs;
+    QVector<CCloudMachine> registeredMachines;
+    foreach (const QUuid &uId, registeredIDs)
+        registeredMachines << newMachines.value(uId);
+
+    /* Remove unregistered cloud VM nodes: */
+    if (!unregisteredIDs.isEmpty())
+        sltCloudMachinesUnregistered(pAcquiringTask->providerShortName(), pAcquiringTask->profileName(), unregisteredIDs.toList());
+    /* Add registered cloud VM nodes: */
+    if (!registeredMachines.isEmpty())
+        sltCloudMachinesRegistered(pAcquiringTask->providerShortName(), pAcquiringTask->profileName(), registeredMachines);
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.h	(revision 86610)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.h	(revision 86611)
@@ -172,4 +172,10 @@
                                                  const QString &strProfileName,
                                                  const QUuid &uId);
+        /** Handles cloud machine unregistering for a list of @a ids.
+          * @param  strProviderShortName  Brings provider short name.
+          * @param  strProfileName        Brings profile name. */
+        virtual void sltCloudMachinesUnregistered(const QString &strProviderShortName,
+                                                  const QString &strProfileName,
+                                                  const QList<QUuid> &ids);
         /** Handles cloud machine registering for @a comMachine.
           * @param  strProviderShortName  Brings provider short name.
@@ -178,4 +184,10 @@
                                                const QString &strProfileName,
                                                const CCloudMachine &comMachine);
+        /** Handles cloud machine registering for a list of @a machines.
+          * @param  strProviderShortName  Brings provider short name.
+          * @param  strProfileName        Brings profile name. */
+        virtual void sltCloudMachinesRegistered(const QString &strProviderShortName,
+                                                const QString &strProfileName,
+                                                const QVector<CCloudMachine> &machines);
 
         /** Handles list cloud machines task complete signal. */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserModel.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserModel.cpp	(revision 86610)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserModel.cpp	(revision 86611)
@@ -1169,4 +1169,19 @@
 }
 
+void UIChooserModel::sltCloudMachinesUnregistered(const QString &strProviderShortName,
+                                                  const QString &strProfileName,
+                                                  const QList<QUuid> &ids)
+{
+    /* Make sure no item with one of passed ids is selected: */
+    foreach (const QUuid &uId, ids)
+        makeSureNoItemWithCertainIdSelected(uId);
+
+    /* Call to base-class: */
+    UIChooserAbstractModel::sltCloudMachinesUnregistered(strProviderShortName, strProfileName, ids);
+
+    /* Rebuild tree for main root: */
+    buildTreeForMainRoot(true /* preserve selection */);
+}
+
 void UIChooserModel::sltCloudMachineRegistered(const QString &strProviderShortName,
                                                const QString &strProfileName,
@@ -1185,4 +1200,15 @@
                                               UIChooserItemSearchFlag_Machine |
                                               UIChooserItemSearchFlag_ExactId));
+}
+
+void UIChooserModel::sltCloudMachinesRegistered(const QString &strProviderShortName,
+                                                const QString &strProfileName,
+                                                const QVector<CCloudMachine> &machines)
+{
+    /* Call to base-class: */
+    UIChooserAbstractModel::sltCloudMachinesRegistered(strProviderShortName, strProfileName, machines);
+
+    /* Rebuild tree for main root: */
+    buildTreeForMainRoot(true /* preserve selection */);
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserModel.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserModel.h	(revision 86610)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserModel.h	(revision 86611)
@@ -282,4 +282,10 @@
                                                  const QString &strProfileName,
                                                  const QUuid &uId) /* override */;
+        /** Handles cloud machine unregistering for a list of @a ids.
+          * @param  strProviderShortName  Brings provider short name.
+          * @param  strProfileName        Brings profile name. */
+        virtual void sltCloudMachinesUnregistered(const QString &strProviderShortName,
+                                                  const QString &strProfileName,
+                                                  const QList<QUuid> &ids) /* override */;
         /** Handles cloud machine registering for @a comMachine.
           * @param  strProviderShortName  Brings provider short name.
@@ -288,4 +294,10 @@
                                                const QString &strProfileName,
                                                const CCloudMachine &comMachine) /* override */;
+        /** Handles cloud machine registering for a list of @a machines.
+          * @param  strProviderShortName  Brings provider short name.
+          * @param  strProfileName        Brings profile name. */
+        virtual void sltCloudMachinesRegistered(const QString &strProviderShortName,
+                                                const QString &strProfileName,
+                                                const QVector<CCloudMachine> &machines) /* override */;
 
         /** Handles list cloud machines task complete signal. */
