Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h	(revision 23568)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h	(revision 23569)
@@ -140,4 +140,5 @@
 void printUsage(USAGECATEGORY u64Cmd);
 int errorSyntax(USAGECATEGORY u64Cmd, const char *pszFormat, ...);
+int errorGetOpt(USAGECATEGORY u64Cmd, int rc, union RTGETOPTUNION const *pValueUnion);
 int errorArgument(const char *pszFormat, ...);
 
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 23568)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 23569)
@@ -20,6 +20,7 @@
  */
 
+#include <iprt/ctype.h>
+#include <iprt/getopt.h>
 #include <iprt/stream.h>
-#include <iprt/getopt.h>
 
 #include "VBoxManage.h"
@@ -335,5 +336,5 @@
     {
         RTPrintf("VBoxManage snapshot         <uuid>|<name>\n"
-                 "                            take <name> [--description <desc>] |\n"
+                 "                            take <name> [--description <desc>] [--pause] |\n"
                  "                            discard <uuid>|<name> |\n"
                  "                            discardcurrent --state|--all |\n"
@@ -589,4 +590,38 @@
 
 /**
+ * errorSyntax for RTGetOpt users.
+ *
+ * @returns 1.
+ *
+ * @param   fUsageCategory  The usage category of the command.
+ * @param   rc              The RTGetOpt return code.
+ * @param   pValueUnion     The value union.
+ */
+int errorGetOpt(USAGECATEGORY fUsageCategory, int rc, union RTGETOPTUNION const *pValueUnion)
+{
+    showLogo(); // show logo even if suppressed
+#ifndef VBOX_ONLY_DOCS
+    if (g_fInternalMode)
+        printUsageInternal(fUsageCategory);
+    else
+        printUsage(fUsageCategory);
+#endif /* !VBOX_ONLY_DOCS */
+
+    if (rc == VINF_GETOPT_NOT_OPTION)
+        return RTPrintf("error: Invalid parameter '%s'", pValueUnion->psz);
+    if (rc > 0)
+    {
+        if (RT_C_IS_PRINT(rc))
+            return RTPrintf("error: Invalid option -%c", rc);
+        return RTPrintf("error: Invalid option case %i", rc);
+    }
+    if (rc == VERR_GETOPT_UNKNOWN_OPTION)
+        return RTPrintf("error: unknown option: %s\n", pValueUnion->psz);
+    if (pValueUnion->pDef)
+        return RTPrintf("error: %s: %Rrs", pValueUnion->pDef->pszLong, rc);
+    return RTPrintf("error: %Rrs", rc);
+}
+
+/**
  * Print an error message without the syntax stuff.
  */
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageSnapshot.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageSnapshot.cpp	(revision 23568)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageSnapshot.cpp	(revision 23569)
@@ -78,16 +78,51 @@
             }
             Bstr name(a->argv[2]);
-            if ((a->argc > 3) && (   (a->argc != 5)
-                                  || (   strcmp(a->argv[3], "--description")
-                                      && strcmp(a->argv[3], "-description")
-                                      && strcmp(a->argv[3], "-desc"))))
-            {
-                errorSyntax(USAGE_SNAPSHOT, "Incorrect description format");
-                rc = E_FAIL;
-                break;
-            }
+
+            /* parse the optional arguments */
             Bstr desc;
-            if (a->argc == 5)
-                desc = a->argv[4];
+            bool fPause = false;
+            static const RTGETOPTDEF s_aTakeOptions[] =
+            {
+                { "--description", 'd', RTGETOPT_REQ_STRING },
+                { "-description",  'd', RTGETOPT_REQ_STRING },
+                { "-desc",         'd', RTGETOPT_REQ_STRING },
+                { "--pause",       'p', RTGETOPT_REQ_NOTHING }
+            };
+            RTGETOPTSTATE GetOptState;
+            RTGetOptInit(&GetOptState, a->argc, a->argv, s_aTakeOptions, RT_ELEMENTS(s_aTakeOptions), 3, 0 /*fFlags*/);
+            int ch;
+            RTGETOPTUNION Value;
+            while (   SUCCEEDED(rc)
+                   && (ch = RTGetOpt(&GetOptState, &Value)))
+            {
+                switch (ch)
+                {
+                    case 'p':
+                        fPause = true;
+                        break;
+
+                    case 'd':
+                        desc = Value.psz;
+                        break;
+
+                    default:
+                        errorGetOpt(USAGE_SNAPSHOT, ch, &Value);
+                        rc = E_FAIL;
+                        break;
+                }
+            }
+            if (FAILED(rc))
+                break;
+
+            if (fPause)
+            {
+                MachineState_T machineState;
+                CHECK_ERROR_BREAK(console, COMGETTER(State)(&machineState));
+                if (machineState == MachineState_Running)
+                    CHECK_ERROR_BREAK(console, Pause());
+                else
+                    fPause = false;
+            }
+
             ComPtr<IProgress> progress;
             CHECK_ERROR_BREAK(console, TakeSnapshot(name, desc, progress.asOutParam()));
@@ -105,4 +140,17 @@
                     RTPrintf("Error: failed to take snapshot. No error message available!\n");
             }
+
+            if (fPause)
+            {
+                MachineState_T machineState;
+                CHECK_ERROR_BREAK(console, COMGETTER(State)(&machineState));
+                if (machineState == MachineState_Paused)
+                {
+                    if (SUCCEEDED(rc))
+                        CHECK_ERROR_BREAK(console, Resume());
+                    else
+                        console->Pause();
+                }
+            }
         }
         else if (!strcmp(a->argv[1], "discard"))
