diff --git a/dev/core/src/com/google/gwt/dev/GWTShell.java b/dev/core/src/com/google/gwt/dev/GWTShell.java
index 49a239d..a03250b 100644
--- a/dev/core/src/com/google/gwt/dev/GWTShell.java
+++ b/dev/core/src/com/google/gwt/dev/GWTShell.java
@@ -42,11 +42,17 @@
    * Handles the list of startup urls that can be passed at the end of the
    * command line.
    */
-  protected class ArgHandlerStartupURLsExtra extends ArgHandlerExtra {
+  protected static class ArgHandlerStartupURLsExtra extends ArgHandlerExtra {
+
+    private final OptionStartupURLs options;
+
+    public ArgHandlerStartupURLsExtra(OptionStartupURLs options) {
+      this.options = options;
+    }
 
     @Override
     public boolean addExtraArg(String arg) {
-      addStartupURL(arg);
+      options.addStartupURL(arg);
       return true;
     }
 
@@ -64,14 +70,12 @@
   /**
    * The GWTShell argument processor.
    */
-  protected class ArgProcessor extends HostedModeBase.ArgProcessor {
-    public ArgProcessor(boolean forceServer, boolean noURLs) {
-      if (!forceServer) {
-        registerHandler(new ArgHandlerNoServerFlag());
-      }
-
+  protected static class ArgProcessor extends HostedModeBase.ArgProcessor {
+    public ArgProcessor(ShellOptionsImpl options, boolean forceServer,
+        boolean noURLs) {
+      super(options, forceServer);
       if (!noURLs) {
-        registerHandler(new ArgHandlerStartupURLsExtra());
+        registerHandler(new ArgHandlerStartupURLsExtra(options));
       }
       registerHandler(new ArgHandlerOutDir(options));
     }
@@ -83,16 +87,23 @@
   }
 
   /**
-   * Concrete class to implement all compiler options.
+   * Concrete class to implement all shell options.
    */
-  static class ShellOptionsImpl extends GWTCompilerOptionsImpl implements
-      HostedModeBaseOptions, WorkDirs {
+  static class ShellOptionsImpl extends HostedModeBaseOptionsImpl implements
+      HostedModeBaseOptions, WorkDirs, LegacyCompilerOptions {
+    private int localWorkers;
+    private File outDir;
+
     public File getCompilerOutputDir(ModuleDef moduleDef) {
       return new File(getOutDir(), moduleDef.getName());
     }
 
-    public File getShellBaseWorkDir(ModuleDef moduleDef) {
-      return new File(new File(getWorkDir(), moduleDef.getName()), "shell");
+    public int getLocalWorkers() {
+      return localWorkers;
+    }
+
+    public File getOutDir() {
+      return outDir;
     }
 
     public File getShellPublicGenDir(ModuleDef moduleDef) {
@@ -103,6 +114,14 @@
     public File getWorkDir() {
       return new File(getOutDir(), ".gwt-tmp");
     }
+
+    public void setLocalWorkers(int localWorkers) {
+      this.localWorkers = localWorkers;
+    }
+
+    public void setOutDir(File outDir) {
+      this.outDir = outDir;
+    }
   }
 
   public static void main(String[] args) {
@@ -115,9 +134,10 @@
      * shutdown AWT related threads, since the contract for their termination is
      * still implementation-dependent.
      */
-    GWTShell shellMain = new GWTShell();
-    if (shellMain.new ArgProcessor(false, false).processArgs(args)) {
-      shellMain.run();
+    GWTShell gwtShell = new GWTShell();
+    ArgProcessor argProcessor = new ArgProcessor(gwtShell.options, false, false);
+    if (argProcessor.processArgs(args)) {
+      gwtShell.run();
       // Exit w/ success code.
       System.exit(0);
     }
diff --git a/dev/core/src/com/google/gwt/dev/HostedMode.java b/dev/core/src/com/google/gwt/dev/HostedMode.java
index 93ebb2c..19dba6b 100644
--- a/dev/core/src/com/google/gwt/dev/HostedMode.java
+++ b/dev/core/src/com/google/gwt/dev/HostedMode.java
@@ -27,6 +27,7 @@
 import com.google.gwt.dev.shell.jetty.JettyLauncher;
 import com.google.gwt.dev.util.Util;
 import com.google.gwt.dev.util.arg.ArgHandlerExtraDir;
+import com.google.gwt.dev.util.arg.ArgHandlerLocalWorkers;
 import com.google.gwt.dev.util.arg.ArgHandlerModuleName;
 import com.google.gwt.dev.util.arg.ArgHandlerWarDir;
 import com.google.gwt.dev.util.arg.ArgHandlerWorkDirOptional;
@@ -51,7 +52,22 @@
   /**
    * Handles the -server command line flag.
    */
-  protected class ArgHandlerServer extends ArgHandlerString {
+  protected static class ArgHandlerServer extends ArgHandlerString {
+    private HostedModeOptions options;
+
+    public ArgHandlerServer(HostedModeOptions options) {
+      this.options = options;
+    }
+
+    @Override
+    public String[] getDefaultArgs() {
+      if (options.isNoServer()) {
+        return null;
+      } else {
+        return new String[] {getTag(), JettyLauncher.class.getName()};
+      }
+    }
+
     @Override
     public String getPurpose() {
       return "Prevents the embedded Tomcat server from running, even if a port is specified";
@@ -64,21 +80,44 @@
 
     @Override
     public String[] getTagArgs() {
-      return new String[] {"serverLauncherClass"};
+      return new String[] {"servletContainerLauncher"};
     }
 
     @Override
-    public boolean setString(String arg) {
+    public boolean setString(String sclClassName) {
       // Supercedes -noserver.
-      setRunTomcat(true);
-      return setServer(console, arg);
+      options.setNoServer(false);
+      Throwable t;
+      try {
+        Class<?> clazz = Class.forName(sclClassName, true,
+            Thread.currentThread().getContextClassLoader());
+        Class<? extends ServletContainerLauncher> sclClass = clazz.asSubclass(ServletContainerLauncher.class);
+        options.setServletContainerLauncher(sclClass.newInstance());
+        return true;
+      } catch (ClassCastException e) {
+        t = e;
+      } catch (ClassNotFoundException e) {
+        t = e;
+      } catch (InstantiationException e) {
+        t = e;
+      } catch (IllegalAccessException e) {
+        t = e;
+      }
+      System.err.println("Unable to load server class '" + sclClassName + "'");
+      t.printStackTrace();
+      return false;
     }
   }
 
   /**
    * Handles a startup url that can be passed on the command line.
    */
-  protected class ArgHandlerStartupURLs extends ArgHandlerString {
+  protected static class ArgHandlerStartupURLs extends ArgHandlerString {
+    private final OptionStartupURLs options;
+
+    public ArgHandlerStartupURLs(OptionStartupURLs options) {
+      this.options = options;
+    }
 
     @Override
     public String getPurpose() {
@@ -97,19 +136,20 @@
 
     @Override
     public boolean setString(String arg) {
-      addStartupURL(arg);
+      options.addStartupURL(arg);
       return true;
     }
   }
 
-  class ArgProcessor extends HostedModeBase.ArgProcessor {
-    public ArgProcessor() {
-      registerHandler(new ArgHandlerServer());
-      registerHandler(new ArgHandlerNoServerFlag());
-      registerHandler(new ArgHandlerStartupURLs());
+  static class ArgProcessor extends HostedModeBase.ArgProcessor {
+    public ArgProcessor(HostedModeOptions options) {
+      super(options, false);
+      registerHandler(new ArgHandlerServer(options));
+      registerHandler(new ArgHandlerStartupURLs(options));
       registerHandler(new ArgHandlerWarDir(options));
       registerHandler(new ArgHandlerExtraDir(options));
       registerHandler(new ArgHandlerWorkDirOptional(options));
+      registerHandler(new ArgHandlerLocalWorkers(options));
       registerHandler(new ArgHandlerModuleName(options));
     }
 
@@ -119,14 +159,61 @@
     }
   }
 
+  interface HostedModeOptions extends HostedModeBaseOptions, CompilerOptions {
+    ServletContainerLauncher getServletContainerLauncher();
+
+    void setServletContainerLauncher(ServletContainerLauncher scl);
+  }
+
   /**
-   * Concrete class to implement all compiler options.
+   * Concrete class to implement all hosted mode options.
    */
-  static class HostedModeOptionsImpl extends CompilerOptionsImpl implements
-      HostedModeBaseOptions {
+  static class HostedModeOptionsImpl extends HostedModeBaseOptionsImpl
+      implements HostedModeOptions {
+    private File extraDir;
+    private int localWorkers;
+    private ServletContainerLauncher scl;
+    private File warDir;
+
+    public File getExtraDir() {
+      return extraDir;
+    }
+
+    public int getLocalWorkers() {
+      return localWorkers;
+    }
+
+    public ServletContainerLauncher getServletContainerLauncher() {
+      return scl;
+    }
+
     public File getShellBaseWorkDir(ModuleDef moduleDef) {
       return new File(new File(getWorkDir(), moduleDef.getName()), "shell");
     }
+
+    public File getShellPublicGenDir(ModuleDef moduleDef) {
+      return new File(getShellBaseWorkDir(moduleDef), "public");
+    }
+
+    public File getWarDir() {
+      return warDir;
+    }
+
+    public void setExtraDir(File extraDir) {
+      this.extraDir = extraDir;
+    }
+
+    public void setLocalWorkers(int localWorkers) {
+      this.localWorkers = localWorkers;
+    }
+
+    public void setServletContainerLauncher(ServletContainerLauncher scl) {
+      this.scl = scl;
+    }
+
+    public void setWarDir(File warDir) {
+      this.warDir = warDir;
+    }
   }
 
   public static void main(String[] args) {
@@ -137,7 +224,7 @@
      * still implementation-dependent.
      */
     HostedMode hostedMode = new HostedMode();
-    if (hostedMode.new ArgProcessor().processArgs(args)) {
+    if (new ArgProcessor(hostedMode.options).processArgs(args)) {
       hostedMode.run();
       // Exit w/ success code.
       System.exit(0);
@@ -157,11 +244,6 @@
   protected final HostedModeOptionsImpl options = (HostedModeOptionsImpl) super.options;
 
   /**
-   * The servlet launcher to use (defaults to embedded Jetty).
-   */
-  private ServletContainerLauncher launcher = new JettyLauncher();
-
-  /**
    * Maps each active linker stack by module.
    */
   private final Map<String, StandardLinkerContext> linkerStacks = new HashMap<String, StandardLinkerContext>();
@@ -187,9 +269,9 @@
   }
 
   /**
-   * The public API of this class is yet to be determined.
+   * Default constructor for testing; no public API yet.
    */
-  private HostedMode() {
+  HostedMode() {
   }
 
   @Override
@@ -278,7 +360,8 @@
     try {
       TreeLogger serverLogger = getTopLogger().branch(TreeLogger.INFO,
           "Starting HTTP on port " + getPort(), null);
-      server = launcher.start(serverLogger, getPort(), options.getWarDir());
+      server = options.getServletContainerLauncher().start(serverLogger,
+          getPort(), options.getWarDir());
       assert (server != null);
       return server.getPort();
     } catch (BindException e) {
@@ -293,6 +376,14 @@
   }
 
   @Override
+  protected String getHost() {
+    if (server != null) {
+      return server.getHost();
+    }
+    return super.getHost();
+  }
+
+  @Override
   protected boolean initModule(String moduleName) {
     ModuleDef module = modulesByName.get(moduleName);
     if (module == null) {
@@ -328,28 +419,6 @@
     return module;
   }
 
-  protected boolean setServer(TreeLogger logger, String serverClassName) {
-    Throwable t;
-    try {
-      Class<?> clazz = Class.forName(serverClassName, true,
-          Thread.currentThread().getContextClassLoader());
-      Class<? extends ServletContainerLauncher> sclClass = clazz.asSubclass(ServletContainerLauncher.class);
-      launcher = sclClass.newInstance();
-      return true;
-    } catch (ClassCastException e) {
-      t = e;
-    } catch (ClassNotFoundException e) {
-      t = e;
-    } catch (InstantiationException e) {
-      t = e;
-    } catch (IllegalAccessException e) {
-      t = e;
-    }
-    logger.log(TreeLogger.ERROR, "Unable to load server class '"
-        + serverClassName + "'", t);
-    return false;
-  }
-
   /**
    * Perform an initial hosted mode link, without overwriting newer or
    * unmodified files in the output folder.
diff --git a/dev/core/src/com/google/gwt/dev/HostedModeBase.java b/dev/core/src/com/google/gwt/dev/HostedModeBase.java
index ab72df7..331297a 100644
--- a/dev/core/src/com/google/gwt/dev/HostedModeBase.java
+++ b/dev/core/src/com/google/gwt/dev/HostedModeBase.java
@@ -17,8 +17,8 @@
 
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.TreeLogger.Type;
 import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.dev.Precompile.PrecompileOptionsImpl;
 import com.google.gwt.dev.cfg.ModuleDef;
 import com.google.gwt.dev.cfg.ModuleDefLoader;
 import com.google.gwt.dev.jjs.JJSOptions;
@@ -56,6 +56,7 @@
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -68,7 +69,7 @@
   /**
    * Handles the -blacklist command line argument.
    */
-  protected class ArgHandlerBlacklist extends ArgHandlerString {
+  protected static class ArgHandlerBlacklist extends ArgHandlerString {
     @Override
     public String getPurpose() {
       return "Prevents the user browsing URLs that match the specified regexes (comma or space separated)";
@@ -93,7 +94,13 @@
   /**
    * Handles the -noserver command line flag.
    */
-  protected class ArgHandlerNoServerFlag extends ArgHandlerFlag {
+  protected static class ArgHandlerNoServerFlag extends ArgHandlerFlag {
+    private final OptionNoServer options;
+
+    public ArgHandlerNoServerFlag(OptionNoServer options) {
+      this.options = options;
+    }
+
     @Override
     public String getPurpose() {
       return "Prevents the embedded Tomcat server from running, even if a port is specified";
@@ -106,7 +113,7 @@
 
     @Override
     public boolean setFlag() {
-      runTomcat = false;
+      options.setNoServer(true);
       return true;
     }
   }
@@ -114,7 +121,13 @@
   /**
    * Handles the -port command line flag.
    */
-  protected class ArgHandlerPort extends ArgHandlerString {
+  protected static class ArgHandlerPort extends ArgHandlerString {
+
+    private final OptionPort options;
+
+    public ArgHandlerPort(OptionPort options) {
+      this.options = options;
+    }
 
     @Override
     public String[] getDefaultArgs() {
@@ -139,10 +152,10 @@
     @Override
     public boolean setString(String value) {
       if (value.equals("auto")) {
-        port = 0;
+        options.setPort(0);
       } else {
         try {
-          port = Integer.parseInt(value);
+          options.setPort(Integer.parseInt(value));
         } catch (NumberFormatException e) {
           System.err.println("A port must be an integer or \"auto\"");
           return false;
@@ -155,7 +168,7 @@
   /**
    * Handles the -whitelist command line flag.
    */
-  protected class ArgHandlerWhitelist extends ArgHandlerString {
+  protected static class ArgHandlerWhitelist extends ArgHandlerString {
     @Override
     public String getPurpose() {
       return "Allows the user to browse URLs that match the specified regexes (comma or space separated)";
@@ -177,26 +190,8 @@
     }
   }
 
-  abstract class ArgProcessor extends ArgProcessorBase {
-    public ArgProcessor() {
-      registerHandler(getArgHandlerPort());
-      registerHandler(new ArgHandlerWhitelist());
-      registerHandler(new ArgHandlerBlacklist());
-      registerHandler(new ArgHandlerLogLevel(options) {
-        @Override
-        protected Type getDefaultLogLevel() {
-          return doGetDefaultLogLevel();
-        }
-      });
-      registerHandler(new ArgHandlerGenDir(options));
-      registerHandler(new ArgHandlerScriptStyle(options));
-      registerHandler(new ArgHandlerEnableAssertions(options));
-      registerHandler(new ArgHandlerDisableAggressiveOptimization(options));
-    }
-  }
-
-  interface HostedModeBaseOptions extends JJSOptions, OptionLogLevel,
-      OptionGenDir {
+  protected interface HostedModeBaseOptions extends JJSOptions, OptionLogLevel,
+      OptionGenDir, OptionNoServer, OptionPort, OptionStartupURLs {
 
     /**
      * The base shell work directory.
@@ -204,6 +199,90 @@
     File getShellBaseWorkDir(ModuleDef moduleDef);
   }
 
+  /**
+   * Concrete class to implement all hosted mode base options.
+   */
+  protected static class HostedModeBaseOptionsImpl extends
+      PrecompileOptionsImpl implements HostedModeBaseOptions {
+
+    private boolean isNoServer;
+    private int port;
+    private final List<String> startupURLs = new ArrayList<String>();
+
+    public void addStartupURL(String url) {
+      startupURLs.add(url);
+    }
+
+    public int getPort() {
+      return port;
+    }
+
+    public File getShellBaseWorkDir(ModuleDef moduleDef) {
+      return new File(new File(getWorkDir(), moduleDef.getName()), "shell");
+    }
+
+    public List<String> getStartupURLs() {
+      return Collections.unmodifiableList(startupURLs);
+    }
+
+    public boolean isNoServer() {
+      return isNoServer;
+    }
+
+    public void setNoServer(boolean isNoServer) {
+      this.isNoServer = isNoServer;
+    }
+
+    public void setPort(int port) {
+      this.port = port;
+    }
+  }
+
+  /**
+   * Controls whether to run a server or not.
+   * 
+   */
+  protected interface OptionNoServer {
+    boolean isNoServer();
+
+    void setNoServer(boolean isNoServer);
+  }
+
+  /**
+   * Controls what port to use.
+   * 
+   */
+  protected interface OptionPort {
+    int getPort();
+
+    void setPort(int port);
+  }
+
+  /**
+   * Controls the startup URLs.
+   */
+  protected interface OptionStartupURLs {
+    void addStartupURL(String url);
+
+    List<String> getStartupURLs();
+  }
+
+  abstract static class ArgProcessor extends ArgProcessorBase {
+    public ArgProcessor(HostedModeBaseOptions options, boolean forceServer) {
+      if (!forceServer) {
+        registerHandler(new ArgHandlerNoServerFlag(options));
+      }
+      registerHandler(new ArgHandlerPort(options));
+      registerHandler(new ArgHandlerWhitelist());
+      registerHandler(new ArgHandlerBlacklist());
+      registerHandler(new ArgHandlerLogLevel(options));
+      registerHandler(new ArgHandlerGenDir(options));
+      registerHandler(new ArgHandlerScriptStyle(options));
+      registerHandler(new ArgHandlerEnableAssertions(options));
+      registerHandler(new ArgHandlerDisableAggressiveOptimization(options));
+    }
+  }
+
   private class BrowserWidgetHostImpl implements BrowserWidgetHost {
 
     public void compile() throws UnableToCompleteException {
@@ -258,7 +337,7 @@
       return HostedModeBase.this.initModule(moduleName);
     }
 
-    @SuppressWarnings("deprecation")
+    @Deprecated
     public boolean isLegacyMode() {
       return HostedModeBase.this instanceof GWTShell;
     }
@@ -305,14 +384,8 @@
 
   private ShellMainWindow mainWnd;
 
-  private int port;
-
-  private boolean runTomcat = true;
-
   private boolean started;
 
-  private final List<String> startupUrls = new ArrayList<String>();
-
   public HostedModeBase() {
     // Set any platform specific system properties.
     BootStrapPlatform.init();
@@ -321,7 +394,7 @@
   }
 
   public final void addStartupURL(String url) {
-    startupUrls.add(url);
+    options.addStartupURL(url);
   }
 
   public final void closeAllBrowserWindows() {
@@ -331,7 +404,7 @@
   }
 
   public final int getPort() {
-    return port;
+    return options.getPort();
   }
 
   public TreeLogger getTopLogger() {
@@ -353,7 +426,7 @@
     // Launch a browser window for each startup url.
     String startupURL = "";
     try {
-      for (String prenormalized : startupUrls) {
+      for (String prenormalized : options.getStartupURLs()) {
         startupURL = normalizeURL(prenormalized);
         logger.log(TreeLogger.TRACE, "Starting URL: " + startupURL, null);
         BrowserWidget bw = openNewBrowserWindow();
@@ -448,11 +521,11 @@
   }
 
   public final void setPort(int port) {
-    this.port = port;
+    options.setPort(port);
   }
 
   public final void setRunTomcat(boolean run) {
-    runTomcat = run;
+    options.setNoServer(!run);
   }
 
   /**
@@ -493,14 +566,6 @@
   }
 
   /**
-   * Can be override to change the default log level in subclasses. JUnit does
-   * this for example.
-   */
-  protected Type doGetDefaultLogLevel() {
-    return Type.INFO;
-  }
-
-  /**
    * Derived classes can override to prevent automatic update checking.
    */
   protected boolean doShouldCheckForUpdates() {
@@ -523,13 +588,6 @@
 
   protected abstract int doStartUpServer();
 
-  /**
-   * Derived classes can override to set a default port.
-   */
-  protected ArgHandlerPort getArgHandlerPort() {
-    return new ArgHandlerPort();
-  }
-
   protected final BrowserWidgetHost getBrowserHost() {
     return browserHost;
   }
@@ -612,7 +670,7 @@
   }
 
   protected final void shutDown() {
-    if (!runTomcat) {
+    if (options.isNoServer()) {
       return;
     }
     doShutDownServer();
@@ -633,12 +691,12 @@
       return false;
     }
 
-    if (runTomcat) {
+    if (!options.isNoServer()) {
       int resultPort = doStartUpServer();
       if (resultPort < 0) {
         return false;
       }
-      port = resultPort;
+      options.setPort(resultPort);
     }
 
     return true;
@@ -690,8 +748,8 @@
 
     boolean checkForUpdates = doShouldCheckForUpdates();
 
-    mainWnd = new ShellMainWindow(this, shell, runTomcat ? getPort() : 0,
-        checkForUpdates);
+    mainWnd = new ShellMainWindow(this, shell, options.isNoServer() ? 0
+        : getPort(), checkForUpdates);
 
     shell.setSize(700, 600);
     if (!isHeadless()) {
diff --git a/dev/core/test/com/google/gwt/dev/ArgProcessorTestBase.java b/dev/core/test/com/google/gwt/dev/ArgProcessorTestBase.java
new file mode 100644
index 0000000..5faff0d
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/ArgProcessorTestBase.java
@@ -0,0 +1,76 @@
+package com.google.gwt.dev;
+
+import com.google.gwt.util.tools.Utility;
+
+import junit.framework.TestCase;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+
+/**
+ * Base class for argument processor testing.
+ */
+public abstract class ArgProcessorTestBase extends TestCase {
+
+  private static class MockOutputStream extends OutputStream {
+    private boolean isEmpty = true;
+
+    public boolean isEmpty() {
+      return isEmpty;
+    }
+
+    @Override
+    public void write(byte[] b, int off, int len) throws IOException {
+      isEmpty = false;
+    }
+
+    @Override
+    public void write(int b) throws IOException {
+      isEmpty = false;
+    }
+  }
+
+  /*
+   * The "compute installation directory" dance.
+   */
+  static {
+    String oldValue = System.getProperty("gwt.devjar");
+    System.setProperty("gwt.devjar", "gwt-dev-windows.jar");
+    Utility.getInstallPath();
+    if (oldValue == null) {
+      System.getProperties().remove("gwt.devjar");
+    } else {
+      System.setProperty("gwt.devjar", oldValue);
+    }
+  }
+
+  protected static void assertProcessFailure(ArgProcessorBase argProcessor,
+      String... args) {
+    PrintStream oldErrStream = System.err;
+    MockOutputStream myErrStream = new MockOutputStream();
+    try {
+      System.setErr(new PrintStream(myErrStream, true));
+      assertFalse(argProcessor.processArgs(args));
+    } finally {
+      System.setErr(oldErrStream);
+    }
+    assertFalse(myErrStream.isEmpty());
+  }
+
+  protected static void assertProcessSuccess(ArgProcessorBase argProcessor,
+      String... args) {
+    PrintStream oldErrStream = System.err;
+    ByteArrayOutputStream myErrStream = new ByteArrayOutputStream();
+    try {
+      System.setErr(new PrintStream(myErrStream, true));
+      if (!argProcessor.processArgs(args)) {
+        fail(new String(myErrStream.toByteArray()));
+      }
+      assertEquals(0, myErrStream.size());
+    } finally {
+      System.setErr(oldErrStream);
+    }
+  }
+}
diff --git a/dev/core/test/com/google/gwt/dev/CompilerTest.java b/dev/core/test/com/google/gwt/dev/CompilerTest.java
new file mode 100644
index 0000000..cda54e3
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/CompilerTest.java
@@ -0,0 +1,68 @@
+package com.google.gwt.dev;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.dev.Compiler.CompilerOptionsImpl;
+import com.google.gwt.dev.jjs.JsOutputOption;
+
+import java.io.File;
+
+/**
+ * Test for {@link Compiler}.
+ */
+public class CompilerTest extends ArgProcessorTestBase {
+
+  private final Compiler.ArgProcessor argProcessor;
+  private final CompilerOptionsImpl options = new CompilerOptionsImpl();
+
+  public CompilerTest() {
+    argProcessor = new Compiler.ArgProcessor(options);
+  }
+
+  public void testAllValidArgs() {
+    assertProcessSuccess(argProcessor, "-logLevel", "DEBUG", "-style",
+        "PRETTY", "-ea", "-XdisableAggressiveOptimization", "-gen", "myGen",
+        "-war", "myWar", "-workDir", "myWork", "-extra", "myExtra",
+        "-localWorkers", "2", "c.g.g.h.H", "my.Module");
+
+    assertEquals(new File("myGen").getAbsoluteFile(),
+        options.getGenDir().getAbsoluteFile());
+    assertEquals(new File("myWar"), options.getWarDir());
+    assertEquals(new File("myWork"), options.getWorkDir());
+    assertEquals(new File("myExtra"), options.getExtraDir());
+
+    assertEquals(2, options.getLocalWorkers());
+
+    assertEquals(TreeLogger.DEBUG, options.getLogLevel());
+    assertEquals(JsOutputOption.PRETTY, options.getOutput());
+    assertTrue(options.isEnableAssertions());
+    assertFalse(options.isAggressivelyOptimize());
+
+    assertEquals(2, options.getModuleNames().size());
+    assertEquals("c.g.g.h.H", options.getModuleNames().get(0));
+    assertEquals("my.Module", options.getModuleNames().get(1));
+  }
+
+  public void testDefaultArgs() {
+    assertProcessSuccess(argProcessor, "c.g.g.h.H");
+
+    assertEquals(null, options.getGenDir());
+    assertEquals(new File("war").getAbsoluteFile(),
+        options.getWarDir().getAbsoluteFile());
+    assertEquals(null, options.getWorkDir());
+    assertEquals(null, options.getExtraDir());
+
+    assertEquals(TreeLogger.INFO, options.getLogLevel());
+    assertEquals(JsOutputOption.OBFUSCATED, options.getOutput());
+    assertFalse(options.isEnableAssertions());
+    assertTrue(options.isAggressivelyOptimize());
+
+    assertEquals(1, options.getLocalWorkers());
+
+    assertEquals(1, options.getModuleNames().size());
+    assertEquals("c.g.g.h.H", options.getModuleNames().get(0));
+  }
+
+  public void testForbiddenArgs() {
+    assertProcessFailure(argProcessor, "-out", "www");
+  }
+}
diff --git a/dev/core/test/com/google/gwt/dev/GWTCompilerTest.java b/dev/core/test/com/google/gwt/dev/GWTCompilerTest.java
new file mode 100644
index 0000000..fb4e07b
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/GWTCompilerTest.java
@@ -0,0 +1,63 @@
+package com.google.gwt.dev;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.dev.GWTCompiler.GWTCompilerOptionsImpl;
+import com.google.gwt.dev.jjs.JsOutputOption;
+
+import java.io.File;
+
+/**
+ * Test for deprecated {@link GWTShell}.
+ */
+@SuppressWarnings("deprecation")
+public class GWTCompilerTest extends ArgProcessorTestBase {
+
+  private final GWTCompiler.ArgProcessor argProcessor;
+  private final GWTCompilerOptionsImpl options = new GWTCompilerOptionsImpl();
+
+  public GWTCompilerTest() {
+    argProcessor = new GWTCompiler.ArgProcessor(options);
+  }
+
+  public void testAllValidArgs() {
+    assertProcessSuccess(argProcessor, "-logLevel", "DEBUG", "-style",
+        "PRETTY", "-ea", "-XdisableAggressiveOptimization", "-out", "myWww",
+        "-gen", "myGen", "c.g.g.h.H", "my.Module");
+
+    assertEquals(new File("myGen").getAbsoluteFile(),
+        options.getGenDir().getAbsoluteFile());
+    assertEquals(new File("myWww"), options.getOutDir());
+
+    assertEquals(TreeLogger.DEBUG, options.getLogLevel());
+    assertEquals(JsOutputOption.PRETTY, options.getOutput());
+    assertTrue(options.isEnableAssertions());
+    assertFalse(options.isAggressivelyOptimize());
+
+    assertEquals(2, options.getModuleNames().size());
+    assertEquals("c.g.g.h.H", options.getModuleNames().get(0));
+    assertEquals("my.Module", options.getModuleNames().get(1));
+  }
+
+  public void testDefaultArgs() {
+    assertProcessSuccess(argProcessor, "c.g.g.h.H");
+
+    assertEquals(null, options.getGenDir());
+    assertEquals(new File("").getAbsoluteFile(),
+        options.getOutDir().getAbsoluteFile());
+
+    assertEquals(TreeLogger.INFO, options.getLogLevel());
+    assertEquals(JsOutputOption.OBFUSCATED, options.getOutput());
+    assertFalse(options.isEnableAssertions());
+    assertTrue(options.isAggressivelyOptimize());
+
+    assertEquals(1, options.getModuleNames().size());
+    assertEquals("c.g.g.h.H", options.getModuleNames().get(0));
+  }
+
+  public void testForbiddenArgs() {
+    assertProcessFailure(argProcessor, "-localWorkers", "2");
+    assertProcessFailure(argProcessor, "-extra", "extra");
+    assertProcessFailure(argProcessor, "-war", "war");
+    assertProcessFailure(argProcessor, "-work", "work");
+  }
+}
diff --git a/dev/core/test/com/google/gwt/dev/GWTShellTest.java b/dev/core/test/com/google/gwt/dev/GWTShellTest.java
new file mode 100644
index 0000000..7b76e59
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/GWTShellTest.java
@@ -0,0 +1,73 @@
+package com.google.gwt.dev;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.dev.GWTShell.ShellOptionsImpl;
+import com.google.gwt.dev.HostedModeTest.MySCL;
+import com.google.gwt.dev.jjs.JsOutputOption;
+import com.google.gwt.dev.shell.BrowserWidgetHostChecker;
+
+import java.io.File;
+
+/**
+ * Test for deprecated {@link GWTShell}.
+ */
+@SuppressWarnings("deprecation")
+public class GWTShellTest extends ArgProcessorTestBase {
+
+  private final GWTShell.ArgProcessor argProcessor;
+  private final ShellOptionsImpl options = new ShellOptionsImpl();
+
+  public GWTShellTest() {
+    argProcessor = new GWTShell.ArgProcessor(options, false, false);
+  }
+
+  public void testAllValidArgs() {
+    assertProcessSuccess(argProcessor, "-port", "8080", "-whitelist", "white",
+        "-blacklist", "black", "-logLevel", "DEBUG", "-style", "PRETTY", "-ea",
+        "-XdisableAggressiveOptimization", "-noserver", "-out", "myWww",
+        "-gen", "myGen", "http://www.google.com/", "foo");
+
+    assertNotNull(BrowserWidgetHostChecker.matchWhitelisted("white"));
+    assertNotNull(BrowserWidgetHostChecker.matchBlacklisted("black"));
+
+    assertEquals(new File("myGen").getAbsoluteFile(),
+        options.getGenDir().getAbsoluteFile());
+    assertEquals(new File("myWww"), options.getOutDir());
+
+    assertEquals(TreeLogger.DEBUG, options.getLogLevel());
+    assertEquals(JsOutputOption.PRETTY, options.getOutput());
+    assertTrue(options.isEnableAssertions());
+    assertFalse(options.isAggressivelyOptimize());
+
+    assertEquals(8080, options.getPort());
+    assertTrue(options.isNoServer());
+    assertEquals(2, options.getStartupURLs().size());
+    assertEquals("http://www.google.com/", options.getStartupURLs().get(0));
+    assertEquals("foo", options.getStartupURLs().get(1));
+  }
+
+  public void testDefaultArgs() {
+    assertProcessSuccess(argProcessor);
+
+    assertEquals(null, options.getGenDir());
+    assertEquals(new File("").getAbsoluteFile(),
+        options.getOutDir().getAbsoluteFile());
+
+    assertEquals(TreeLogger.INFO, options.getLogLevel());
+    assertEquals(JsOutputOption.OBFUSCATED, options.getOutput());
+    assertFalse(options.isEnableAssertions());
+    assertTrue(options.isAggressivelyOptimize());
+
+    assertEquals(8888, options.getPort());
+    assertFalse(options.isNoServer());
+    assertEquals(0, options.getStartupURLs().size());
+  }
+
+  public void testForbiddenArgs() {
+    assertProcessFailure(argProcessor, "-localWorkers", "2");
+    assertProcessFailure(argProcessor, "-extra", "extra");
+    assertProcessFailure(argProcessor, "-war", "war");
+    assertProcessFailure(argProcessor, "-work", "work");
+    assertProcessFailure(argProcessor, "-server", MySCL.class.getName());
+  }
+}
diff --git a/dev/core/test/com/google/gwt/dev/HostedModeTest.java b/dev/core/test/com/google/gwt/dev/HostedModeTest.java
new file mode 100644
index 0000000..015e943
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/HostedModeTest.java
@@ -0,0 +1,121 @@
+package com.google.gwt.dev;
+
+import com.google.gwt.core.ext.ServletContainer;
+import com.google.gwt.core.ext.ServletContainerLauncher;
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.dev.HostedMode.HostedModeOptionsImpl;
+import com.google.gwt.dev.jjs.JsOutputOption;
+import com.google.gwt.dev.shell.BrowserWidgetHostChecker;
+
+import java.io.File;
+import java.net.BindException;
+
+/**
+ * Test for {@link HostedMode}.
+ */
+public class HostedModeTest extends ArgProcessorTestBase {
+
+  public static class MySCL extends ServletContainerLauncher {
+    public ServletContainer start(TreeLogger logger, int port, File appRootDir)
+        throws BindException, Exception {
+      throw new UnsupportedOperationException();
+    }
+  }
+
+  private final HostedMode.ArgProcessor argProcessor;
+  private final HostedModeOptionsImpl options = new HostedModeOptionsImpl();
+
+  public HostedModeTest() {
+    argProcessor = new HostedMode.ArgProcessor(options);
+  }
+
+  public void testAllValidArgs() {
+    assertProcessSuccess(argProcessor, "-port", "8080", "-whitelist", "white",
+        "-blacklist", "black", "-logLevel", "DEBUG", "-style", "PRETTY", "-ea",
+        "-XdisableAggressiveOptimization", "-noserver", "-server",
+        MySCL.class.getName(), "-gen", "myGen", "-war", "myWar", "-workDir",
+        "myWork", "-extra", "myExtra", "-localWorkers", "2", "-startupUrl",
+        "http://www.google.com/", "-startupUrl", "foo", "c.g.g.h.H",
+        "my.Module");
+
+    assertNotNull(BrowserWidgetHostChecker.matchWhitelisted("white"));
+    assertNotNull(BrowserWidgetHostChecker.matchBlacklisted("black"));
+
+    assertEquals(new File("myGen").getAbsoluteFile(),
+        options.getGenDir().getAbsoluteFile());
+    assertEquals(new File("myWar"), options.getWarDir());
+    assertEquals(new File("myWork"), options.getWorkDir());
+    assertEquals(new File("myExtra"), options.getExtraDir());
+
+    assertEquals(TreeLogger.DEBUG, options.getLogLevel());
+    assertEquals(JsOutputOption.PRETTY, options.getOutput());
+    assertTrue(options.isEnableAssertions());
+    assertFalse(options.isAggressivelyOptimize());
+
+    assertEquals(2, options.getLocalWorkers());
+
+    assertEquals(8080, options.getPort());
+    // False because -server overrides -noserver.
+    assertFalse(options.isNoServer());
+    assertSame(MySCL.class, options.getServletContainerLauncher().getClass());
+
+    assertEquals(2, options.getStartupURLs().size());
+    assertEquals("http://www.google.com/", options.getStartupURLs().get(0));
+    assertEquals("foo", options.getStartupURLs().get(1));
+
+    assertEquals(2, options.getModuleNames().size());
+    assertEquals("c.g.g.h.H", options.getModuleNames().get(0));
+    assertEquals("my.Module", options.getModuleNames().get(1));
+  }
+
+  public void testNoServer() {
+    assertProcessSuccess(argProcessor, "-noserver", "c.g.g.h.H");
+
+    assertTrue(options.isNoServer());
+    assertNull(options.getServletContainerLauncher());
+
+    assertEquals(1, options.getModuleNames().size());
+    assertEquals("c.g.g.h.H", options.getModuleNames().get(0));
+  }
+
+  public void testNoServerOverridesServer() {
+    assertProcessSuccess(argProcessor, "-server", MySCL.class.getName(),
+        "-noserver", "c.g.g.h.H");
+
+    assertTrue(options.isNoServer());
+    assertSame(MySCL.class, options.getServletContainerLauncher().getClass());
+
+    assertEquals(1, options.getModuleNames().size());
+    assertEquals("c.g.g.h.H", options.getModuleNames().get(0));
+  }
+
+  public void testDefaultArgs() {
+    assertProcessSuccess(argProcessor, "c.g.g.h.H");
+
+    assertEquals(null, options.getGenDir());
+    assertEquals(new File("war").getAbsoluteFile(),
+        options.getWarDir().getAbsoluteFile());
+    assertEquals(null, options.getWorkDir());
+    assertEquals(null, options.getExtraDir());
+
+    assertEquals(TreeLogger.INFO, options.getLogLevel());
+    assertEquals(JsOutputOption.OBFUSCATED, options.getOutput());
+    assertFalse(options.isEnableAssertions());
+    assertTrue(options.isAggressivelyOptimize());
+
+    assertEquals(1, options.getLocalWorkers());
+
+    assertEquals(8888, options.getPort());
+    assertFalse(options.isNoServer());
+    assertNotNull(options.getServletContainerLauncher());
+
+    assertEquals(0, options.getStartupURLs().size());
+
+    assertEquals(1, options.getModuleNames().size());
+    assertEquals("c.g.g.h.H", options.getModuleNames().get(0));
+  }
+
+  public void testForbiddenArgs() {
+    assertProcessFailure(argProcessor, "-out", "www");
+  }
+}
diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index 3fc8e80..b913922 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -28,6 +28,7 @@
 import com.google.gwt.dev.cfg.Properties;
 import com.google.gwt.dev.cfg.Property;
 import com.google.gwt.dev.javac.CompilationUnit;
+import com.google.gwt.dev.util.arg.ArgHandlerLogLevel;
 import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
 import com.google.gwt.junit.client.TimeoutException;
 import com.google.gwt.junit.client.impl.GWTRunner;
@@ -76,6 +77,7 @@
  * {@link JUnitMessageQueue}, thus closing the loop.
  * </p>
  */
+@SuppressWarnings("deprecation")
 public class JUnitShell extends GWTShell {
 
   /**
@@ -92,9 +94,25 @@
   class ArgProcessor extends GWTShell.ArgProcessor {
 
     public ArgProcessor() {
-      super(true, true);
-      registerHandler(new ArgHandlerFlag() {
+      super(options, true, true);
 
+      // Override port to set auto by default.
+      registerHandler(new ArgHandlerPort(options) {
+        @Override
+        public String[] getDefaultArgs() {
+          return new String[] {"-port", "auto"};
+        }
+      });
+
+      // Override log level to set WARN by default..
+      registerHandler(new ArgHandlerLogLevel(options) {
+        @Override
+        protected Type getDefaultLogLevel() {
+          return TreeLogger.WARN;
+        }
+      });
+
+      registerHandler(new ArgHandlerFlag() {
         @Override
         public String getPurpose() {
           return "Causes your test to run in web (compiled) mode (defaults to hosted mode)";
@@ -111,11 +129,9 @@
           numClients = 1;
           return true;
         }
-
       });
 
       registerHandler(new ArgHandlerString() {
-
         @Override
         public String getPurpose() {
           return "Runs web mode via RMI to a set of BrowserManagerServers; "
@@ -147,7 +163,6 @@
       });
 
       registerHandler(new ArgHandlerString() {
-
         @Override
         public String getPurpose() {
           return "Runs web mode via HTTP to a set of Selenium servers; "
@@ -174,7 +189,6 @@
       });
 
       registerHandler(new ArgHandlerString() {
-
         @Override
         public String getPurpose() {
           return "Run external browsers in web mode (pass a comma separated list of executables.)";
@@ -205,7 +219,6 @@
       });
 
       registerHandler(new ArgHandler() {
-
         @Override
         public String[] getDefaultArgs() {
           return null;
@@ -249,7 +262,6 @@
           runStyle = new RunStyleManual(JUnitShell.this, value);
           numClients = value;
         }
-
       });
 
       registerHandler(new ArgHandlerFlag() {
@@ -485,11 +497,6 @@
     }
   }
 
-  @Override
-  protected Type doGetDefaultLogLevel() {
-    return Type.WARN;
-  }
-
   /**
    * Never check for updates in JUnit mode.
    */
@@ -499,16 +506,6 @@
   }
 
   @Override
-  protected ArgHandlerPort getArgHandlerPort() {
-    return new ArgHandlerPort() {
-      @Override
-      public String[] getDefaultArgs() {
-        return new String[] {"-port", "auto"};
-      }
-    };
-  }
-
-  @Override
   protected void initializeLogger() {
     if (isHeadless()) {
       consoleLogger = new PrintWriterTreeLogger();
