diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index b1ae899..53292ad 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -260,6 +260,39 @@
         }
       });
 
+      registerHandler(new ArgHandlerInt() {
+        @Override
+        public String[] getDefaultArgs() {
+          return new String[] {getTag(), "1"};
+        }
+
+        @Override
+        public String getPurpose() {
+          return "Set the test begin timeout (time for clients to contact "
+              + "server), in minutes";
+        }
+
+        @Override
+        public String getTag() {
+          return "-testBeginTimeout";
+        }
+
+        @Override
+        public String[] getTagArgs() {
+          return new String[] {"minutes"};
+        }
+
+        @Override
+        public boolean isUndocumented() {
+          return false;
+        }
+
+        @Override
+        public void setInt(int minutes) {
+          baseTestBeginTimeoutMillis = minutes * 60 * 1000;
+        }
+      });
+
       registerHandler(new ArgHandlerString() {
         @Override
         public String getPurpose() {
@@ -462,13 +495,6 @@
   }
 
   /**
-   * The amount of time to wait for all clients to have contacted the server and
-   * begin running the test. "Contacted" does not necessarily mean "the test has
-   * begun," e.g. for linker errors stopping the test initialization.
-   */
-  static final int TEST_BEGIN_TIMEOUT_MILLIS = 60 * 1000;
-
-  /**
    * This is a system property that, when set, emulates command line arguments.
    */
   private static final String PROP_GWT_ARGS = "gwt.args";
@@ -676,6 +702,13 @@
   private long baseTestMethodTimeoutMillis;
 
   /**
+   * The amount of time to wait for all clients to have contacted the server and
+   * begin running the test. "Contacted" does not necessarily mean "the test has
+   * begun," e.g. for linker errors stopping the test initialization.
+   */
+  private long baseTestBeginTimeoutMillis;
+
+  /**
    * Determines how to batch up tests for execution.
    */
   private BatchingStrategy batchingStrategy = new NoBatchingStrategy();
@@ -925,7 +958,7 @@
       double elapsed = (currentTimeMillis - testBeginTime) / 1000.0;
       throw new TimeoutException(
           "The browser did not contact the server within "
-              + TEST_BEGIN_TIMEOUT_MILLIS + "ms.\n"
+              + baseTestBeginTimeoutMillis + "ms.\n"
               + messageQueue.getUnretrievedClients(currentTestInfo)
               + "\n Actual time elapsed: " + elapsed + " seconds.\n");
     }
@@ -1220,7 +1253,7 @@
       // Set a timeout period to automatically fail if the servlet hasn't been
       // contacted; something probably went wrong (the module failed to load?)
       testBeginTime = System.currentTimeMillis();
-      testBeginTimeout = testBeginTime + TEST_BEGIN_TIMEOUT_MILLIS;
+      testBeginTimeout = testBeginTime + baseTestBeginTimeoutMillis;
       testMethodTimeout = 0; // wait until test execution begins
       while (notDone()) {
         messageQueue.waitForResults(1000);
