diff --git a/image_creator/os_type/windows/__init__.py b/image_creator/os_type/windows/__init__.py
index 9ce8688655e4ac3b4e269b5e8c479937d35108ad..457ef0bca88f9cbb6e566efd2ccde3fd5dadd16e 100644
--- a/image_creator/os_type/windows/__init__.py
+++ b/image_creator/os_type/windows/__init__.py
@@ -30,6 +30,7 @@ import tempfile
 import re
 import os
 import uuid
+import time
 
 # For more info see: http://technet.microsoft.com/en-us/library/jj612867.aspx
 KMS_CLIENT_SETUP_KEYS = {
@@ -339,7 +340,7 @@ class Windows(OSBase):
         """
 
         self.vm.rexec(r'C:\Windows\system32\sysprep\sysprep '
-                      r'/quiet /generalize /oobe /shutdown')
+                      r'/quiet /generalize /oobe /shutdown', uninstall=True)
         self.sysprepped = True
 
     @sysprep('Converting the image into a KMS client', enabled=False)
@@ -422,7 +423,7 @@ class Windows(OSBase):
             r'IF NOT !ERRORLEVEL! EQU 0 EXIT /B 1 & ' +
             r'DEL /Q %SCRIPT%"')
 
-        stdout, stderr, rc = self.vm.rexec(cmd, False)
+        stdout, stderr, rc = self.vm.rexec(cmd, fatal=False)
 
         if rc != 0:
             FatalError("Shrinking failed. Please make sure the media is "
@@ -430,7 +431,7 @@ class Windows(OSBase):
                        "`Defrag.exe /U /X /W'")
         for line in stdout.splitlines():
             if line.find('shrunk') >= 0:
-                self.out.output(line)
+                self.out.output(" %s" % line)
 
     def do_sysprep(self):
         """Prepare system for image creation."""
@@ -496,6 +497,11 @@ class Windows(OSBase):
                 self.out.success('done')
                 booted = True
 
+                # Since the password is reset when logging in, sleep a little
+                # bit before checking the connectivity, to avoid race
+                # conditions
+                time.sleep(2)
+
                 self.out.output("Checking connectivity to the VM ...", False)
                 self._check_connectivity()
                 # self.out.success('done')
@@ -565,7 +571,7 @@ class Windows(OSBase):
 
     def _shutdown(self):
         """Shuts down the windows VM"""
-        self.vm.rexec(r'shutdown /s /t 5')
+        self.vm.rexec(r'shutdown /s /t 5', uninstall=True)
 
     def _disable_autologon(self):
         """Disable automatic logon on the windows image"""
diff --git a/image_creator/os_type/windows/vm.py b/image_creator/os_type/windows/vm.py
index 386974e58b1c08156f13dfbadbbb8f978aa70adc..2ce262b89a512cad73d97d3b4b26f44fc3bf4aa6 100644
--- a/image_creator/os_type/windows/vm.py
+++ b/image_creator/os_type/windows/vm.py
@@ -205,26 +205,51 @@ class VM(object):
 
         return (stdout, stderr, self.process.poll())
 
-    def rexec(self, command, fatal=True, debug=False):
-        """Remote execute a command on the windows VM"""
+    def rexec(self, command, **kwargs):
+        """Remote execute a command on the windows VM
+
+        The following optional flags are allowed:
+
+        * fatal: If True, a FatalError is thrown if the command fails
+
+        * debug: If True, WinEXE is executed in the highest debug level
+
+        * uninstall: If True, the winexesvc.exe service will be uninstalled
+          after the execution of the command.
+        """
+
+        fatal = kwargs['fatal'] if 'fatal' in kwargs else True
+        debug = kwargs['debug'] if 'debug' in kwargs else False
+        uninstall = kwargs['uninstall'] if 'uninstall' in kwargs else False
 
         user = self.params['admin'].value
         winexe = WinEXE(user, 'localhost', password=self.password)
-        winexe.runas(user, self.password).uninstall().no_pass()
+        winexe.runas(user, self.password).no_pass()
+
         if debug:
             winexe.debug(9)
 
+        if uninstall:
+            winexe.uninstall()
+
         try:
             (stdout, stderr, rc) = winexe.run(command)
         except WinexeTimeout:
             FatalError("Command: `%s' timeout out." % command)
 
         if rc != 0 and fatal:
-            reason = stderr if len(stderr) else stdout
+            log = tempfile.NamedTemporaryFile(delete=False)
+            try:
+                log.file.write("STDOUT:\n%s\n" % stdout)
+                log.file.write("STDERR:\n%s\n" % stderr)
+            finally:
+                fname = log.name
+                log.close()
+
             # self.out.output("Command: `%s' failed (rc=%d). Reason: %s" %
             #                 (command, rc, reason))
-            raise FatalError("Command: `%s' failed (rc=%d). Reason: %s" %
-                             (command, rc, reason))
+            raise FatalError("Command: `%s' failed (rc=%d). See: %s" %
+                             (command, rc, fname))
 
         return (stdout, stderr, rc)