Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolManager.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolManager.cpp	(revision 84216)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolManager.cpp	(revision 84217)
@@ -1090,6 +1090,6 @@
 };
 
-/** Simple action extension, used as 'Perform Discard' action class. */
-class UIActionSimpleSelectorCommonPerformDiscard : public UIActionSimple
+/** Polymorphic menu action extension, used as 'Perform Discard' action class. */
+class UIActionSimpleSelectorCommonPerformDiscard : public UIActionPolymorphicMenu
 {
     Q_OBJECT;
@@ -1099,8 +1099,11 @@
     /** Constructs action passing @a pParent to the base-class. */
     UIActionSimpleSelectorCommonPerformDiscard(UIActionPool *pParent)
-        : UIActionSimple(pParent,
-                         ":/vm_discard_32px.png", ":/vm_discard_16px.png",
-                         ":/vm_discard_disabled_32px.png", ":/vm_discard_disabled_16px.png")
-    {}
+        : UIActionPolymorphicMenu(pParent,
+                                  ":/vm_discard_32px.png", ":/vm_discard_16px.png",
+                                  ":/vm_discard_disabled_32px.png", ":/vm_discard_disabled_16px.png")
+    {
+        /* Hide menu always: */
+        hideMenu();
+    }
 
 protected:
@@ -1115,8 +1118,25 @@
     virtual void retranslateUi() /* override */
     {
-        setIconText(QApplication::translate("UIActionPool", "Discard"));
-        setName(QApplication::translate("UIActionPool", "D&iscard Saved State..."));
-        setStatusTip(QApplication::translate("UIActionPool", "Discard saved state of selected virtual machines"));
-        setToolTip(simplifyText(text()) + (shortcut().isEmpty() ? QString() : QString(" (%1)").arg(shortcut().toString())));
+        switch (state())
+        {
+            case 0:
+            {
+                setIconText(QApplication::translate("UIActionPool", "Discard"));
+                setName(QApplication::translate("UIActionPool", "D&iscard Saved State..."));
+                setStatusTip(QApplication::translate("UIActionPool", "Discard saved state of selected virtual machines"));
+                setToolTip(simplifyText(text()) + (shortcut().isEmpty() ? QString() : QString(" (%1)").arg(shortcut().toString())));
+                break;
+            }
+            case 1:
+            {
+                setIconText(QApplication::translate("UIActionPool", "Terminate"));
+                setName(QApplication::translate("UIActionPool", "&Terminate Cloud Instance..."));
+                setStatusTip(QApplication::translate("UIActionPool", "Terminate cloud instance of selected virtual machines"));
+                setToolTip(simplifyText(text()) + (shortcut().isEmpty() ? QString() : QString(" (%1)").arg(shortcut().toString())));
+                break;
+            }
+            default:
+                break;
+        }
     }
 };
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp	(revision 84216)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp	(revision 84217)
@@ -838,4 +838,14 @@
 }
 
+bool UIMessageCenter::confirmTerminateCloudInstance(const QString &strNames) const
+{
+    return questionBinary(0, MessageType_Question,
+                          tr("<p>Are you sure you want to terminate the cloud instance "
+                             "of the following virtual machines?</p><p><b>%1</b></p>")
+                             .arg(strNames),
+                          0 /* auto-confirm id */,
+                          tr("Terminate", "cloud instance"));
+}
+
 bool UIMessageCenter::confirmResetMachine(const QString &strNames) const
 {
@@ -892,4 +902,20 @@
              .arg(CMachine(machine).GetName()),
           UIErrorString::formatErrorInfo(machine));
+}
+
+void UIMessageCenter::cannotTerminateCloudInstance(const CCloudMachine &comMachine) const
+{
+    error(0, MessageType_Error,
+          tr("Failed to terminate the cloud instance of the virtual machine <b>%1</b>.")
+             .arg(CCloudMachine(comMachine).GetName()),
+          UIErrorString::formatErrorInfo(comMachine));
+}
+
+void UIMessageCenter::cannotTerminateCloudInstance(const CProgress &comProgress, const QString &strMachineName) const
+{
+    error(0, MessageType_Error,
+          tr("Failed to terminate the cloud instance of the virtual machine <b>%1</b>.")
+             .arg(strMachineName),
+          UIErrorString::formatErrorInfo(comProgress));
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h	(revision 84216)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h	(revision 84217)
@@ -281,4 +281,5 @@
     bool warnAboutInaccessibleMedia() const;
     bool confirmDiscardSavedState(const QString &strNames) const;
+    bool confirmTerminateCloudInstance(const QString &strNames) const;
     bool confirmResetMachine(const QString &strNames) const;
     bool confirmACPIShutdownMachine(const QString &strNames) const;
@@ -287,4 +288,6 @@
     void cannotResumeMachine(const CConsole &console) const;
     void cannotDiscardSavedState(const CMachine &machine) const;
+    void cannotTerminateCloudInstance(const CCloudMachine &comMachine) const;
+    void cannotTerminateCloudInstance(const CProgress &comProgress, const QString &strMachineName) const;
     void cannotSaveMachineState(const CMachine &machine);
     void cannotSaveMachineState(const CProgress &progress, const QString &strMachineName);
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.cpp	(revision 84216)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.cpp	(revision 84217)
@@ -26,4 +26,5 @@
 #include "UIActionPoolManager.h"
 #include "UICloudMachineSettingsDialog.h"
+#include "UICloudNetworkingStuff.h"
 #include "UICloudProfileManager.h"
 #include "UIDesktopServices.h"
@@ -760,25 +761,37 @@
     AssertMsgReturnVoid(!items.isEmpty(), ("At least one item should be selected!\n"));
 
-    /* Prepare the list of the machines to be discarded: */
-    QStringList machineNames;
+    /* Prepare the list of the machines to be discarded/terminated: */
+    QStringList machinesToDiscard;
+    QStringList machinesToTerminate;
     QList<UIVirtualMachineItem*> itemsToDiscard;
+    QList<UIVirtualMachineItem*> itemsToTerminate;
     foreach (UIVirtualMachineItem *pItem, items)
     {
         if (isActionEnabled(UIActionIndexST_M_Group_S_Discard, QList<UIVirtualMachineItem*>() << pItem))
         {
-            machineNames << pItem->name();
-            itemsToDiscard << pItem;
-        }
-    }
-    AssertMsg(!machineNames.isEmpty(), ("This action should not be allowed!"));
-
-    /* Confirm discarding saved VM state: */
-    if (!msgCenter().confirmDiscardSavedState(machineNames.join(", ")))
+            if (pItem->itemType() == UIVirtualMachineItemType_Local)
+            {
+                machinesToDiscard << pItem->name();
+                itemsToDiscard << pItem;
+            }
+            else if (pItem->itemType() == UIVirtualMachineItemType_CloudReal)
+            {
+                machinesToTerminate << pItem->name();
+                itemsToTerminate << pItem;
+            }
+        }
+    }
+    AssertMsg(!machinesToDiscard.isEmpty() || !machinesToTerminate.isEmpty(), ("This action should not be allowed!"));
+
+    /* Confirm discarding/terminating: */
+    if (   (machinesToDiscard.isEmpty() || !msgCenter().confirmDiscardSavedState(machinesToDiscard.join(", ")))
+        && (machinesToTerminate.isEmpty() || !msgCenter().confirmTerminateCloudInstance(machinesToTerminate.join(", "))))
         return;
 
-    /* For every confirmed item: */
+    /* For every confirmed item to discard: */
     foreach (UIVirtualMachineItem *pItem, itemsToDiscard)
     {
         /* Open a session to modify VM: */
+        AssertPtrReturnVoid(pItem);
         CSession comSession = uiCommon().openSession(pItem->id());
         if (comSession.isNull())
@@ -793,4 +806,32 @@
         /* Unlock machine finally: */
         comSession.UnlockMachine();
+    }
+
+    /* For every confirmed item to terminate: */
+    foreach (UIVirtualMachineItem *pItem, itemsToTerminate)
+    {
+        /* Get cloud machine: */
+        AssertPtrReturnVoid(pItem);
+        UIVirtualMachineItemCloud *pCloudItem = pItem->toCloud();
+        AssertPtrReturnVoid(pCloudItem);
+        CCloudMachine comMachine = pCloudItem->machine();
+
+        /* Acquire machine name: */
+        QString strName;
+        if (!cloudMachineName(comMachine, strName))
+            continue;
+
+        /* Prepare terminate cloud instance progress: */
+        CProgress comProgress = comMachine.Terminate();
+        if (!comMachine.isOk())
+        {
+            msgCenter().cannotTerminateCloudInstance(comMachine);
+            continue;
+        }
+
+        /* Show terminate cloud instance progress: */
+        msgCenter().showModalProgressDialog(comProgress, strName, ":/progress_media_delete_90px.png"); /// @todo use proper icon
+        if (!comProgress.isOk() || comProgress.GetResultCode() != 0)
+            msgCenter().cannotTerminateCloudInstance(comProgress, strName);
     }
 }
@@ -1887,4 +1928,18 @@
     UIVirtualMachineItem *pItem = currentItem();
 
+    /* Discard/Terminate action is deremined by 1st item: */
+    if (   pItem
+        && (   pItem->itemType() == UIVirtualMachineItemType_CloudFake
+            || pItem->itemType() == UIVirtualMachineItemType_CloudReal))
+    {
+        actionPool()->action(UIActionIndexST_M_Group_S_Discard)->toActionPolymorphicMenu()->setState(1);
+        actionPool()->action(UIActionIndexST_M_Machine_S_Discard)->toActionPolymorphicMenu()->setState(1);
+    }
+    else
+    {
+        actionPool()->action(UIActionIndexST_M_Group_S_Discard)->toActionPolymorphicMenu()->setState(0);
+        actionPool()->action(UIActionIndexST_M_Machine_S_Discard)->toActionPolymorphicMenu()->setState(0);
+    }
+
     /* Start/Show action is deremined by 1st item: */
     if (pItem && pItem->accessible())
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualMachineItemCloud.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualMachineItemCloud.cpp	(revision 84216)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualMachineItemCloud.cpp	(revision 84217)
@@ -185,5 +185,6 @@
 bool UIVirtualMachineItemCloud::isItemSaved() const
 {
-    return false;
+    return    accessible()
+           && machineState() == KCloudMachineState_Stopped;
 }
 
