diff --git a/dev/core/src/com/google/gwt/dev/DevMode.java b/dev/core/src/com/google/gwt/dev/DevMode.java
index 9e60e6b..5dd351b 100644
--- a/dev/core/src/com/google/gwt/dev/DevMode.java
+++ b/dev/core/src/com/google/gwt/dev/DevMode.java
@@ -21,7 +21,6 @@
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.linker.ArtifactSet;
 import com.google.gwt.core.ext.linker.impl.StandardLinkerContext;
-import com.google.gwt.dev.Compiler.CompilerOptionsImpl;
 import com.google.gwt.dev.cfg.ModuleDef;
 import com.google.gwt.dev.shell.ArtifactAcceptor;
 import com.google.gwt.dev.shell.jetty.JettyLauncher;
@@ -298,20 +297,6 @@
   }
 
   @Override
-  protected void compile(TreeLogger logger) throws UnableToCompleteException {
-    CompilerOptions newOptions = new CompilerOptionsImpl(options);
-    newOptions.setCompilationStateRetained(true);
-    new Compiler(newOptions).run(logger);
-  }
-
-  @Deprecated
-  @Override
-  protected void compile(TreeLogger logger, ModuleDef moduleDef)
-      throws UnableToCompleteException {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
   protected HostedModeBaseOptions createOptions() {
     return new HostedModeOptionsImpl();
   }
@@ -419,33 +404,6 @@
     return options.getServletContainerLauncher().getName();
   }
 
-  @Override
-  protected boolean initModule(String moduleName) {
-    ModuleDef module = modulesByName.get(moduleName);
-    if (module == null) {
-      getTopLogger().log(
-          TreeLogger.WARN,
-          "Unknown module requested '"
-              + moduleName
-              + "'; all active GWT modules must be specified in the command line arguments");
-      return false;
-    }
-    try {
-      TreeLogger logger = getTopLogger().branch(TreeLogger.DEBUG,
-          "Initializing module '" + module.getName() + "' for hosted mode");
-      boolean shouldRefreshPage = false;
-      if (module.isGwtXmlFileStale()) {
-        shouldRefreshPage = true;
-        module = loadModule(logger, module.getCanonicalName(), false);
-      }
-      link(logger, module);
-      return shouldRefreshPage;
-    } catch (UnableToCompleteException e) {
-      // Already logged.
-      return false;
-    }
-  }
-
   /*
    * Overridden to keep our map up to date.
    */
diff --git a/dev/core/src/com/google/gwt/dev/DevModeBase.java b/dev/core/src/com/google/gwt/dev/DevModeBase.java
index 90932c3..31615db 100644
--- a/dev/core/src/com/google/gwt/dev/DevModeBase.java
+++ b/dev/core/src/com/google/gwt/dev/DevModeBase.java
@@ -73,25 +73,6 @@
    */
   public class UiBrowserWidgetHostImpl implements BrowserWidgetHost {
 
-    public void compile() throws UnableToCompleteException {
-      if (isLegacyMode()) {
-        throw new UnsupportedOperationException();
-      }
-      DevModeBase.this.compile(getLogger());
-    }
-
-    @Deprecated
-    public void compile(String[] moduleNames) throws UnableToCompleteException {
-      if (!isLegacyMode()) {
-        throw new UnsupportedOperationException();
-      }
-      for (int i = 0; i < moduleNames.length; i++) {
-        String moduleName = moduleNames[i];
-        ModuleDef moduleDef = loadModule(getLogger(), moduleName, true);
-        DevModeBase.this.compile(getLogger(), moduleDef);
-      }
-    }
-
     public ModuleSpaceHost createModuleSpaceHost(TreeLogger mainLogger,
         String moduleName, String userAgent, String url, String tabKey,
         String sessionKey, BrowserChannelServer serverChannel,
@@ -133,19 +114,6 @@
       return getTopLogger();
     }
 
-    public boolean initModule(String moduleName) {
-      return DevModeBase.this.initModule(moduleName);
-    }
-
-    @Deprecated
-    public boolean isLegacyMode() {
-      return DevModeBase.this instanceof GWTShell;
-    }
-
-    public String normalizeURL(String whatTheUserTyped) {
-      return DevModeBase.this.normalizeURL(whatTheUserTyped);
-    }
-
     public void unloadModule(ModuleSpaceHost moduleSpaceHost) {
       ModuleHandle module = loadedModules.remove(moduleSpaceHost);
       if (module != null) {
@@ -733,7 +701,7 @@
     String startupURL = "";
     try {
       for (String prenormalized : options.getStartupURLs()) {
-        startupURL = normalizeURL(prenormalized);
+        startupURL = normalizeURL(prenormalized, getPort(), getHost());
         logger.log(TreeLogger.INFO, "Starting URL: " + startupURL, null);
         launchURL(startupURL);
       }
@@ -743,10 +711,6 @@
     }
   }
 
-  public final String normalizeURL(String unknownUrlText) {
-    return normalizeURL(unknownUrlText, getPort(), getHost());
-  }
-
   /**
    * Callback for the UI to indicate it is done.
    */
@@ -791,21 +755,6 @@
     return CheckForUpdates.ONE_MINUTE;
   }
 
-  /**
-   * Compiles all modules.
-   * 
-   * @throws UnableToCompleteException
-   */
-  protected abstract void compile(TreeLogger logger)
-      throws UnableToCompleteException;
-
-  /**
-   * Compiles a module (legacy only).
-   */
-  @Deprecated
-  protected abstract void compile(TreeLogger logger, ModuleDef moduleDef)
-      throws UnableToCompleteException;
-
   protected abstract HostedModeBaseOptions createOptions();
 
   protected abstract ArtifactAcceptor doCreateArtifactAcceptor(ModuleDef module);
@@ -892,26 +841,6 @@
   }
 
   /**
-   * Called from a selection script as it begins to load in hosted mode. This
-   * triggers a hosted mode link, which might actually update the running
-   * selection script.
-   * 
-   * @param moduleName the module to link
-   * @return <code>true</code> if the selection script was overwritten; this
-   *         will trigger a full-page refresh by the calling (out of date)
-   *         selection script
-   */
-  protected boolean initModule(String moduleName) {
-    /*
-     * Not used in legacy mode due to GWTShellServlet playing this role.
-     * 
-     * TODO: something smarter here and actually make GWTShellServlet less
-     * magic?
-     */
-    return false;
-  }
-
-  /**
    * By default we will open the application window.
    * 
    * @return true if we are running in headless mode
diff --git a/dev/core/src/com/google/gwt/dev/GWTCompiler.java b/dev/core/src/com/google/gwt/dev/GWTCompiler.java
index ba82fe7..d5eea34 100644
--- a/dev/core/src/com/google/gwt/dev/GWTCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/GWTCompiler.java
@@ -66,7 +66,10 @@
     }
   }
 
-  static class GWTCompilerOptionsImpl extends PrecompileOptionsImpl implements
+  /**
+   * Simple implementation of {@link LegacyCompilerOptions}.
+   */
+  public static class GWTCompilerOptionsImpl extends PrecompileOptionsImpl implements
       LegacyCompilerOptions {
 
     private int localWorkers;
diff --git a/dev/core/src/com/google/gwt/dev/GWTShell.java b/dev/core/src/com/google/gwt/dev/GWTShell.java
index 9b41e00..2879f4b 100644
--- a/dev/core/src/com/google/gwt/dev/GWTShell.java
+++ b/dev/core/src/com/google/gwt/dev/GWTShell.java
@@ -19,7 +19,6 @@
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.linker.ArtifactSet;
 import com.google.gwt.core.ext.linker.EmittedArtifact;
-import com.google.gwt.dev.GWTCompiler.GWTCompilerOptionsImpl;
 import com.google.gwt.dev.cfg.ModuleDef;
 import com.google.gwt.dev.shell.ArtifactAcceptor;
 import com.google.gwt.dev.shell.WorkDirs;
@@ -187,26 +186,6 @@
   }
 
   @Override
-  protected void compile(TreeLogger logger) throws UnableToCompleteException {
-    throw new UnsupportedOperationException();
-  }
-
-  /**
-   * Compiles a logical module def. The caller can modify the specified module
-   * def programmatically in some cases (this is needed for JUnit support, for
-   * example).
-   */
-  @Override
-  protected void compile(TreeLogger logger, ModuleDef moduleDef)
-      throws UnableToCompleteException {
-    LegacyCompilerOptions newOptions = new GWTCompilerOptionsImpl(options);
-    newOptions.setCompilationStateRetained(true);
-    if (!new GWTCompiler(newOptions).run(logger, moduleDef)) {
-      // TODO(jat): error dialog?
-    }
-  }
-
-  @Override
   protected HostedModeBaseOptions createOptions() {
     return new ShellOptionsImpl();
   }
diff --git a/dev/core/src/com/google/gwt/dev/shell/BrowserWidgetHost.java b/dev/core/src/com/google/gwt/dev/shell/BrowserWidgetHost.java
index a9ea146..1002d4e 100644
--- a/dev/core/src/com/google/gwt/dev/shell/BrowserWidgetHost.java
+++ b/dev/core/src/com/google/gwt/dev/shell/BrowserWidgetHost.java
@@ -23,23 +23,6 @@
  * <code>ModuleSpaceHost</code>, and the compiler.
  */
 public interface BrowserWidgetHost {
-  /**
-   * Perform a web-mode compile on the user-specified set of modules. Used in
-   * non-legacy mode.
-   * 
-   * @throws UnableToCompleteException
-   */
-  void compile() throws UnableToCompleteException;
-
-  /**
-   * Compile the specified set of modules, used in legacy mode.
-   * 
-   * @param modules the names of the modules to compile
-   * @throws UnableToCompleteException
-   * @deprecated Will be removed when legacy shell mode is removed
-   */
-  @Deprecated
-  void compile(String[] modules) throws UnableToCompleteException;
 
   /**
    * For OOPHM.
@@ -63,29 +46,6 @@
   TreeLogger getLogger();
 
   /**
-   * Called from a selection script as it begins to load in hosted mode. This
-   * triggers a hosted mode link, which might actually update the running
-   * selection script.
-   * 
-   * @param moduleName the module to link
-   * @return <code>true</code> if the selection script was overwritten; this
-   *         will trigger a full-page refresh by the calling (out of date)
-   *         selection script
-   */
-  boolean initModule(String moduleName);
-
-  /**
-   * Returns <code>true</code> if running in legacy mode.
-   * 
-   * @deprecated Will be removed when legacy shell mode is removed
-   */
-  @Deprecated
-  boolean isLegacyMode();
-
-  String normalizeURL(String whatTheUserTyped);
-
-
-  /**
    * For OOPHM.
    */
   void unloadModule(ModuleSpaceHost moduleSpaceHost);
diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index 81f1641..eeb8e9a 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -20,7 +20,10 @@
 import com.google.gwt.core.ext.TreeLogger.Type;
 import com.google.gwt.core.ext.typeinfo.JClassType;
 import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.dev.GWTCompiler;
 import com.google.gwt.dev.GWTShell;
+import com.google.gwt.dev.LegacyCompilerOptions;
+import com.google.gwt.dev.GWTCompiler.GWTCompilerOptionsImpl;
 import com.google.gwt.dev.cfg.BindingProperty;
 import com.google.gwt.dev.cfg.ModuleDef;
 import com.google.gwt.dev.cfg.ModuleDefLoader;
@@ -848,7 +851,11 @@
             userAgents);
       }
     }
-    super.compile(getTopLogger(), module);
+    LegacyCompilerOptions newOptions = new GWTCompilerOptionsImpl(options);
+    newOptions.setCompilationStateRetained(true);
+    if (!new GWTCompiler(newOptions).run(getTopLogger(), module)) {
+      throw new UnableToCompleteException();
+    }
   }
 
   void maybeCompileForWebMode(String moduleName, String... userAgents)
