Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolManager.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolManager.cpp	(revision 84544)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolManager.cpp	(revision 84545)
@@ -653,5 +653,5 @@
     /** Constructs action passing @a pParent to the base-class. */
     UIActionSimpleSelectorMachineMoveToGroupNew(UIActionPool *pParent)
-        : UIActionSimple(pParent, ":/vm_group_create_16px.png", ":/vm_group_create_disabled_16px.png")
+        : UIActionSimple(pParent)
     {}
 
@@ -667,5 +667,5 @@
     virtual void retranslateUi() /* override */
     {
-        setName(QApplication::translate("UIActionPool", "&New"));
+        setName(QApplication::translate("UIActionPool", "[New]"));
         setStatusTip(QApplication::translate("UIActionPool", "Add new group based on selected virtual machines"));
     }
@@ -3369,6 +3369,5 @@
     pMenu->addAction(action(UIActionIndexST_M_Machine_M_MoveToGroup_S_New));
 
-    /* Mark menu as valid (for now): */
-    m_invalidations.remove(UIActionIndexST_M_Machine_M_MoveToGroup);
+    /* This menu always remains invalid.. */
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.cpp	(revision 84544)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.cpp	(revision 84545)
@@ -794,4 +794,12 @@
 }
 
+void UIVirtualBoxManager::sltPerformMachineMoveToSpecificGroup()
+{
+    AssertPtrReturnVoid(sender());
+    QAction *pAction = qobject_cast<QAction*>(sender());
+    AssertPtrReturnVoid(pAction);
+    m_pWidget->moveMachineToGroup(pAction->text());
+}
+
 void UIVirtualBoxManager::sltPerformStartOrShowMachine()
 {
@@ -1469,4 +1477,5 @@
     /* Prepare menu update-handlers: */
     m_menuUpdateHandlers[UIActionIndexST_M_Group_M_Close] = &UIVirtualBoxManager::updateMenuGroupClose;
+    m_menuUpdateHandlers[UIActionIndexST_M_Machine_M_MoveToGroup] = &UIVirtualBoxManager::updateMenuMachineMoveToGroup;
     m_menuUpdateHandlers[UIActionIndexST_M_Machine_M_Close] = &UIVirtualBoxManager::updateMenuMachineClose;
 
@@ -1908,4 +1917,17 @@
 }
 
+void UIVirtualBoxManager::updateMenuMachineMoveToGroup(QMenu *pMenu)
+{
+    /* Get current item: */
+    UIVirtualMachineItem *pItem = currentItem();
+    AssertMsgReturnVoid(pItem, ("Current item should be selected!\n"));
+
+    const QStringList groups = m_pWidget->possibleGroupsForMachineToMove(pItem->id());
+    if (!groups.isEmpty())
+        pMenu->addSeparator();
+    foreach (const QString &strGroupName, groups)
+        pMenu->addAction(strGroupName, this, &UIVirtualBoxManager::sltPerformMachineMoveToSpecificGroup);
+}
+
 void UIVirtualBoxManager::updateMenuMachineClose(QMenu *)
 {
@@ -2218,5 +2240,4 @@
         {
             return !isGroupSavingInProgress() &&
-                   !isAllItemsOfOneGroupSelected() &&
                    isItemsLocal(items) &&
                    isItemsPoweredOff(items);
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.h	(revision 84544)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.h	(revision 84545)
@@ -225,4 +225,6 @@
         /** Handles call to move machine to a new group. */
         void sltPerformMachineMoveToNewGroup();
+        /** Handles call to move machine to a specific group. */
+        void sltPerformMachineMoveToSpecificGroup();
 
         /** Handles call to start or show machine. */
@@ -345,4 +347,6 @@
         /** Updates 'Group' : 'Close' menu. */
         void updateMenuGroupClose(QMenu *pMenu);
+        /** Updates 'Machine' : 'Move to Group' menu. */
+        void updateMenuMachineMoveToGroup(QMenu *pMenu);
         /** Updates 'Machine' : 'Close' menu. */
         void updateMenuMachineClose(QMenu *pMenu);
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManagerWidget.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManagerWidget.cpp	(revision 84544)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManagerWidget.cpp	(revision 84545)
@@ -134,4 +134,9 @@
 {
     m_pPaneChooser->moveMachineToGroup(strName);
+}
+
+QStringList UIVirtualBoxManagerWidget::possibleGroupsForMachineToMove(const QUuid &uId)
+{
+    return m_pPaneChooser->possibleGroupsForMachineToMove(uId);
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManagerWidget.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManagerWidget.h	(revision 84544)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManagerWidget.h	(revision 84545)
@@ -148,4 +148,6 @@
         /** Moves machine to a group with certain @a strName. */
         void moveMachineToGroup(const QString &strName = QString());
+        /** Returns possible groups for VM with passed @a uId to move to. */
+        QStringList possibleGroupsForMachineToMove(const QUuid &uId);
         /** Refreshes machine. */
         void refreshMachine();
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooser.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooser.cpp	(revision 84544)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooser.cpp	(revision 84545)
@@ -135,4 +135,10 @@
     AssertPtrReturnVoid(model());
     model()->moveSelectedMachineItemsToGroupItem(strName);
+}
+
+QStringList UIChooser::possibleGroupsForMachineToMove(const QUuid &uId)
+{
+    AssertPtrReturn(model(), QStringList());
+    return model()->possibleGroupNodeNamesForMachineNodeToMove(uId);
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooser.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooser.h	(revision 84544)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooser.h	(revision 84545)
@@ -142,4 +142,6 @@
         /** Moves machine to a group with certain @a strName. */
         void moveMachineToGroup(const QString &strName);
+        /** Returns possible groups for VM with passed @a uId to move to. */
+        QStringList possibleGroupsForMachineToMove(const QUuid &uId);
         /** Refreshes machine. */
         void refreshMachine();
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.cpp	(revision 84544)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.cpp	(revision 84545)
@@ -514,4 +514,16 @@
 {
     wipeOutEmptyGroupsStartingFrom(invisibleRoot());
+}
+
+QStringList UIChooserAbstractModel::possibleGroupNodeNamesForMachineNodeToMove(const QUuid &uId)
+{
+    /* Search for all the machine nodes with passed ID: */
+    QList<UIChooserNode*> machineNodes;
+    invisibleRoot()->searchForNodes(toOldStyleUuid(uId),
+                                    UIChooserItemSearchFlag_Machine | UIChooserItemSearchFlag_ExactId,
+                                    machineNodes);
+
+    /* Return group nodes starting from root one: */
+    return gatherPossibleGroupNodeNames(invisibleRoot(), machineNodes);
 }
 
@@ -1300,4 +1312,36 @@
 }
 
+QStringList UIChooserAbstractModel::gatherPossibleGroupNodeNames(UIChooserNode *pCurrentNode, QList<UIChooserNode*> exceptions) const
+{
+    /* Prepare result: */
+    QStringList result;
+
+    /* Walk through all the children and make sure there are no exceptions: */
+    bool fAddCurrent = true;
+    foreach (UIChooserNode *pChild, pCurrentNode->nodes(UIChooserNodeType_Any))
+    {
+        AssertPtrReturn(pChild, result);
+        if (exceptions.contains(pChild))
+            fAddCurrent = false;
+        else
+        {
+            if (pChild->type() == UIChooserNodeType_Group)
+            {
+                UIChooserNodeGroup *pChildGroup = pChild->toGroupNode();
+                AssertPtrReturn(pChildGroup, result);
+                if (pChildGroup->groupType() == UIChooserNodeGroupType_Local)
+                    result << gatherPossibleGroupNodeNames(pChild, exceptions);
+            }
+        }
+    }
+
+    /* Add current item if not overridden: */
+    if (fAddCurrent)
+        result.prepend(pCurrentNode->fullName());
+
+    /* Return result: */
+    return result;
+}
+
 void UIChooserAbstractModel::saveGroupSettings()
 {
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.h	(revision 84544)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserAbstractModel.h	(revision 84545)
@@ -79,4 +79,7 @@
         /** Wipes out empty groups. */
         void wipeOutEmptyGroups();
+
+        /** Returns possible group node names for VM node with passed @a uId to move to. */
+        QStringList possibleGroupNodeNamesForMachineNodeToMove(const QUuid &uId);
 
         /** Generates unique group name traversing recursively starting from @a pRoot. */
@@ -220,4 +223,7 @@
         /** Creates cloud machine node based on certain @a comMachine as a child of specified @a pParentNode. */
         void createCloudMachineNode(UIChooserNode *pParentNode, const CCloudMachine &comMachine);
+
+        /** Gathers a list of possible group node names for machine nodes listed in @a exceptions, starting from @a pCurrentNode. */
+        QStringList gatherPossibleGroupNodeNames(UIChooserNode *pCurrentNode, QList<UIChooserNode*> exceptions) const;
     /** @} */
 
