diff --git a/dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java b/dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java
index d64f1ff..39f07d0 100644
--- a/dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java
+++ b/dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java
@@ -19,7 +19,6 @@
 import com.google.gwt.core.ext.TreeLogger.Type;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.dev.CompilerContext;
-import com.google.gwt.dev.javac.JdtCompiler.AdditionalTypeProviderDelegate;
 import com.google.gwt.dev.javac.JdtCompiler.UnitProcessor;
 import com.google.gwt.dev.javac.typemodel.TypeOracle;
 import com.google.gwt.dev.jjs.CorrelationFactory.DummyCorrelationFactory;
@@ -206,13 +205,11 @@
 
     private CompilerContext compilerContext;
 
-    public CompileMoreLater(
-        CompilerContext compilerContext, AdditionalTypeProviderDelegate delegate) {
+    public CompileMoreLater(CompilerContext compilerContext) {
       this.compilerContext = compilerContext;
       this.compiler = new JdtCompiler(
           compilerContext, new UnitProcessorImpl());
       this.suppressErrors = !compilerContext.getOptions().isStrict();
-      compiler.setAdditionalTypeProviderDelegate(delegate);
     }
 
     /**
@@ -459,24 +456,12 @@
    *
    * @throws UnableToCompleteException if the compiler aborts (not a normal compile error).
    */
-  public static CompilationState buildFrom(
-      TreeLogger logger, CompilerContext compilerContext, Set<Resource> resources)
-      throws UnableToCompleteException {
-    return buildFrom(logger, compilerContext, resources, null);
-  }
-
-  /**
-   * Compiles the given source files and adds them to the CompilationState. See
-   * {@link CompileMoreLater#compile} for details.
-   *
-   * @throws UnableToCompleteException if the compiler aborts (not a normal compile error).
-   */
   public static CompilationState buildFrom(TreeLogger logger, CompilerContext compilerContext,
-      Set<Resource> resources, AdditionalTypeProviderDelegate delegate)
+      Set<Resource> resources)
       throws UnableToCompleteException {
     Event event = SpeedTracerLogger.start(DevModeEventType.CSB_BUILD_FROM_ORACLE);
     try {
-      return instance.doBuildFrom(logger, compilerContext, resources, delegate);
+      return instance.doBuildFrom(logger, compilerContext, resources);
     } finally {
       event.end();
     }
@@ -489,8 +474,7 @@
    * TODO: maybe use a finer brush than to synchronize the whole thing.
    */
   public synchronized CompilationState doBuildFrom(TreeLogger logger,
-      CompilerContext compilerContext, Set<Resource> resources,
-      AdditionalTypeProviderDelegate compilerDelegate)
+      CompilerContext compilerContext, Set<Resource> resources)
     throws UnableToCompleteException {
     UnitCache unitCache = compilerContext.getUnitCache();
     assert unitCache != null : "CompilerContext should always contain a unit cache.";
@@ -501,7 +485,7 @@
     // Units we don't want to rebuild unless we have to.
     Map<CompilationUnitBuilder, CompilationUnit> cachedUnits = Maps.newIdentityHashMap();
 
-    CompileMoreLater compileMoreLater = new CompileMoreLater(compilerContext, compilerDelegate);
+    CompileMoreLater compileMoreLater = new CompileMoreLater(compilerContext);
 
     // For each incoming Java source file...
     for (Resource resource : resources) {
@@ -588,12 +572,6 @@
     return new ContentId(Shared.getTypeName(resource), Util.computeStrongName(content));
   }
 
-  public CompilationState doBuildFrom(
-      TreeLogger logger, CompilerContext compilerContext, Set<Resource> resources)
-      throws UnableToCompleteException {
-    return doBuildFrom(logger, compilerContext, resources, null);
-  }
-
   /**
    * Compile new generated units into an existing state.
    *
diff --git a/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java b/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
index 88fc310..911bd5a 100644
--- a/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
@@ -95,31 +95,6 @@
  * Manages the process of compiling {@link CompilationUnit}s.
  */
 public class JdtCompiler {
-  /**
-   * Provides hooks for changing the behavior of the JdtCompiler when unknown
-   * types are encountered during compilation. Currently used for allowing
-   * external tools to provide source lazily when undefined references appear.
-   */
-  public interface AdditionalTypeProviderDelegate {
-    /**
-     * Checks for additional packages which may contain additional compilation
-     * units.
-     *
-     * @param slashedPackageName the '/' separated name of the package to find
-     * @return <code>true</code> if such a package exists
-     */
-    boolean doFindAdditionalPackage(String slashedPackageName);
-
-    /**
-     * Finds a new compilation unit on-the-fly for the requested type, if there
-     * is an alternate mechanism for doing so.
-     *
-     * @param binaryName the binary name of the requested type
-     * @return a unit answering the name, or <code>null</code> if no such unit
-     *         can be created
-     */
-    GeneratedUnit doFindAdditionalType(String binaryName);
-  }
 
   /**
    * A default processor that simply collects build units.
@@ -262,7 +237,8 @@
     private int abortCount = 0;
 
     public CompilerImpl(TreeLogger logger, CompilerOptions compilerOptions) {
-      super(new INameEnvironmentImpl(), DefaultErrorHandlingPolicies.proceedWithAllProblems(),
+      super(new INameEnvironmentImpl(packages, internalTypes),
+          DefaultErrorHandlingPolicies.proceedWithAllProblems(),
           compilerOptions, new ICompilerRequestorImpl(), new DefaultProblemFactory(
               Locale.getDefault()));
       this.logger = logger;
@@ -376,7 +352,26 @@
   /**
    * How JDT receives files from the environment.
    */
-  private class INameEnvironmentImpl implements INameEnvironment {
+  private static class INameEnvironmentImpl implements INameEnvironment {
+
+    /**
+     * Remembers types that have been found in the classpath or not found at all to avoid
+     * unnecessary resource scanning.
+     */
+    private final Map<String, NameEnvironmentAnswer> cachedClassPathAnswerByInternalName =
+        Maps.newHashMap();
+
+    private final Set<String> packages;
+
+    private final Set<String> notPackages = new HashSet<String>();
+
+    private final Map<String, CompiledClass> internalTypes;
+
+    public INameEnvironmentImpl(Set<String> packages, Map<String, CompiledClass> internalTypes) {
+      this.packages = packages;
+      this.internalTypes = internalTypes;
+    }
+
     @Override
     public void cleanup() {
     }
@@ -401,11 +396,6 @@
         return cachedAnswer;
       }
 
-      NameEnvironmentAnswer additionalProviderAnswer = findTypeInAdditionalProvider(internalName);
-      if (additionalProviderAnswer != null) {
-        return additionalProviderAnswer;
-      }
-
       NameEnvironmentAnswer classPathAnswer = findTypeInClassPath(internalName);
 
       if (classPathAnswer != null) {
@@ -520,19 +510,6 @@
       }
     }
 
-    private NameEnvironmentAnswer findTypeInAdditionalProvider(String internalName) {
-      if (additionalTypeProviderDelegate == null) {
-        return null;
-      }
-
-      GeneratedUnit unit = additionalTypeProviderDelegate.doFindAdditionalType(internalName);
-      if (unit == null) {
-        return null;
-      }
-
-      return new NameEnvironmentAnswer(new Adapter(CompilationUnitBuilder.create(unit)), null);
-    }
-
     private NameEnvironmentAnswer findTypeInClassPath(String internalName) {
 
       // If the class was previously queried here return the cached result.
@@ -611,14 +588,9 @@
       if (notPackages.contains(slashedPackageName)) {
         return false;
       }
-      if ((additionalTypeProviderDelegate != null && additionalTypeProviderDelegate
-          .doFindAdditionalPackage(slashedPackageName))) {
-        addPackages(slashedPackageName);
-        return true;
-      }
       // Include class loader check for binary-only annotations.
       if (caseSensitivePathExists(slashedPackageName)) {
-        addPackages(slashedPackageName);
+        addPackages(packages, slashedPackageName);
         return true;
       } else {
         notPackages.add(slashedPackageName);
@@ -765,21 +737,12 @@
     }
   }
 
-  private AdditionalTypeProviderDelegate additionalTypeProviderDelegate;
-
   /**
    * Maps internal names to compiled classes.
    */
   private final Map<String, CompiledClass> internalTypes = new HashMap<String, CompiledClass>();
 
   /**
-   * Remembers types that have been found in the classpath or not found at all to avoid unnecessary
-   * resource scanning.
-   */
-  private final Map<String, NameEnvironmentAnswer> cachedClassPathAnswerByInternalName =
-      Maps.newHashMap();
-
-  /**
    * Remembers types that where not found during resolution to avoid unnecessary file scanning.
    */
   private final Set<String> unresolvableReferences = Sets.newHashSet();
@@ -789,8 +752,6 @@
    */
   private transient CompilerImpl compilerImpl;
 
-  private final Set<String> notPackages = new HashSet<String>();
-
   private final Set<String> packages = new HashSet<String>();
 
   private final UnitProcessor processor;
@@ -1070,10 +1031,6 @@
     return typeBinding;
   }
 
-  public void setAdditionalTypeProviderDelegate(AdditionalTypeProviderDelegate newDelegate) {
-    additionalTypeProviderDelegate = newDelegate;
-  }
-
   /**
    * Sets whether the compiler should remove unused imports.
    */
@@ -1088,6 +1045,10 @@
   }
 
   private void addPackages(String slashedPackageName) {
+    addPackages(packages, slashedPackageName);
+  }
+
+  private static void addPackages(Set<String> packages, String slashedPackageName) {
     while (packages.add(slashedPackageName)) {
       int pos = slashedPackageName.lastIndexOf('/');
       if (pos > 0) {
diff --git a/dev/core/src/com/google/gwt/dev/javac/testing/GeneratorContextBuilder.java b/dev/core/src/com/google/gwt/dev/javac/testing/GeneratorContextBuilder.java
index f0f512d..6a0ef30 100644
--- a/dev/core/src/com/google/gwt/dev/javac/testing/GeneratorContextBuilder.java
+++ b/dev/core/src/com/google/gwt/dev/javac/testing/GeneratorContextBuilder.java
@@ -107,7 +107,7 @@
 
   private CompilationState buildCompilationState() throws UnableToCompleteException {
     TreeLogger logger = treeLogger != null ? treeLogger : createLogger();
-      return new CompilationStateBuilder().doBuildFrom(logger, compilerContext, resources, null);
+      return new CompilationStateBuilder().doBuildFrom(logger, compilerContext, resources);
   }
 
   private TreeLogger createLogger() {
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/AdditionalTypeProviderDelegateTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/AdditionalTypeProviderDelegateTest.java
deleted file mode 100644
index 3609782..0000000
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/AdditionalTypeProviderDelegateTest.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.dev.jjs.impl;
-
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.dev.javac.GeneratedUnit;
-import com.google.gwt.dev.javac.JdtCompiler.AdditionalTypeProviderDelegate;
-import com.google.gwt.dev.javac.testing.impl.MockJavaResource;
-import com.google.gwt.dev.jjs.ast.JDeclaredType;
-import com.google.gwt.dev.jjs.ast.JMethod;
-import com.google.gwt.dev.jjs.ast.JProgram;
-
-/**
- * Tests that a AdditionalTypeProviderDelegate correctly gets control when an unknown
- * class is found, and that source for an unknown class gets correctly parsed.
- */
-public class AdditionalTypeProviderDelegateTest extends OptimizerTestBase {
-
-  /**
-   * Compilation unit for a class generated at runtime when an unknown
-   * reference appears.
-   */
-  private class JavaWrapperCompilationUnit implements GeneratedUnit {
-    private final long createTime = System.currentTimeMillis();
-
-    @Override
-    public String optionalFileLocation() {
-      return null; // not used
-    }
-
-    @Override
-    public String getStrongHash() {
-      return "InsertedClass";
-    }
-
-    @Override
-    public long creationTime() {
-      return createTime;
-    }
-
-    @Override
-    public String getSource() {
-      String classSource =
-          "package myPackage;\n" +
-          "public class InsertedClass {\n" +
-          "  public static int getSmallNumber() {\n" +
-          "    return 5;\n" +
-          "  }\n" +
-          "}";
-      return classSource;
-    }
-
-    @Override
-    public String getSourceMapPath() {
-      // The named file location requires a non-Java extension,
-      // or else the file won't get compiled correctly.
-      return "myPackage/InsertedClass.notjava";
-    }
-
-    @Override
-    public String getTypeName() {
-      return "myPackage.InsertedClass";
-    }
-    @Override
-    public long getSourceToken() {
-      return -1;
-    }
-  }
-
-  public boolean insertInsertedClass = false;
-
-  @Override
-  public void setUp() {
-     // Create a source class that passes fine (just to test infrastructure.)
-     sourceOracle.addOrReplace(new MockJavaResource("test.A") {
-       @Override
-       public CharSequence getContent() {
-         StringBuilder code = new StringBuilder();
-         code.append("package test;\n");
-         code.append("class A {\n");
-         code.append("  void myFunc() {\n");
-         code.append("  }\n");
-         code.append("}\n");
-         return code;
-       }
-     });
-
-     // Create a source file containing a reference to a class in another
-     // package that we don't yet know about.  That code will be inserted
-     // by the AdditionalTypeProviderDelegate.
-     sourceOracle.addOrReplace(new MockJavaResource("test.B") {
-       @Override
-       public CharSequence getContent() {
-         StringBuilder code = new StringBuilder();
-         code.append("package test;\n");
-         code.append("import myPackage.InsertedClass;");
-         code.append("class B {\n");
-         code.append("  int func() {\n");
-         // Reference an unknown class that will be substituted on the fly.
-         code.append("    return myPackage.InsertedClass.getSmallNumber();\n");
-         code.append("  }\n");
-         code.append("}\n");
-         return code;
-       }
-     });
-
-     // Create a source file containing a reference to a class in another
-     // package, but that lacks an import directive.  Are we creating the
-     // class anyway?
-     sourceOracle.addOrReplace(new MockJavaResource("test.B1") {
-       @Override
-       public CharSequence getContent() {
-         StringBuilder code = new StringBuilder();
-         code.append("package test;\n");
-         code.append("class B1 {\n");
-         code.append("  int func() {\n");
-         // Reference an unknown class that will be substituted on the fly.
-         code.append("    return myPackage.InsertedClass.getSmallNumber();\n");
-         code.append("  }\n");
-         code.append("}\n");
-         return code;
-       }
-     });
-  }
-
-  public void testInsertedClass() throws UnableToCompleteException {
-    JProgram program = compileSnippet("void", "new test.B().func();", true);
-
-    // Make sure the compiled classes appeared.
-    JDeclaredType bType = findDeclaredType(program, "test.B");
-    assertNotNull("Unknown type B", bType);
-    JDeclaredType insertedClassType = findDeclaredType(program, "myPackage.InsertedClass");
-    assertNotNull("Unknown type InsertedClass", insertedClassType);
-  }
-
-  public void testInsertedClass2() throws UnableToCompleteException {
-    JProgram program = compileSnippet("void", "new test.B1().func();", true);
-
-    // Make sure the compiled classes appeared.
-    JDeclaredType bType = findDeclaredType(program, "test.B1");
-    assertNotNull("Unknown type B1", bType);
-    JDeclaredType insertedClassType = findDeclaredType(program, "myPackage.InsertedClass");
-    assertNotNull("Unknown type InsertedClass", insertedClassType);
-  }
-
-  // Make sure regular code not using the AdditionalTypeProviderDelegate still works.
-  public void testSimpleParse() throws UnableToCompleteException {
-    JProgram program = compileSnippet("void", "new test.A();", true);
-    JDeclaredType goodClassType = findDeclaredType(program, "test.A");
-    assertNotNull("Unknown class A", goodClassType);
-  }
-
-  public void testUnknownClass() {
-    // Create a source file containing a reference to an unknown class.
-    sourceOracle.addOrReplace(new MockJavaResource("test.C") {
-      @Override
-      public CharSequence getContent() {
-        StringBuilder code = new StringBuilder();
-        code.append("package test;\n");
-        code.append("import myPackage.UnknownClass;");
-        code.append("class C {\n");
-        code.append("  int func() {\n");
-        // Reference an unknown class.
-        code.append("    return myPackage.UnknownClass.getSmallNumber();\n");
-        code.append("  }\n");
-        code.append("}\n");
-        return code;
-      }
-    });
-    try {
-      compileSnippet("void", "new test.C();", true);
-      fail("Shouldn't have compiled");
-    } catch (UnableToCompleteException expected) {
-    }
-  }
-
-  public void testUnknownClassNoImport() {
-    // Create a source file with a reference to an unknown class and no
-    // import statement.
-    sourceOracle.addOrReplace(new MockJavaResource("test.D") {
-      @Override
-      public CharSequence getContent() {
-        StringBuilder code = new StringBuilder();
-        code.append("package test;\n");
-        code.append("class D {\n");
-        code.append("  int func() {\n");
-        // Reference an unknown class.
-        code.append("    return myPackage.UnknownClass.getSmallNumber();\n");
-        code.append("  }\n");
-        code.append("}\n");
-        return code;
-      }
-    });
-    try {
-      compileSnippet("void", "new test.D();", true);
-      fail("Shouldn't have compiled");
-    } catch (UnableToCompleteException expected) {
-    }
-  }
-
-  @Override
-  protected AdditionalTypeProviderDelegate getAdditionalTypeProviderDelegate() {
-    // We'll provide a simple compiler delegate that will provide source
-    // for a class called myPackage.InsertedClass.
-    return new AdditionalTypeProviderDelegate() {
-      @Override
-      public boolean doFindAdditionalPackage(String slashedPackageName) {
-        if (slashedPackageName.compareTo("myPackage") == 0) {
-            return true;
-        }
-        return false;
-      }
-
-      @Override
-      public GeneratedUnit doFindAdditionalType(String binaryName) {
-        if (binaryName.compareTo("myPackage/InsertedClass") == 0) {
-          return new JavaWrapperCompilationUnit();
-      }
-      return null;
-      }
-    };
-  }
-
-  @Override
-  protected boolean doOptimizeMethod(TreeLogger logger, JProgram program, JMethod method) {
-    return false;
-  }
-}
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/FullCompileTestBase.java b/dev/core/test/com/google/gwt/dev/jjs/impl/FullCompileTestBase.java
index 3246258..79c7cd8 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/FullCompileTestBase.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/FullCompileTestBase.java
@@ -82,8 +82,7 @@
 
     CompilerContext compilerContext = provideCompilerContext();
     CompilationState state =
-        CompilationStateBuilder.buildFrom(logger, compilerContext,
-            sourceOracle.getResources(), getAdditionalTypeProviderDelegate());
+        CompilationStateBuilder.buildFrom(logger, compilerContext, sourceOracle.getResources());
     ConfigurationProperties config = new ConfigurationProperties(Lists.newArrayList(
         configurationProperties));
 
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/GwtAstBuilderTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/GwtAstBuilderTest.java
index 2e0c624..c4837a2 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/GwtAstBuilderTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/GwtAstBuilderTest.java
@@ -302,16 +302,14 @@
         }).build();
     compilerContext.getOptions().setSourceLevel(sourceLevel);
     compilerContext.getOptions().setStrict(true);
-    CompilationState state = CompilationStateBuilder.buildFrom(logger, compilerContext, sources,
-        getAdditionalTypeProviderDelegate());
+    CompilationState state = CompilationStateBuilder.buildFrom(logger, compilerContext, sources);
     return state;
   }
 
   private JProgram compileProgram(String entryType) throws UnableToCompleteException {
     CompilerContext compilerContext = provideCompilerContext();
     ;
-    CompilationState state = CompilationStateBuilder.buildFrom(logger, compilerContext, sources,
-        getAdditionalTypeProviderDelegate());
+    CompilationState state = CompilationStateBuilder.buildFrom(logger, compilerContext, sources);
     JProgram program = JavaAstConstructor.construct(logger, state, compilerContext,
         null, entryType, "com.google.gwt.lang.Exceptions");
     return program;
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/JJSTestBase.java b/dev/core/test/com/google/gwt/dev/jjs/impl/JJSTestBase.java
index a1f22f3..74ff099 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/JJSTestBase.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/JJSTestBase.java
@@ -23,7 +23,6 @@
 import com.google.gwt.dev.javac.CheckerTestCase;
 import com.google.gwt.dev.javac.CompilationState;
 import com.google.gwt.dev.javac.CompilationStateBuilder;
-import com.google.gwt.dev.javac.JdtCompiler.AdditionalTypeProviderDelegate;
 import com.google.gwt.dev.javac.testing.impl.MockJavaResource;
 import com.google.gwt.dev.javac.testing.impl.MockResourceOracle;
 import com.google.gwt.dev.jjs.JavaAstConstructor;
@@ -333,8 +332,7 @@
       logger = this.logger;
     }
     CompilationState state =
-        CompilationStateBuilder.buildFrom(logger, compilerContext,
-            sourceOracle.getResources(), getAdditionalTypeProviderDelegate());
+        CompilationStateBuilder.buildFrom(logger, compilerContext, sourceOracle.getResources());
     JProgram program =
         JavaAstConstructor.construct(logger, state, compilerContext,
             null, "test.EntryPoint", "com.google.gwt.lang.Exceptions");
@@ -361,14 +359,6 @@
   }
 
   /**
-   * Return an AdditionalTypeProviderDelegate that will be able to provide
-   * new sources for unknown classnames.
-   */
-  protected AdditionalTypeProviderDelegate getAdditionalTypeProviderDelegate() {
-    return null;
-  }
-
-  /**
    * Java source level compatibility option.
    */
   protected SourceLevel sourceLevel = SourceLevel.DEFAULT_SOURCE_LEVEL;
diff --git a/dev/core/test/com/google/gwt/dev/js/JsStackEmulatorTest.java b/dev/core/test/com/google/gwt/dev/js/JsStackEmulatorTest.java
index 1114d41..330b039 100644
--- a/dev/core/test/com/google/gwt/dev/js/JsStackEmulatorTest.java
+++ b/dev/core/test/com/google/gwt/dev/js/JsStackEmulatorTest.java
@@ -265,8 +265,7 @@
         recordLineNumbersProp));
 
     CompilationState state =
-        CompilationStateBuilder.buildFrom(logger, context,
-            sourceOracle.getResources(), null);
+        CompilationStateBuilder.buildFrom(logger, context, sourceOracle.getResources());
     JProgram jProgram = AstConstructor.construct(logger, state, options, config);
     jProgram.addEntryMethod(findMethod(jProgram, "onModuleLoad"));
 
