diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index 99a42e3..b020a14 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -688,15 +688,22 @@
    */
   protected boolean notDone() {
     int activeClients = messageQueue.getNumClientsRetrievedTest(currentTestInfo);
-    if (firstLaunch && runStyle instanceof RunStyleManual) {
-      String[] newClients = messageQueue.getNewClients();
-      int printIndex = activeClients - newClients.length + 1;
-      for (String newClient : newClients) {
-        System.out.println(printIndex + " - " + newClient);
-        ++printIndex;
+    if (firstLaunch && runStyle.isStartDelayed()) {
+      // Pretty print the list of clients for manual tests.
+      if (runStyle instanceof RunStyleManual) {
+        String[] newClients = messageQueue.getNewClients();
+        int printIndex = activeClients - newClients.length + 1;
+        for (String newClient : newClients) {
+          System.out.println(printIndex + " - " + newClient);
+          ++printIndex;
+        }
       }
-      if (activeClients != this.numClients) {
-        // Wait forever for first contact; user-driven.
+
+      if (runStyle.wasInterrupted()) {
+        // Exit early if the test is interrupted.
+        throw new TimeoutException("A remote browser died a mysterious death.");
+      } else if (activeClients != this.numClients) {
+        // Wait forever for first contact.
         return true;
       }
     }
diff --git a/user/src/com/google/gwt/junit/RunStyle.java b/user/src/com/google/gwt/junit/RunStyle.java
index d054429..088cd94 100644
--- a/user/src/com/google/gwt/junit/RunStyle.java
+++ b/user/src/com/google/gwt/junit/RunStyle.java
@@ -51,6 +51,15 @@
   }
 
   /**
+   * Check whether or not tests start immediately or if they can be delayed.
+   * 
+   * @return <code>true</code> if the test can be delayed
+   */
+  public boolean isStartDelayed() {
+    return false;
+  }
+
+  /**
    * Requests initial launch of the browser. This should only be called once per
    * instance of RunStyle.
    * 
diff --git a/user/src/com/google/gwt/junit/RunStyleManual.java b/user/src/com/google/gwt/junit/RunStyleManual.java
index 07e974a..5486a8f 100644
--- a/user/src/com/google/gwt/junit/RunStyleManual.java
+++ b/user/src/com/google/gwt/junit/RunStyleManual.java
@@ -46,6 +46,14 @@
     return true;
   }
 
+  /**
+   * Manual tests are started by users in user time.
+   */
+  @Override
+  public boolean isStartDelayed() {
+    return true;
+  }
+
   @Override
   public void launchModule(String moduleName) throws UnableToCompleteException {
     if (numClients == 1) {
diff --git a/user/src/com/google/gwt/junit/RunStyleRemoteWeb.java b/user/src/com/google/gwt/junit/RunStyleRemoteWeb.java
index 795762d..43dfd43 100644
--- a/user/src/com/google/gwt/junit/RunStyleRemoteWeb.java
+++ b/user/src/com/google/gwt/junit/RunStyleRemoteWeb.java
@@ -201,6 +201,14 @@
     return true;
   }
 
+  /**
+   * Remote web tests can be queued for extended periods.
+   */
+  @Override
+  public boolean isStartDelayed() {
+    return true;
+  }
+
   @Override
   public synchronized void launchModule(String moduleName)
       throws UnableToCompleteException {
