diff --git a/lib/runner.ts b/lib/runner.ts
index c720e0f69..47325a313 100644
--- a/lib/runner.ts
+++ b/lib/runner.ts
@@ -33,6 +33,8 @@ export class Runner extends EventEmitter {
   driverprovider_: DriverProvider;
   o: any;
   plugins_: Plugins;
+  restartPromise: q.Promise<any>;
+  frameworkUsesAfterEach: boolean;
 
   constructor(config: Config) {
     super();
@@ -86,6 +88,26 @@ export class Runner extends EventEmitter {
     });
   }
 
+  /**
+   * Called after each test finishes.
+   *
+   * Responsible for `restartBrowserBetweenTests`
+   *
+   * @public
+   * @return {q.Promise} A promise that will resolve when the work here is done
+   */
+  afterEach(): q.Promise<void> {
+    let ret: q.Promise<void>;
+    this.frameworkUsesAfterEach = true;
+    if (this.config_.restartBrowserBetweenTests) {
+      // TODO(sjelin): remove the `|| q()` once `restart()` returns a promise
+      this.restartPromise = this.restartPromise || protractor.browser.restart() || q();
+      ret = this.restartPromise;
+      this.restartPromise = undefined;
+    }
+    return ret || q();
+  }
+
   /**
    * Grab driver provider based on type
    * @private
@@ -325,8 +347,12 @@ export class Runner extends EventEmitter {
           }
 
           if (this.config_.restartBrowserBetweenTests) {
+            // TODO(sjelin): replace with warnings once `afterEach` support is required
             let restartDriver = () => {
-              browser_.restart();
+              if (!this.frameworkUsesAfterEach) {
+                // TODO(sjelin): remove the `|| q()` once `restart()` returns a promise
+                this.restartPromise = browser_.restart() || q();
+              }
             };
             this.on('testPass', restartDriver);
             this.on('testFail', restartDriver);