diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index d832f46..ba83433 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -684,22 +684,15 @@
    */
   protected boolean notDone() {
     int activeClients = messageQueue.getNumClientsRetrievedTest(currentTestInfo);
-    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 (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 (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.
+      if (activeClients != this.numClients) {
+        // Wait forever for first contact; user-driven.
         return true;
       }
     }
diff --git a/user/src/com/google/gwt/junit/RunStyle.java b/user/src/com/google/gwt/junit/RunStyle.java
index 088cd94..d054429 100644
--- a/user/src/com/google/gwt/junit/RunStyle.java
+++ b/user/src/com/google/gwt/junit/RunStyle.java
@@ -51,15 +51,6 @@
   }
 
   /**
-   * 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 5486a8f..07e974a 100644
--- a/user/src/com/google/gwt/junit/RunStyleManual.java
+++ b/user/src/com/google/gwt/junit/RunStyleManual.java
@@ -46,14 +46,6 @@
     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 43dfd43..795762d 100644
--- a/user/src/com/google/gwt/junit/RunStyleRemoteWeb.java
+++ b/user/src/com/google/gwt/junit/RunStyleRemoteWeb.java
@@ -201,14 +201,6 @@
     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 {
