diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 0616857bed219c88ac27f3667c43bcb493b90774..2836be5d55724149286c36f28cbd25e9514ae6e5 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -6043,8 +6043,9 @@ A jump table for the options with a short description can be found at |Q_op|.
 
 						*'shellxquote'* *'sxq'*
 'shellxquote' 'sxq'	string	(default: "";
-					for Win32, when 'shell' is cmd.exe or
-					contains "sh" somewhere: "\""
+					for Win32, when 'shell' is cmd.exe: "("
+					for Win32, when 'shell' contains "sh"
+					somewhere: "\""
 					for Unix, when using system(): "\"")
 			global
 			{not in Vi}
@@ -6052,6 +6053,9 @@ A jump table for the options with a short description can be found at |Q_op|.
 	the "!" and ":!" commands.  Includes the redirection.  See
 	'shellquote' to exclude the redirection.  It's probably not useful
 	to set both options.
+	When the value is '(' then ')' is appended. When the value is '"('
+	then ')"' is appended.
+	When the value is '(' then also see 'shellxescape'.
 	This is an empty string by default on most systems, but is known to be
 	useful for on Win32 version, either for cmd.exe which automatically
 	strips off the first and last quote on a command, or 3rd-party shells
@@ -6061,6 +6065,16 @@ A jump table for the options with a short description can be found at |Q_op|.
 	This option cannot be set from a |modeline| or in the |sandbox|, for
 	security reasons.
 
+						*'shellxescape'* *'sxe'*
+'shellxescape' 'sxe'	string	(default: "";
+				 for MS-DOS and MS-Windows: "\"&|<>()@^")
+			global
+			{not in Vi}
+	When 'shellxquote' is set to "(" then the characters listed in this
+	option will be escaped with a '^' character.  This makes it possible
+	to execute most external commands with cmd.exe.
+
+
 			*'shiftround'* *'sr'* *'noshiftround'* *'nosr'*
 'shiftround' 'sr'	boolean	(default off)
 			global
diff --git a/src/misc2.c b/src/misc2.c
index fc38cd029498c6c008def97ebf6a4ac71abc6854..045117fe022c1b92114f9d6d569852307206ac9f 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -3225,11 +3225,19 @@ call_shell(cmd, opt)
 	    retval = mch_call_shell(cmd, opt);
 	else
 	{
-	    ncmd = alloc((unsigned)(STRLEN(cmd) + STRLEN(p_sxq) * 2 + 1));
+	    char_u *ecmd = cmd;
+
+	    if (*p_sxe != NUL && STRCMP(p_sxq, "(") == 0)
+	    {
+		ecmd = vim_strsave_escaped_ext(cmd, p_sxe, '^', FALSE);
+		if (ecmd == NULL)
+		    ecmd = cmd;
+	    }
+	    ncmd = alloc((unsigned)(STRLEN(ecmd) + STRLEN(p_sxq) * 2 + 1));
 	    if (ncmd != NULL)
 	    {
 		STRCPY(ncmd, p_sxq);
-		STRCAT(ncmd, cmd);
+		STRCAT(ncmd, ecmd);
 		/* When 'shellxquote' is ( append ).
 		 * When 'shellxquote' is "( append )". */
 		STRCAT(ncmd, STRCMP(p_sxq, "(") == 0 ? (char_u *)")"
@@ -3240,6 +3248,8 @@ call_shell(cmd, opt)
 	    }
 	    else
 		retval = -1;
+	    if (ecmd != cmd)
+		vim_free(ecmd);
 	}
 #ifdef FEAT_GUI
 	--hold_gui_events;
diff --git a/src/option.c b/src/option.c
index cac031e18419586b35b95e69dc35ce17a3c0d5f0..0cea5586a809d02e6399f9b47bd524fbb9348b34 100644
--- a/src/option.c
+++ b/src/option.c
@@ -2271,6 +2271,15 @@ static struct vimoption
 			    (char_u *)"\"",
 #else
 			    (char_u *)"",
+#endif
+				(char_u *)0L} SCRIPTID_INIT},
+    {"shellxescape", "sxe", P_STRING|P_VI_DEF|P_SECURE,
+			    (char_u *)&p_sxe, PV_NONE,
+			    {
+#if defined(MSDOS) || defined(WIN16) || defined(WIN3264)
+			    (char_u *)"\"&|<>()@^",
+#else
+			    (char_u *)"",
 #endif
 				(char_u *)0L} SCRIPTID_INIT},
     {"shiftround",  "sr",   P_BOOL|P_VI_DEF|P_VIM,
diff --git a/src/option.h b/src/option.h
index 21c2753422ed0caccce0ec0a2a0664106842053d..9dd93872385d803bddf1a05e944fd5887f70787a 100644
--- a/src/option.h
+++ b/src/option.h
@@ -712,6 +712,7 @@ EXTERN char_u	*p_sp;		/* 'shellpipe' */
 #endif
 EXTERN char_u	*p_shq;		/* 'shellquote' */
 EXTERN char_u	*p_sxq;		/* 'shellxquote' */
+EXTERN char_u	*p_sxe;		/* 'shellxescape' */
 EXTERN char_u	*p_srr;		/* 'shellredir' */
 #ifdef AMIGA
 EXTERN long	p_st;		/* 'shelltype' */
diff --git a/src/version.c b/src/version.c
index 7b78a45a0d4a797a25118dd718692f022e971aeb..159fe8681cc54cc3690eecec824b40e71e4e9b91 100644
--- a/src/version.c
+++ b/src/version.c
@@ -714,6 +714,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    446,
 /**/
     445,
 /**/