Index: Application/Shell/Shell.c
===================================================================
--- Application/Shell/Shell.c	(revision 14400)
+++ Application/Shell/Shell.c	(working copy)
@@ -381,7 +381,7 @@
         Status = DoStartupScript(ShellInfoObject.ImageDevPath, ShellInfoObject.FileDevPath);
       }
 
-      if (!ShellCommandGetExit() && (PcdGet8(PcdShellSupportLevel) >= 3 || PcdGetBool(PcdShellForceConsole)) && !EFI_ERROR(Status) && !ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleIn) {
+      if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.Exit && !ShellCommandGetExit() && (PcdGet8(PcdShellSupportLevel) >= 3 || PcdGetBool(PcdShellForceConsole)) && !EFI_ERROR(Status) && !ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleIn) {
         //
         // begin the UI waiting loop
         //
@@ -642,6 +642,7 @@
   {L"-noversion",     TypeFlag},
   {L"-startup",       TypeFlag},
   {L"-delay",         TypeValue},
+  {L"-_exit",         TypeFlag},
   {NULL, TypeMax}
   };
 
@@ -749,6 +750,7 @@
   ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoMap        = ShellCommandLineGetFlag(Package, L"-nomap");
   ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoVersion    = ShellCommandLineGetFlag(Package, L"-noversion");
   ShellInfoObject.ShellInitSettings.BitUnion.Bits.Delay        = ShellCommandLineGetFlag(Package, L"-delay");
+  ShellInfoObject.ShellInitSettings.BitUnion.Bits.Exit         = ShellCommandLineGetFlag(Package, L"-_exit");
 
   ShellInfoObject.ShellInitSettings.Delay = 5;
 
Index: Application/Shell/Shell.h
===================================================================
--- Application/Shell/Shell.h	(revision 14400)
+++ Application/Shell/Shell.h	(working copy)
@@ -71,7 +71,8 @@
   UINT32  NoMap:1;        ///< Was "-nomap"         found on command line.
   UINT32  NoVersion:1;    ///< Was "-noversion"     found on command line.
   UINT32  Delay:1;        ///< Was "-delay[:n]      found on command line
-  UINT32  Reserved:8;     ///< Extra bits
+  UINT32  Exit:1;         ///< Was "-_exit"          found on command line
+  UINT32  Reserved:7;     ///< Extra bits
 } SHELL_BITS;
 
 typedef union {
Index: Application/Shell/ShellProtocol.c
===================================================================
--- Application/Shell/ShellProtocol.c	(revision 14400)
+++ Application/Shell/ShellProtocol.c	(working copy)
@@ -1594,7 +1594,7 @@
   Temp = NULL;
   Size = 0;
   ASSERT((Temp == NULL && Size == 0) || (Temp != NULL));
-  StrnCatGrow(&Temp, &Size, L"Shell.efi ", 0);
+  StrnCatGrow(&Temp, &Size, L"Shell.efi -_exit ", 0);
   StrnCatGrow(&Temp, &Size, CommandLine, 0);
 
   Status = InternalShellExecuteDevicePath(
