diff --git a/slapos/grid/slapgrid.py b/slapos/grid/slapgrid.py
index a3e4737b5c72c830b23a22648ab32e321ec0a05a..8b78ed803c77eae6c9e5a9bd5203d6307812ab4a 100644
--- a/slapos/grid/slapgrid.py
+++ b/slapos/grid/slapgrid.py
@@ -541,18 +541,27 @@ class Slapgrid(object):
         process_handler.stdin.close()
         process_handler.stdin = None
 
-        time.sleep(self.promise_timeout)
-
-        if process_handler.poll() is None:
+        # Check if the promise finished every tenth of second,
+        # but timeout after promise_timeout.
+        sleep_time = 0.1
+        increment_limit = int(self.promise_timeout / sleep_time)
+        for current_increment in range(0, increment_limit):
+          if process_handler.poll() is None:
+            time.sleep(sleep_time)
+            continue
+          if process_handler.poll() == 0:
+            # Success!
+            break
+          else:
+            stderr = process_handler.communicate()[1]
+            if stderr is None:
+              stderr = "No error output from '%s'." % promise
+            else:
+              stderr = "Promise '%s':" % promise + stderr
+            raise Slapgrid.PromiseError(stderr)
+        else:
           process_handler.terminate()
           raise Slapgrid.PromiseError("The promise '%s' timed out" % promise)
-        elif process_handler.poll() != 0:
-          stderr = process_handler.communicate()[1]
-          if stderr is None:
-            stderr = "No error output from '%s'." % promise
-          else:
-            stderr = "Promise '%s':" % promise + stderr
-          raise Slapgrid.PromiseError(stderr)
 
     if not promise_present:
       self.logger.info("No promise.")