diff --git a/user/src/com/google/gwt/junit/JUnitMessageQueue.java b/user/src/com/google/gwt/junit/JUnitMessageQueue.java
index 6dbe0ae..25b7f99 100644
--- a/user/src/com/google/gwt/junit/JUnitMessageQueue.java
+++ b/user/src/com/google/gwt/junit/JUnitMessageQueue.java
@@ -89,7 +89,8 @@
 
   /**
    * Gets a human-readable string.
-   * @return Fetches a human-readable representation of the current test object 
+   * 
+   * @return Fetches a human-readable representation of the current test object
    */
   public String getCurrentTestName() {
     if (currentTest == null) {
@@ -147,7 +148,7 @@
 
   /**
    * Returns a human-formatted message identifying what clients have connected
-   * but have not yet reported results for this test.  It is used in a timeout
+   * but have not yet reported results for this test. It is used in a timeout
    * condition, to identify what we're still waiting on.
    * 
    * @return human readable message
@@ -157,7 +158,7 @@
       StringBuilder buf = new StringBuilder();
       int itemCount = 0;
       for (ClientStatus clientStatus : clientStatuses.values()) {
-        if (clientStatus.hasRequestedCurrentTest 
+        if (clientStatus.hasRequestedCurrentTest
             && clientStatus.currentTestResults == null) {
           if (itemCount > 0) {
             buf.append(", ");
@@ -171,8 +172,8 @@
         if (itemCount > 0) {
           buf.append('\n');
         }
-        buf.append(difference + 
-            " other client(s) haven't responded back to JUnitShell since the start of the test.");
+        buf.append(difference
+            + " other client(s) haven't responded back to JUnitShell since the start of the test.");
       }
       return buf.toString();
     }
diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index 2a11a2b..82cc08a 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -330,15 +330,15 @@
 
   /**
    * 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.
+   * begin running the test. "Contacted" does not necessarily mean "the test has
+   * begun," e.g. for linker errors stopping the test initialization.
    */
   private static final int TEST_BEGIN_TIMEOUT_MILLIS = 60000;
 
   /**
    * The amount of time to wait for all clients to complete a single test
-   * method, in milliseconds, measured from when the <i>last</i> client 
-   * connects (and thus starts the test).  5 minutes.
+   * method, in milliseconds, measured from when the <i>last</i> client
+   * connects (and thus starts the test). 5 minutes.
    */
   private static final long TEST_METHOD_TIMEOUT_MILLIS = 300000;
 
@@ -503,9 +503,9 @@
   private long testBeginTimeout;
 
   /**
-   * Timeout for individual test method.  If System.currentTimeMillis() is later
-   * than this timestamp, then we need to pack up and go home.  Zero for "not
-   * yet set" (at the start of a test).  This interval begins when the
+   * Timeout for individual test method. If System.currentTimeMillis() is later
+   * than this timestamp, then we need to pack up and go home. Zero for "not yet
+   * set" (at the start of a test). This interval begins when the
    * testBeginTimeout interval is done.
    */
   private long testMethodTimeout;
@@ -586,11 +586,12 @@
       } else if (testMethodTimeout < currentTimeMillis) {
         double elapsed = (currentTimeMillis - testBeginTime) / 1000.0;
         throw new TimeoutException(
-            "The browser did not complete the test method " 
+            "The browser did not complete the test method "
                 + messageQueue.getCurrentTestName() + " in "
-                + TEST_METHOD_TIMEOUT_MILLIS + "ms.\n  We have no results from: "
-                + messageQueue.getWorkingClients()
-                + "\n Actual time elapsed: " + elapsed + " seconds.\n");
+                + TEST_METHOD_TIMEOUT_MILLIS
+                + "ms.\n  We have no results from: "
+                + messageQueue.getWorkingClients() + "\n Actual time elapsed: "
+                + elapsed + " seconds.\n");
       }
     } else if (testBeginTimeout < currentTimeMillis) {
       double elapsed = (currentTimeMillis - testBeginTime) / 1000.0;
@@ -668,9 +669,8 @@
       currentModule.clearEntryPoints();
       currentModule.addEntryPointTypeName(GWTRunner.class.getName());
       // Squirrel away the name of the active module for GWTRunnerGenerator
-      ConfigurationProperty moduleNameProp
-          = currentModule.getProperties().createConfiguration(
-              "junit.moduleName", false);
+      ConfigurationProperty moduleNameProp = currentModule.getProperties().createConfiguration(
+          "junit.moduleName", false);
       moduleNameProp.setValue(moduleName);
       runStyle.maybeCompileModule(syntheticModuleName);
     }
@@ -701,7 +701,7 @@
       // contacted; something probably went wrong (the module failed to load?)
       testBeginTime = System.currentTimeMillis();
       testBeginTimeout = testBeginTime + TEST_BEGIN_TIMEOUT_MILLIS;
-      testMethodTimeout = 0;  // wait until test execution begins
+      testMethodTimeout = 0; // wait until test execution begins
       pumpEventLoop();
     } catch (TimeoutException e) {
       lastLaunchFailed = true;
