Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h	(revision 23881)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h	(revision 23882)
@@ -169,5 +169,9 @@
 
 /* VBoxManageVMInfo.cpp */
-void showSnapshots(ComPtr<ISnapshot> rootSnapshot, VMINFO_DETAILS details, const com::Bstr &prefix = "", int level = 0);
+void showSnapshots(ComPtr<ISnapshot> &rootSnapshot,
+                   ComPtr<ISnapshot> &currentSnapshot,
+                   VMINFO_DETAILS details,
+                   const com::Bstr &prefix = "",
+                   int level = 0);
 int handleShowVMInfo(HandlerArg *a);
 HRESULT showVMInfo(ComPtr<IVirtualBox> virtualBox,
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 23881)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 23882)
@@ -327,6 +327,6 @@
         RTPrintf("VBoxManage snapshot         <uuid>|<name>\n"
                  "                            take <name> [--description <desc>] [--pause] |\n"
-                 "                            discard <uuid>|<name> |\n"
-                 "                            discardcurrent --state|--all |\n"
+                 "                            delete <uuid>|<name> |\n"
+                 "                            restore <uuid>|<name> |\n"
                  "                            edit <uuid>|<name>|--current\n"
                  "                                 [--name <name>]\n"
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 23881)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 23882)
@@ -48,5 +48,9 @@
 ///////////////////////////////////////////////////////////////////////////////
 
-void showSnapshots(ComPtr<ISnapshot> rootSnapshot, VMINFO_DETAILS details, const Bstr &prefix /* = ""*/, int level /*= 0*/)
+void showSnapshots(ComPtr<ISnapshot> &rootSnapshot,
+                   ComPtr<ISnapshot> &currentSnapshot,
+                   VMINFO_DETAILS details,
+                   const Bstr &prefix /* = ""*/,
+                   int level /*= 0*/)
 {
     /* start with the root */
@@ -64,5 +68,10 @@
     {
         /* print with indentation */
-        RTPrintf("   %lSName: %lS (UUID: %s)\n", prefix.raw(), name.raw(), Utf8Str(uuid).raw());
+        bool fCurrent = (rootSnapshot == currentSnapshot);
+        RTPrintf("   %lSName: %lS (UUID: %s)%s\n",
+                 prefix.raw(),
+                 name.raw(),
+                 Utf8Str(uuid).raw(),
+                 (fCurrent) ? " *" : "");
     }
 
@@ -81,7 +90,10 @@
                     newPrefix = Utf8StrFmt("%lS-%d", prefix.raw(), index + 1);
                 else
+                {
                     newPrefix = Utf8StrFmt("%lS   ", prefix.raw());
+                }
+
                 /* recursive call */
-                showSnapshots(snapshot, details, newPrefix, level + 1);
+                showSnapshots(snapshot, currentSnapshot, details, newPrefix, level + 1);
             }
         }
@@ -1832,7 +1844,12 @@
     if (SUCCEEDED(rc) && snapshot)
     {
-        if (details != VMINFO_MACHINEREADABLE)
-            RTPrintf("Snapshots:\n\n");
-        showSnapshots(snapshot, details);
+        ComPtr<ISnapshot> currentSnapshot;
+        rc = machine->GetCurrentSnapshot(currentSnapshot.asOutParam());
+        if (SUCCEEDED(rc))
+        {
+            if (details != VMINFO_MACHINEREADABLE)
+                RTPrintf("Snapshots:\n\n");
+            showSnapshots(snapshot, currentSnapshot, details);
+        }
     }
 
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageSnapshot.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageSnapshot.cpp	(revision 23881)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageSnapshot.cpp	(revision 23882)
@@ -68,4 +68,5 @@
 
         /* switch based on the command */
+        bool fDelete = false, fRestore = false;
         if (!strcmp(a->argv[1], "take"))
         {
@@ -154,5 +155,7 @@
             }
         }
-        else if (!strcmp(a->argv[1], "discard"))
+        else if (    (fDelete = !strcmp(a->argv[1], "delete"))
+                  || (fRestore = !strcmp(a->argv[1], "restore"))
+                )
         {
             /* exactly one parameter: snapshot name */
@@ -164,5 +167,5 @@
             }
 
-            ComPtr<ISnapshot> snapshot;
+            ComPtr<ISnapshot> pSnapshot;
 
             /* assume it's a UUID */
@@ -170,46 +173,23 @@
             if (!guid.isEmpty())
             {
-                CHECK_ERROR_BREAK(machine, GetSnapshot(guid, snapshot.asOutParam()));
+                CHECK_ERROR_BREAK(machine, GetSnapshot(guid, pSnapshot.asOutParam()));
             }
             else
             {
                 /* then it must be a name */
-                CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(a->argv[2]), snapshot.asOutParam()));
-            }
-
-            snapshot->COMGETTER(Id)(guid.asOutParam());
-
-            ComPtr<IProgress> progress;
-            CHECK_ERROR_BREAK(console, DeleteSnapshot(guid, progress.asOutParam()));
-
-            showProgress(progress);
-            LONG iRc;
-            progress->COMGETTER(ResultCode)(&iRc);
-            rc = iRc;
-            if (FAILED(rc))
-            {
-                com::ProgressErrorInfo info(progress);
-                if (info.isBasicAvailable())
-                    RTPrintf("Error: failed to discard snapshot. Error message: %lS\n", info.getText().raw());
-                else
-                    RTPrintf("Error: failed to discard snapshot. No error message available!\n");
-            }
-        }
-        else if (!strcmp(a->argv[1], "discardcurrent"))
-        {
-            if (   (a->argc != 3)
-                || (   strcmp(a->argv[2], "--state")
-                    && strcmp(a->argv[2], "-state")))
-            {
-                errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(a->argv[2]).raw());
-                rc = E_FAIL;
-                break;
-            }
-
-            ComPtr<ISnapshot> pCurrentSnapshot;
-            CHECK_ERROR_BREAK(machine, COMGETTER(CurrentSnapshot)(pCurrentSnapshot.asOutParam()));
+                CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(a->argv[2]), pSnapshot.asOutParam()));
+                pSnapshot->COMGETTER(Id)(guid.asOutParam());
+            }
 
             ComPtr<IProgress> pProgress;
-            CHECK_ERROR_BREAK(console, RestoreSnapshot(pCurrentSnapshot, pProgress.asOutParam()));
+            if (fDelete)
+            {
+                CHECK_ERROR_BREAK(console, DeleteSnapshot(guid, pProgress.asOutParam()));
+            }
+            else
+            {
+                // must be restore
+                CHECK_ERROR_BREAK(console, RestoreSnapshot(pSnapshot, pProgress.asOutParam()));
+            }
 
             showProgress(pProgress);
@@ -221,9 +201,8 @@
                 com::ProgressErrorInfo info(pProgress);
                 if (info.isBasicAvailable())
-                    RTPrintf("Error: failed to restore snapshot. Error message: %lS\n", info.getText().raw());
-                else
-                    RTPrintf("Error: failed to restore snapshot. No error message available!\n");
-            }
-
+                    RTPrintf("Error: snapshot operation failed. Error message: %lS\n", info.getText().raw());
+                else
+                    RTPrintf("Error: snapshot operation failed. No error message available!\n");
+            }
         }
         else if (!strcmp(a->argv[1], "edit"))
Index: /trunk/src/VBox/Main/MachineImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/MachineImpl.cpp	(revision 23881)
+++ /trunk/src/VBox/Main/MachineImpl.cpp	(revision 23882)
@@ -7586,5 +7586,5 @@
     void handler()
     {
-        machine->discardSnapshotHandler(*this);
+        machine->deleteSnapshotHandler(*this);
     }
 
@@ -9445,5 +9445,5 @@
 
 /**
- * Helper struct for SessionMachine::discardSnapshotHandler().
+ * Helper struct for SessionMachine::deleteSnapshotHandler().
  */
 struct MediumDiscardRec
@@ -9484,5 +9484,5 @@
  * @note Locks mParent + this + child objects for writing!
  */
-void SessionMachine::discardSnapshotHandler(DeleteSnapshotTask &aTask)
+void SessionMachine::deleteSnapshotHandler(DeleteSnapshotTask &aTask)
 {
     LogFlowThisFuncEnter();
@@ -9895,4 +9895,7 @@
                 {
                     mSSData->mStateFilePath = stateFilePath;
+
+                    /* make the snapshot we restored from the current snapshot */
+                    mData->mCurrentSnapshot = aTask.pSnapshot;
                 }
                 else
Index: /trunk/src/VBox/Main/include/MachineImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/MachineImpl.h	(revision 23881)
+++ /trunk/src/VBox/Main/include/MachineImpl.h	(revision 23882)
@@ -1037,5 +1037,5 @@
     typedef std::map<ComObjPtr<Machine>, MachineState_T> AffectedMachines;
 
-    void discardSnapshotHandler(DeleteSnapshotTask &aTask);
+    void deleteSnapshotHandler(DeleteSnapshotTask &aTask);
     void restoreSnapshotHandler(RestoreSnapshotTask &aTask);
 
