Index: trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp
===================================================================
--- trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp	(revision 2981)
+++ trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp	(revision 3077)
@@ -210,4 +210,19 @@
 // funcs
 ///////////////////////////////////////////////////////////////////////////////
+
+static void showLogo(void)
+{
+    static bool fShown; /* show only once */
+
+    if (!fShown)
+    {
+        RTPrintf("VirtualBox Command Line Management Interface Version %s\n"
+                 "(C) 2005-2007 innotek GmbH\n"
+                 "All rights reserved.\n"
+                 "\n",
+                 VBOX_VERSION_STRING);
+        fShown = true;
+    }
+}
 
 static void printUsage(USAGECATEGORY u64Cmd)
@@ -244,4 +259,10 @@
     RTPrintf("Usage:\n"
              "\n");
+
+    if (u64Cmd == USAGE_ALL)
+    {
+        RTPrintf("VBoxManage -nologo ...      suppress the logo\n"
+                 "\n");
+    }
 
     if (u64Cmd & USAGE_LIST)
@@ -567,4 +588,5 @@
 {
     va_list args;
+    showLogo(); // show logo even if suppressed
     if (fInternalMode)
         printUsageInternal(u64Cmd);
@@ -6105,29 +6127,44 @@
     RTR3Init(false);
 
-    RTPrintf("VirtualBox Command Line Management Interface Version %s\n"
-             "(C) 2005-2007 innotek GmbH\n"
-             "All rights reserved.\n"
-             "\n",
-             VBOX_VERSION_STRING);
-
-    /* shortcut for no parameters or help */
-    if (    (argc < 2)
-        ||  (strcmp(argv[1], "help") == 0)
-        ||  (strcmp(argv[1], "-?") == 0)
-        ||  (strcmp(argv[1], "-h") == 0)
-        ||  (strcmp(argv[1], "-help") == 0)
-        ||  (strcmp(argv[1], "--help") == 0))
-    {
-        printUsage(USAGE_ALL);
-        return 0;
-    }
-
-    /* Special option to dump really all commands, even the ones not
-     * understood on this platform. */
-    if (argc == 2 && strcmp(argv[1], "-dumpopts") == 0)
-    {
-        printUsage(USAGE_DUMPOPTS);
-        return 0;
-    }
+    bool fShowLogo = true;
+    int  iCmd      = 1;
+    int  iCmdArg;
+
+    for (int i = 1; i < argc || argc <= iCmd; i++)
+    {
+        if (    argc <= iCmd
+            ||  (strcmp(argv[i], "help")   == 0)
+            ||  (strcmp(argv[i], "-?")     == 0)
+            ||  (strcmp(argv[i], "-h")     == 0)
+            ||  (strcmp(argv[i], "-help")  == 0)
+            ||  (strcmp(argv[i], "--help") == 0))
+        {
+            showLogo();
+            printUsage(USAGE_ALL);
+            return 0;
+        }
+        else if (strcmp(argv[i], "-nologo") == 0)
+        {
+            /* suppress the logo */
+            fShowLogo = false;
+            iCmd++;
+        }
+        else if (strcmp(argv[i], "-dumpopts") == 0)
+        {
+            /* Special option to dump really all commands,
+             * even the ones not understood on this platform. */
+            printUsage(USAGE_DUMPOPTS);
+            return 0;
+        }
+        else
+        {
+            break;
+        }
+    }
+
+    iCmdArg = iCmd + 1;
+
+    if (fShowLogo)
+        showLogo();
 
     HRESULT rc;
@@ -6140,5 +6177,5 @@
      * For simplicity, just convert the argv[] array here.
      */
-    for (int i = 2; i < argc; i++)
+    for (int i = iCmdArg; i < argc; i++)
     {
         char *converted;
@@ -6153,14 +6190,14 @@
 
     /* update settings command (no VirtualBox instantiation!) */
-    if (argc >= 2 && (strcmp(argv[1], "updatesettings") == 0))
-    {
-        rc = handleUpdateSettings(argc - 2, argv + 2);
+    if (argc >= iCmdArg && (strcmp(argv[iCmd], "updatesettings") == 0))
+    {
+        rc = handleUpdateSettings(argc - iCmdArg, argv + iCmdArg);
         break;
     }
 
     /* convertdd: does not need a VirtualBox instantiation) */
-    if (argc >= 2 && (strcmp(argv[1], "convertdd") == 0))
-    {
-        rc = handleConvertDDImage(argc - 2, argv + 2);
+    if (argc >= iCmdArg && (strcmp(argv[iCmd], "convertdd") == 0))
+    {
+        rc = handleConvertDDImage(argc - iCmdArg, argv + iCmdArg);
         break;
     }
@@ -6189,4 +6226,5 @@
      * (here it is necessary only to process remaining XPCOM/IPC events
      * after the session is closed) */
+
     EventQueue eventQ;
 
@@ -6233,7 +6271,7 @@
     for (commandIndex = 0; commandHandlers[commandIndex].command != NULL; commandIndex++)
     {
-        if (strcmp(commandHandlers[commandIndex].command, argv[1]) == 0)
-        {
-            rc = commandHandlers[commandIndex].handler(argc - 2, &argv[2], virtualBox, session);
+        if (strcmp(commandHandlers[commandIndex].command, argv[iCmd]) == 0)
+        {
+            rc = commandHandlers[commandIndex].handler(argc - iCmdArg, &argv[iCmdArg], virtualBox, session);
             break;
         }
@@ -6241,5 +6279,5 @@
     if (!commandHandlers[commandIndex].command)
     {
-        rc = errorSyntax(USAGE_ALL, "Invalid command '%s'", Utf8Str(argv[1]).raw());
+        rc = errorSyntax(USAGE_ALL, "Invalid command '%s'", Utf8Str(argv[iCmd]).raw());
     }
 
@@ -6255,8 +6293,6 @@
      * Free converted argument vector
      */
-    for (int i = 2; i < argc; i++)
-    {
+    for (int i = iCmdArg; i < argc; i++)
         RTStrFree(argv[i]);
-    }
 
     return rc;
