diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index ff9945b..3657d75 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -28,7 +28,7 @@
     return re.sub("\[\d+ refs\]\r?\n?$", "", stderr.decode()).encode()
     #return re.sub(r"\[\d+ refs\]\r?\n?$", "", stderr)
 
-class ProcessTestCase(unittest.TestCase):
+class BaseTestCase(unittest.TestCase):
     def setUp(self):
         # Try to minimize the number of children we have so this test
         # doesn't crash on some buildbots (Alphas in particular).
@@ -41,14 +41,15 @@
         if hasattr(support, "reap_children"):
             support.reap_children()
 
-    def mkstemp(self):
+    def mkstemp(self, *args, **kwargs):
         """wrapper for mkstemp, calling mktemp if mkstemp is not available"""
         if hasattr(tempfile, "mkstemp"):
-            return tempfile.mkstemp()
+            return tempfile.mkstemp(*args, **kwargs)
         else:
-            fname = tempfile.mktemp()
+            fname = tempfile.mktemp(*args, **kwargs)
             return os.open(fname, os.O_RDWR|os.O_CREAT), fname
 
+class ProcessTestCase(BaseTestCase):
     #
     # Generic tests
     #
@@ -863,6 +864,7 @@
             p.terminate()
             self.assertNotEqual(p.wait(), 0)
 
+
 class CommandTests(unittest.TestCase):
 # The module says:
 #   "NB This only works (and is only relevant) for UNIX."
@@ -893,6 +895,50 @@
 
 unit_tests = [ProcessTestCase, CommandTests]
 
+if mswindows:
+    class CommandsWithSpaces (BaseTestCase):
+
+        def setUp(self):
+            super().setUp()
+            f, fname = self.mkstemp(".py", "te st")
+            self.fname = fname.lower ()
+            os.write(f, b"import sys;"
+                        b"sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv]))"
+            )
+            os.close(f)
+
+        def tearDown(self):
+            os.remove(self.fname)
+            super().tearDown()
+
+        def with_spaces(self, *args, **kwargs):
+            kwargs['stdout'] = subprocess.PIPE
+            p = subprocess.Popen(*args, **kwargs)
+            self.assertEqual(
+              p.stdout.read ().decode("mbcs"),
+              "2 [%r, 'ab cd']" % self.fname
+            )
+
+        def test_shell_string_with_spaces(self):
+            # call() function with string argument with spaces on Windows
+            self.with_spaces('"%s" "%s"' % (self.fname, "ab cd"), shell=1)
+
+        def test_shell_sequence_with_spaces(self):
+            # call() function with sequence argument with spaces on Windows
+            self.with_spaces([self.fname, "ab cd"], shell=1)
+
+        def test_noshell_string_with_spaces(self):
+            # call() function with string argument with spaces on Windows
+            self.with_spaces('"%s" "%s" "%s"' % (sys.executable, self.fname,
+                                 "ab cd"))
+
+        def test_noshell_sequence_with_spaces(self):
+            # call() function with sequence argument with spaces on Windows
+            self.with_spaces([sys.executable, self.fname, "ab cd"])
+
+    unit_tests.append(CommandsWithSpaces)
+
+
 if getattr(subprocess, '_has_poll', False):
     class ProcessTestCaseNoPoll(ProcessTestCase):
         def setUp(self):
