diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6c818cc..328d4b1 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -5,43 +5,12 @@
     branches:
       - master
   pull_request:
-    branches:
-      - master
-
-env:
-  # Our Bazel builds currently rely on JDK 8.
-  USE_JAVA_VERSION: '8'
-  # Our Bazel builds currently rely on 3.7.1. The version is set via
-  # baselisk by USE_BAZEL_VERSION: https://github.com/bazelbuild/bazelisk.
-  USE_BAZEL_VERSION: '3.7.1'
 
 jobs:
-  validate-latest-dagger-version:
-    name: 'Validate Dagger version'
-    runs-on: ubuntu-latest
-    steps:
-      # Cancel previous runs on the same branch to avoid unnecessary parallel
-      # runs of the same job. See https://github.com/google/go-github/pull/1821
-      - name: Cancel previous
-        uses: styfle/cancel-workflow-action@0.8.0
-        with:
-          access_token: ${{ github.token }}
-      - name: 'Check out gh-pages repository'
-        uses: actions/checkout@v2
-        with:
-          ref: 'refs/heads/gh-pages'
-          path: gh-pages
-      - name: 'Validate latest Dagger version'
-        run: ./gh-pages/.github/scripts/validate-latest-dagger-version.sh gh-pages/_config.yml
   bazel-test:
     name: 'Bazel tests'
-    needs: validate-latest-dagger-version
     runs-on: ubuntu-latest
     steps:
-      - name: 'Install Java ${{ env.USE_JAVA_VERSION }}'
-        uses: actions/setup-java@v1
-        with:
-          java-version: '${{ env.USE_JAVA_VERSION }}'
       - name: 'Check out repository'
         uses: actions/checkout@v2
       - name: 'Cache local Maven repository'
@@ -70,7 +39,7 @@
           restore-keys: |
             ${{ runner.os }}-gradle-
       - name: 'Run Bazel tests'
-        run: bazel test --test_output=errors //... --keep_going
+        run: bazel test --test_output=errors //...
         shell: bash
       - name: 'Install local snapshot'
         run: ./util/install-local-snapshot.sh
@@ -131,12 +100,6 @@
       - name: 'Gradle Android local tests (AGP ${{ matrix.agp }})'
         run: ./util/run-local-gradle-android-tests.sh "${{ matrix.agp }}"
         shell: bash
-      - name: 'Upload test reports (AGP ${{ matrix.agp }})'
-        if: ${{ always() }}
-        uses: actions/upload-artifact@v2
-        with:
-          name: tests-reports-agp-${{ matrix.agp }}
-          path: ${{ github.workspace }}/**/build/reports/tests/*
   artifact-android-emulator-tests:
     name: 'Artifact Android emulator tests (API 30)'
     needs: bazel-test
@@ -167,12 +130,6 @@
           api-level: 30
           target: google_apis
           script: ./util/run-local-emulator-tests.sh
-      - name: 'Upload test reports (API 30)'
-        if: ${{ always() }}
-        uses: actions/upload-artifact@v2
-        with:
-          name: androidTests-reports-api-30
-          path: ${{ github.workspace }}/**/build/reports/androidTests/connected/*
   publish-snapshot:
     name: 'Publish snapshot'
     # TODO(bcorso): Consider also waiting on artifact-android-emulator-tests
@@ -181,10 +138,6 @@
     if: github.event_name == 'push' && github.repository == 'google/dagger' && github.ref == 'refs/heads/master'
     runs-on: ubuntu-latest
     steps:
-      - name: 'Install Java ${{ env.USE_JAVA_VERSION }}'
-        uses: actions/setup-java@v1
-        with:
-          java-version: '${{ env.USE_JAVA_VERSION }}'
       - name: 'Check out repository'
         uses: actions/checkout@v2
       - name: 'Cache local Maven repository'
@@ -233,8 +186,8 @@
     # See https://github.com/marketplace/actions/android-emulator-runner
     runs-on: macos-latest
     strategy:
-      matrix: # Run on 16 (PreL), 21 (L), and 26 (O).
-        api-level: [16, 21, 26]
+      matrix:
+        api-level: [16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 29]
     steps:
       - name: 'Check out repository'
         uses: actions/checkout@v2
@@ -259,9 +212,3 @@
           api-level: ${{ matrix.api-level }}
           target: google_apis
           script: ./util/run-local-emulator-tests.sh
-      - name: 'Upload test reports (API ${{ matrix.api-level }})'
-        if: ${{ always() }}
-        uses: actions/upload-artifact@v2
-        with:
-          name: androidTests-report-api-${{ matrix.api-level }}
-          path: ${{ github.workspace }}/**/build/reports/androidTests/connected/*
diff --git a/BUILD b/BUILD
index b2495d7..015e849 100644
--- a/BUILD
+++ b/BUILD
@@ -97,22 +97,6 @@
     ],
 )
 
-android_library(
-    name = "android_local_test_exports",
-    exports = [
-        # TODO(bcorso): see if we can remove jsr250 dep from autovalue to prevent this.
-        "@javax_annotation_jsr250_api",  # For @Generated
-        "@maven//:org_robolectric_shadows_framework",  # For ActivityController
-        "@maven//:androidx_lifecycle_lifecycle_common",  # For Lifecycle.State
-        "@maven//:androidx_activity_activity",  # For ComponentActivity
-        "@maven//:androidx_test_core",  # For ApplicationProvider
-        "@maven//:androidx_test_ext_junit",
-        "@maven//:org_robolectric_annotations",
-        "@maven//:org_robolectric_robolectric",
-        "@robolectric//bazel:android-all",
-    ],
-)
-
 # coalesced javadocs used for the gh-pages site
 javadoc_library(
     name = "user-docs",
diff --git a/WORKSPACE b/WORKSPACE
index d49c0e2..6c2b6b0 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -12,12 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
-
-#############################
-# Load nested repository
-#############################
-
 # Declare the nested workspace so that the top-level workspace doesn't try to
 # traverse it when calling `bazel build //...`
 local_repository(
@@ -25,9 +19,7 @@
     path = "examples/bazel",
 )
 
-#############################
-# Load Bazel-Common repository
-#############################
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
 
 http_archive(
     name = "google_bazel_common",
@@ -40,9 +32,16 @@
 
 google_common_workspace_rules()
 
-#############################
-# Load Protobuf dependencies
-#############################
+RULES_JVM_EXTERNAL_TAG = "2.7"
+
+RULES_JVM_EXTERNAL_SHA = "f04b1466a00a2845106801e0c5cec96841f49ea4e7d1df88dc8e4bf31523df74"
+
+http_archive(
+    name = "rules_jvm_external",
+    sha256 = RULES_JVM_EXTERNAL_SHA,
+    strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
+    url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
+)
 
 # rules_python and zlib are required by protobuf.
 # TODO(ronshapiro): Figure out if zlib is in fact necessary, or if proto can depend on the
@@ -66,27 +65,6 @@
     urls = ["https://github.com/madler/zlib/archive/v1.2.11.tar.gz"],
 )
 
-#############################
-# Load Robolectric repository
-#############################
-
-ROBOLECTRIC_VERSION = "4.4"
-
-http_archive(
-    name = "robolectric",
-    sha256 = "d4f2eb078a51f4e534ebf5e18b6cd4646d05eae9b362ac40b93831bdf46112c7",
-    strip_prefix = "robolectric-bazel-%s" % ROBOLECTRIC_VERSION,
-    urls = ["https://github.com/robolectric/robolectric-bazel/archive/%s.tar.gz" % ROBOLECTRIC_VERSION],
-)
-
-load("@robolectric//bazel:robolectric.bzl", "robolectric_repositories")
-
-robolectric_repositories()
-
-#############################
-# Load Kotlin repository
-#############################
-
 RULES_KOTLIN_COMMIT = "2c283821911439e244285b5bfec39148e7d90e21"
 
 RULES_KOTLIN_SHA = "b04cd539e7e3571745179da95069586b6fa76a64306b24bb286154e652010608"
@@ -118,21 +96,6 @@
 
 register_toolchains("//:kotlin_toolchain")
 
-#############################
-# Load Maven dependencies
-#############################
-
-RULES_JVM_EXTERNAL_TAG = "2.7"
-
-RULES_JVM_EXTERNAL_SHA = "f04b1466a00a2845106801e0c5cec96841f49ea4e7d1df88dc8e4bf31523df74"
-
-http_archive(
-    name = "rules_jvm_external",
-    sha256 = RULES_JVM_EXTERNAL_SHA,
-    strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
-    url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
-)
-
 load("@rules_jvm_external//:defs.bzl", "maven_install")
 
 ANDROID_LINT_VERSION = "26.6.2"
@@ -141,16 +104,14 @@
     artifacts = [
         "androidx.annotation:annotation:1.1.0",
         "androidx.appcompat:appcompat:1.2.0",
-        "androidx.activity:activity:1.2.2",
-        "androidx.fragment:fragment:1.3.2",
-        "androidx.lifecycle:lifecycle-common:2.3.1",
-        "androidx.lifecycle:lifecycle-viewmodel:2.3.1",
-        "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1",
+        "androidx.activity:activity:1.1.0",
+        "androidx.fragment:fragment:1.2.5",
+        "androidx.lifecycle:lifecycle-viewmodel:2.2.0",
+        "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0",
         "androidx.multidex:multidex:2.0.1",
         "androidx.savedstate:savedstate:1.0.0",
         "androidx.test:monitor:1.1.1",
         "androidx.test:core:1.1.0",
-        "androidx.test.ext:junit:1.1.2",
         "com.google.auto:auto-common:0.11",
         "com.android.support:appcompat-v7:25.0.0",
         "com.android.support:support-annotations:25.0.0",
@@ -165,11 +126,9 @@
         "com.android.tools:testutils:%s" % ANDROID_LINT_VERSION,
         "com.github.tschuchortdev:kotlin-compile-testing:1.2.8",
         "com.google.guava:guava:27.1-android",
-        "junit:junit:4.13",
         "org.jetbrains.kotlin:kotlin-stdlib:%s" % KOTLIN_VERSION,
-        "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.2.0",
-        "org.robolectric:robolectric:4.4",
-        "org.robolectric:shadows-framework:4.4",  # For ActivityController
+        "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.1.0",
+        "org.robolectric:robolectric:4.3.1",
     ],
     repositories = [
         "https://repo1.maven.org/maven2",
@@ -178,10 +137,6 @@
     ],
 )
 
-#############################
-# Load Bazel Skylib rules
-#############################
-
 BAZEL_SKYLIB_VERSION = "1.0.2"
 
 BAZEL_SKYLIB_SHA = "97e70364e9249702246c0e9444bccdc4b847bed1eb03c5a3ece4f83dfe6abc44"
diff --git a/build_defs.bzl b/build_defs.bzl
index 915f0a0..932ca08 100644
--- a/build_defs.bzl
+++ b/build_defs.bzl
@@ -25,4 +25,7 @@
     "1.7",
 ]
 
-POM_VERSION = "${project.version}"
+POM_VERSION = "2.29.1"
+
+# DO NOT remove the comment on the next line. It's used in deploy-to-maven-central.sh
+POM_VERSION_ALPHA = POM_VERSION  + "-alpha"
diff --git a/java/dagger/android/support/BUILD b/java/dagger/android/support/BUILD
index 8afa703..03846b5 100644
--- a/java/dagger/android/support/BUILD
+++ b/java/dagger/android/support/BUILD
@@ -41,13 +41,9 @@
         "//:dagger_with_compiler",
         "//java/dagger/android",
         "@google_bazel_common//third_party/java/error_prone:annotations",
-        "@maven//:androidx_activity_activity",
         "@maven//:androidx_annotation_annotation",
         "@maven//:androidx_appcompat_appcompat",
         "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
     ],
 )
 
diff --git a/java/dagger/android/support/DaggerAppCompatActivity.java b/java/dagger/android/support/DaggerAppCompatActivity.java
index 3f0469e..da5b173 100644
--- a/java/dagger/android/support/DaggerAppCompatActivity.java
+++ b/java/dagger/android/support/DaggerAppCompatActivity.java
@@ -17,10 +17,10 @@
 package dagger.android.support;
 
 import android.os.Bundle;
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatActivity;
 import androidx.annotation.ContentView;
 import androidx.annotation.LayoutRes;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
 import dagger.android.AndroidInjection;
 import dagger.android.AndroidInjector;
 import dagger.android.DispatchingAndroidInjector;
diff --git a/java/dagger/android/support/DaggerFragment.java b/java/dagger/android/support/DaggerFragment.java
index e705b3c..8874511 100644
--- a/java/dagger/android/support/DaggerFragment.java
+++ b/java/dagger/android/support/DaggerFragment.java
@@ -17,9 +17,9 @@
 package dagger.android.support;
 
 import android.content.Context;
-import androidx.fragment.app.Fragment;
 import androidx.annotation.ContentView;
 import androidx.annotation.LayoutRes;
+import androidx.fragment.app.Fragment;
 import dagger.android.AndroidInjector;
 import dagger.android.DispatchingAndroidInjector;
 import dagger.android.HasAndroidInjector;
diff --git a/java/dagger/hilt/BUILD b/java/dagger/hilt/BUILD
index 3d12c91..94af18a 100644
--- a/java/dagger/hilt/BUILD
+++ b/java/dagger/hilt/BUILD
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 load("//tools:maven.bzl", "gen_maven_artifact")
-load("//:build_defs.bzl", "POM_VERSION")
+load("//:build_defs.bzl", "POM_VERSION_ALPHA")
 
 # Description:
 #   A library that wraps the Dagger API to make DI usage and testing easier.
@@ -46,14 +46,11 @@
         # TODO(bcorso): Consider using a separate processor to validate @EntryPoint.
         "//java/dagger/hilt/processor/internal/aggregateddeps:plugin",
     ],
-    proguard_specs = ["proguard-rules.pro"],
     deps = [
         ":generates_root_input",
         ":package_info",
         "//java/dagger/hilt/internal:component_manager",
         "//java/dagger/hilt/internal:generated_component",
-        "//java/dagger/hilt/internal:preconditions",
-        "//java/dagger/hilt/internal:test_singleton_component",
         "@google_bazel_common//third_party/java/jsr305_annotations",
     ],
 )
@@ -165,6 +162,7 @@
         "//java/dagger/hilt/android/processor/internal/androidentrypoint:srcs_filegroup",
         "//java/dagger/hilt/android/processor/internal/bindvalue:srcs_filegroup",
         "//java/dagger/hilt/android/processor/internal/customtestapplication:srcs_filegroup",
+        "//java/dagger/hilt/android/processor/internal/uninstallmodules:srcs_filegroup",
         "//java/dagger/hilt/android/processor/internal/viewmodel:srcs_filegroup",
         "//java/dagger/hilt/processor:srcs_filegroup",
         "//java/dagger/hilt/processor/internal:srcs_filegroup",
@@ -175,13 +173,12 @@
         "//java/dagger/hilt/processor/internal/generatesrootinput:srcs_filegroup",
         "//java/dagger/hilt/processor/internal/originatingelement:srcs_filegroup",
         "//java/dagger/hilt/processor/internal/root:srcs_filegroup",
-        "//java/dagger/hilt/processor/internal/uninstallmodules:srcs_filegroup",
     ],
 )
 
 java_library(
     name = "artifact-core-lib",
-    tags = ["maven_coordinates=com.google.dagger:hilt-core:" + POM_VERSION],
+    tags = ["maven_coordinates=com.google.dagger:hilt-core:" + POM_VERSION_ALPHA],
     exports = [
         ":define_component",
         ":entry_point",
@@ -197,7 +194,7 @@
 
 gen_maven_artifact(
     name = "artifact-core",
-    artifact_coordinates = "com.google.dagger:hilt-core:" + POM_VERSION,
+    artifact_coordinates = "com.google.dagger:hilt-core:" + POM_VERSION_ALPHA,
     artifact_name = "Hilt Core",
     artifact_target = ":artifact-core-lib",
     artifact_target_libs = [
@@ -213,7 +210,6 @@
         "//java/dagger/hilt/internal:component_manager",
         "//java/dagger/hilt/internal:generated_component",
         "//java/dagger/hilt/internal:preconditions",
-        "//java/dagger/hilt/internal:test_singleton_component",
         "//java/dagger/hilt/internal:unsafe_casts",
         "//java/dagger/hilt/internal/aliasof",
         "//java/dagger/hilt/internal/definecomponent",
diff --git a/java/dagger/hilt/EntryPoints.java b/java/dagger/hilt/EntryPoints.java
index 3db77f9..32e2312 100644
--- a/java/dagger/hilt/EntryPoints.java
+++ b/java/dagger/hilt/EntryPoints.java
@@ -18,14 +18,10 @@
 
 import dagger.hilt.internal.GeneratedComponent;
 import dagger.hilt.internal.GeneratedComponentManager;
-import dagger.hilt.internal.Preconditions;
-import dagger.hilt.internal.TestSingletonComponent;
-import java.lang.annotation.Annotation;
 import javax.annotation.Nonnull;
 
 /** Static utility methods for accessing objects through entry points. */
 public final class EntryPoints {
-  private static final String EARLY_ENTRY_POINT = "dagger.hilt.android.EarlyEntryPoint";
 
   /**
    * Returns the entry point interface given a component or component manager. Note that this
@@ -43,20 +39,11 @@
   @Nonnull
   public static <T> T get(Object component, Class<T> entryPoint) {
     if (component instanceof GeneratedComponent) {
-      if (component instanceof TestSingletonComponent) {
-        // @EarlyEntryPoint only has an effect in test environment, so we shouldn't fail in
-        // non-test cases. In addition, some of the validation requires the use of reflection, which
-        // we don't want to do in non-test cases anyway.
-        Preconditions.checkState(
-            !hasAnnotationReflection(entryPoint, EARLY_ENTRY_POINT),
-            "Interface, %s, annotated with @EarlyEntryPoint should be called with "
-                + "EarlyEntryPoints.get() rather than EntryPoints.get()",
-            entryPoint.getCanonicalName());
-      }
       // Unsafe cast. There is no way for this method to know that the correct component was used.
       return entryPoint.cast(component);
     } else if (component instanceof GeneratedComponentManager) {
-      return get(((GeneratedComponentManager<?>) component).generatedComponent(), entryPoint);
+      // Unsafe cast. There is no way for this method to know that the correct component was used.
+      return entryPoint.cast(((GeneratedComponentManager<?>) component).generatedComponent());
     } else {
       throw new IllegalStateException(
           String.format(
@@ -65,15 +52,5 @@
     }
   }
 
-  // Note: This method uses reflection but it should only be called in test environments.
-  private static boolean hasAnnotationReflection(Class<?> clazz, String annotationName) {
-    for (Annotation annotation : clazz.getAnnotations()) {
-      if (annotation.annotationType().getCanonicalName().contentEquals(annotationName)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
   private EntryPoints() {}
 }
diff --git a/java/dagger/hilt/android/BUILD b/java/dagger/hilt/android/BUILD
index d8833e7..47d7e67 100644
--- a/java/dagger/hilt/android/BUILD
+++ b/java/dagger/hilt/android/BUILD
@@ -14,7 +14,7 @@
 
 # Description:
 #   A library based on Hilt that provides standard components and automated injection for Android.
-load("//:build_defs.bzl", "POM_VERSION")
+load("//:build_defs.bzl", "POM_VERSION_ALPHA")
 load("//tools:maven.bzl", "gen_maven_artifact")
 
 package(default_visibility = ["//:src"])
@@ -41,12 +41,8 @@
         "//java/dagger/hilt/internal:component_manager",
         "//java/dagger/hilt/internal:generated_entry_point",
         "//java/dagger/hilt/internal:preconditions",
-        "@maven//:androidx_activity_activity",
         "@maven//:androidx_annotation_annotation",
         "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
     ],
     deps = [
         ":package_info",
@@ -63,28 +59,18 @@
         "//java/dagger/hilt/processor/internal/root:plugin",
     ],
     exports = [
-        ":activity_retained_lifecycle",
         "//:dagger_with_compiler",
         "//java/dagger/hilt:install_in",
         "//java/dagger/hilt/android/components",
-        "//java/dagger/hilt/android/internal/builders",
         "//java/dagger/hilt/android/internal/managers",
         "//java/dagger/hilt/android/internal/managers:component_supplier",
         "//java/dagger/hilt/android/internal/modules",
-        "//java/dagger/hilt/android/scopes",
         "//java/dagger/hilt/codegen:originating_element",
         "//java/dagger/hilt/internal:component_manager",
         "//java/dagger/hilt/internal:generated_component",
         "//java/dagger/hilt/internal:generated_entry_point",
-        "//java/dagger/hilt/internal/aggregatedroot",
-        "//java/dagger/hilt/internal/processedrootsentinel",
         "//java/dagger/hilt/migration:disable_install_in_check",
-        "@maven//:androidx_activity_activity",
         "@maven//:androidx_annotation_annotation",
-        "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
     ],
     deps = [
         ":package_info",
@@ -99,11 +85,7 @@
         ":package_info",
         "//java/dagger/hilt:entry_point",
         "@google_bazel_common//third_party/java/jsr305_annotations",
-        "@maven//:androidx_activity_activity",
         "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
     ],
 )
 
@@ -117,27 +99,16 @@
 )
 
 android_library(
-    name = "early_entry_point",
-    srcs = [
-        "EarlyEntryPoint.java",
-        "EarlyEntryPoints.java",
-    ],
-    exported_plugins = [
-        "//java/dagger/hilt/processor/internal/aggregateddeps:plugin",
-        "//java/dagger/hilt/processor/internal/earlyentrypoint:processor",
-    ],
-    proguard_specs = ["proguard-rules.pro"],
+    name = "artifact-lib",
+    tags = ["maven_coordinates=com.google.dagger:hilt-android:" + POM_VERSION_ALPHA],
     exports = [
-        "//java/dagger/hilt/android/internal/earlyentrypoint",
-    ],
-    deps = [
+        ":android_entry_point",
+        ":entry_point_accessors",
+        ":hilt_android_app",
         ":package_info",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt/internal:component_manager",
-        "//java/dagger/hilt/internal:preconditions",
-        "//java/dagger/hilt/internal:test_singleton_component_manager",
-        "@google_bazel_common//third_party/java/jsr305_annotations",
+        "//java/dagger/hilt:artifact-core-lib",
+        "//java/dagger/hilt/android/migration:optional_inject",
+        "//java/dagger/lint:lint-android-artifact-lib",
     ],
 )
 
@@ -149,24 +120,9 @@
     ],
 )
 
-android_library(
-    name = "artifact-lib",
-    tags = ["maven_coordinates=com.google.dagger:hilt-android:" + POM_VERSION],
-    exports = [
-        ":android_entry_point",
-        ":early_entry_point",
-        ":entry_point_accessors",
-        ":hilt_android_app",
-        ":package_info",
-        "//java/dagger/hilt:artifact-core-lib",
-        "//java/dagger/hilt/android/migration:optional_inject",
-        "//java/dagger/lint:lint-android-artifact-lib",
-    ],
-)
-
 gen_maven_artifact(
     name = "artifact",
-    artifact_coordinates = "com.google.dagger:hilt-android:" + POM_VERSION,
+    artifact_coordinates = "com.google.dagger:hilt-android:" + POM_VERSION_ALPHA,
     artifact_name = "Hilt Android",
     artifact_target = ":artifact-lib",
     artifact_target_libs = [
@@ -174,13 +130,12 @@
         "//java/dagger/hilt/android:activity_retained_lifecycle",
         "//java/dagger/hilt/android:android_entry_point",
         "//java/dagger/hilt/android:hilt_android_app",
-        "//java/dagger/hilt/android:early_entry_point",
         "//java/dagger/hilt/android:package_info",
         "//java/dagger/hilt/android/components",
+        "//java/dagger/hilt/android/components:view_model_component",
         "//java/dagger/hilt/android/components:package_info",
         "//java/dagger/hilt/android/internal",
         "//java/dagger/hilt/android/internal/builders",
-        "//java/dagger/hilt/android/internal/earlyentrypoint",
         "//java/dagger/hilt/android/internal/lifecycle",
         "//java/dagger/hilt/android/internal/managers",
         "//java/dagger/hilt/android/internal/managers:component_supplier",
@@ -192,18 +147,16 @@
         "//java/dagger/hilt/android/qualifiers",
         "//java/dagger/hilt/android/qualifiers:package_info",
         "//java/dagger/hilt/android/scopes",
+        "//java/dagger/hilt/android/scopes:activity_retained_scoped",
+        "//java/dagger/hilt/android/scopes:view_model_scoped",
         "//java/dagger/hilt/android/scopes:package_info",
         "//java/dagger/hilt/internal:component_entry_point",
         "//java/dagger/hilt/internal:generated_entry_point",
-        "//java/dagger/hilt/internal:test_singleton_component_manager",
-        "//java/dagger/hilt/internal/aggregatedroot:aggregatedroot",
-        "//java/dagger/hilt/internal/processedrootsentinel:processedrootsentinel",
     ],
     artifact_target_maven_deps = [
         "androidx.activity:activity",
         "androidx.annotation:annotation",
         "androidx.fragment:fragment",
-        "androidx.lifecycle:lifecycle-common",
         "androidx.lifecycle:lifecycle-viewmodel",
         "androidx.lifecycle:lifecycle-viewmodel-savedstate",
         "androidx.savedstate:savedstate",
@@ -230,10 +183,7 @@
     manifest = "AndroidManifest.xml",
     packaging = "aar",
     proguard_specs = [
-        "//java/dagger/hilt:proguard-rules.pro",
-        ":proguard-rules.pro",
         "//java/dagger/hilt/android/lifecycle:proguard-rules.pro",
-        "//java/dagger/hilt/internal:proguard-rules.pro",
     ],
 )
 
diff --git a/java/dagger/hilt/android/EarlyEntryPoint.java b/java/dagger/hilt/android/EarlyEntryPoint.java
deleted file mode 100644
index 2a9845e..0000000
--- a/java/dagger/hilt/android/EarlyEntryPoint.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import dagger.internal.Beta;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * An escape hatch for when a Hilt entry point usage needs to be called before the singleton
- * component is available in a Hilt test.
- *
- * <p>Warning: Please see documentation for more details:
- * https://dagger.dev/hilt/early-entry-point
- *
- * <p>Usage:
- *
- * <p>To enable an existing entry point to be called early in a Hilt test, replace its
- * {@link dagger.hilt.EntryPoint} annotation with {@link EarlyEntryPoint}. (Note that,
- * {@link EarlyEntryPoint} is only allowed on entry points installed in the
- * {@link dagger.hilt.components.SingletonComponent}).
- *
- * <pre><code>
- * @EarlyEntryPoint  // <- This replaces @EntryPoint
- * @InstallIn(SingletonComponent.class)
- * interface FooEntryPoint {
- *   Foo getFoo();
- * }
- * </code></pre>
- *
- * <p>Then, replace any of the corresponding usages of {@link dagger.hilt.EntryPoints} with
- * {@link EarlyEntryPoints}, as shown below:
- *
- * <pre><code>
- * // EarlyEntryPoints.get() must be used with entry points annotated with @EarlyEntryPoint
- * // This entry point can now be called at any point during a test, e.g. in Application.onCreate().
- * Foo foo = EarlyEntryPoints.get(appContext, FooEntryPoint.class).getFoo();
- * </code></pre>
- */
-@Beta
-@Retention(RUNTIME) // Needs to be runtime for checks in EntryPoints and EarlyEntryPoints.
-@Target(ElementType.TYPE)
-public @interface EarlyEntryPoint {}
diff --git a/java/dagger/hilt/android/EarlyEntryPoints.java b/java/dagger/hilt/android/EarlyEntryPoints.java
deleted file mode 100644
index e714019..0000000
--- a/java/dagger/hilt/android/EarlyEntryPoints.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import android.content.Context;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.internal.GeneratedComponentManagerHolder;
-import dagger.hilt.internal.Preconditions;
-import dagger.hilt.internal.TestSingletonComponentManager;
-import dagger.internal.Beta;
-import java.lang.annotation.Annotation;
-import javax.annotation.Nonnull;
-
-/** Static utility methods for accessing entry points annotated with {@link EarlyEntryPoint}. */
-@Beta
-public final class EarlyEntryPoints {
-
-  /**
-   * Returns the early entry point interface given a component manager holder. Note that this
-   * performs an unsafe cast and so callers should be sure that the given component/component
-   * manager matches the early entry point interface that is given.
-   *
-   * @param applicationContext The application context.
-   * @param entryPoint The interface marked with {@link EarlyEntryPoint}. The {@link
-   *     dagger.hilt.InstallIn} annotation on this entry point should match the component argument
-   *     above.
-   */
-  // Note that the input is not statically declared to be a Component or ComponentManager to make
-  // this method easier to use, since most code will use this with an Application or Context type.
-  @Nonnull
-  public static <T> T get(Context applicationContext, Class<T> entryPoint) {
-    applicationContext = applicationContext.getApplicationContext();
-    Preconditions.checkState(
-        applicationContext instanceof GeneratedComponentManagerHolder,
-        "Expected application context to implement GeneratedComponentManagerHolder. "
-            + "Check that you're passing in an application context that uses Hilt.");
-    Object componentManager =
-        ((GeneratedComponentManagerHolder) applicationContext).componentManager();
-    if (componentManager instanceof TestSingletonComponentManager) {
-      Preconditions.checkState(
-          hasAnnotationReflection(entryPoint, EarlyEntryPoint.class),
-          "%s should be called with EntryPoints.get() rather than EarlyEntryPoints.get()",
-          entryPoint.getCanonicalName());
-      Object earlyComponent =
-          ((TestSingletonComponentManager) componentManager).earlySingletonComponent();
-      return entryPoint.cast(earlyComponent);
-    }
-
-    // @EarlyEntryPoint only has an effect in test environment, so if this is not a test we
-    // delegate to EntryPoints.
-    return EntryPoints.get(applicationContext, entryPoint);
-  }
-
-  // Note: This method uses reflection but it should only be called in test environments.
-  private static boolean hasAnnotationReflection(
-      Class<?> clazz, Class<? extends Annotation> annotationClazz) {
-    for (Annotation annotation : clazz.getAnnotations()) {
-      if (annotation.annotationType().equals(annotationClazz)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private EarlyEntryPoints() {}
-}
diff --git a/java/dagger/hilt/android/components/BUILD b/java/dagger/hilt/android/components/BUILD
index 655ccd1..3a307d1 100644
--- a/java/dagger/hilt/android/components/BUILD
+++ b/java/dagger/hilt/android/components/BUILD
@@ -25,7 +25,6 @@
         "FragmentComponent.java",
         "ServiceComponent.java",
         "ViewComponent.java",
-        "ViewModelComponent.java",
         "ViewWithFragmentComponent.java",
     ],
     exports = [
@@ -35,7 +34,20 @@
         ":package_info",
         "//java/dagger/hilt:define_component",
         "//java/dagger/hilt/android/scopes",
+        "//java/dagger/hilt/android/scopes:activity_retained_scoped",
         "//java/dagger/hilt/components",
+        "@google_bazel_common//third_party/java/jsr330_inject",
+    ],
+)
+
+android_library(
+    name = "view_model_component",
+    srcs = ["ViewModelComponent.java"],
+    deps = [
+        ":components",
+        ":package_info",
+        "//java/dagger/hilt:define_component",
+        "//java/dagger/hilt/android/scopes:view_model_scoped",
     ],
 )
 
diff --git a/java/dagger/hilt/android/internal/builders/BUILD b/java/dagger/hilt/android/internal/builders/BUILD
index 9693f79..0e282be 100644
--- a/java/dagger/hilt/android/internal/builders/BUILD
+++ b/java/dagger/hilt/android/internal/builders/BUILD
@@ -24,10 +24,9 @@
         "//:dagger_with_compiler",
         "//java/dagger/hilt:define_component",
         "//java/dagger/hilt/android/components",
+        "//java/dagger/hilt/android/components:view_model_component",
         "@maven//:androidx_activity_activity",
         "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
         "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
     ],
 )
diff --git a/java/dagger/hilt/android/internal/earlyentrypoint/AggregatedEarlyEntryPoint.java b/java/dagger/hilt/android/internal/earlyentrypoint/AggregatedEarlyEntryPoint.java
deleted file mode 100644
index 124f831..0000000
--- a/java/dagger/hilt/android/internal/earlyentrypoint/AggregatedEarlyEntryPoint.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android.internal.earlyentrypoint;
-
-import static java.lang.annotation.RetentionPolicy.CLASS;
-
-import java.lang.annotation.Retention;
-
-/** Holds aggregated data about {@link dagger.hilt.android.EarlyEntryPoint} elements. */
-@Retention(CLASS)
-public @interface AggregatedEarlyEntryPoint {
-
-  /** Returns the entry point annotated with {@link dagger.hilt.android.EarlyEntryPoint}. */
-  String earlyEntryPoint();
-}
diff --git a/java/dagger/hilt/android/internal/earlyentrypoint/BUILD b/java/dagger/hilt/android/internal/earlyentrypoint/BUILD
deleted file mode 100644
index ab1478a..0000000
--- a/java/dagger/hilt/android/internal/earlyentrypoint/BUILD
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (C) 2021 The Dagger Authors.
-#
-# 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.
-
-# Description:
-#   A processor that aggregates metadata about Hilt @EarlyEntryPoint annotations
-
-package(default_visibility = ["//:src"])
-
-java_library(
-    name = "earlyentrypoint",
-    srcs = ["AggregatedEarlyEntryPoint.java"],
-)
diff --git a/java/dagger/hilt/android/internal/lifecycle/BUILD b/java/dagger/hilt/android/internal/lifecycle/BUILD
index 17812c9..b3ecfc2 100644
--- a/java/dagger/hilt/android/internal/lifecycle/BUILD
+++ b/java/dagger/hilt/android/internal/lifecycle/BUILD
@@ -25,12 +25,12 @@
         "//java/dagger/hilt:entry_point",
         "//java/dagger/hilt:install_in",
         "//java/dagger/hilt/android/components",
+        "//java/dagger/hilt/android/components:view_model_component",
         "//java/dagger/hilt/android/internal/builders",
         "//java/dagger/hilt/android/qualifiers",
         "@maven//:androidx_activity_activity",
         "@maven//:androidx_annotation_annotation",
         "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
         "@maven//:androidx_lifecycle_lifecycle_viewmodel",
         "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
         "@maven//:androidx_savedstate_savedstate",
diff --git a/java/dagger/hilt/internal/aggregatedroot/AggregatedRoot.java b/java/dagger/hilt/android/internal/lifecycle/DefaultActivityViewModelFactory.java
similarity index 67%
copy from java/dagger/hilt/internal/aggregatedroot/AggregatedRoot.java
copy to java/dagger/hilt/android/internal/lifecycle/DefaultActivityViewModelFactory.java
index b53ee72..becce8c 100644
--- a/java/dagger/hilt/internal/aggregatedroot/AggregatedRoot.java
+++ b/java/dagger/hilt/android/internal/lifecycle/DefaultActivityViewModelFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 The Dagger Authors.
+ * Copyright (C) 2020 The Dagger Authors.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,21 +14,16 @@
  * limitations under the License.
  */
 
-package dagger.hilt.internal.aggregatedroot;
+package dagger.hilt.android.internal.lifecycle;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
+import javax.inject.Qualifier;
 
-/**
- * An annotation used to aggregate {@link dagger.hilt.android.HiltAndroidApp} and {@link
- * dagger.hilt.android.testing.HiltAndroidTest} roots.
- */
-@Target(ElementType.TYPE)
+/** Qualifier for the default view model factory used by @AndroidEntryPoint annotated activities. */
+@Qualifier
 @Retention(RetentionPolicy.CLASS)
-public @interface AggregatedRoot {
-  String root();
-
-  Class<?> rootAnnotation();
-}
+@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
+public @interface DefaultActivityViewModelFactory {}
diff --git a/java/dagger/hilt/internal/aggregatedroot/AggregatedRoot.java b/java/dagger/hilt/android/internal/lifecycle/DefaultFragmentViewModelFactory.java
similarity index 67%
rename from java/dagger/hilt/internal/aggregatedroot/AggregatedRoot.java
rename to java/dagger/hilt/android/internal/lifecycle/DefaultFragmentViewModelFactory.java
index b53ee72..9967053 100644
--- a/java/dagger/hilt/internal/aggregatedroot/AggregatedRoot.java
+++ b/java/dagger/hilt/android/internal/lifecycle/DefaultFragmentViewModelFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 The Dagger Authors.
+ * Copyright (C) 2020 The Dagger Authors.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,21 +14,16 @@
  * limitations under the License.
  */
 
-package dagger.hilt.internal.aggregatedroot;
+package dagger.hilt.android.internal.lifecycle;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
+import javax.inject.Qualifier;
 
-/**
- * An annotation used to aggregate {@link dagger.hilt.android.HiltAndroidApp} and {@link
- * dagger.hilt.android.testing.HiltAndroidTest} roots.
- */
-@Target(ElementType.TYPE)
+/** Qualifier for the default view model factory used by @AndroidEntryPoint annotated fragments. */
+@Qualifier
 @Retention(RetentionPolicy.CLASS)
-public @interface AggregatedRoot {
-  String root();
-
-  Class<?> rootAnnotation();
-}
+@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
+public @interface DefaultFragmentViewModelFactory {}
diff --git a/java/dagger/hilt/android/internal/lifecycle/DefaultViewModelFactories.java b/java/dagger/hilt/android/internal/lifecycle/DefaultViewModelFactories.java
index 448847c..427822d 100644
--- a/java/dagger/hilt/android/internal/lifecycle/DefaultViewModelFactories.java
+++ b/java/dagger/hilt/android/internal/lifecycle/DefaultViewModelFactories.java
@@ -50,11 +50,10 @@
    *
    * <p>Do not use except in Hilt generated code!
    */
-  public static ViewModelProvider.Factory getActivityFactory(ComponentActivity activity,
-      ViewModelProvider.Factory delegateFactory) {
+  public static ViewModelProvider.Factory getActivityFactory(ComponentActivity activity) {
     return EntryPoints.get(activity, ActivityEntryPoint.class)
         .getHiltInternalFactoryFactory()
-        .fromActivity(activity, delegateFactory);
+        .fromActivity(activity);
   }
 
   /**
@@ -62,11 +61,10 @@
    *
    * <p>Do not use except in Hilt generated code!
    */
-  public static ViewModelProvider.Factory getFragmentFactory(
-      Fragment fragment, ViewModelProvider.Factory delegateFactory) {
+  public static ViewModelProvider.Factory getFragmentFactory(Fragment fragment) {
     return EntryPoints.get(fragment, FragmentEntryPoint.class)
         .getHiltInternalFactoryFactory()
-        .fromFragment(fragment, delegateFactory);
+        .fromFragment(fragment);
   }
 
   /** Internal factory for the Hilt ViewModel Factory. */
@@ -75,28 +73,33 @@
     private final Application application;
     private final Set<String> keySet;
     private final ViewModelComponentBuilder viewModelComponentBuilder;
+    @Nullable private final ViewModelProvider.Factory defaultActivityFactory;
+    @Nullable private final ViewModelProvider.Factory defaultFragmentFactory;
 
     @Inject
     InternalFactoryFactory(
             Application application,
         @HiltViewModelMap.KeySet Set<String> keySet,
-        ViewModelComponentBuilder viewModelComponentBuilder) {
+        ViewModelComponentBuilder viewModelComponentBuilder,
+        // These default factory bindings are temporary for the transition of deprecating
+        // the Hilt ViewModel extension for the built-in support
+        @DefaultActivityViewModelFactory Set<ViewModelProvider.Factory> defaultActivityFactorySet,
+        @DefaultFragmentViewModelFactory Set<ViewModelProvider.Factory> defaultFragmentFactorySet) {
       this.application = application;
       this.keySet = keySet;
       this.viewModelComponentBuilder = viewModelComponentBuilder;
+      this.defaultActivityFactory = getFactoryFromSet(defaultActivityFactorySet);
+      this.defaultFragmentFactory = getFactoryFromSet(defaultFragmentFactorySet);
     }
 
-    ViewModelProvider.Factory fromActivity(
-        ComponentActivity activity, ViewModelProvider.Factory delegateFactory) {
-      return getHiltViewModelFactory(
-          activity,
+    ViewModelProvider.Factory fromActivity(ComponentActivity activity) {
+      return getHiltViewModelFactory(activity,
           activity.getIntent() != null ? activity.getIntent().getExtras() : null,
-          delegateFactory);
+          defaultActivityFactory);
     }
 
-    ViewModelProvider.Factory fromFragment(
-        Fragment fragment, ViewModelProvider.Factory delegateFactory) {
-      return getHiltViewModelFactory(fragment, fragment.getArguments(), delegateFactory);
+    ViewModelProvider.Factory fromFragment(Fragment fragment) {
+      return getHiltViewModelFactory(fragment, fragment.getArguments(), defaultFragmentFactory);
     }
 
     private ViewModelProvider.Factory getHiltViewModelFactory(
@@ -109,6 +112,24 @@
       return new HiltViewModelFactory(
           owner, defaultArgs, keySet, delegate, viewModelComponentBuilder);
     }
+
+    @Nullable
+    private static ViewModelProvider.Factory getFactoryFromSet(Set<ViewModelProvider.Factory> set) {
+      // A multibinding set is used instead of BindsOptionalOf because Optional is not available in
+      // Android until API 24 and we don't want to have Guava as a transitive dependency.
+      if (set.isEmpty()) {
+        return null;
+      }
+      if (set.size() > 1) {
+        throw new IllegalStateException(
+            "At most one default view model factory is expected. Found " + set);
+      }
+      ViewModelProvider.Factory factory = set.iterator().next();
+      if (factory == null) {
+        throw new IllegalStateException("Default view model factory must not be null.");
+      }
+      return factory;
+    }
   }
 
   /** The activity module to declare the optional factories. */
@@ -118,6 +139,14 @@
     @Multibinds
     @HiltViewModelMap.KeySet
     abstract Set<String> viewModelKeys();
+
+    @Multibinds
+    @DefaultActivityViewModelFactory
+    Set<ViewModelProvider.Factory> defaultActivityViewModelFactory();
+
+    @Multibinds
+    @DefaultFragmentViewModelFactory
+    Set<ViewModelProvider.Factory> defaultFragmentViewModelFactory();
   }
 
   /** The activity entry point to retrieve the factory. */
diff --git a/java/dagger/hilt/android/internal/lifecycle/HiltViewModelFactory.java b/java/dagger/hilt/android/internal/lifecycle/HiltViewModelFactory.java
index 4438941..3b0d3bc 100644
--- a/java/dagger/hilt/android/internal/lifecycle/HiltViewModelFactory.java
+++ b/java/dagger/hilt/android/internal/lifecycle/HiltViewModelFactory.java
@@ -16,7 +16,6 @@
 
 package dagger.hilt.android.internal.lifecycle;
 
-import android.app.Activity;
 import androidx.lifecycle.AbstractSavedStateViewModelFactory;
 import androidx.lifecycle.SavedStateHandle;
 import androidx.lifecycle.ViewModel;
@@ -29,7 +28,6 @@
 import dagger.hilt.EntryPoint;
 import dagger.hilt.EntryPoints;
 import dagger.hilt.InstallIn;
-import dagger.hilt.android.components.ActivityComponent;
 import dagger.hilt.android.components.ViewModelComponent;
 import dagger.hilt.android.internal.builders.ViewModelComponentBuilder;
 import dagger.multibindings.Multibinds;
@@ -111,28 +109,4 @@
       return delegateFactory.create(modelClass);
     }
   }
-
-  @EntryPoint
-  @InstallIn(ActivityComponent.class)
-  interface ActivityCreatorEntryPoint {
-    @HiltViewModelMap.KeySet
-    Set<String> getViewModelKeys();
-    ViewModelComponentBuilder getViewModelComponentBuilder();
-  }
-
-  public static ViewModelProvider.Factory createInternal(
-      @NonNull Activity activity,
-      @NonNull SavedStateRegistryOwner owner,
-      @Nullable Bundle defaultArgs,
-      @NonNull ViewModelProvider.Factory delegateFactory) {
-    ActivityCreatorEntryPoint entryPoint =
-        EntryPoints.get(activity, ActivityCreatorEntryPoint.class);
-    return new HiltViewModelFactory(
-        owner,
-        defaultArgs,
-        entryPoint.getViewModelKeys(),
-        delegateFactory,
-        entryPoint.getViewModelComponentBuilder()
-    );
-  }
 }
diff --git a/java/dagger/hilt/android/internal/managers/ActivityRetainedComponentManager.java b/java/dagger/hilt/android/internal/managers/ActivityRetainedComponentManager.java
index 0af3dcd..2d4a72b 100644
--- a/java/dagger/hilt/android/internal/managers/ActivityRetainedComponentManager.java
+++ b/java/dagger/hilt/android/internal/managers/ActivityRetainedComponentManager.java
@@ -18,8 +18,6 @@
 
 import androidx.lifecycle.ViewModel;
 import androidx.lifecycle.ViewModelProvider;
-import androidx.lifecycle.ViewModelStoreOwner;
-import android.content.Context;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.activity.ComponentActivity;
@@ -84,26 +82,23 @@
   private final Object componentLock = new Object();
 
   ActivityRetainedComponentManager(ComponentActivity activity) {
-    this.viewModelProvider = getViewModelProvider(activity, activity.getApplication());
-  }
-
-  private ViewModelProvider getViewModelProvider(
-      ViewModelStoreOwner owner, Context applicationContext) {
-    return new ViewModelProvider(
-        owner,
-        new ViewModelProvider.Factory() {
-          @NonNull
-          @Override
-          @SuppressWarnings("unchecked")
-          public <T extends ViewModel> T create(@NonNull Class<T> aClass) {
-            ActivityRetainedComponent component =
-                EntryPoints.get(
-                        applicationContext, ActivityRetainedComponentBuilderEntryPoint.class)
-                    .retainedComponentBuilder()
-                    .build();
-            return (T) new ActivityRetainedComponentViewModel(component);
-          }
-        });
+    this.viewModelProvider =
+        new ViewModelProvider(
+            activity,
+            new ViewModelProvider.Factory() {
+              @NonNull
+              @Override
+              @SuppressWarnings("unchecked")
+              public <T extends ViewModel> T create(@NonNull Class<T> aClass) {
+                ActivityRetainedComponent component =
+                    EntryPoints.get(
+                            activity.getApplication(),
+                            ActivityRetainedComponentBuilderEntryPoint.class)
+                        .retainedComponentBuilder()
+                        .build();
+                return (T) new ActivityRetainedComponentViewModel(component);
+              }
+            });
   }
 
   @Override
diff --git a/java/dagger/hilt/android/internal/managers/BUILD b/java/dagger/hilt/android/internal/managers/BUILD
index 7661310..3bc8df1 100644
--- a/java/dagger/hilt/android/internal/managers/BUILD
+++ b/java/dagger/hilt/android/internal/managers/BUILD
@@ -40,17 +40,17 @@
         "//java/dagger/hilt:install_in",
         "//java/dagger/hilt/android:activity_retained_lifecycle",
         "//java/dagger/hilt/android/components",
+        "//java/dagger/hilt/android/components:view_model_component",
         "//java/dagger/hilt/android/internal",
         "//java/dagger/hilt/android/internal/builders",
-        "//java/dagger/hilt/android/scopes",
+        "//java/dagger/hilt/android/scopes:activity_retained_scoped",
+        "//java/dagger/hilt/android/scopes:view_model_scoped",
         "//java/dagger/hilt/internal:component_manager",
         "//java/dagger/hilt/internal:preconditions",
         "@maven//:androidx_activity_activity",
         "@maven//:androidx_annotation_annotation",
         "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
         "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
     ],
 )
 
diff --git a/java/dagger/hilt/android/internal/managers/ViewComponentManager.java b/java/dagger/hilt/android/internal/managers/ViewComponentManager.java
index 7861495..cb2ece0 100644
--- a/java/dagger/hilt/android/internal/managers/ViewComponentManager.java
+++ b/java/dagger/hilt/android/internal/managers/ViewComponentManager.java
@@ -16,9 +16,6 @@
 
 package dagger.hilt.android.internal.managers;
 
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleEventObserver;
-import androidx.lifecycle.LifecycleOwner;
 import android.content.Context;
 import android.content.ContextWrapper;
 import androidx.fragment.app.Fragment;
@@ -107,7 +104,7 @@
       if (context instanceof FragmentContextWrapper) {
 
         FragmentContextWrapper fragmentContextWrapper = (FragmentContextWrapper) context;
-        return (GeneratedComponentManager<?>) fragmentContextWrapper.getFragment();
+        return (GeneratedComponentManager<?>) fragmentContextWrapper.fragment;
       } else if (allowMissing) {
         // We didn't find anything, so return null if we're not supposed to fail.
         // The rest of the logic is just about getting a good error message.
@@ -168,41 +165,22 @@
    *
    * <p>A wrapper class to expose the {@link Fragment} to the views they're inflating.
    */
+  // This is only non-final for the account override
   public static final class FragmentContextWrapper extends ContextWrapper {
-    private Fragment fragment;
     private LayoutInflater baseInflater;
     private LayoutInflater inflater;
-    private final LifecycleEventObserver fragmentLifecycleObserver =
-        new LifecycleEventObserver() {
-          @Override
-          public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
-            if (event == Lifecycle.Event.ON_DESTROY) {
-              // Prevent the fragment from leaking if the view outlives the fragment.
-              // See https://github.com/google/dagger/issues/2070
-              FragmentContextWrapper.this.fragment = null;
-              FragmentContextWrapper.this.baseInflater = null;
-              FragmentContextWrapper.this.inflater = null;
-            }
-          }
-        };
+    public final Fragment fragment;
 
-    FragmentContextWrapper(Context base, Fragment fragment) {
+    public FragmentContextWrapper(Context base, Fragment fragment) {
       super(Preconditions.checkNotNull(base));
       this.baseInflater = null;
       this.fragment = Preconditions.checkNotNull(fragment);
-      this.fragment.getLifecycle().addObserver(fragmentLifecycleObserver);
     }
 
-    FragmentContextWrapper(LayoutInflater baseInflater, Fragment fragment) {
+    public FragmentContextWrapper(LayoutInflater baseInflater, Fragment fragment) {
       super(Preconditions.checkNotNull(Preconditions.checkNotNull(baseInflater).getContext()));
       this.baseInflater = baseInflater;
       this.fragment = Preconditions.checkNotNull(fragment);
-      this.fragment.getLifecycle().addObserver(fragmentLifecycleObserver);
-    }
-
-    Fragment getFragment() {
-      Preconditions.checkNotNull(fragment, "The fragment has already been destroyed.");
-      return fragment;
     }
 
     @Override
diff --git a/java/dagger/hilt/android/internal/modules/BUILD b/java/dagger/hilt/android/internal/modules/BUILD
index c1b639d..a36e237 100644
--- a/java/dagger/hilt/android/internal/modules/BUILD
+++ b/java/dagger/hilt/android/internal/modules/BUILD
@@ -28,9 +28,6 @@
         "@maven//:androidx_activity_activity",
         "@maven//:androidx_annotation_annotation",
         "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
     ],
 )
 
diff --git a/java/dagger/hilt/android/internal/testing/BUILD b/java/dagger/hilt/android/internal/testing/BUILD
index 98a273d..b0bc361 100644
--- a/java/dagger/hilt/android/internal/testing/BUILD
+++ b/java/dagger/hilt/android/internal/testing/BUILD
@@ -21,6 +21,7 @@
     name = "test_injector",
     testonly = 1,
     srcs = [
+        "TestApplicationInjector.java",
         "TestInjector.java",
     ],
 )
@@ -36,23 +37,15 @@
 )
 
 android_library(
-    name = "early_test_singleton_component_creator",
-    testonly = 1,
-    srcs = ["EarlySingletonComponentCreator.java"],
-)
-
-android_library(
     name = "test_application_component_manager",
     testonly = 1,
     srcs = ["TestApplicationComponentManager.java"],
     deps = [
-        ":early_test_singleton_component_creator",
         ":test_component_data",
         ":test_injector",
         "//java/dagger/hilt/android/testing:on_component_ready_runner",
         "//java/dagger/hilt/internal:component_manager",
         "//java/dagger/hilt/internal:preconditions",
-        "//java/dagger/hilt/internal:test_singleton_component_manager",
         "@maven//:junit_junit",
     ],
 )
@@ -74,9 +67,6 @@
     name = "test_application_component_manager_holder",
     testonly = 1,
     srcs = ["TestApplicationComponentManagerHolder.java"],
-    deps = [
-        "//java/dagger/hilt/internal:component_manager",
-    ],
 )
 
 android_library(
diff --git a/java/dagger/hilt/android/internal/testing/EarlySingletonComponentCreator.java b/java/dagger/hilt/android/internal/testing/EarlySingletonComponentCreator.java
deleted file mode 100644
index 8e61e4a..0000000
--- a/java/dagger/hilt/android/internal/testing/EarlySingletonComponentCreator.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android.internal.testing;
-
-import java.lang.reflect.InvocationTargetException;
-
-/** Creates a test's early component. */
-public abstract class EarlySingletonComponentCreator {
-  private static final String EARLY_SINGLETON_COMPONENT_CREATOR_IMPL =
-      "dagger.hilt.android.internal.testing.EarlySingletonComponentCreatorImpl";
-
-  static Object createComponent() {
-    try {
-      return Class.forName(EARLY_SINGLETON_COMPONENT_CREATOR_IMPL)
-          .asSubclass(EarlySingletonComponentCreator.class)
-          .getDeclaredConstructor()
-          .newInstance()
-          .create();
-    } catch (ClassNotFoundException
-        | NoSuchMethodException
-        | IllegalAccessException
-        | InstantiationException
-        | InvocationTargetException e) {
-      throw new RuntimeException(
-          "The EarlyComponent was requested but does not exist. Check that you have annotated "
-              + "your test class with @HiltAndroidTest and that the processor is running over your "
-              + "test.",
-          e);
-    }
-  }
-
-  /** Creates the early test component. */
-  abstract Object create();
-}
diff --git a/java/dagger/hilt/android/internal/testing/TestApplicationComponentManager.java b/java/dagger/hilt/android/internal/testing/TestApplicationComponentManager.java
index c205117..1878870 100644
--- a/java/dagger/hilt/android/internal/testing/TestApplicationComponentManager.java
+++ b/java/dagger/hilt/android/internal/testing/TestApplicationComponentManager.java
@@ -21,7 +21,7 @@
 import dagger.hilt.android.testing.OnComponentReadyRunner.OnComponentReadyRunnerHolder;
 import dagger.hilt.internal.GeneratedComponentManager;
 import dagger.hilt.internal.Preconditions;
-import dagger.hilt.internal.TestSingletonComponentManager;
+import java.lang.reflect.InvocationTargetException;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -35,18 +35,17 @@
  * <p>A manager for the creation of components that live in the test Application.
  */
 public final class TestApplicationComponentManager
-    implements TestSingletonComponentManager, OnComponentReadyRunnerHolder {
+    implements GeneratedComponentManager<Object>, OnComponentReadyRunnerHolder {
 
-  private final Object earlyComponentLock = new Object();
-  private volatile Object earlyComponent = null;
-
-  private final Object testComponentDataLock = new Object();
-  private volatile TestComponentData testComponentData;
+  // This is a generated class that we always generate in a known location.
+  private static final String TEST_COMPONENT_DATA_SUPPLIER_IMPL =
+      "dagger.hilt.android.internal.testing.TestComponentDataSupplierImpl";
 
   private final Application application;
+  private final Map<Class<?>, TestComponentData> testComponentDataSupplier;
+
   private final AtomicReference<Object> component = new AtomicReference<>();
   private final AtomicReference<Description> hasHiltTestRule = new AtomicReference<>();
-  // TODO(bcorso): Consider using a lock here rather than ConcurrentHashMap to avoid b/37042460.
   private final Map<Class<?>, Object> registeredModules = new ConcurrentHashMap<>();
   private final AtomicReference<Boolean> autoAddModuleEnabled = new AtomicReference<>();
   private final AtomicReference<DelayedComponentState> delayedComponentState =
@@ -76,18 +75,24 @@
 
   public TestApplicationComponentManager(Application application) {
     this.application = application;
-  }
-
-  @Override
-  public Object earlySingletonComponent() {
-    if (earlyComponent == null) {
-      synchronized (earlyComponentLock) {
-        if (earlyComponent == null) {
-          earlyComponent = EarlySingletonComponentCreator.createComponent();
-        }
-      }
+    try {
+      this.testComponentDataSupplier =
+          Class.forName(TEST_COMPONENT_DATA_SUPPLIER_IMPL)
+              .asSubclass(TestComponentDataSupplier.class)
+              .getDeclaredConstructor()
+              .newInstance()
+              .get();
+    } catch (ClassNotFoundException
+        | NoSuchMethodException
+        | IllegalAccessException
+        | InstantiationException
+        | InvocationTargetException e) {
+      throw new RuntimeException(
+          "Hilt classes generated from @HiltAndroidTest are missing. Check that you have annotated "
+              + "your test class with @HiltAndroidTest and that the processor is running over your "
+              + "test",
+          e);
     }
-    return earlyComponent;
   }
 
   @Override
@@ -144,9 +149,6 @@
         testInstance == null,
         "The Hilt BindValue instance cannot be set before Hilt's test rule has run.");
     Preconditions.checkState(
-        testComponentData == null,
-        "The testComponentData instance cannot be set before Hilt's test rule has run.");
-    Preconditions.checkState(
         registeredModules.isEmpty(),
         "The Hilt registered modules cannot be set before Hilt's test rule has run.");
     Preconditions.checkState(
@@ -169,7 +171,6 @@
     component.set(null);
     hasHiltTestRule.set(null);
     testInstance = null;
-    testComponentData = null;
     registeredModules.clear();
     autoAddModuleEnabled.set(null);
     delayedComponentState.set(DelayedComponentState.NOT_DELAYED);
@@ -307,14 +308,7 @@
   }
 
   private TestComponentData testComponentData() {
-    if (testComponentData == null) {
-      synchronized (testComponentDataLock) {
-        if (testComponentData == null) {
-          testComponentData = TestComponentDataSupplier.get(testClass());
-        }
-      }
-    }
-    return testComponentData;
+    return testComponentDataSupplier.get(testClass());
   }
 
   private Class<?> testClass() {
diff --git a/java/dagger/hilt/android/internal/testing/TestApplicationComponentManagerHolder.java b/java/dagger/hilt/android/internal/testing/TestApplicationComponentManagerHolder.java
index 4be5829..a8695c4 100644
--- a/java/dagger/hilt/android/internal/testing/TestApplicationComponentManagerHolder.java
+++ b/java/dagger/hilt/android/internal/testing/TestApplicationComponentManagerHolder.java
@@ -16,8 +16,9 @@
 
 package dagger.hilt.android.internal.testing;
 
-import dagger.hilt.internal.GeneratedComponentManagerHolder;
-
 /** For use by Hilt internally only! Returns the component manager. */
-// TODO(bcorso):Consider deleting this interface and just using GeneratedComponentManagerHolder
-public interface TestApplicationComponentManagerHolder extends GeneratedComponentManagerHolder {}
+public interface TestApplicationComponentManagerHolder {
+  // Returns {@link Object} so that we do not expose {@code TestApplicationComponentManager} to
+  // clients. Framework code should explicitly cast to {@code TestApplicationComponentManager}.
+  Object componentManager();
+}
diff --git a/java/dagger/hilt/internal/TestSingletonComponent.java b/java/dagger/hilt/android/internal/testing/TestApplicationInjector.java
similarity index 69%
rename from java/dagger/hilt/internal/TestSingletonComponent.java
rename to java/dagger/hilt/android/internal/testing/TestApplicationInjector.java
index 730b70b..c7ff5c9 100644
--- a/java/dagger/hilt/internal/TestSingletonComponent.java
+++ b/java/dagger/hilt/android/internal/testing/TestApplicationInjector.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 The Dagger Authors.
+ * Copyright (C) 2020 The Dagger Authors.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,11 @@
  * limitations under the License.
  */
 
-package dagger.hilt.internal;
+package dagger.hilt.android.internal.testing;
 
-/** A marker that the given component is a test {@code SingletonComponent}. */
-public interface TestSingletonComponent extends GeneratedComponent {}
+/**
+ * Interface to expose a method for members injection for use in tests.
+ */
+public interface TestApplicationInjector<T> {
+  void injectApp(T t);
+}
diff --git a/java/dagger/hilt/android/internal/testing/TestComponentDataSupplier.java b/java/dagger/hilt/android/internal/testing/TestComponentDataSupplier.java
index b6f8b0b..e39073f 100644
--- a/java/dagger/hilt/android/internal/testing/TestComponentDataSupplier.java
+++ b/java/dagger/hilt/android/internal/testing/TestComponentDataSupplier.java
@@ -16,50 +16,11 @@
 
 package dagger.hilt.android.internal.testing;
 
-import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
 
-/** Stores the {@link TestComponentData} for a Hilt test class. */
+/** Stores the {@link TestComponentData} for all Hilt test classes. */
 public abstract class TestComponentDataSupplier {
 
-  /** Returns a {@link TestComponentData}. */
-  protected abstract TestComponentData get();
-
-  static TestComponentData get(Class<?> testClass) {
-    String generatedClassName = getEnclosedClassName(testClass) + "_TestComponentDataSupplier";
-    try {
-      return Class.forName(generatedClassName)
-          .asSubclass(TestComponentDataSupplier.class)
-          .getDeclaredConstructor()
-          .newInstance()
-          .get();
-    } catch (ClassNotFoundException
-        | NoSuchMethodException
-        | IllegalAccessException
-        | InstantiationException
-        | InvocationTargetException e) {
-      throw new RuntimeException(
-          String.format(
-              "Hilt test, %s, is missing generated file: %s. Check that the test class is "
-                  + " annotated with @HiltAndroidTest and that the processor is running over your"
-                  + " test.",
-              testClass.getSimpleName(),
-              generatedClassName),
-          e);
-    }
-  }
-
-  private static String getEnclosedClassName(Class<?> testClass) {
-    StringBuilder sb = new StringBuilder();
-    Class<?> currClass = testClass;
-    while (currClass != null) {
-      Class<?> enclosingClass = currClass.getEnclosingClass();
-      if (enclosingClass != null) {
-        sb.insert(0, "_" + currClass.getSimpleName());
-      } else {
-        sb.insert(0, currClass.getCanonicalName());
-      }
-      currClass = enclosingClass;
-    }
-    return sb.toString();
-  }
+  /** Returns a map of {@link TestComponentData} keyed by test class. */
+  protected abstract Map<Class<?>, TestComponentData> get();
 }
diff --git a/java/dagger/hilt/android/internal/testing/root/BUILD b/java/dagger/hilt/android/internal/testing/root/BUILD
deleted file mode 100644
index 96b161e..0000000
--- a/java/dagger/hilt/android/internal/testing/root/BUILD
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (C) 2021 The Dagger Authors.
-#
-# 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.
-
-# Description:
-#   Internal Hilt android testing root
-
-package(default_visibility = ["//:src"])
-
-android_library(
-    name = "default",
-    srcs = ["Default.java"],
-)
diff --git a/java/dagger/hilt/android/internal/testing/root/Default.java b/java/dagger/hilt/android/internal/testing/root/Default.java
deleted file mode 100644
index 0aa1b16..0000000
--- a/java/dagger/hilt/android/internal/testing/root/Default.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android.internal.testing.root;
-
-/**
- * This is internal code. Do not depend on this class directly.
- *
- * <p>This is a "default" root (used only in tests) that generates a component without any test
- * specific dependencies.
- */
-final class Default {}
diff --git a/java/dagger/hilt/android/internal/uninstallmodules/AggregatedUninstallModules.java b/java/dagger/hilt/android/internal/uninstallmodules/AggregatedUninstallModules.java
deleted file mode 100644
index 0ab1f31..0000000
--- a/java/dagger/hilt/android/internal/uninstallmodules/AggregatedUninstallModules.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android.internal.uninstallmodules;
-
-import static java.lang.annotation.RetentionPolicy.CLASS;
-
-import java.lang.annotation.Retention;
-
-/** Holds aggregated data about {@link dagger.hilt.android.testing.UninstallModules} elements. */
-@Retention(CLASS)
-public @interface AggregatedUninstallModules {
-
-  /** Returns the test annotated with {@link dagger.hilt.android.testing.UninstallModules}. */
-  String test();
-
-  /** Returns the list of modules to uninstall. */
-  String[] uninstallModules();
-}
diff --git a/java/dagger/hilt/android/internal/uninstallmodules/BUILD b/java/dagger/hilt/android/internal/uninstallmodules/BUILD
deleted file mode 100644
index 583964b..0000000
--- a/java/dagger/hilt/android/internal/uninstallmodules/BUILD
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright (C) 2021 The Dagger Authors.
-#
-# 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.
-
-# Description:
-#   A processor that aggregates metadata about Hilt @UninstallModules annotations
-
-package(default_visibility = ["//:src"])
-
-java_library(
-    name = "uninstallmodules",
-    testonly = 1,
-    srcs = ["AggregatedUninstallModules.java"],
-)
diff --git a/java/dagger/hilt/android/lifecycle/BUILD b/java/dagger/hilt/android/lifecycle/BUILD
index 25b3e5e..fd80510 100644
--- a/java/dagger/hilt/android/lifecycle/BUILD
+++ b/java/dagger/hilt/android/lifecycle/BUILD
@@ -25,7 +25,7 @@
     ],
     proguard_specs = ["proguard-rules.pro"],
     exports = [
-        "//java/dagger/hilt/android/components",
+        "//java/dagger/hilt/android/components:view_model_component",
         "//java/dagger/hilt/android/internal/lifecycle",
     ],
     deps = [
diff --git a/java/dagger/hilt/android/migration/BUILD b/java/dagger/hilt/android/migration/BUILD
index a42f0ac..ade47c3 100644
--- a/java/dagger/hilt/android/migration/BUILD
+++ b/java/dagger/hilt/android/migration/BUILD
@@ -33,9 +33,6 @@
         "@maven//:androidx_activity_activity",
         "@maven//:androidx_annotation_annotation",
         "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
     ],
 )
 
diff --git a/java/dagger/hilt/android/plugin/build.gradle b/java/dagger/hilt/android/plugin/build.gradle
index 480c6f0..274ecbe 100644
--- a/java/dagger/hilt/android/plugin/build.gradle
+++ b/java/dagger/hilt/android/plugin/build.gradle
@@ -17,7 +17,6 @@
 buildscript {
   repositories {
     google()
-    mavenCentral()
     jcenter()
   }
 }
@@ -30,7 +29,6 @@
 
 repositories {
   google()
-  mavenCentral()
   jcenter()
 }
 
diff --git a/java/dagger/hilt/android/plugin/src/main/kotlin/dagger/hilt/android/plugin/AndroidEntryPointClassTransformer.kt b/java/dagger/hilt/android/plugin/src/main/kotlin/dagger/hilt/android/plugin/AndroidEntryPointClassTransformer.kt
index 3bbf1e1..e066f48 100644
--- a/java/dagger/hilt/android/plugin/src/main/kotlin/dagger/hilt/android/plugin/AndroidEntryPointClassTransformer.kt
+++ b/java/dagger/hilt/android/plugin/src/main/kotlin/dagger/hilt/android/plugin/AndroidEntryPointClassTransformer.kt
@@ -81,7 +81,6 @@
         if (entry.isClassFile()) {
           val clazz = classPool.makeClass(input, false)
           transformed = transformClassToOutput(clazz) || transformed
-          clazz.detach()
         }
         entry = input.nextEntry
       }
@@ -100,9 +99,7 @@
       "Invalid file, '$inputFile' is not a class."
     }
     val clazz = inputFile.inputStream().use { classPool.makeClass(it, false) }
-    val transformed = transformClassToOutput(clazz)
-    clazz.detach()
-    return transformed
+    return transformClassToOutput(clazz)
   }
 
   private fun transformClassToOutput(clazz: CtClass): Boolean {
diff --git a/java/dagger/hilt/android/plugin/src/main/kotlin/dagger/hilt/android/plugin/HiltGradlePlugin.kt b/java/dagger/hilt/android/plugin/src/main/kotlin/dagger/hilt/android/plugin/HiltGradlePlugin.kt
index a82826e..e26edb5 100644
--- a/java/dagger/hilt/android/plugin/src/main/kotlin/dagger/hilt/android/plugin/HiltGradlePlugin.kt
+++ b/java/dagger/hilt/android/plugin/src/main/kotlin/dagger/hilt/android/plugin/HiltGradlePlugin.kt
@@ -32,12 +32,10 @@
 import dagger.hilt.android.plugin.util.CopyTransform
 import dagger.hilt.android.plugin.util.SimpleAGPVersion
 import java.io.File
-import javax.inject.Inject
 import org.gradle.api.Plugin
 import org.gradle.api.Project
 import org.gradle.api.artifacts.component.ProjectComponentIdentifier
 import org.gradle.api.attributes.Attribute
-import org.gradle.api.provider.ProviderFactory
 
 /**
  * A Gradle plugin that checks if the project is an Android project and if so, registers a
@@ -47,9 +45,7 @@
  * classes annotated with `@AndroidEntryPoint` since the registered transform by this plugin will
  * update the superclass.
  */
-class HiltGradlePlugin @Inject constructor(
-  val providers: ProviderFactory
-) : Plugin<Project> {
+class HiltGradlePlugin : Plugin<Project> {
   override fun apply(project: Project) {
     var configured = false
     project.plugins.withType(AndroidBasePlugin::class.java) {
@@ -131,7 +127,6 @@
     }
   }
 
-  @Suppress("UnstableApiUsage")
   private fun configureVariantCompileClasspath(
     project: Project,
     hiltExtension: HiltExtension,
@@ -165,7 +160,7 @@
           "android.injected.build.model.only.versioned", // Sent by AS 2.4+
           "android.injected.build.model.feature.full.dependencies", // Sent by AS 2.4+
           "android.injected.build.model.v2", // Sent by AS 4.2+
-        ).any { providers.gradleProperty(it).forUseAtConfigurationTime().isPresent }
+        ).any { project.properties.containsKey(it) }
     ) {
       // Do not configure compile classpath when AndroidStudio is building the model (syncing)
       // otherwise it will cause a freeze.
diff --git a/java/dagger/hilt/android/plugin/src/main/kotlin/dagger/hilt/android/plugin/util/SimpleAGPVersion.kt b/java/dagger/hilt/android/plugin/src/main/kotlin/dagger/hilt/android/plugin/util/SimpleAGPVersion.kt
index 339c83e..1580431 100644
--- a/java/dagger/hilt/android/plugin/src/main/kotlin/dagger/hilt/android/plugin/util/SimpleAGPVersion.kt
+++ b/java/dagger/hilt/android/plugin/src/main/kotlin/dagger/hilt/android/plugin/util/SimpleAGPVersion.kt
@@ -1,5 +1,7 @@
 package dagger.hilt.android.plugin.util
 
+import com.android.Version
+
 /**
  * Simple Android Gradle Plugin version class since there is no public API one. b/175816217
  */
@@ -18,18 +20,7 @@
 
   companion object {
 
-    // TODO(danysantiago): Migrate to AndroidPluginVersion once it is available (b/175816217)
-    val ANDROID_GRADLE_PLUGIN_VERSION by lazy {
-      val clazz =
-        findClass("com.android.Version")
-          ?: findClass("com.android.builder.model.Version")
-      if (clazz != null) {
-        return@lazy parse(clazz.getField("ANDROID_GRADLE_PLUGIN_VERSION").get(null) as String)
-      }
-      error(
-        "Unable to obtain AGP version. It is likely that the AGP version being used is too old."
-      )
-    }
+    val ANDROID_GRADLE_PLUGIN_VERSION by lazy { parse(Version.ANDROID_GRADLE_PLUGIN_VERSION) }
 
     fun parse(version: String?) =
       tryParse(version) ?: error("Unable to parse AGP version: $version")
@@ -46,11 +37,5 @@
 
       return SimpleAGPVersion(parts[0].toInt(), parts[1].toInt())
     }
-
-    private fun findClass(fqName: String) = try {
-      Class.forName(fqName)
-    } catch (ex: ClassNotFoundException) {
-      null
-    }
   }
 }
diff --git a/java/dagger/hilt/android/plugin/src/test/kotlin/IncrementalProcessorTest.kt b/java/dagger/hilt/android/plugin/src/test/kotlin/IncrementalProcessorTest.kt
index cab50aa..a003ab5 100644
--- a/java/dagger/hilt/android/plugin/src/test/kotlin/IncrementalProcessorTest.kt
+++ b/java/dagger/hilt/android/plugin/src/test/kotlin/IncrementalProcessorTest.kt
@@ -157,22 +157,28 @@
     genActivityInjector2 = File(projectRoot, "$GEN_SRC_DIR/simple/Activity2_GeneratedInjector.java")
     genAppInjectorDeps = File(
       projectRoot,
-      "$GEN_SRC_DIR/hilt_aggregated_deps/_simple_SimpleApp_GeneratedInjector.java"
+      "$GEN_SRC_DIR/hilt_aggregated_deps/simple_SimpleApp_GeneratedInjectorModuleDeps.java"
     )
     genActivityInjectorDeps1 = File(
       projectRoot,
-      "$GEN_SRC_DIR/hilt_aggregated_deps/_simple_Activity1_GeneratedInjector.java"
+      "$GEN_SRC_DIR/hilt_aggregated_deps/simple_Activity1_GeneratedInjectorModuleDeps.java"
     )
     genActivityInjectorDeps2 = File(
       projectRoot,
-      "$GEN_SRC_DIR/hilt_aggregated_deps/_simple_Activity2_GeneratedInjector.java"
+      "$GEN_SRC_DIR/hilt_aggregated_deps/simple_Activity2_GeneratedInjectorModuleDeps.java"
     )
     genModuleDeps1 = File(
       projectRoot,
-      "$GEN_SRC_DIR/hilt_aggregated_deps/_simple_Module1.java"
+      "$GEN_SRC_DIR/hilt_aggregated_deps/simple_Module1ModuleDeps.java"
     )
-    genModuleDeps2 = File(projectRoot, "$GEN_SRC_DIR/hilt_aggregated_deps/_simple_Module2.java")
-    genHiltComponents = File(projectRoot, "$GEN_SRC_DIR/simple/SimpleApp_HiltComponents.java")
+    genModuleDeps2 = File(
+      projectRoot,
+      "$GEN_SRC_DIR/hilt_aggregated_deps/simple_Module2ModuleDeps.java"
+    )
+    genHiltComponents = File(
+      projectRoot,
+      "$GEN_SRC_DIR/simple/SimpleApp_HiltComponents.java"
+    )
     genDaggerHiltApplicationComponent = File(
       projectRoot,
       "$GEN_SRC_DIR/simple/DaggerSimpleApp_HiltComponents_SingletonC.java"
@@ -197,18 +203,24 @@
     )
     classGenAppInjectorDeps = File(
       projectRoot,
-      "$CLASS_DIR/hilt_aggregated_deps/_simple_SimpleApp_GeneratedInjector.class"
+      "$CLASS_DIR/hilt_aggregated_deps/simple_SimpleApp_GeneratedInjectorModuleDeps.class"
     )
     classGenActivityInjectorDeps1 = File(
       projectRoot,
-      "$CLASS_DIR/hilt_aggregated_deps/_simple_Activity1_GeneratedInjector.class"
+      "$CLASS_DIR/hilt_aggregated_deps/simple_Activity1_GeneratedInjectorModuleDeps.class"
     )
     classGenActivityInjectorDeps2 = File(
       projectRoot,
-      "$CLASS_DIR/hilt_aggregated_deps/_simple_Activity2_GeneratedInjector.class"
+      "$CLASS_DIR/hilt_aggregated_deps/simple_Activity2_GeneratedInjectorModuleDeps.class"
     )
-    classGenModuleDeps1 = File(projectRoot, "$CLASS_DIR/hilt_aggregated_deps/_simple_Module1.class")
-    classGenModuleDeps2 = File(projectRoot, "$CLASS_DIR/hilt_aggregated_deps/_simple_Module2.class")
+    classGenModuleDeps1 = File(
+      projectRoot,
+      "$CLASS_DIR/hilt_aggregated_deps/simple_Module1ModuleDeps.class"
+    )
+    classGenModuleDeps2 = File(
+      projectRoot,
+      "$CLASS_DIR/hilt_aggregated_deps/simple_Module2ModuleDeps.class"
+    )
     classGenHiltComponents = File(
       projectRoot,
       "$CLASS_DIR/simple/SimpleApp_HiltComponents.class"
diff --git a/java/dagger/hilt/android/processor/BUILD b/java/dagger/hilt/android/processor/BUILD
index ccf2103..e116c44 100644
--- a/java/dagger/hilt/android/processor/BUILD
+++ b/java/dagger/hilt/android/processor/BUILD
@@ -15,14 +15,14 @@
 # Description:
 #   Hilt android processors.
 
-load("//:build_defs.bzl", "POM_VERSION")
+load("//:build_defs.bzl", "POM_VERSION_ALPHA")
 load("//tools:maven.bzl", "gen_maven_artifact")
 
 package(default_visibility = ["//:src"])
 
 java_library(
     name = "artifact-lib",
-    tags = ["maven_coordinates=com.google.dagger:hilt-android-compiler:" + POM_VERSION],
+    tags = ["maven_coordinates=com.google.dagger:hilt-android-compiler:" + POM_VERSION_ALPHA],
     visibility = ["//visibility:private"],
     exports = [
         "//java/dagger/hilt/processor:artifact-lib-shared",
@@ -31,23 +31,23 @@
 
 gen_maven_artifact(
     name = "artifact",
-    artifact_coordinates = "com.google.dagger:hilt-android-compiler:" + POM_VERSION,
+    artifact_coordinates = "com.google.dagger:hilt-android-compiler:" + POM_VERSION_ALPHA,
     artifact_name = "Hilt Android Processor",
     artifact_target = ":artifact-lib",
     artifact_target_libs = [
         "//java/dagger/hilt/android/processor/internal:android_classnames",
         "//java/dagger/hilt/android/processor/internal:utils",
         "//java/dagger/hilt/android/processor/internal/androidentrypoint:android_generators",
+        "//java/dagger/hilt/android/processor/internal/androidentrypoint:compiler_options",
         "//java/dagger/hilt/android/processor/internal/androidentrypoint:metadata",
         "//java/dagger/hilt/android/processor/internal/androidentrypoint:processor_lib",
         "//java/dagger/hilt/android/processor/internal/bindvalue:bind_value_processor_lib",
         "//java/dagger/hilt/android/processor/internal/customtestapplication:processor_lib",
         "//java/dagger/hilt/android/processor/internal/viewmodel:validation_plugin_lib",
+        "//java/dagger/hilt/android/processor/internal/uninstallmodules:processor_lib",
         "//java/dagger/hilt/android/processor/internal/viewmodel:processor_lib",
-        "//java/dagger/hilt/processor/internal:aggregated_elements",
         "//java/dagger/hilt/processor/internal:base_processor",
         "//java/dagger/hilt/processor/internal:classnames",
-        "//java/dagger/hilt/processor/internal:compiler_options",
         "//java/dagger/hilt/processor/internal:component_descriptor",
         "//java/dagger/hilt/processor/internal:component_names",
         "//java/dagger/hilt/processor/internal:components",
@@ -55,22 +55,17 @@
         "//java/dagger/hilt/processor/internal:processor_errors",
         "//java/dagger/hilt/processor/internal:processors",
         "//java/dagger/hilt/processor/internal/aggregateddeps:component_dependencies",
-        "//java/dagger/hilt/processor/internal/aggregateddeps:pkg_private_metadata",
         "//java/dagger/hilt/processor/internal/aggregateddeps:processor_lib",
         "//java/dagger/hilt/processor/internal/aliasof:alias_ofs",
         "//java/dagger/hilt/processor/internal/aliasof:processor_lib",
         "//java/dagger/hilt/processor/internal/definecomponent:define_components",
         "//java/dagger/hilt/processor/internal/definecomponent:processor_lib",
-        "//java/dagger/hilt/processor/internal/earlyentrypoint:aggregated_early_entry_point_metadata",
-        "//java/dagger/hilt/processor/internal/earlyentrypoint:processor_lib",
         "//java/dagger/hilt/processor/internal/generatesrootinput:generates_root_inputs",
         "//java/dagger/hilt/processor/internal/generatesrootinput:processor_lib",
         "//java/dagger/hilt/processor/internal/originatingelement:processor_lib",
         "//java/dagger/hilt/processor/internal/root:processor_lib",
         "//java/dagger/hilt/processor/internal/root:root_metadata",
         "//java/dagger/hilt/processor/internal/root:root_type",
-        "//java/dagger/hilt/processor/internal/uninstallmodules:processor_lib",
-        "//java/dagger/hilt/processor/internal/uninstallmodules:aggregated_uninstall_modules_metadata",
     ],
     artifact_target_maven_deps = [
         "com.google.auto:auto-common",
diff --git a/java/dagger/hilt/android/processor/internal/AndroidClassNames.java b/java/dagger/hilt/android/processor/internal/AndroidClassNames.java
index d370920..915ae51 100644
--- a/java/dagger/hilt/android/processor/internal/AndroidClassNames.java
+++ b/java/dagger/hilt/android/processor/internal/AndroidClassNames.java
@@ -113,10 +113,5 @@
   public static final ClassName SAVED_STATE_HANDLE =
       get("androidx.lifecycle", "SavedStateHandle");
 
-  public static final ClassName ON_CONTEXT_AVAILABLE_LISTENER =
-      get("androidx.activity.contextaware", "OnContextAvailableListener");
-  public static final ClassName INJECT_VIA_ON_CONTEXT_AVAILABLE_LISTENER =
-      get("dagger.hilt.android", "InjectViaOnContextAvailableListener");
-
   private AndroidClassNames() {}
 }
diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java
index 86fbaa7..ce9ad14 100644
--- a/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java
+++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java
@@ -17,9 +17,9 @@
 package dagger.hilt.android.processor.internal.androidentrypoint;
 
 import com.squareup.javapoet.ClassName;
-import com.squareup.javapoet.CodeBlock;
 import com.squareup.javapoet.JavaFile;
 import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.ParameterSpec;
 import com.squareup.javapoet.TypeSpec;
 import com.squareup.javapoet.TypeVariableName;
 import dagger.hilt.android.processor.internal.AndroidClassNames;
@@ -30,6 +30,7 @@
 
 /** Generates an Hilt Activity class for the @AndroidEntryPoint annotated class. */
 public final class ActivityGenerator {
+
   private final ProcessingEnvironment env;
   private final AndroidEntryPointMetadata metadata;
   private final ClassName generatedClassName;
@@ -55,11 +56,9 @@
     Generators.addGeneratedBaseClassJavadoc(builder, AndroidClassNames.ANDROID_ENTRY_POINT);
     Processors.addGeneratedAnnotation(builder, env, getClass());
 
-      Generators.copyConstructors(
-          metadata.baseElement(),
-          CodeBlock.builder().addStatement("_initHiltInternal()").build(),
-          builder);
-      builder.addMethod(init());
+      Generators.copyConstructors(metadata.baseElement(), builder);
+      builder.addMethod(onCreate());
+
 
     metadata.baseElement().getTypeParameters().stream()
         .map(TypeVariableName::get)
@@ -80,36 +79,29 @@
         .writeTo(env.getFiler());
   }
 
-  // private void init() {
-  //   addOnContextAvailableListener(new OnContextAvailableListener() {
-  //     @Override
-  //     public void onContextAvailable(Context context) {
-  //       inject();
-  //     }
-  //   });
+  // @CallSuper
+  // @Override
+  // protected void onCreate(@Nullable Bundle savedInstanceState) {
+  //   inject();
+  //   super.onCreate(savedInstanceState);
   // }
-  private MethodSpec init() {
-    return MethodSpec.methodBuilder("_initHiltInternal")
-        .addModifiers(Modifier.PRIVATE)
-        .addStatement(
-            "addOnContextAvailableListener($L)",
-            TypeSpec.anonymousClassBuilder("")
-                .addSuperinterface(AndroidClassNames.ON_CONTEXT_AVAILABLE_LISTENER)
-                .addMethod(
-                    MethodSpec.methodBuilder("onContextAvailable")
-                        .addAnnotation(Override.class)
-                        .addModifiers(Modifier.PUBLIC)
-                        .addParameter(AndroidClassNames.CONTEXT, "context")
-                        .addStatement("inject()")
-                        .build())
+  private MethodSpec onCreate() {
+    return MethodSpec.methodBuilder("onCreate")
+        .addAnnotation(AndroidClassNames.CALL_SUPER)
+        .addAnnotation(Override.class)
+        .addModifiers(Modifier.PROTECTED)
+        .addParameter(
+            ParameterSpec.builder(AndroidClassNames.BUNDLE, "savedInstanceState")
+                .addAnnotation(AndroidClassNames.NULLABLE)
                 .build())
+        .addStatement("inject()")
+        .addStatement("super.onCreate(savedInstanceState)")
         .build();
   }
 
   // @Override
   // public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
-  //   return DefaultViewModelFactories.getActivityFactory(
-  //       this, super.getDefaultViewModelProviderFactory());
+  //   return DefaultViewModelFactories.getActivityFactory(this);
   // }
   private MethodSpec getDefaultViewModelProviderFactory() {
     return MethodSpec.methodBuilder("getDefaultViewModelProviderFactory")
@@ -117,7 +109,7 @@
         .addModifiers(Modifier.PUBLIC)
         .returns(AndroidClassNames.VIEW_MODEL_PROVIDER_FACTORY)
         .addStatement(
-            "return $T.getActivityFactory(this, super.getDefaultViewModelProviderFactory())",
+            "return $T.getActivityFactory(this)",
             AndroidClassNames.DEFAULT_VIEW_MODEL_FACTORIES)
         .build();
   }
diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointMetadata.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointMetadata.java
index c94f6a9..e5868f8 100644
--- a/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointMetadata.java
+++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointMetadata.java
@@ -16,7 +16,7 @@
 
 package dagger.hilt.android.processor.internal.androidentrypoint;
 
-import static dagger.hilt.processor.internal.HiltCompilerOptions.isAndroidSuperclassValidationDisabled;
+import static dagger.hilt.android.processor.internal.androidentrypoint.HiltCompilerOptions.BooleanOption.DISABLE_ANDROID_SUPERCLASS_VALIDATION;
 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
 
 import com.google.auto.common.MoreElements;
@@ -245,7 +245,7 @@
     final TypeElement baseElement;
     final ClassName generatedClassName;
     boolean requiresBytecodeInjection =
-        isAndroidSuperclassValidationDisabled(androidEntryPointElement, env)
+        DISABLE_ANDROID_SUPERCLASS_VALIDATION.get(env)
             && MoreTypes.isTypeOf(Void.class, androidEntryPointClassValue.asType());
     if (requiresBytecodeInjection) {
       baseElement = MoreElements.asType(env.getTypeUtils().asElement(androidEntryPointElement.getSuperclass()));
diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointProcessor.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointProcessor.java
index cd3290b..7bb9b9a 100644
--- a/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointProcessor.java
+++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointProcessor.java
@@ -44,6 +44,11 @@
   }
 
   @Override
+  public Set<String> getSupportedOptions() {
+    return HiltCompilerOptions.getProcessorOptions();
+  }
+
+  @Override
   public boolean delayErrors() {
     return true;
   }
diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/ApplicationGenerator.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/ApplicationGenerator.java
index 8d63cdb..f16e06d 100644
--- a/java/dagger/hilt/android/processor/internal/androidentrypoint/ApplicationGenerator.java
+++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/ApplicationGenerator.java
@@ -38,13 +38,11 @@
   private final ProcessingEnvironment env;
   private final AndroidEntryPointMetadata metadata;
   private final ClassName wrapperClassName;
-  private final ComponentNames componentNames;
 
   public ApplicationGenerator(ProcessingEnvironment env, AndroidEntryPointMetadata metadata) {
     this.env = env;
     this.metadata = metadata;
-    this.wrapperClassName = metadata.generatedClassName();
-    this.componentNames = ComponentNames.withoutRenaming();
+    wrapperClassName = metadata.generatedClassName();
   }
 
   // @Generated("ApplicationGenerator")
@@ -109,7 +107,7 @@
   // }
   private TypeSpec creatorType() {
     ClassName component =
-        componentNames.generatedComponent(
+        ComponentNames.generatedComponent(
             metadata.elementClassName(), AndroidClassNames.SINGLETON_COMPONENT);
     return TypeSpec.anonymousClassBuilder("")
         .addSuperinterface(AndroidClassNames.COMPONENT_SUPPLIER)
diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/BUILD b/java/dagger/hilt/android/processor/internal/androidentrypoint/BUILD
index efbf9e4..55e9ddc 100644
--- a/java/dagger/hilt/android/processor/internal/androidentrypoint/BUILD
+++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/BUILD
@@ -35,9 +35,11 @@
     srcs = ["AndroidEntryPointProcessor.java"],
     deps = [
         ":android_generators",
+        ":compiler_options",
         ":metadata",
         "//java/dagger/hilt/android/processor/internal:android_classnames",
         "//java/dagger/hilt/processor/internal:base_processor",
+        "//java/dagger/hilt/processor/internal:processors",
         "//java/dagger/internal/guava:collect",
         "@google_bazel_common//third_party/java/auto:service",
         "@google_bazel_common//third_party/java/incap",
@@ -79,9 +81,9 @@
         "AndroidEntryPointMetadata.java",
     ],
     deps = [
+        ":compiler_options",
         "//java/dagger/hilt/android/processor/internal:android_classnames",
         "//java/dagger/hilt/processor/internal:classnames",
-        "//java/dagger/hilt/processor/internal:compiler_options",
         "//java/dagger/hilt/processor/internal:components",
         "//java/dagger/hilt/processor/internal:kotlin",
         "//java/dagger/hilt/processor/internal:processor_errors",
@@ -96,6 +98,11 @@
     ],
 )
 
+java_library(
+    name = "compiler_options",
+    srcs = ["HiltCompilerOptions.java"],
+)
+
 filegroup(
     name = "srcs_filegroup",
     srcs = glob(["*"]),
diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/FragmentGenerator.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/FragmentGenerator.java
index 81b2b61..4ef479f 100644
--- a/java/dagger/hilt/android/processor/internal/androidentrypoint/FragmentGenerator.java
+++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/FragmentGenerator.java
@@ -202,8 +202,7 @@
 
   // @Override
   // public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
-  //   return DefaultViewModelFactories.getFragmentFactory(
-  //       this, super.getDefaultViewModelProviderFactory());
+  //   return DefaultViewModelFactories.getFragmentFactory(this);
   // }
   private MethodSpec getDefaultViewModelProviderFactory() {
     return MethodSpec.methodBuilder("getDefaultViewModelProviderFactory")
@@ -211,7 +210,7 @@
         .addModifiers(Modifier.PUBLIC)
         .returns(AndroidClassNames.VIEW_MODEL_PROVIDER_FACTORY)
         .addStatement(
-            "return $T.getFragmentFactory(this, super.getDefaultViewModelProviderFactory())",
+            "return $T.getFragmentFactory(this)",
             AndroidClassNames.DEFAULT_VIEW_MODEL_FACTORIES)
         .build();
   }
diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/Generators.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/Generators.java
index 91df537..daadd03 100644
--- a/java/dagger/hilt/android/processor/internal/androidentrypoint/Generators.java
+++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/Generators.java
@@ -319,12 +319,6 @@
           .endControlFlow();
     }
 
-    // Only add @Override if an ancestor extends a generated Hilt class.
-    // When using bytecode injection, this isn't always guaranteed.
-    if (metadata.overridesAndroidEntryPointClass()
-        && ancestorExtendsGeneratedHiltClass(metadata)) {
-      methodSpecBuilder.addAnnotation(Override.class);
-    }
     typeSpecBuilder.addField(injectedField(metadata));
 
     switch (metadata.androidType()) {
@@ -332,6 +326,12 @@
       case FRAGMENT:
       case VIEW:
       case SERVICE:
+        // Only add @Override if an ancestor extends a generated Hilt class.
+        // When using bytecode injection, this isn't always guaranteed.
+        if (metadata.overridesAndroidEntryPointClass()
+            && ancestorExtendsGeneratedHiltClass(metadata)) {
+          methodSpecBuilder.addAnnotation(Override.class);
+        }
         methodSpecBuilder
             .beginControlFlow("if (!injected)")
             .addStatement("injected = true")
diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/HiltCompilerOptions.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/HiltCompilerOptions.java
new file mode 100644
index 0000000..577410d
--- /dev/null
+++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/HiltCompilerOptions.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2020 The Dagger Authors.
+ *
+ * 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 dagger.hilt.android.processor.internal.androidentrypoint;
+
+import java.util.Arrays;
+import java.util.Set;
+import java.util.stream.Collectors;
+import javax.annotation.processing.ProcessingEnvironment;
+
+/** Hilt annotation processor options. */
+// TODO(danysantiago): Consider consolidating with Dagger compiler options logic.
+// TODO(user): Move this class to dagger/hilt/processor/internal
+public final class HiltCompilerOptions {
+
+  /** Processor options which can have true or false values. */
+  public enum BooleanOption {
+    /**
+     * Flag that disables validating the superclass of @AndroidEntryPoint are Hilt_ generated,
+     * classes. This flag is to be used internally by the Gradle plugin, enabling the bytecode
+     * transformation to change the superclass.
+     */
+    DISABLE_ANDROID_SUPERCLASS_VALIDATION(
+        "android.internal.disableAndroidSuperclassValidation", false),
+
+    /** Flag that disables check on modules to be annotated with @InstallIn. */
+    DISABLE_MODULES_HAVE_INSTALL_IN_CHECK("disableModulesHaveInstallInCheck", false);
+
+    private final String name;
+    private final boolean defaultValue;
+
+    BooleanOption(String name, boolean defaultValue) {
+      this.name = name;
+      this.defaultValue = defaultValue;
+    }
+
+    public boolean get(ProcessingEnvironment env) {
+      String value = env.getOptions().get(getQualifiedName());
+      if (value == null) {
+        return defaultValue;
+      }
+      // TODO(danysantiago): Strictly verify input, either 'true' or 'false' and nothing else.
+      return Boolean.parseBoolean(value);
+    }
+
+    public String getQualifiedName() {
+      return "dagger.hilt." + name;
+    }
+  }
+
+  public static Set<String> getProcessorOptions() {
+    return Arrays.stream(BooleanOption.values())
+        .map(BooleanOption::getQualifiedName)
+        .collect(Collectors.toSet());
+  }
+
+  private HiltCompilerOptions() {}
+}
diff --git a/java/dagger/hilt/android/processor/internal/customtestapplication/CustomTestApplicationGenerator.java b/java/dagger/hilt/android/processor/internal/customtestapplication/CustomTestApplicationGenerator.java
index 4f7f1bd..51b7ef4 100644
--- a/java/dagger/hilt/android/processor/internal/customtestapplication/CustomTestApplicationGenerator.java
+++ b/java/dagger/hilt/android/processor/internal/customtestapplication/CustomTestApplicationGenerator.java
@@ -109,7 +109,7 @@
     return MethodSpec.methodBuilder("componentManager")
         .addAnnotation(Override.class)
         .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
-        .returns(ParameterizedTypeName.get(ClassNames.GENERATED_COMPONENT_MANAGER, TypeName.OBJECT))
+        .returns(TypeName.OBJECT)
         .addStatement("return $N", COMPONENT_MANAGER)
         .build();
   }
diff --git a/java/dagger/hilt/processor/internal/uninstallmodules/BUILD b/java/dagger/hilt/android/processor/internal/uninstallmodules/BUILD
similarity index 67%
rename from java/dagger/hilt/processor/internal/uninstallmodules/BUILD
rename to java/dagger/hilt/android/processor/internal/uninstallmodules/BUILD
index 4f944be..73c4606 100644
--- a/java/dagger/hilt/processor/internal/uninstallmodules/BUILD
+++ b/java/dagger/hilt/android/processor/internal/uninstallmodules/BUILD
@@ -20,14 +20,13 @@
 java_plugin(
     name = "processor",
     generates_api = 1,
-    processor_class = "dagger.hilt.processor.internal.uninstallmodules.UninstallModulesProcessor",
+    processor_class = "dagger.hilt.android.processor.internal.uninstallmodules.UninstallModulesProcessor",
     deps = [":processor_lib"],
 )
 
 java_library(
     name = "processor_lib",
     srcs = [
-        "AggregatedUninstallModulesGenerator.java",
         "UninstallModulesProcessor.java",
     ],
     deps = [
@@ -39,26 +38,10 @@
         "//java/dagger/internal/guava:collect",
         "@google_bazel_common//third_party/java/auto:service",
         "@google_bazel_common//third_party/java/incap",
-        "@google_bazel_common//third_party/java/javapoet",
         "@maven//:com_google_auto_auto_common",
     ],
 )
 
-java_library(
-    name = "aggregated_uninstall_modules_metadata",
-    srcs = [
-        "AggregatedUninstallModulesMetadata.java",
-    ],
-    deps = [
-        "//java/dagger/hilt/processor/internal:aggregated_elements",
-        "//java/dagger/hilt/processor/internal:classnames",
-        "//java/dagger/hilt/processor/internal:processors",
-        "//java/dagger/internal/codegen/extension",
-        "//java/dagger/internal/guava:collect",
-        "@google_bazel_common//third_party/java/auto:value",
-    ],
-)
-
 filegroup(
     name = "srcs_filegroup",
     srcs = glob(["*"]),
diff --git a/java/dagger/hilt/processor/internal/uninstallmodules/UninstallModulesProcessor.java b/java/dagger/hilt/android/processor/internal/uninstallmodules/UninstallModulesProcessor.java
similarity index 62%
rename from java/dagger/hilt/processor/internal/uninstallmodules/UninstallModulesProcessor.java
rename to java/dagger/hilt/android/processor/internal/uninstallmodules/UninstallModulesProcessor.java
index c7e528d..e92f0f0 100644
--- a/java/dagger/hilt/processor/internal/uninstallmodules/UninstallModulesProcessor.java
+++ b/java/dagger/hilt/android/processor/internal/uninstallmodules/UninstallModulesProcessor.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package dagger.hilt.processor.internal.uninstallmodules;
+package dagger.hilt.android.processor.internal.uninstallmodules;
 
 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList;
 import static net.ltgt.gradle.incap.IncrementalAnnotationProcessorType.ISOLATING;
@@ -23,7 +23,6 @@
 import com.google.auto.service.AutoService;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-import com.squareup.javapoet.ClassName;
 import dagger.hilt.processor.internal.BaseProcessor;
 import dagger.hilt.processor.internal.ClassNames;
 import dagger.hilt.processor.internal.ProcessorErrors;
@@ -41,7 +40,7 @@
 
   @Override
   public Set<String> getSupportedAnnotationTypes() {
-    return ImmutableSet.of(ClassNames.UNINSTALL_MODULES.toString());
+    return ImmutableSet.of(ClassNames.IGNORE_MODULES.toString());
   }
 
   @Override
@@ -57,24 +56,12 @@
         ClassNames.HILT_ANDROID_TEST.simpleName(),
         element);
 
-    TypeElement testElement = MoreElements.asType(element);
-    ImmutableList<TypeElement> uninstallModules =
-        Processors.getAnnotationClassValues(
-            getElementUtils(),
-            Processors.getAnnotationMirror(testElement, ClassNames.UNINSTALL_MODULES),
-            "value");
-
-    checkModulesHaveInstallIn(testElement, uninstallModules);
-    checkModulesDontOriginateFromTest(testElement, uninstallModules);
-
-    new AggregatedUninstallModulesGenerator(testElement, uninstallModules, getProcessingEnv())
-        .generate();
-  }
-
-  private void checkModulesHaveInstallIn(
-      TypeElement testElement, ImmutableList<TypeElement> uninstallModules) {
     ImmutableList<TypeElement> invalidModules =
-        uninstallModules.stream()
+        Processors.getAnnotationClassValues(
+                getElementUtils(),
+                Processors.getAnnotationMirror(element, ClassNames.IGNORE_MODULES),
+                "value")
+            .stream()
             .filter(
                 module ->
                     !(Processors.hasAnnotation(module, ClassNames.MODULE)
@@ -84,27 +71,10 @@
     ProcessorErrors.checkState(
         invalidModules.isEmpty(),
         // TODO(b/152801981): Point to the annotation value rather than the annotated element.
-        testElement,
-        "@UninstallModules should only include modules annotated with both @Module and @InstallIn, "
-            + "but found: %s.",
-        invalidModules);
-  }
-
-  private void checkModulesDontOriginateFromTest(
-      TypeElement testElement, ImmutableList<TypeElement> uninstallModules) {
-    ImmutableList<ClassName> invalidModules =
-        uninstallModules.stream()
-            .filter(
-                module ->
-                    Processors.getOriginatingTestElement(module, getElementUtils()).isPresent())
-            .map(ClassName::get)
-            .collect(toImmutableList());
-
-    ProcessorErrors.checkState(
-        invalidModules.isEmpty(),
-        // TODO(b/152801981): Point to the annotation value rather than the annotated element.
-        testElement,
-        "@UninstallModules should not contain test modules, but found: %s",
+        element,
+        "@%s should only include modules annotated with both @Module and @InstallIn, but found: "
+          + "%s.",
+        annotation.getSimpleName(),
         invalidModules);
   }
 }
diff --git a/java/dagger/hilt/android/processor/internal/viewmodel/ViewModelModuleGenerator.kt b/java/dagger/hilt/android/processor/internal/viewmodel/ViewModelModuleGenerator.kt
index 1bc2e93..846f7d2 100644
--- a/java/dagger/hilt/android/processor/internal/viewmodel/ViewModelModuleGenerator.kt
+++ b/java/dagger/hilt/android/processor/internal/viewmodel/ViewModelModuleGenerator.kt
@@ -93,11 +93,6 @@
     component = AndroidClassNames.VIEW_MODEL_COMPONENT
   )
     .addModifiers(Modifier.ABSTRACT)
-    .addMethod(
-      MethodSpec.constructorBuilder()
-        .addModifiers(Modifier.PRIVATE)
-        .build()
-    )
     .addMethod(getViewModelBindsMethod())
     .build()
 
diff --git a/java/dagger/hilt/android/proguard-rules.pro b/java/dagger/hilt/android/proguard-rules.pro
deleted file mode 100644
index 6fd3a82..0000000
--- a/java/dagger/hilt/android/proguard-rules.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-# Keep for the reflective cast done in EntryPoints.
-# See b/183070411#comment4 for more info.
--keep,allowobfuscation,allowshrinking @dagger.hilt.android.EarlyEntryPoint class *
\ No newline at end of file
diff --git a/java/dagger/hilt/android/scopes/BUILD b/java/dagger/hilt/android/scopes/BUILD
index 5abc27e..e74ac9e 100644
--- a/java/dagger/hilt/android/scopes/BUILD
+++ b/java/dagger/hilt/android/scopes/BUILD
@@ -20,11 +20,9 @@
 android_library(
     name = "scopes",
     srcs = [
-        "ActivityRetainedScoped.java",
         "ActivityScoped.java",
         "FragmentScoped.java",
         "ServiceScoped.java",
-        "ViewModelScoped.java",
         "ViewScoped.java",
     ],
     deps = [
@@ -33,6 +31,24 @@
     ],
 )
 
+android_library(
+    name = "activity_retained_scoped",
+    srcs = ["ActivityRetainedScoped.java"],
+    deps = [
+        ":package_info",
+        "@google_bazel_common//third_party/java/jsr330_inject",
+    ],
+)
+
+android_library(
+    name = "view_model_scoped",
+    srcs = ["ViewModelScoped.java"],
+    deps = [
+        ":package_info",
+        "@google_bazel_common//third_party/java/jsr330_inject",
+    ],
+)
+
 java_library(
     name = "package_info",
     srcs = ["package-info.java"],
diff --git a/java/dagger/hilt/android/testing/BUILD b/java/dagger/hilt/android/testing/BUILD
index 93d4ceb..47db287 100644
--- a/java/dagger/hilt/android/testing/BUILD
+++ b/java/dagger/hilt/android/testing/BUILD
@@ -14,7 +14,7 @@
 # Description:
 #   Testing libraries for Hilt Android.
 
-load("//:build_defs.bzl", "POM_VERSION")
+load("//:build_defs.bzl", "POM_VERSION_ALPHA")
 load("//tools:maven.bzl", "gen_maven_artifact")
 
 package(default_visibility = ["//:src"])
@@ -57,21 +57,14 @@
         "//java/dagger/hilt/android/internal/builders",
         "//java/dagger/hilt/android/internal/managers",
         "//java/dagger/hilt/android/internal/modules",
-        "//java/dagger/hilt/android/internal/testing:early_test_singleton_component_creator",
         "//java/dagger/hilt/android/internal/testing:test_application_component_manager",
         "//java/dagger/hilt/android/internal/testing:test_application_component_manager_holder",
-        "//java/dagger/hilt/android/internal/testing:test_component_data",
         "//java/dagger/hilt/android/internal/testing:test_injector",
-        "//java/dagger/hilt/android/internal/testing/root:default",
         "//java/dagger/hilt/android/scopes",
         "//java/dagger/hilt/internal:component_entry_point",
         "//java/dagger/hilt/internal:component_manager",
-        "//java/dagger/hilt/internal:generated_component",
         "//java/dagger/hilt/internal:generated_entry_point",
         "//java/dagger/hilt/internal:preconditions",
-        "//java/dagger/hilt/internal:test_singleton_component",
-        "//java/dagger/hilt/internal/aggregatedroot",
-        "//java/dagger/hilt/internal/processedrootsentinel",
         "//java/dagger/hilt/migration:disable_install_in_check",
         "@maven//:androidx_annotation_annotation",
         "@maven//:androidx_multidex_multidex",
@@ -130,14 +123,10 @@
     testonly = 1,
     srcs = ["UninstallModules.java"],
     exported_plugins = [
-        "//java/dagger/hilt/processor/internal/uninstallmodules:processor",
-    ],
-    exports = [
-        "//java/dagger/hilt/android/internal/uninstallmodules",
+        "//java/dagger/hilt/android/processor/internal/uninstallmodules:processor",
     ],
     deps = [
         ":package_info",
-        "//java/dagger/hilt:generates_root_input",
     ],
 )
 
@@ -174,7 +163,7 @@
 android_library(
     name = "artifact-lib",
     testonly = 1,
-    tags = ["maven_coordinates=com.google.dagger:hilt-android-testing:" + POM_VERSION],
+    tags = ["maven_coordinates=com.google.dagger:hilt-android-testing:" + POM_VERSION_ALPHA],
     exports = [
         ":bind_value",
         ":custom_test_application",
@@ -189,18 +178,15 @@
 gen_maven_artifact(
     name = "artifact",
     testonly = 1,
-    artifact_coordinates = "com.google.dagger:hilt-android-testing:" + POM_VERSION,
+    artifact_coordinates = "com.google.dagger:hilt-android-testing:" + POM_VERSION_ALPHA,
     artifact_name = "Hilt Android Testing",
     artifact_target = ":artifact-lib",
     artifact_target_libs = [
-        "//java/dagger/hilt/android/internal/testing:early_test_singleton_component_creator",
         "//java/dagger/hilt/android/internal/testing:mark_that_rules_ran_rule",
         "//java/dagger/hilt/android/internal/testing:test_application_component_manager",
         "//java/dagger/hilt/android/internal/testing:test_application_component_manager_holder",
         "//java/dagger/hilt/android/internal/testing:test_component_data",
         "//java/dagger/hilt/android/internal/testing:test_injector",
-        "//java/dagger/hilt/android/internal/testing/root:default",
-        "//java/dagger/hilt/android/internal/uninstallmodules:uninstallmodules",
         "//java/dagger/hilt/android/testing:bind_value",
         "//java/dagger/hilt/android/testing:custom_test_application",
         "//java/dagger/hilt/android/testing:hilt_android_rule",
@@ -216,7 +202,6 @@
         "androidx.activity:activity",
         "androidx.annotation:annotation",
         "androidx.fragment:fragment",
-        "androidx.lifecycle:lifecycle-common",
         "androidx.lifecycle:lifecycle-viewmodel",
         "androidx.lifecycle:lifecycle-viewmodel-savedstate",
         "androidx.multidex:multidex",
diff --git a/java/dagger/hilt/android/testing/HiltTestApplication.java b/java/dagger/hilt/android/testing/HiltTestApplication.java
index 293bfda..97eb4cb 100644
--- a/java/dagger/hilt/android/testing/HiltTestApplication.java
+++ b/java/dagger/hilt/android/testing/HiltTestApplication.java
@@ -40,7 +40,7 @@
   }
 
   @Override
-  public final GeneratedComponentManager<Object> componentManager() {
+  public final Object componentManager() {
     return componentManager;
   }
 
diff --git a/java/dagger/hilt/android/testing/UninstallModules.java b/java/dagger/hilt/android/testing/UninstallModules.java
index 607d76a..6480c10 100644
--- a/java/dagger/hilt/android/testing/UninstallModules.java
+++ b/java/dagger/hilt/android/testing/UninstallModules.java
@@ -16,7 +16,6 @@
 
 package dagger.hilt.android.testing;
 
-import dagger.hilt.GeneratesRootInput;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Target;
 
@@ -44,7 +43,6 @@
  *   }
  * </code></pre>
  */
-@GeneratesRootInput
 @Target({ElementType.TYPE})
 public @interface UninstallModules {
 
diff --git a/java/dagger/hilt/internal/BUILD b/java/dagger/hilt/internal/BUILD
index ad4dbb5..dc245d1 100644
--- a/java/dagger/hilt/internal/BUILD
+++ b/java/dagger/hilt/internal/BUILD
@@ -18,20 +18,10 @@
 package(default_visibility = ["//:src"])
 
 java_library(
-    name = "test_singleton_component",
-    srcs = ["TestSingletonComponent.java"],
-    deps = [":generated_component"],
-)
-
-java_library(
     name = "generated_component",
-    srcs = ["GeneratedComponent.java"],
-)
-
-java_library(
-    name = "test_singleton_component_manager",
-    srcs = ["TestSingletonComponentManager.java"],
-    deps = [":component_manager"],
+    srcs = [
+        "GeneratedComponent.java",
+    ],
 )
 
 java_library(
@@ -63,14 +53,12 @@
 java_library(
     name = "component_entry_point",
     srcs = ["ComponentEntryPoint.java"],
-    proguard_specs = ["proguard-rules.pro"],
     deps = ["//java/dagger/hilt:generates_root_input"],
 )
 
 java_library(
     name = "generated_entry_point",
     srcs = ["GeneratedEntryPoint.java"],
-    proguard_specs = ["proguard-rules.pro"],
     deps = ["//java/dagger/hilt:generates_root_input"],
 )
 
diff --git a/java/dagger/hilt/internal/TestSingletonComponentManager.java b/java/dagger/hilt/internal/TestSingletonComponentManager.java
deleted file mode 100644
index 316a008..0000000
--- a/java/dagger/hilt/internal/TestSingletonComponentManager.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.internal;
-
-/** A marker that the given component manager is for an {@link TestSingletonComponent}. */
-public interface TestSingletonComponentManager extends GeneratedComponentManager<Object> {
-  Object earlySingletonComponent();
-}
diff --git a/java/dagger/hilt/internal/aggregatedroot/BUILD b/java/dagger/hilt/internal/aggregatedroot/BUILD
deleted file mode 100644
index 0a7263a..0000000
--- a/java/dagger/hilt/internal/aggregatedroot/BUILD
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (C) 2021 The Dagger Authors.
-#
-# 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.
-
-# Description:
-#   The annotation for aggregating information about Hilt roots.
-
-package(default_visibility = ["//:src"])
-
-java_library(
-    name = "aggregatedroot",
-    srcs = ["AggregatedRoot.java"],
-)
-
-filegroup(
-    name = "srcs_filegroup",
-    srcs = glob(["*"]),
-)
diff --git a/java/dagger/hilt/internal/aliasof/BUILD b/java/dagger/hilt/internal/aliasof/BUILD
index 13d4364..3e96ed4 100644
--- a/java/dagger/hilt/internal/aliasof/BUILD
+++ b/java/dagger/hilt/internal/aliasof/BUILD
@@ -17,7 +17,7 @@
 
 package(default_visibility = ["//:src"])
 
-java_library(
+android_library(
     name = "aliasof",
     srcs = ["AliasOfPropagatedData.java"],
 )
diff --git a/java/dagger/hilt/internal/processedrootsentinel/BUILD b/java/dagger/hilt/internal/processedrootsentinel/BUILD
deleted file mode 100644
index 70b72a6..0000000
--- a/java/dagger/hilt/internal/processedrootsentinel/BUILD
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (C) 2021 The Dagger Authors.
-#
-# 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.
-
-# Description:
-#   The annotation for aggregating information about processed Hilt roots.
-
-package(default_visibility = ["//:src"])
-
-java_library(
-    name = "processedrootsentinel",
-    srcs = ["ProcessedRootSentinel.java"],
-)
-
-filegroup(
-    name = "srcs_filegroup",
-    srcs = glob(["*"]),
-)
diff --git a/java/dagger/hilt/internal/processedrootsentinel/ProcessedRootSentinel.java b/java/dagger/hilt/internal/processedrootsentinel/ProcessedRootSentinel.java
deleted file mode 100644
index e5e0b1b..0000000
--- a/java/dagger/hilt/internal/processedrootsentinel/ProcessedRootSentinel.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.internal.processedrootsentinel;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/** An annotation used to aggregate sentinels for processed roots. */
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface ProcessedRootSentinel {
-  /** Returns the set of roots processed in a previous build. */
-  String[] roots();
-}
diff --git a/java/dagger/hilt/internal/proguard-rules.pro b/java/dagger/hilt/internal/proguard-rules.pro
deleted file mode 100644
index 2607ba1..0000000
--- a/java/dagger/hilt/internal/proguard-rules.pro
+++ /dev/null
@@ -1,4 +0,0 @@
-# Keep for the reflective cast done in EntryPoints.
-# See b/183070411#comment4 for more info.
--keep,allowobfuscation,allowshrinking @dagger.hilt.internal.ComponentEntryPoint class *
--keep,allowobfuscation,allowshrinking @dagger.hilt.internal.GeneratedEntryPoint class *
\ No newline at end of file
diff --git a/java/dagger/hilt/processor/BUILD b/java/dagger/hilt/processor/BUILD
index 1f75d0a..87adcf3 100644
--- a/java/dagger/hilt/processor/BUILD
+++ b/java/dagger/hilt/processor/BUILD
@@ -15,7 +15,7 @@
 # Description:
 #   Hilt android processors.
 
-load("//:build_defs.bzl", "POM_VERSION")
+load("//:build_defs.bzl", "POM_VERSION_ALPHA")
 load("//tools:maven.bzl", "gen_maven_artifact")
 
 package(default_visibility = ["//:src"])
@@ -27,23 +27,22 @@
         "//java/dagger/hilt/android/processor/internal/androidentrypoint:processor_lib",
         "//java/dagger/hilt/android/processor/internal/bindvalue:bind_value_processor_lib",
         "//java/dagger/hilt/android/processor/internal/customtestapplication:processor_lib",
+        "//java/dagger/hilt/android/processor/internal/uninstallmodules:processor_lib",
         "//java/dagger/hilt/android/processor/internal/viewmodel:processor_lib",
         "//java/dagger/hilt/android/processor/internal/viewmodel:validation_plugin_lib",
         "//java/dagger/hilt/processor/internal/aggregateddeps:processor_lib",
         "//java/dagger/hilt/processor/internal/aliasof:processor_lib",
         "//java/dagger/hilt/processor/internal/definecomponent:processor_lib",
-        "//java/dagger/hilt/processor/internal/earlyentrypoint:processor_lib",
         "//java/dagger/hilt/processor/internal/generatesrootinput:processor_lib",
         "//java/dagger/hilt/processor/internal/originatingelement:processor_lib",
         "//java/dagger/hilt/processor/internal/root:processor_lib",
-        "//java/dagger/hilt/processor/internal/uninstallmodules:processor_lib",
         "//java/dagger/internal/codegen:processor",
     ],
 )
 
 java_library(
     name = "artifact-lib",
-    tags = ["maven_coordinates=com.google.dagger:hilt-compiler:" + POM_VERSION],
+    tags = ["maven_coordinates=com.google.dagger:hilt-compiler:" + POM_VERSION_ALPHA],
     visibility = ["//visibility:private"],
     exports = [
         ":artifact-lib-shared",
@@ -52,23 +51,23 @@
 
 gen_maven_artifact(
     name = "artifact",
-    artifact_coordinates = "com.google.dagger:hilt-compiler:" + POM_VERSION,
+    artifact_coordinates = "com.google.dagger:hilt-compiler:" + POM_VERSION_ALPHA,
     artifact_name = "Hilt Processor",
     artifact_target = ":artifact-lib",
     artifact_target_libs = [
         "//java/dagger/hilt/android/processor/internal:android_classnames",
         "//java/dagger/hilt/android/processor/internal:utils",
         "//java/dagger/hilt/android/processor/internal/androidentrypoint:android_generators",
+        "//java/dagger/hilt/android/processor/internal/androidentrypoint:compiler_options",
         "//java/dagger/hilt/android/processor/internal/androidentrypoint:metadata",
         "//java/dagger/hilt/android/processor/internal/androidentrypoint:processor_lib",
         "//java/dagger/hilt/android/processor/internal/bindvalue:bind_value_processor_lib",
         "//java/dagger/hilt/android/processor/internal/customtestapplication:processor_lib",
         "//java/dagger/hilt/android/processor/internal/viewmodel:validation_plugin_lib",
+        "//java/dagger/hilt/android/processor/internal/uninstallmodules:processor_lib",
         "//java/dagger/hilt/android/processor/internal/viewmodel:processor_lib",
-        "//java/dagger/hilt/processor/internal:aggregated_elements",
         "//java/dagger/hilt/processor/internal:base_processor",
         "//java/dagger/hilt/processor/internal:classnames",
-        "//java/dagger/hilt/processor/internal:compiler_options",
         "//java/dagger/hilt/processor/internal:component_descriptor",
         "//java/dagger/hilt/processor/internal:component_names",
         "//java/dagger/hilt/processor/internal:components",
@@ -76,22 +75,17 @@
         "//java/dagger/hilt/processor/internal:processor_errors",
         "//java/dagger/hilt/processor/internal:processors",
         "//java/dagger/hilt/processor/internal/aggregateddeps:component_dependencies",
-        "//java/dagger/hilt/processor/internal/aggregateddeps:pkg_private_metadata",
         "//java/dagger/hilt/processor/internal/aggregateddeps:processor_lib",
         "//java/dagger/hilt/processor/internal/aliasof:alias_ofs",
         "//java/dagger/hilt/processor/internal/aliasof:processor_lib",
         "//java/dagger/hilt/processor/internal/definecomponent:define_components",
         "//java/dagger/hilt/processor/internal/definecomponent:processor_lib",
-        "//java/dagger/hilt/processor/internal/earlyentrypoint:aggregated_early_entry_point_metadata",
-        "//java/dagger/hilt/processor/internal/earlyentrypoint:processor_lib",
         "//java/dagger/hilt/processor/internal/generatesrootinput:generates_root_inputs",
         "//java/dagger/hilt/processor/internal/generatesrootinput:processor_lib",
         "//java/dagger/hilt/processor/internal/originatingelement:processor_lib",
         "//java/dagger/hilt/processor/internal/root:processor_lib",
         "//java/dagger/hilt/processor/internal/root:root_metadata",
         "//java/dagger/hilt/processor/internal/root:root_type",
-        "//java/dagger/hilt/processor/internal/uninstallmodules:processor_lib",
-        "//java/dagger/hilt/processor/internal/uninstallmodules:aggregated_uninstall_modules_metadata",
     ],
     artifact_target_maven_deps = [
         "com.google.auto:auto-common",
diff --git a/java/dagger/hilt/processor/internal/AggregatedElements.java b/java/dagger/hilt/processor/internal/AggregatedElements.java
deleted file mode 100644
index 8ee820f..0000000
--- a/java/dagger/hilt/processor/internal/AggregatedElements.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal;
-
-import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
-
-import com.google.auto.common.MoreElements;
-import com.google.common.collect.ImmutableSet;
-import com.squareup.javapoet.ClassName;
-import javax.lang.model.element.PackageElement;
-import javax.lang.model.element.TypeElement;
-import javax.lang.model.util.Elements;
-
-/** Utility class for aggregating metadata. */
-public final class AggregatedElements {
-
-  /** Returns all aggregated elements in the aggregating package after validating them. */
-  public static ImmutableSet<TypeElement> from(
-      String aggregatingPackage, ClassName aggregatingAnnotation, Elements elements) {
-    PackageElement packageElement = elements.getPackageElement(aggregatingPackage);
-
-    if (packageElement == null) {
-      return ImmutableSet.of();
-    }
-
-    ImmutableSet<TypeElement> aggregatedElements =
-        packageElement.getEnclosedElements().stream()
-            .map(MoreElements::asType)
-            .collect(toImmutableSet());
-
-    ProcessorErrors.checkState(
-        !aggregatedElements.isEmpty(),
-        packageElement,
-        "No dependencies found. Did you remove code in package %s?",
-        packageElement);
-
-    for (TypeElement aggregatedElement : aggregatedElements) {
-      ProcessorErrors.checkState(
-          Processors.hasAnnotation(aggregatedElement, aggregatingAnnotation),
-          aggregatedElement,
-          "Expected element, %s, to be annotated with @%s, but only found: %s.",
-          aggregatedElement.getSimpleName(),
-          aggregatingAnnotation,
-          aggregatedElement.getAnnotationMirrors());
-    }
-
-    return aggregatedElements;
-  }
-
-  private AggregatedElements() {}
-}
diff --git a/java/dagger/hilt/processor/internal/AnnotationValues.java b/java/dagger/hilt/processor/internal/AnnotationValues.java
index 9ebeeeb..584d8f9 100644
--- a/java/dagger/hilt/processor/internal/AnnotationValues.java
+++ b/java/dagger/hilt/processor/internal/AnnotationValues.java
@@ -18,19 +18,15 @@
 
 import static com.google.auto.common.AnnotationMirrors.getAnnotationValue;
 import static com.google.auto.common.AnnotationMirrors.getAnnotationValuesWithDefaults;
-import static com.google.auto.common.MoreTypes.asTypeElement;
 import static com.google.common.base.Preconditions.checkNotNull;
-import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
 
 import com.google.auto.common.MoreTypes;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
 import java.util.List;
 import java.util.Optional;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.AnnotationValue;
 import javax.lang.model.element.AnnotationValueVisitor;
-import javax.lang.model.element.TypeElement;
 import javax.lang.model.element.VariableElement;
 import javax.lang.model.type.DeclaredType;
 import javax.lang.model.type.TypeMirror;
@@ -91,18 +87,6 @@
     }
   }
 
-  /** Returns a class array value as a set of {@link TypeElement}. */
-  public static ImmutableSet<TypeElement> getTypeElements(AnnotationValue value) {
-    return getAnnotationValues(value).stream()
-        .map(AnnotationValues::getTypeElement)
-        .collect(toImmutableSet());
-  }
-
-  /** Returns a class value as a {@link TypeElement}. */
-  public static TypeElement getTypeElement(AnnotationValue value) {
-    return asTypeElement(getTypeMirror(value));
-  }
-
   /**
    * Returns the value as a VariableElement.
    *
@@ -112,13 +96,6 @@
     return EnumVisitor.INSTANCE.visit(value);
   }
 
-  /** Returns a string array value as a set of strings. */
-  public static ImmutableSet<String> getStrings(AnnotationValue value) {
-    return getAnnotationValues(value).stream()
-        .map(AnnotationValues::getString)
-        .collect(toImmutableSet());
-  }
-
   /**
    * Returns the value as a string.
    *
@@ -128,15 +105,6 @@
     return valueOfType(value, String.class);
   }
 
-  /**
-   * Returns the value as a boolean.
-   *
-   * @throws IllegalArgumentException if the value is not a boolean.
-   */
-  public static boolean getBoolean(AnnotationValue value) {
-    return valueOfType(value, Boolean.class);
-  }
-
   private static <T> T valueOfType(AnnotationValue annotationValue, Class<T> type) {
     Object value = annotationValue.getValue();
     if (!type.isInstance(value)) {
diff --git a/java/dagger/hilt/processor/internal/BUILD b/java/dagger/hilt/processor/internal/BUILD
index 978655d..baff1d8 100644
--- a/java/dagger/hilt/processor/internal/BUILD
+++ b/java/dagger/hilt/processor/internal/BUILD
@@ -24,7 +24,6 @@
         "ProcessorErrorHandler.java",
     ],
     deps = [
-        ":compiler_options",
         ":processor_errors",
         ":processors",
         "//java/dagger/internal/guava:base",
@@ -63,9 +62,11 @@
         ":processor_errors",
         "//java/dagger/internal/codegen/extension",
         "//java/dagger/internal/codegen/kotlin",
+        "//java/dagger/internal/codegen/langmodel",
         "//java/dagger/internal/guava:base",
         "//java/dagger/internal/guava:collect",
         "@google_bazel_common//third_party/java/javapoet",
+        "@google_bazel_common//third_party/java/jsr305_annotations",
         "@google_bazel_common//third_party/java/jsr330_inject",
         "@maven//:com_google_auto_auto_common",
         "@maven//:org_jetbrains_kotlin_kotlin_stdlib",
@@ -89,34 +90,25 @@
         "ComponentNames.java",
     ],
     deps = [
-        ":classnames",
         ":processors",
-        "//java/dagger/internal/guava:base",
-        "//java/dagger/internal/guava:collect",
         "@google_bazel_common//third_party/java/javapoet",
     ],
 )
 
 java_library(
-    name = "aggregated_elements",
-    srcs = [
-        "AggregatedElements.java",
-    ],
-    deps = [
-        ":processor_errors",
-        ":processors",
-        "//java/dagger/internal/codegen/extension",
-        "//java/dagger/internal/guava:collect",
-        "@google_bazel_common//third_party/java/javapoet",
-        "@maven//:com_google_auto_auto_common",
-    ],
-)
-
-java_library(
     name = "component_descriptor",
-    srcs = ["ComponentDescriptor.java"],
+    srcs = [
+        "ComponentDescriptor.java",
+        "ComponentGenerator.java",
+        "ComponentTree.java",
+    ],
     deps = [
+        ":classnames",
+        ":processors",
+        "//java/dagger/internal/codegen/extension",
+        "//java/dagger/internal/guava:base",
         "//java/dagger/internal/guava:collect",
+        "//java/dagger/internal/guava:graph",
         "@google_bazel_common//third_party/java/auto:value",
         "@google_bazel_common//third_party/java/javapoet",
     ],
@@ -151,16 +143,6 @@
     ],
 )
 
-java_library(
-    name = "compiler_options",
-    srcs = ["HiltCompilerOptions.java"],
-    deps = [
-        ":processor_errors",
-        "//java/dagger/internal/guava:collect",
-        "@google_bazel_common//third_party/java/javapoet",
-    ],
-)
-
 filegroup(
     name = "srcs_filegroup",
     srcs = glob(["*"]),
diff --git a/java/dagger/hilt/processor/internal/BadInputException.java b/java/dagger/hilt/processor/internal/BadInputException.java
index f57a34a..d961768 100644
--- a/java/dagger/hilt/processor/internal/BadInputException.java
+++ b/java/dagger/hilt/processor/internal/BadInputException.java
@@ -36,11 +36,6 @@
     this.badElements = ImmutableList.copyOf(badElements);
   }
 
-  public BadInputException(String message) {
-    super(message);
-    this.badElements = ImmutableList.of();
-  }
-
   public ImmutableList<Element> getBadElements() {
     return badElements;
   }
diff --git a/java/dagger/hilt/processor/internal/BaseProcessor.java b/java/dagger/hilt/processor/internal/BaseProcessor.java
index 1a63f8b..4961cd5 100644
--- a/java/dagger/hilt/processor/internal/BaseProcessor.java
+++ b/java/dagger/hilt/processor/internal/BaseProcessor.java
@@ -96,15 +96,6 @@
   private Messager messager;
   private ProcessorErrorHandler errorHandler;
 
-  @Override
-  public final Set<String> getSupportedOptions() {
-    // This is declared here rather than in the actual processors because KAPT will issue a
-    // warning if any used option is not unsupported. This can happen when there is a module
-    // which uses Hilt but lacks any @AndroidEntryPoint annotations.
-    // See: https://github.com/google/dagger/issues/2040
-    return HiltCompilerOptions.getProcessorOptions();
-  }
-
   /** Used to perform initialization before each round of processing. */
   protected void preRoundProcess(RoundEnvironment roundEnv) {};
 
diff --git a/java/dagger/hilt/processor/internal/ClassNames.java b/java/dagger/hilt/processor/internal/ClassNames.java
index 093e1b3..234ea7b 100644
--- a/java/dagger/hilt/processor/internal/ClassNames.java
+++ b/java/dagger/hilt/processor/internal/ClassNames.java
@@ -22,26 +22,6 @@
 
 /** Holder for commonly used class names. */
 public final class ClassNames {
-  public static final String AGGREGATED_ROOT_PACKAGE =
-      "dagger.hilt.internal.aggregatedroot.codegen";
-  public static final ClassName AGGREGATED_ROOT =
-      get("dagger.hilt.internal.aggregatedroot", "AggregatedRoot");
-  public static final String PROCESSED_ROOT_SENTINEL_PACKAGE =
-      "dagger.hilt.internal.processedrootsentinel.codegen";
-  public static final ClassName PROCESSED_ROOT_SENTINEL =
-      get("dagger.hilt.internal.processedrootsentinel", "ProcessedRootSentinel");
-
-  public static final String AGGREGATED_EARLY_ENTRY_POINT_PACKAGE =
-      "dagger.hilt.android.internal.earlyentrypoint.codegen";
-  public static final ClassName AGGREGATED_EARLY_ENTRY_POINT =
-      get("dagger.hilt.android.internal.earlyentrypoint", "AggregatedEarlyEntryPoint");
-  public static final ClassName EARLY_ENTRY_POINT = get("dagger.hilt.android", "EarlyEntryPoint");
-
-  public static final String AGGREGATED_UNINSTALL_MODULES_PACKAGE =
-      "dagger.hilt.android.internal.uninstallmodules.codegen";
-  public static final ClassName AGGREGATED_UNINSTALL_MODULES =
-      get("dagger.hilt.android.internal.uninstallmodules", "AggregatedUninstallModules");
-
   public static final ClassName ORIGINATING_ELEMENT =
       get("dagger.hilt.codegen", "OriginatingElement");
   public static final ClassName AGGREGATED_DEPS =
@@ -52,11 +32,9 @@
       get("dagger.hilt.internal", "GeneratedComponentManager");
   public static final ClassName GENERATED_COMPONENT_MANAGER_HOLDER =
       get("dagger.hilt.internal", "GeneratedComponentManagerHolder");
-  public static final ClassName UNINSTALL_MODULES =
+  public static final ClassName IGNORE_MODULES =
       get("dagger.hilt.android.testing", "UninstallModules");
 
-  public static final String DEFINE_COMPONENT_CLASSES_PACKAGE =
-      "dagger.hilt.processor.internal.definecomponent.codegen";
   public static final ClassName DEFINE_COMPONENT = get("dagger.hilt", "DefineComponent");
   public static final ClassName DEFINE_COMPONENT_BUILDER =
       get("dagger.hilt", "DefineComponent", "Builder");
@@ -101,8 +79,6 @@
   public static final ClassName ALIAS_OF = get("dagger.hilt.migration", "AliasOf");
   public static final ClassName ALIAS_OF_PROPAGATED_DATA =
       get("dagger.hilt.internal.aliasof", "AliasOfPropagatedData");
-  public static final String ALIAS_OF_PROPAGATED_DATA_PACKAGE =
-      "dagger.hilt.processor.internal.aliasof.codegen";
 
   public static final ClassName GENERATES_ROOT_INPUT = get("dagger.hilt", "GeneratesRootInput");
   public static final ClassName GENERATES_ROOT_INPUT_PROPAGATED_DATA =
@@ -146,12 +122,12 @@
       get("dagger.hilt.android.internal.managers", "ComponentSupplier");
   public static final ClassName APPLICATION_CONTEXT_MODULE =
       get("dagger.hilt.android.internal.modules", "ApplicationContextModule");
-  public static final ClassName DEFAULT_ROOT =
-      ClassName.get("dagger.hilt.android.internal.testing.root", "Default");
   public static final ClassName INTERNAL_TEST_ROOT =
       get("dagger.hilt.android.internal.testing", "InternalTestRoot");
   public static final ClassName TEST_INJECTOR =
       get("dagger.hilt.android.internal.testing", "TestInjector");
+  public static final ClassName TEST_APPLICATION_INJECTOR =
+      get("dagger.hilt.android.internal.testing", "TestApplicationInjector");
   public static final ClassName TEST_APPLICATION_COMPONENT_MANAGER =
       get("dagger.hilt.android.internal.testing", "TestApplicationComponentManager");
   public static final ClassName TEST_APPLICATION_COMPONENT_MANAGER_HOLDER =
@@ -176,8 +152,6 @@
       get("dagger.hilt.android.testing", "BindValueIntoSet");
   public static final ClassName APPLICATION_CONTEXT =
       get("dagger.hilt.android.qualifiers", "ApplicationContext");
-  public static final ClassName TEST_SINGLETON_COMPONENT =
-      get("dagger.hilt.internal", "TestSingletonComponent");
   public static final ClassName TEST_COMPONENT_DATA =
       get("dagger.hilt.android.internal.testing", "TestComponentData");
   public static final ClassName TEST_COMPONENT_DATA_SUPPLIER =
diff --git a/java/dagger/hilt/processor/internal/root/ComponentGenerator.java b/java/dagger/hilt/processor/internal/ComponentGenerator.java
similarity index 89%
rename from java/dagger/hilt/processor/internal/root/ComponentGenerator.java
rename to java/dagger/hilt/processor/internal/ComponentGenerator.java
index 0e8d0ad..3a4bf1e 100644
--- a/java/dagger/hilt/processor/internal/root/ComponentGenerator.java
+++ b/java/dagger/hilt/processor/internal/ComponentGenerator.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package dagger.hilt.processor.internal.root;
+package dagger.hilt.processor.internal;
 
 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList;
 import static java.util.Comparator.comparing;
@@ -28,8 +28,6 @@
 import com.squareup.javapoet.JavaFile;
 import com.squareup.javapoet.TypeName;
 import com.squareup.javapoet.TypeSpec;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.Processors;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Comparator;
@@ -38,9 +36,11 @@
 import java.util.Set;
 import javax.annotation.processing.ProcessingEnvironment;
 import javax.lang.model.element.Modifier;
+import javax.lang.model.element.TypeElement;
 
 /** Generates a Dagger component or subcomponent interface. */
-final class ComponentGenerator {
+// TODO(bcorso): Make this non-public
+public final class ComponentGenerator {
   private static final Joiner JOINER = Joiner.on(".");
   private static final Comparator<ClassName> SIMPLE_NAME_SORTER =
       Comparator.comparing((ClassName c) -> JOINER.join(c.simpleNames()))
@@ -49,6 +49,7 @@
 
   private final ProcessingEnvironment processingEnv;
   private final ClassName name;
+  private final TypeElement rootElement;
   private final Optional<ClassName> superclass;
   private final ImmutableList<ClassName> modules;
   private final ImmutableList<TypeName> entryPoints;
@@ -60,6 +61,7 @@
   public ComponentGenerator(
       ProcessingEnvironment processingEnv,
       ClassName name,
+      TypeElement rootElement,
       Optional<ClassName> superclass,
       Set<? extends ClassName> modules,
       Set<? extends TypeName> entryPoints,
@@ -69,6 +71,7 @@
       Optional<TypeSpec> componentBuilder) {
     this.processingEnv = processingEnv;
     this.name = name;
+    this.rootElement = rootElement;
     this.superclass = superclass;
     this.modules = modules.stream().sorted(SIMPLE_NAME_SORTER).collect(toImmutableList());
     this.entryPoints = entryPoints.stream().sorted(TYPE_NAME_SORTER).collect(toImmutableList());
@@ -78,24 +81,25 @@
     this.componentBuilder = componentBuilder;
   }
 
-  public TypeSpec.Builder typeSpecBuilder() throws IOException {
-    TypeSpec.Builder builder =
+  public TypeSpec generate() throws IOException {
+    TypeSpec.Builder generator =
         TypeSpec.classBuilder(name)
             // Public because components from a scope below must reference to create
             .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)
+            .addOriginatingElement(rootElement)
             .addAnnotation(getComponentAnnotation());
 
-    componentBuilder.ifPresent(builder::addType);
+    componentBuilder.ifPresent(generator::addType);
 
-    scopes.forEach(builder::addAnnotation);
+    scopes.forEach(generator::addAnnotation);
 
-    addEntryPoints(builder);
+    addEntryPoints(generator);
 
-    superclass.ifPresent(builder::superclass);
+    superclass.ifPresent(generator::superclass);
 
-    builder.addAnnotations(extraAnnotations);
+    generator.addAnnotations(extraAnnotations);
 
-    return builder;
+    return generator.build();
   }
 
   /** Returns the component annotation with the list of modules to install for the component. */
@@ -156,6 +160,7 @@
             Processors.getEnclosedClassName(name), "_EntryPointPartition" + partitionIndex);
     TypeSpec.Builder builder =
         TypeSpec.interfaceBuilder(partitionName)
+            .addOriginatingElement(rootElement)
             .addModifiers(Modifier.ABSTRACT)
             .addSuperinterfaces(partition);
 
diff --git a/java/dagger/hilt/processor/internal/ComponentNames.java b/java/dagger/hilt/processor/internal/ComponentNames.java
index eeaa5f4..fab4d19 100644
--- a/java/dagger/hilt/processor/internal/ComponentNames.java
+++ b/java/dagger/hilt/processor/internal/ComponentNames.java
@@ -16,25 +16,7 @@
 
 package dagger.hilt.processor.internal;
 
-import static java.lang.Character.isUpperCase;
-import static java.lang.String.format;
-import static java.util.Comparator.comparing;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Multimaps;
 import com.squareup.javapoet.ClassName;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import javax.lang.model.element.Name;
-import javax.lang.model.element.TypeElement;
 
 /**
  * Utility class for getting the generated component name.
@@ -42,45 +24,15 @@
  * <p>This should not be used externally.
  */
 public final class ComponentNames {
-  private static final Splitter QUALIFIED_NAME_SPLITTER = Splitter.on('.');
-
-  private final boolean renameTestComponents;
-  private final String destinationPackage;
-  private final ImmutableMap<ClassName, String> simpleNameByClassName;
-
-  public static ComponentNames withoutRenaming() {
-    return new ComponentNames(
-        /*renameTestComponents=*/ false, /*destinationPackage=*/ null, ImmutableMap.of());
-  }
-
-  public static ComponentNames withRenamingIntoPackage(
-      String destinationPackage, ImmutableList<TypeElement> roots) {
-    ImmutableMap.Builder<ClassName, String> builder = ImmutableMap.builder();
-    ImmutableListMultimap<String, TypeElement> rootsBySimpleName =
-        Multimaps.index(roots, typeElement -> typeElement.getSimpleName().toString());
-    rootsBySimpleName.asMap().values().stream()
-        .map(ComponentNames::disambiguateConflictingSimpleNames)
-        .forEach(builder::putAll);
-    return new ComponentNames(/*renameTestComponents=*/ true, destinationPackage, builder.build());
-  }
-
-  private ComponentNames(
-      boolean renameTestComponents,
-      String destinationPackage,
-      ImmutableMap<ClassName, String> simpleNameByClassName) {
-    this.renameTestComponents = renameTestComponents;
-    this.destinationPackage = destinationPackage;
-    this.simpleNameByClassName = simpleNameByClassName;
-  }
+  private ComponentNames() {}
 
   /** Returns the name of the generated component wrapper. */
-  public ClassName generatedComponentsWrapper(ClassName root) {
-    return Processors.append(
-        Processors.getEnclosedClassName(maybeRenameComponent(root)), "_HiltComponents");
+  public static ClassName generatedComponentsWrapper(ClassName root) {
+    return Processors.append(Processors.getEnclosedClassName(root), "_HiltComponents");
   }
 
   /** Returns the name of the generated component. */
-  public ClassName generatedComponent(ClassName root, ClassName component) {
+  public static ClassName generatedComponent(ClassName root, ClassName component) {
     return generatedComponentsWrapper(root).nestedClass(componentName(component));
   }
 
@@ -98,82 +50,4 @@
     // Note: This uses regex matching so we only match if the name ends in "Component"
     return Processors.getEnclosedName(component).replaceAll("Component$", "C");
   }
-
-  /**
-   * Rewrites the provided HiltAndroidTest-annotated class name using the shared component
-   * directory.
-   */
-  private ClassName maybeRenameComponent(ClassName className) {
-    return (renameTestComponents && !className.equals(ClassNames.DEFAULT_ROOT))
-        ? ClassName.get(destinationPackage, dedupeSimpleName(className))
-        : className;
-  }
-
-  /**
-   * Derives a new generated component base name, should the simple names of two roots have
-   * conflicting simple names.
-   *
-   * <p>This is lifted nearly verbatim (albeit with new different struct types) from {@link
-   * dagger.internal.codegen.writing.SubcomponentNames}.
-   */
-  private String dedupeSimpleName(ClassName className) {
-    Preconditions.checkState(
-        simpleNameByClassName.containsKey(className),
-        "Class name %s not found in simple name map",
-        className.canonicalName());
-    return simpleNameByClassName.get(className);
-  }
-
-  private static ImmutableMap<ClassName, String> disambiguateConflictingSimpleNames(
-      Collection<TypeElement> rootsWithConflictingNames) {
-    // If there's only 1 root there's nothing to disambiguate so return the simple name.
-    if (rootsWithConflictingNames.size() == 1) {
-      TypeElement root = Iterables.getOnlyElement(rootsWithConflictingNames);
-      return ImmutableMap.of(ClassName.get(root), root.getSimpleName().toString());
-    }
-
-    // There are conflicting simple names, so disambiguate them with a unique prefix.
-    // We keep them small to fix https://github.com/google/dagger/issues/421.
-    // Sorted in order to guarantee determinism if this is invoked by different processors.
-    ImmutableList<TypeElement> sortedRootsWithConflictingNames =
-        ImmutableList.sortedCopyOf(
-            comparing(typeElement -> typeElement.getQualifiedName().toString()),
-            rootsWithConflictingNames);
-    Set<String> usedNames = new HashSet<>();
-    ImmutableMap.Builder<ClassName, String> uniqueNames = ImmutableMap.builder();
-    for (TypeElement root : sortedRootsWithConflictingNames) {
-      String basePrefix = uniquingPrefix(root);
-      String uniqueName = basePrefix;
-      for (int differentiator = 2; !usedNames.add(uniqueName); differentiator++) {
-        uniqueName = basePrefix + differentiator;
-      }
-      uniqueNames.put(ClassName.get(root), format("%s_%s", uniqueName, root.getSimpleName()));
-    }
-    return uniqueNames.build();
-  }
-
-  /** Returns a prefix that could make the component's simple name more unique. */
-  private static String uniquingPrefix(TypeElement typeElement) {
-    String containerName = typeElement.getEnclosingElement().getSimpleName().toString();
-
-    // If parent element looks like a class, use its initials as a prefix.
-    if (!containerName.isEmpty() && isUpperCase(containerName.charAt(0))) {
-      return CharMatcher.javaLowerCase().removeFrom(containerName);
-    }
-
-    // Not in a normally named class. Prefix with the initials of the elements leading here.
-    Name qualifiedName = typeElement.getQualifiedName();
-    Iterator<String> pieces = QUALIFIED_NAME_SPLITTER.split(qualifiedName).iterator();
-    StringBuilder b = new StringBuilder();
-
-    while (pieces.hasNext()) {
-      String next = pieces.next();
-      if (pieces.hasNext()) {
-        b.append(next.charAt(0));
-      }
-    }
-
-    // Note that a top level class in the root package will be prefixed "$_".
-    return b.length() > 0 ? b.toString() : "$";
-  }
 }
diff --git a/java/dagger/hilt/processor/internal/root/ComponentTree.java b/java/dagger/hilt/processor/internal/ComponentTree.java
similarity index 88%
rename from java/dagger/hilt/processor/internal/root/ComponentTree.java
rename to java/dagger/hilt/processor/internal/ComponentTree.java
index fe3d4b1..6d2137a 100644
--- a/java/dagger/hilt/processor/internal/root/ComponentTree.java
+++ b/java/dagger/hilt/processor/internal/ComponentTree.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package dagger.hilt.processor.internal.root;
+package dagger.hilt.processor.internal;
 
 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList;
 
@@ -27,18 +27,17 @@
 import com.google.common.graph.ImmutableGraph;
 import com.google.common.graph.MutableGraph;
 import com.squareup.javapoet.ClassName;
-import dagger.hilt.processor.internal.ComponentDescriptor;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
 /** A representation of the full tree of scopes. */
-final class ComponentTree {
+public final class ComponentTree {
   private final ImmutableGraph<ComponentDescriptor> graph;
   private final ComponentDescriptor root;
 
   /** Creates a new tree from a set of descriptors. */
-  static ComponentTree from(Set<ComponentDescriptor> descriptors) {
+  public static ComponentTree from(Set<ComponentDescriptor> descriptors) {
     MutableGraph<ComponentDescriptor> graph =
         GraphBuilder.directed().allowsSelfLoops(false).build();
 
@@ -89,19 +88,19 @@
     root = Iterables.getOnlyElement(roots);
   }
 
-  ImmutableSet<ComponentDescriptor> getComponentDescriptors() {
+  public ImmutableSet<ComponentDescriptor> getComponentDescriptors() {
     return ImmutableSet.copyOf(graph.nodes());
   }
 
-  ImmutableSet<ComponentDescriptor> childrenOf(ComponentDescriptor componentDescriptor) {
+  public ImmutableSet<ComponentDescriptor> childrenOf(ComponentDescriptor componentDescriptor) {
     return ImmutableSet.copyOf(graph.successors(componentDescriptor));
   }
 
-  ImmutableGraph<ComponentDescriptor> graph() {
+  public ImmutableGraph<ComponentDescriptor> graph() {
     return graph;
   }
 
-  ComponentDescriptor root() {
+  public ComponentDescriptor root() {
     return root;
   }
 }
diff --git a/java/dagger/hilt/processor/internal/HiltCompilerOptions.java b/java/dagger/hilt/processor/internal/HiltCompilerOptions.java
deleted file mode 100644
index 0d24823..0000000
--- a/java/dagger/hilt/processor/internal/HiltCompilerOptions.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal;
-
-import com.google.common.collect.ImmutableSet;
-import java.util.Arrays;
-import java.util.Set;
-import java.util.stream.Collectors;
-import javax.annotation.processing.ProcessingEnvironment;
-import javax.lang.model.element.TypeElement;
-
-/** Hilt annotation processor options. */
-// TODO(danysantiago): Consider consolidating with Dagger compiler options logic.
-public final class HiltCompilerOptions {
-
-  /**
-   * Returns {@code true} if the superclass validation is disabled for
-   * {@link dagger.hilt.android.AndroidEntryPoint}-annotated classes.
-   *
-   * This flag is for internal use only! The superclass validation checks that the super class is a
-   * generated {@code Hilt_} class. This flag is disabled by the Hilt Gradle plugin to enable
-   * bytecode transformation to change the superclass.
-   */
-  public static boolean isAndroidSuperclassValidationDisabled(
-      TypeElement element, ProcessingEnvironment env) {
-    BooleanOption option = BooleanOption.DISABLE_ANDROID_SUPERCLASS_VALIDATION;
-    return option.get(env);
-  }
-
-  /**
-   * Returns {@code true} if cross-compilation root validation is disabled.
-   *
-   * <p>This flag should rarely be needed, but may be used for legacy/migration purposes if
-   * tests require the use of {@link dagger.hilt.android.HiltAndroidApp} rather than
-   * {@link dagger.hilt.android.testing.HiltAndroidTest}.
-   *
-   * <p>Note that Hilt still does validation within a single compilation unit. In particular,
-   * a compilation unit that contains a {@code HiltAndroidApp} usage cannot have other
-   * {@code HiltAndroidApp} or {@code HiltAndroidTest} usages in the same compilation unit.
-   */
-  public static boolean isCrossCompilationRootValidationDisabled(
-      ImmutableSet<TypeElement> rootElements, ProcessingEnvironment env) {
-    BooleanOption option = BooleanOption.DISABLE_CROSS_COMPILATION_ROOT_VALIDATION;
-    return option.get(env);
-  }
-
-  /** Returns {@code true} if the check for {@link dagger.hilt.InstallIn} is disabled. */
-  public static boolean isModuleInstallInCheckDisabled(ProcessingEnvironment env) {
-    return BooleanOption.DISABLE_MODULES_HAVE_INSTALL_IN_CHECK.get(env);
-  }
-
-  /**
-   * Returns {@code true} of unit tests should try to share generated components, rather than using
-   * separate generated components per Hilt test root.
-   *
-   * <p>Tests that provide their own test bindings (e.g. using {@link
-   * dagger.hilt.android.testing.BindValue} or a test {@link dagger.Module}) cannot use the shared
-   * component. In these cases, a component will be generated for the test.
-   */
-  public static boolean isSharedTestComponentsEnabled(ProcessingEnvironment env) {
-    return BooleanOption.SHARE_TEST_COMPONENTS.get(env);
-  }
-
-  /** Processor options which can have true or false values. */
-  private enum BooleanOption {
-    DISABLE_ANDROID_SUPERCLASS_VALIDATION(
-        "android.internal.disableAndroidSuperclassValidation", false),
-
-    DISABLE_CROSS_COMPILATION_ROOT_VALIDATION("disableCrossCompilationRootValidation", false),
-
-    DISABLE_MODULES_HAVE_INSTALL_IN_CHECK("disableModulesHaveInstallInCheck", false),
-
-    SHARE_TEST_COMPONENTS("shareTestComponents", false);
-
-    private final String name;
-    private final boolean defaultValue;
-
-    BooleanOption(String name, boolean defaultValue) {
-      this.name = name;
-      this.defaultValue = defaultValue;
-    }
-
-    boolean get(ProcessingEnvironment env) {
-      String value = env.getOptions().get(getQualifiedName());
-      if (value == null) {
-        return defaultValue;
-      }
-      // TODO(danysantiago): Strictly verify input, either 'true' or 'false' and nothing else.
-      return Boolean.parseBoolean(value);
-    }
-
-    String getQualifiedName() {
-      return "dagger.hilt." + name;
-    }
-  }
-
-  public static Set<String> getProcessorOptions() {
-    return Arrays.stream(BooleanOption.values())
-        .map(BooleanOption::getQualifiedName)
-        .collect(Collectors.toSet());
-  }
-}
diff --git a/java/dagger/hilt/processor/internal/KotlinMetadataUtils.java b/java/dagger/hilt/processor/internal/KotlinMetadataUtils.java
index 64d5892..ec5ddf8 100644
--- a/java/dagger/hilt/processor/internal/KotlinMetadataUtils.java
+++ b/java/dagger/hilt/processor/internal/KotlinMetadataUtils.java
@@ -20,11 +20,7 @@
 import dagger.internal.codegen.kotlin.KotlinMetadataUtil;
 import javax.inject.Singleton;
 
-/**
- * A single-use provider of {@link KotlinMetadataUtil}. Since the returned util has a cache, it is
- * better to reuse the same instance as much as possible, except for going across processor rounds
- * because the cache contains elements.
- */
+/** A single-use provider of {@link KotlinMetadataUtil}. */
 // TODO(erichang):  Revert this, should be wrapped with a Dagger module.
 public final class KotlinMetadataUtils {
 
diff --git a/java/dagger/hilt/processor/internal/ProcessorErrorHandler.java b/java/dagger/hilt/processor/internal/ProcessorErrorHandler.java
index 2ecc0f0..460e8a9 100644
--- a/java/dagger/hilt/processor/internal/ProcessorErrorHandler.java
+++ b/java/dagger/hilt/processor/internal/ProcessorErrorHandler.java
@@ -62,9 +62,6 @@
 
     if (t instanceof BadInputException) {
       BadInputException badInput = (BadInputException) t;
-      if (badInput.getBadElements().isEmpty()) {
-        hiltErrors.add(HiltError.of(badInput.getMessage()));
-      }
       for (Element element : badInput.getBadElements()) {
         hiltErrors.add(HiltError.of(badInput.getMessage(), element));
       }
diff --git a/java/dagger/hilt/processor/internal/ProcessorErrors.java b/java/dagger/hilt/processor/internal/ProcessorErrors.java
index d75bb62..b1578da 100644
--- a/java/dagger/hilt/processor/internal/ProcessorErrors.java
+++ b/java/dagger/hilt/processor/internal/ProcessorErrors.java
@@ -36,49 +36,6 @@
    * involving any parameters to the calling method.
    *
    * @param expression a boolean expression
-   * @param errorMessage the exception message to use if the check fails; will be converted to a
-   *     string using {@link String#valueOf(Object)}
-   * @throws BadInputException if {@code expression} is false
-   */
-  public static void checkState(
-      boolean expression,
-      @Nullable Object errorMessage) {
-    if (!expression) {
-      throw new BadInputException(String.valueOf(errorMessage));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * @param expression a boolean expression
-   * @param errorMessageTemplate a template for the exception message should the check fail. The
-   *     message is formed by replacing each {@code %s} placeholder in the template with an
-   *     argument. These are matched by position - the first {@code %s} gets {@code
-   *     errorMessageArgs[0]}, etc. Unmatched arguments will be appended to the formatted message in
-   *     square braces. Unmatched placeholders will be left as-is.
-   * @param errorMessageArgs the arguments to be substituted into the message template. Arguments
-   *     are converted to strings using {@link String#valueOf(Object)}.
-   * @throws BadInputException if {@code expression} is false
-   * @throws NullPointerException if the check fails and either {@code errorMessageTemplate} or
-   *     {@code errorMessageArgs} is null (don't let this happen)
-   */
-  @FormatMethod
-  public static void checkState(
-      boolean expression,
-      @Nullable @FormatString String errorMessageTemplate,
-      @Nullable Object... errorMessageArgs) {
-    if (!expression) {
-      throw new BadInputException(String.format(errorMessageTemplate, errorMessageArgs));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * @param expression a boolean expression
    * @param badElement the element that was at fault
    * @param errorMessage the exception message to use if the check fails; will be converted to a
    *     string using {@link String#valueOf(Object)}
diff --git a/java/dagger/hilt/processor/internal/Processors.java b/java/dagger/hilt/processor/internal/Processors.java
index 8740bd6..b33c19d 100644
--- a/java/dagger/hilt/processor/internal/Processors.java
+++ b/java/dagger/hilt/processor/internal/Processors.java
@@ -17,12 +17,10 @@
 package dagger.hilt.processor.internal;
 
 import static com.google.auto.common.MoreElements.asPackage;
-import static com.google.auto.common.MoreElements.asType;
 import static com.google.auto.common.MoreElements.asVariable;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static dagger.internal.codegen.extension.DaggerCollectors.toOptional;
 import static javax.lang.model.element.Modifier.ABSTRACT;
-import static javax.lang.model.element.Modifier.PUBLIC;
 import static javax.lang.model.element.Modifier.STATIC;
 
 import com.google.auto.common.AnnotationMirrors;
@@ -43,7 +41,6 @@
 import com.google.common.collect.SetMultimap;
 import com.squareup.javapoet.AnnotationSpec;
 import com.squareup.javapoet.ClassName;
-import com.squareup.javapoet.JavaFile;
 import com.squareup.javapoet.MethodSpec;
 import com.squareup.javapoet.ParameterSpec;
 import com.squareup.javapoet.ParameterizedTypeName;
@@ -51,7 +48,6 @@
 import com.squareup.javapoet.TypeSpec;
 import dagger.internal.codegen.extension.DaggerStreams;
 import dagger.internal.codegen.kotlin.KotlinMetadataUtil;
-import java.io.IOException;
 import java.lang.annotation.Annotation;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -92,26 +88,6 @@
 
   private static final String JAVA_CLASS = "java.lang.Class";
 
-  public static void generateAggregatingClass(
-      String aggregatingPackage,
-      AnnotationSpec aggregatingAnnotation,
-      TypeElement element,
-      Class<?> generatedAnnotationClass,
-      ProcessingEnvironment env) throws IOException {
-    ClassName name = ClassName.get(aggregatingPackage, "_" + getFullEnclosedName(element));
-    TypeSpec.Builder builder =
-        TypeSpec.classBuilder(name)
-            .addModifiers(PUBLIC)
-            .addOriginatingElement(element)
-            .addAnnotation(aggregatingAnnotation)
-            .addJavadoc("This class should only be referenced by generated code!")
-            .addJavadoc("This class aggregates information across multiple compilations.\n");;
-
-    addGeneratedAnnotation(builder, env, generatedAnnotationClass);
-
-    JavaFile.builder(name.packageName(), builder.build()).build().writeTo(env.getFiler());
-  }
-
   /** Returns a map from {@link AnnotationMirror} attribute name to {@link AnnotationValue}s */
   public static ImmutableMap<String, AnnotationValue> getAnnotationValues(Elements elements,
       AnnotationMirror annotation) {
@@ -535,14 +511,6 @@
     return ClassName.get(className.packageName(), getEnclosedName(className));
   }
 
-  /**
-   * Returns an equivalent class name with the {@code .} (dots) used for inner classes replaced with
-   * {@code _}.
-   */
-  public static ClassName getEnclosedClassName(TypeElement typeElement) {
-    return getEnclosedClassName(ClassName.get(typeElement));
-  }
-
   /** Returns the fully qualified class name, with _ instead of . */
   public static String getFullyQualifiedEnclosedClassName(ClassName className) {
     return className.packageName().replace('.', '_') + getEnclosedName(className);
@@ -925,10 +893,7 @@
     return ElementFilter.methodsIn(elements.getAllMembers(module)).stream()
         .filter(Processors::isBindingMethod)
         .map(ExecutableElement::getModifiers)
-        .anyMatch(modifiers -> !modifiers.contains(ABSTRACT) && !modifiers.contains(STATIC))
-        // TODO(erichang): Getting a new KotlinMetadataUtil each time isn't great here, but until
-        // we have some sort of dependency management it will be difficult to share the instance.
-        && !KotlinMetadataUtils.getMetadataUtil().isObjectOrCompanionObjectClass(module);
+        .anyMatch(modifiers -> !modifiers.contains(ABSTRACT) && !modifiers.contains(STATIC));
   }
 
   private static boolean isBindingMethod(ExecutableElement method) {
@@ -971,27 +936,5 @@
         : typeName;
   }
 
-  public static Optional<TypeElement> getOriginatingTestElement(
-      Element element, Elements elements) {
-    TypeElement topLevelType = getOriginatingTopLevelType(element, elements);
-    return hasAnnotation(topLevelType, ClassNames.HILT_ANDROID_TEST)
-        ? Optional.of(asType(topLevelType))
-        : Optional.empty();
-  }
-
-  private static TypeElement getOriginatingTopLevelType(Element element, Elements elements) {
-    TypeElement topLevelType = getTopLevelType(element);
-    if (hasAnnotation(topLevelType, ClassNames.ORIGINATING_ELEMENT)) {
-      return getOriginatingTopLevelType(
-          getAnnotationClassValue(
-              elements,
-              getAnnotationMirror(topLevelType, ClassNames.ORIGINATING_ELEMENT),
-              "topLevelClass"),
-          elements);
-    }
-
-    return topLevelType;
-  }
-
   private Processors() {}
 }
diff --git a/java/dagger/hilt/processor/internal/aggregateddeps/AggregatedDepsGenerator.java b/java/dagger/hilt/processor/internal/aggregateddeps/AggregatedDepsGenerator.java
index 84fb5a1..bcc2dfe 100644
--- a/java/dagger/hilt/processor/internal/aggregateddeps/AggregatedDepsGenerator.java
+++ b/java/dagger/hilt/processor/internal/aggregateddeps/AggregatedDepsGenerator.java
@@ -19,6 +19,8 @@
 import com.google.common.collect.ImmutableSet;
 import com.squareup.javapoet.AnnotationSpec;
 import com.squareup.javapoet.ClassName;
+import com.squareup.javapoet.JavaFile;
+import com.squareup.javapoet.TypeSpec;
 import dagger.hilt.processor.internal.Processors;
 import java.io.IOException;
 import java.util.Optional;
@@ -57,8 +59,20 @@
   }
 
   void generate() throws IOException {
-    Processors.generateAggregatingClass(
-        AGGREGATING_PACKAGE, aggregatedDepsAnnotation(), dependency, getClass(), processingEnv);
+    ClassName name =
+        ClassName.get(
+            AGGREGATING_PACKAGE, Processors.getFullEnclosedName(dependency) + "ModuleDeps");
+    TypeSpec.Builder generator =
+        TypeSpec.classBuilder(name.simpleName())
+            .addOriginatingElement(dependency)
+            .addAnnotation(aggregatedDepsAnnotation())
+            .addJavadoc("Generated class to pass information through multiple javac runs.\n");
+
+    Processors.addGeneratedAnnotation(generator, processingEnv, getClass());
+
+    JavaFile.builder(name.packageName(), generator.build())
+        .build()
+        .writeTo(processingEnv.getFiler());
   }
 
   private AnnotationSpec aggregatedDepsAnnotation() {
diff --git a/java/dagger/hilt/processor/internal/aggregateddeps/AggregatedDepsMetadata.java b/java/dagger/hilt/processor/internal/aggregateddeps/AggregatedDepsMetadata.java
deleted file mode 100644
index 09e1651..0000000
--- a/java/dagger/hilt/processor/internal/aggregateddeps/AggregatedDepsMetadata.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.aggregateddeps;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.collect.Iterables.getOnlyElement;
-import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import dagger.hilt.processor.internal.AggregatedElements;
-import dagger.hilt.processor.internal.AnnotationValues;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.Processors;
-import java.util.Optional;
-import javax.lang.model.element.AnnotationMirror;
-import javax.lang.model.element.AnnotationValue;
-import javax.lang.model.element.TypeElement;
-import javax.lang.model.util.Elements;
-
-/**
- * A class that represents the values stored in an {@link
- * dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps} annotation.
- */
-@AutoValue
-abstract class AggregatedDepsMetadata {
-  private static final String AGGREGATED_DEPS_PACKAGE = "hilt_aggregated_deps";
-
-  enum DependencyType {
-    MODULE,
-    ENTRY_POINT,
-    COMPONENT_ENTRY_POINT
-  }
-
-  abstract Optional<TypeElement> testElement();
-
-  abstract ImmutableSet<TypeElement> componentElements();
-
-  abstract DependencyType dependencyType();
-
-  abstract TypeElement dependency();
-
-  abstract ImmutableSet<TypeElement> replacedDependencies();
-
-  /** Returns all aggregated deps in the aggregating package. */
-  public static ImmutableSet<AggregatedDepsMetadata> from(Elements elements) {
-    return AggregatedElements.from(AGGREGATED_DEPS_PACKAGE, ClassNames.AGGREGATED_DEPS, elements)
-        .stream()
-        .map(aggregatedElement -> create(aggregatedElement, elements))
-        .collect(toImmutableSet());
-  }
-
-  private static AggregatedDepsMetadata create(TypeElement element, Elements elements) {
-    AnnotationMirror annotationMirror =
-        Processors.getAnnotationMirror(element, ClassNames.AGGREGATED_DEPS);
-
-    ImmutableMap<String, AnnotationValue> values =
-        Processors.getAnnotationValues(elements, annotationMirror);
-
-    return new AutoValue_AggregatedDepsMetadata(
-        getTestElement(values.get("test"), elements),
-        getComponents(values.get("components"), elements),
-        getDependencyType(
-            values.get("modules"),
-            values.get("entryPoints"),
-            values.get("componentEntryPoints")),
-        getDependency(
-            values.get("modules"),
-            values.get("entryPoints"),
-            values.get("componentEntryPoints"),
-            elements),
-        getReplacedDependencies(values.get("replaces"), elements));
-  }
-
-  private static Optional<TypeElement> getTestElement(
-      AnnotationValue testValue, Elements elements) {
-    checkNotNull(testValue);
-    String test = AnnotationValues.getString(testValue);
-    return test.isEmpty() ? Optional.empty() : Optional.of(elements.getTypeElement(test));
-  }
-
-  private static ImmutableSet<TypeElement> getComponents(
-      AnnotationValue componentsValue, Elements elements) {
-    checkNotNull(componentsValue);
-    ImmutableSet<TypeElement> componentNames =
-        AnnotationValues.getAnnotationValues(componentsValue).stream()
-            .map(AnnotationValues::getString)
-            .map(
-                // This is a temporary hack to map the old ApplicationComponent to the new
-                // SingletonComponent. Technically, this is only needed for backwards compatibility
-                // with libraries using the old processor since new processors should convert to the
-                // new SingletonComponent when generating the metadata class.
-                componentName ->
-                    componentName.contentEquals(
-                            "dagger.hilt.android.components.ApplicationComponent")
-                        ? ClassNames.SINGLETON_COMPONENT.canonicalName()
-                        : componentName)
-            .map(elements::getTypeElement)
-            .collect(toImmutableSet());
-    checkState(!componentNames.isEmpty());
-    return componentNames;
-  }
-
-  private static DependencyType getDependencyType(
-      AnnotationValue modulesValue,
-      AnnotationValue entryPointsValue,
-      AnnotationValue componentEntryPointsValue) {
-    checkNotNull(modulesValue);
-    checkNotNull(entryPointsValue);
-    checkNotNull(componentEntryPointsValue);
-
-    ImmutableSet.Builder<DependencyType> dependencyTypes = ImmutableSet.builder();
-    if (!AnnotationValues.getAnnotationValues(modulesValue).isEmpty()) {
-      dependencyTypes.add(DependencyType.MODULE);
-    }
-    if (!AnnotationValues.getAnnotationValues(entryPointsValue).isEmpty()) {
-      dependencyTypes.add(DependencyType.ENTRY_POINT);
-    }
-    if (!AnnotationValues.getAnnotationValues(componentEntryPointsValue).isEmpty()) {
-      dependencyTypes.add(DependencyType.COMPONENT_ENTRY_POINT);
-    }
-    return getOnlyElement(dependencyTypes.build());
-  }
-
-  private static TypeElement getDependency(
-      AnnotationValue modulesValue,
-      AnnotationValue entryPointsValue,
-      AnnotationValue componentEntryPointsValue,
-      Elements elements) {
-    checkNotNull(modulesValue);
-    checkNotNull(entryPointsValue);
-    checkNotNull(componentEntryPointsValue);
-
-    return elements.getTypeElement(
-        AnnotationValues.getString(
-            getOnlyElement(
-                ImmutableSet.<AnnotationValue>builder()
-                    .addAll(AnnotationValues.getAnnotationValues(modulesValue))
-                    .addAll(AnnotationValues.getAnnotationValues(entryPointsValue))
-                    .addAll(AnnotationValues.getAnnotationValues(componentEntryPointsValue))
-                    .build())));
-  }
-
-  private static ImmutableSet<TypeElement> getReplacedDependencies(
-      AnnotationValue replacedDependenciesValue, Elements elements) {
-    // Allow null values to support libraries using a Hilt version before @TestInstallIn was added
-    return replacedDependenciesValue == null
-        ? ImmutableSet.of()
-        : AnnotationValues.getAnnotationValues(replacedDependenciesValue).stream()
-            .map(AnnotationValues::getString)
-            .map(elements::getTypeElement)
-            .map(replacedDep -> getPublicDependency(replacedDep, elements))
-            .collect(toImmutableSet());
-  }
-
-  /** Returns the public Hilt wrapper module, or the module itself if its already public. */
-  private static TypeElement getPublicDependency(TypeElement dependency, Elements elements) {
-    return PkgPrivateMetadata.of(elements, dependency, ClassNames.MODULE)
-        .map(metadata -> elements.getTypeElement(metadata.generatedClassName().toString()))
-        .orElse(dependency);
-  }
-}
diff --git a/java/dagger/hilt/processor/internal/aggregateddeps/AggregatedDepsProcessor.java b/java/dagger/hilt/processor/internal/aggregateddeps/AggregatedDepsProcessor.java
index 151401e..58c938f 100644
--- a/java/dagger/hilt/processor/internal/aggregateddeps/AggregatedDepsProcessor.java
+++ b/java/dagger/hilt/processor/internal/aggregateddeps/AggregatedDepsProcessor.java
@@ -20,7 +20,7 @@
 import static com.google.auto.common.MoreElements.asType;
 import static com.google.auto.common.MoreElements.getPackage;
 import static com.google.common.collect.Iterables.getOnlyElement;
-import static dagger.hilt.processor.internal.HiltCompilerOptions.isModuleInstallInCheckDisabled;
+import static dagger.hilt.android.processor.internal.androidentrypoint.HiltCompilerOptions.BooleanOption.DISABLE_MODULES_HAVE_INSTALL_IN_CHECK;
 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList;
 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
 import static javax.lang.model.element.ElementKind.CLASS;
@@ -37,8 +37,10 @@
 import dagger.hilt.processor.internal.BaseProcessor;
 import dagger.hilt.processor.internal.ClassNames;
 import dagger.hilt.processor.internal.Components;
+import dagger.hilt.processor.internal.KotlinMetadataUtils;
 import dagger.hilt.processor.internal.ProcessorErrors;
 import dagger.hilt.processor.internal.Processors;
+import dagger.internal.codegen.kotlin.KotlinMetadataUtil;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
@@ -63,7 +65,6 @@
   private static final ImmutableSet<ClassName> ENTRY_POINT_ANNOTATIONS =
       ImmutableSet.of(
           ClassNames.ENTRY_POINT,
-          ClassNames.EARLY_ENTRY_POINT,
           ClassNames.GENERATED_ENTRY_POINT,
           ClassNames.COMPONENT_ENTRY_POINT);
 
@@ -165,10 +166,7 @@
     // Check that if Dagger needs an instance of the module, Hilt can provide it automatically by
     // calling a visible empty constructor.
     ProcessorErrors.checkState(
-        // Skip ApplicationContextModule, since Hilt manages this module internally.
-        ClassNames.APPLICATION_CONTEXT_MODULE.equals(ClassName.get(module))
-        || !Processors.requiresModuleInstance(getElementUtils(), module)
-        || hasVisibleEmptyConstructor(module),
+        !daggerRequiresModuleInstance(module) || hasVisibleEmptyConstructor(module),
         module,
         "Modules that need to be instantiated by Hilt must have a visible, empty constructor.");
 
@@ -188,14 +186,13 @@
 
     ImmutableList<TypeElement> replacedModules = ImmutableList.of();
     if (Processors.hasAnnotation(module, ClassNames.TEST_INSTALL_IN)) {
-      Optional<TypeElement> originatingTestElement =
-          Processors.getOriginatingTestElement(module, getElementUtils());
+      Optional<TypeElement> originatingTestElement = getOriginatingTestElement(module);
       ProcessorErrors.checkState(
           !originatingTestElement.isPresent(),
           // TODO(b/152801981): this should really error on the annotation value
           module,
           "@TestInstallIn modules cannot be nested in (or originate from) a "
-              + "@HiltAndroidTest-annotated class:  %s",
+                + "@HiltAndroidTest-annotated class:  %s",
           originatingTestElement
               .map(testElement -> testElement.getQualifiedName().toString())
               .orElse(""));
@@ -265,10 +262,7 @@
       // Prevent users from uninstalling test-specific @InstallIn modules.
       ImmutableList<TypeElement> replacedTestSpecificInstallIn =
           replacedModules.stream()
-              .filter(
-                  replacedModule ->
-                      Processors.getOriginatingTestElement(replacedModule, getElementUtils())
-                          .isPresent())
+              .filter(replacedModule -> getOriginatingTestElement(replacedModule).isPresent())
               .collect(toImmutableList());
 
       ProcessorErrors.checkState(
@@ -310,28 +304,6 @@
         element);
     TypeElement entryPoint = asType(element);
 
-    if (entryPointAnnotation.equals(ClassNames.EARLY_ENTRY_POINT)) {
-      ImmutableSet<ClassName> components = Components.getComponents(getElementUtils(), element);
-      ProcessorErrors.checkState(
-          components.equals(ImmutableSet.of(ClassNames.SINGLETON_COMPONENT)),
-          element,
-          "@EarlyEntryPoint can only be installed into the SingletonComponent. Found: %s",
-          components);
-
-      Optional<TypeElement> optionalTestElement =
-          Processors.getOriginatingTestElement(element, getElementUtils());
-      ProcessorErrors.checkState(
-          !optionalTestElement.isPresent(),
-          element,
-          "@EarlyEntryPoint-annotated entry point, %s, cannot be nested in (or originate from) "
-              + "a @HiltAndroidTest-annotated class, %s. This requirement is to avoid confusion "
-              + "with other, test-specific entry points.",
-          asType(element).getQualifiedName().toString(),
-          optionalTestElement
-              .map(testElement -> testElement.getQualifiedName().toString())
-              .orElse(""));
-    }
-
     generateAggregatedDeps(
         entryPointAnnotation.equals(ClassNames.COMPONENT_ENTRY_POINT)
             ? "componentEntryPoints"
@@ -361,8 +333,7 @@
               .generate();
         }
       } else {
-        Optional<ClassName> testName =
-            Processors.getOriginatingTestElement(element, getElementUtils()).map(ClassName::get);
+        Optional<ClassName> testName = getOriginatingTestElement(element).map(ClassName::get);
         new AggregatedDepsGenerator(
                 key, element, testName, components, replacedModules, getProcessingEnv())
             .generate();
@@ -391,6 +362,25 @@
     return Optional.of(getOnlyElement(usedAnnotations));
   }
 
+  private Optional<TypeElement> getOriginatingTestElement(Element element) {
+    TypeElement topLevelType = getOriginatingTopLevelType(element);
+    return Processors.hasAnnotation(topLevelType, ClassNames.HILT_ANDROID_TEST)
+        ? Optional.of(asType(topLevelType))
+        : Optional.empty();
+  }
+
+  private TypeElement getOriginatingTopLevelType(Element element) {
+    TypeElement topLevelType = Processors.getTopLevelType(element);
+    if (Processors.hasAnnotation(topLevelType, ClassNames.ORIGINATING_ELEMENT)) {
+      return getOriginatingTopLevelType(
+          Processors.getAnnotationClassValue(
+              getElementUtils(),
+              Processors.getAnnotationMirror(topLevelType, ClassNames.ORIGINATING_ELEMENT),
+              "topLevelClass"));
+    }
+    return topLevelType;
+  }
+
   private static boolean isValidKind(Element element) {
     // don't go down the rabbit hole of analyzing undefined types. N.B. we don't issue
     // an error here because javac already has and we don't want to spam the user.
@@ -398,7 +388,7 @@
   }
 
   private boolean installInCheckDisabled(Element element) {
-    return isModuleInstallInCheckDisabled(getProcessingEnv())
+    return DISABLE_MODULES_HAVE_INSTALL_IN_CHECK.get(getProcessingEnv())
         || Processors.hasAnnotation(element, ClassNames.DISABLE_INSTALL_IN_CHECK);
   }
 
@@ -445,6 +435,27 @@
         || name.contentEquals("javax.annotation.processing.Generated");
   }
 
+  private static boolean daggerRequiresModuleInstance(TypeElement module) {
+    return !module.getModifiers().contains(ABSTRACT)
+        && !hasOnlyStaticProvides(module)
+        // Skip ApplicationContextModule, since Hilt manages this module internally.
+        && !ClassNames.APPLICATION_CONTEXT_MODULE.equals(ClassName.get(module))
+        // Skip Kotlin object modules since all their provision methods are static
+        && !isKotlinObject(module);
+  }
+
+  private static boolean isKotlinObject(TypeElement type) {
+    KotlinMetadataUtil metadataUtil = KotlinMetadataUtils.getMetadataUtil();
+    return metadataUtil.isObjectClass(type) || metadataUtil.isCompanionObjectClass(type);
+  }
+
+  private static boolean hasOnlyStaticProvides(TypeElement module) {
+    // TODO(erichang): Check for @Produces too when we have a producers story
+    return ElementFilter.methodsIn(module.getEnclosedElements()).stream()
+        .filter(method -> Processors.hasAnnotation(method, ClassNames.PROVIDES))
+        .allMatch(method -> method.getModifiers().contains(STATIC));
+  }
+
   private static boolean hasVisibleEmptyConstructor(TypeElement type) {
     List<ExecutableElement> constructors = ElementFilter.constructorsIn(type.getEnclosedElements());
     return constructors.isEmpty()
diff --git a/java/dagger/hilt/processor/internal/aggregateddeps/BUILD b/java/dagger/hilt/processor/internal/aggregateddeps/BUILD
index 5da2241..ebbc941 100644
--- a/java/dagger/hilt/processor/internal/aggregateddeps/BUILD
+++ b/java/dagger/hilt/processor/internal/aggregateddeps/BUILD
@@ -39,13 +39,14 @@
         "AggregatedDepsGenerator.java",
         "AggregatedDepsProcessor.java",
         "PkgPrivateEntryPointGenerator.java",
+        "PkgPrivateMetadata.java",
         "PkgPrivateModuleGenerator.java",
     ],
     deps = [
-        ":pkg_private_metadata",
+        "//:dagger_with_compiler",
+        "//java/dagger/hilt/android/processor/internal/androidentrypoint:compiler_options",
         "//java/dagger/hilt/processor/internal:base_processor",
         "//java/dagger/hilt/processor/internal:classnames",
-        "//java/dagger/hilt/processor/internal:compiler_options",
         "//java/dagger/hilt/processor/internal:components",
         "//java/dagger/hilt/processor/internal:kotlin",
         "//java/dagger/hilt/processor/internal:processor_errors",
@@ -54,21 +55,10 @@
         "//java/dagger/internal/codegen/kotlin",
         "//java/dagger/internal/guava:collect",
         "@google_bazel_common//third_party/java/auto:service",
+        "@google_bazel_common//third_party/java/auto:value",
         "@google_bazel_common//third_party/java/incap",
         "@google_bazel_common//third_party/java/javapoet",
-        "@maven//:com_google_auto_auto_common",
-    ],
-)
-
-java_library(
-    name = "pkg_private_metadata",
-    srcs = ["PkgPrivateMetadata.java"],
-    deps = [
-        "//java/dagger/hilt/processor/internal:classnames",
-        "//java/dagger/hilt/processor/internal:kotlin",
-        "//java/dagger/hilt/processor/internal:processors",
-        "@google_bazel_common//third_party/java/auto:value",
-        "@google_bazel_common//third_party/java/javapoet",
+        "@google_bazel_common//third_party/java/jsr250_annotations",
         "@maven//:com_google_auto_auto_common",
     ],
 )
@@ -76,17 +66,14 @@
 java_library(
     name = "component_dependencies",
     srcs = [
-        "AggregatedDepsMetadata.java",
         "ComponentDependencies.java",
     ],
     deps = [
-        ":pkg_private_metadata",
-        "//java/dagger/hilt/processor/internal:aggregated_elements",
+        ":processor_lib",
         "//java/dagger/hilt/processor/internal:classnames",
         "//java/dagger/hilt/processor/internal:component_descriptor",
+        "//java/dagger/hilt/processor/internal:processor_errors",
         "//java/dagger/hilt/processor/internal:processors",
-        "//java/dagger/hilt/processor/internal/earlyentrypoint:aggregated_early_entry_point_metadata",
-        "//java/dagger/hilt/processor/internal/uninstallmodules:aggregated_uninstall_modules_metadata",
         "//java/dagger/internal/codegen/extension",
         "//java/dagger/internal/guava:base",
         "//java/dagger/internal/guava:collect",
diff --git a/java/dagger/hilt/processor/internal/aggregateddeps/ComponentDependencies.java b/java/dagger/hilt/processor/internal/aggregateddeps/ComponentDependencies.java
index 897ffd1..23ed148 100644
--- a/java/dagger/hilt/processor/internal/aggregateddeps/ComponentDependencies.java
+++ b/java/dagger/hilt/processor/internal/aggregateddeps/ComponentDependencies.java
@@ -16,17 +16,36 @@
 
 package dagger.hilt.processor.internal.aggregateddeps;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsGenerator.AGGREGATING_PACKAGE;
+import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList;
 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
 
 import com.google.auto.value.AutoValue;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.SetMultimap;
 import com.squareup.javapoet.ClassName;
+import dagger.hilt.processor.internal.AnnotationValues;
+import dagger.hilt.processor.internal.BadInputException;
 import dagger.hilt.processor.internal.ClassNames;
 import dagger.hilt.processor.internal.ComponentDescriptor;
-import dagger.hilt.processor.internal.earlyentrypoint.AggregatedEarlyEntryPointMetadata;
-import dagger.hilt.processor.internal.uninstallmodules.AggregatedUninstallModulesMetadata;
+import dagger.hilt.processor.internal.ProcessorErrors;
+import dagger.hilt.processor.internal.Processors;
+import dagger.hilt.processor.internal.aggregateddeps.ComponentDependencies.AggregatedDepMetadata.DependencyType;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import javax.lang.model.element.AnnotationMirror;
+import javax.lang.model.element.AnnotationValue;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.PackageElement;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.util.Elements;
 
@@ -46,23 +65,6 @@
   /** Returns the component entry point associated with the given a component. */
   public abstract Dependencies componentEntryPoints();
 
-  /** Returns the set of early entry points */
-  public abstract ImmutableSet<ClassName> earlyEntryPoints();
-
-  /** Returns {@code true} if any entry points are annotated with {@code EarlyEntryPoints}. */
-  public boolean hasEarlyEntryPoints() {
-    return !earlyEntryPoints().isEmpty();
-  }
-
-  /**
-   * Returns {@code true} if the test binds or uninstalls test-specific bindings that would prevent
-   * it from sharing components with other test roots.
-   */
-  public final boolean includesTestDeps(ClassName root) {
-    return modules().testDeps().keySet().stream().anyMatch((key) -> key.test().equals(root))
-        || modules().uninstalledTestDeps().containsKey(root);
-  }
-
   @AutoValue.Builder
   abstract static class Builder {
     abstract Dependencies.Builder modulesBuilder();
@@ -71,9 +73,12 @@
 
     abstract Dependencies.Builder componentEntryPointsBuilder();
 
-    abstract ImmutableSet.Builder<ClassName> earlyEntryPointsBuilder();
+    abstract ComponentDependencies autoBuild();
 
-    abstract ComponentDependencies build();
+    ComponentDependencies build(Elements elements) {
+      validateModules(modulesBuilder().build(), elements);
+      return autoBuild();
+    }
   }
 
   /** A key used for grouping a test dependency by both its component and test name. */
@@ -118,17 +123,6 @@
     /** Returns the global uninstalled test deps. */
     abstract ImmutableSet<TypeElement> globalUninstalledTestDeps();
 
-    /** Returns the dependencies to be installed in the global singleton component. */
-    ImmutableSet<TypeElement> getGlobalSingletonDeps() {
-      return ImmutableSet.<TypeElement>builder()
-          .addAll(
-              globalDeps().get(ClassNames.SINGLETON_COMPONENT).stream()
-                  .filter(dep -> !globalUninstalledTestDeps().contains(dep))
-                  .collect(toImmutableSet()))
-          .addAll(globalTestDeps().get(ClassNames.SINGLETON_COMPONENT))
-          .build();
-    }
-
     /** Returns the dependencies to be installed in the given component for the given root. */
     public ImmutableSet<TypeElement> get(ClassName component, ClassName root, boolean isTestRoot) {
       if (!isTestRoot) {
@@ -181,10 +175,14 @@
    */
   public static ComponentDependencies from(
       ImmutableSet<ComponentDescriptor> descriptors, Elements elements) {
-    ImmutableSet<ClassName> componentNames =
-        descriptors.stream().map(ComponentDescriptor::component).collect(toImmutableSet());
+    Map<String, ComponentDescriptor> descriptorLookup = descriptorLookupMap(descriptors);
+    ImmutableList<AggregatedDepMetadata> metadatas =
+        getAggregatedDeps(elements).stream()
+            .map(deps -> AggregatedDepMetadata.create(deps, descriptorLookup, elements))
+            .collect(toImmutableList());
+
     ComponentDependencies.Builder componentDependencies = ComponentDependencies.builder();
-    for (AggregatedDepsMetadata metadata : AggregatedDepsMetadata.from(elements)) {
+    for (AggregatedDepMetadata metadata : metadatas) {
       Dependencies.Builder builder = null;
       switch (metadata.dependencyType()) {
         case MODULE:
@@ -197,46 +195,265 @@
           builder = componentDependencies.componentEntryPointsBuilder();
           break;
       }
-      for (TypeElement componentElement : metadata.componentElements()) {
-        ClassName componentName = ClassName.get(componentElement);
-        checkState(
-            componentNames.contains(componentName), "%s is not a valid Component.", componentName);
+
+      for (ComponentDescriptor componentDescriptor : metadata.componentDescriptors()) {
+        ClassName component = componentDescriptor.component();
         if (metadata.testElement().isPresent()) {
           // In this case the @InstallIn or @TestInstallIn applies to only the given test root.
           ClassName test = ClassName.get(metadata.testElement().get());
-          builder.testDepsBuilder().put(TestDepKey.of(componentName, test), metadata.dependency());
+          builder.testDepsBuilder().put(TestDepKey.of(component, test), metadata.dependency());
           builder.uninstalledTestDepsBuilder().putAll(test, metadata.replacedDependencies());
         } else {
           // In this case the @InstallIn or @TestInstallIn applies to all roots
           if (!metadata.replacedDependencies().isEmpty()) {
             // If there are replacedDependencies() it means this is a @TestInstallIn
-            builder.globalTestDepsBuilder().put(componentName, metadata.dependency());
+            builder.globalTestDepsBuilder().put(component, metadata.dependency());
             builder.globalUninstalledTestDepsBuilder().addAll(metadata.replacedDependencies());
           } else {
-            builder.globalDepsBuilder().put(componentName, metadata.dependency());
+            builder.globalDepsBuilder().put(component, metadata.dependency());
           }
         }
       }
     }
 
-    AggregatedUninstallModulesMetadata.from(elements)
+    // Collect all @UninstallModules.
+    // TODO(b/176438516): Filter @UninstallModules at the root.
+    metadatas.stream()
+        .filter(metadata -> metadata.testElement().isPresent())
+        .map(metadata -> metadata.testElement().get())
+        .distinct()
+        .filter(testElement -> Processors.hasAnnotation(testElement, ClassNames.IGNORE_MODULES))
         .forEach(
-            metadata ->
+            testElement ->
                 componentDependencies
                     .modulesBuilder()
                     .uninstalledTestDepsBuilder()
                     .putAll(
-                        ClassName.get(metadata.testElement()),
-                        metadata.uninstallModuleElements().stream()
-                            .map(module -> PkgPrivateMetadata.publicModule(module, elements))
-                            .collect(toImmutableSet())));
+                        ClassName.get(testElement), getUninstalledModules(testElement, elements)));
 
-    AggregatedEarlyEntryPointMetadata.from(elements).stream()
-        .map(AggregatedEarlyEntryPointMetadata::earlyEntryPoint)
-        .map(entryPoint -> PkgPrivateMetadata.publicEarlyEntryPoint(entryPoint, elements))
-        .map(ClassName::get)
-        .forEach(componentDependencies.earlyEntryPointsBuilder()::add);
+    return componentDependencies.build(elements);
+  }
 
-    return componentDependencies.build();
+  private static ImmutableMap<String, ComponentDescriptor> descriptorLookupMap(
+      ImmutableSet<ComponentDescriptor> descriptors) {
+    ImmutableMap.Builder<String, ComponentDescriptor> builder = ImmutableMap.builder();
+    for (ComponentDescriptor descriptor : descriptors) {
+      // This is a temporary hack to map the old ApplicationComponent to the new SingletonComponent.
+      // Technically, this is only needed for backwards compatibility with libraries using the old
+      // processor since new processors should convert to the new SingletonComponent when generating
+      // the metadata class.
+      if (descriptor.component().equals(ClassNames.SINGLETON_COMPONENT)) {
+        builder.put("dagger.hilt.android.components.ApplicationComponent", descriptor);
+      }
+      builder.put(descriptor.component().toString(), descriptor);
+    }
+    return builder.build();
+  }
+
+  // Validate that the @UninstallModules doesn't contain any test modules.
+  private static Dependencies validateModules(Dependencies moduleDeps, Elements elements) {
+    SetMultimap<ClassName, TypeElement> invalidTestModules = HashMultimap.create();
+    moduleDeps.testDeps().entries().stream()
+        .filter(
+            e -> moduleDeps.uninstalledTestDeps().containsEntry(e.getKey().test(), e.getValue()))
+        .forEach(e -> invalidTestModules.put(e.getKey().test(), e.getValue()));
+
+    // Currently we don't have a good way to throw an error for all tests, so we sort (to keep the
+    // error reporting order stable) and then choose the first test.
+    // TODO(bcorso): Consider using ProcessorErrorHandler directly to report all errors at once?
+    Optional<ClassName> invalidTest =
+        invalidTestModules.keySet().stream()
+            .min((test1, test2) -> test1.toString().compareTo(test2.toString()));
+    if (invalidTest.isPresent()) {
+      throw new BadInputException(
+          String.format(
+              "@UninstallModules on test, %s, should not containing test modules, "
+                  + "but found: %s",
+              invalidTest.get(),
+              invalidTestModules.get(invalidTest.get()).stream()
+                  // Sort modules to keep stable error messages.
+                  .sorted((test1, test2) -> test1.toString().compareTo(test2.toString()))
+                  .collect(toImmutableList())),
+          elements.getTypeElement(invalidTest.get().toString()));
+    }
+    return moduleDeps;
+  }
+
+  private static ImmutableSet<TypeElement> getUninstalledModules(
+      TypeElement testElement, Elements elements) {
+    ImmutableList<TypeElement> userUninstallModules =
+        Processors.getAnnotationClassValues(
+            elements,
+            Processors.getAnnotationMirror(testElement, ClassNames.IGNORE_MODULES),
+            "value");
+
+    // For pkg-private modules, find the generated wrapper class and uninstall that instead.
+    return userUninstallModules.stream()
+        .map(uninstallModule -> getPublicDependency(uninstallModule, elements))
+        .collect(toImmutableSet());
+  }
+
+  /** Returns the public Hilt wrapper module, or the module itself if its already public. */
+  private static TypeElement getPublicDependency(TypeElement dependency, Elements elements) {
+    return PkgPrivateMetadata.of(elements, dependency, ClassNames.MODULE)
+        .map(metadata -> elements.getTypeElement(metadata.generatedClassName().toString()))
+        .orElse(dependency);
+  }
+
+  /** Returns the top-level elements of the aggregated deps package. */
+  private static ImmutableList<AnnotationMirror> getAggregatedDeps(Elements elements) {
+    PackageElement packageElement = elements.getPackageElement(AGGREGATING_PACKAGE);
+    checkState(
+        packageElement != null,
+        "Couldn't find package %s. Did you mark your @Module classes with @InstallIn annotations?",
+        AGGREGATING_PACKAGE);
+
+    List<? extends Element> aggregatedDepsElements = packageElement.getEnclosedElements();
+    checkState(
+        !aggregatedDepsElements.isEmpty(),
+        "No dependencies found. Did you mark your @Module classes with @InstallIn annotations?");
+
+    ImmutableList.Builder<AnnotationMirror> builder = ImmutableList.builder();
+    for (Element element : aggregatedDepsElements) {
+      ProcessorErrors.checkState(
+          element.getKind() == ElementKind.CLASS,
+          element,
+          "Only classes may be in package %s. Did you add custom code in the package?",
+          AGGREGATING_PACKAGE);
+
+      AnnotationMirror aggregatedDeps =
+          Processors.getAnnotationMirror(element, ClassNames.AGGREGATED_DEPS);
+      ProcessorErrors.checkState(
+          aggregatedDeps != null,
+          element,
+          "Classes in package %s must be annotated with @AggregatedDeps: %s. Found: %s.",
+          AGGREGATING_PACKAGE,
+          element.getSimpleName(),
+          element.getAnnotationMirrors());
+
+      builder.add(aggregatedDeps);
+    }
+    return builder.build();
+  }
+
+  @AutoValue
+  abstract static class AggregatedDepMetadata {
+    static AggregatedDepMetadata create(
+        AnnotationMirror aggregatedDeps,
+        Map<String, ComponentDescriptor> descriptorLookup,
+        Elements elements) {
+      ImmutableMap<String, AnnotationValue> aggregatedDepsValues =
+          Processors.getAnnotationValues(elements, aggregatedDeps);
+
+      return new AutoValue_ComponentDependencies_AggregatedDepMetadata(
+          getTestElement(aggregatedDepsValues.get("test"), elements),
+          getComponents(aggregatedDepsValues.get("components"), descriptorLookup),
+          getDependencyType(
+              aggregatedDepsValues.get("modules"),
+              aggregatedDepsValues.get("entryPoints"),
+              aggregatedDepsValues.get("componentEntryPoints")),
+          getDependency(
+              aggregatedDepsValues.get("modules"),
+              aggregatedDepsValues.get("entryPoints"),
+              aggregatedDepsValues.get("componentEntryPoints"),
+              elements),
+          getReplacedDependencies(aggregatedDepsValues.get("replaces"), elements));
+    }
+
+    enum DependencyType {
+      MODULE,
+      ENTRY_POINT,
+      COMPONENT_ENTRY_POINT
+    }
+
+    abstract Optional<TypeElement> testElement();
+
+    abstract ImmutableList<ComponentDescriptor> componentDescriptors();
+
+    abstract DependencyType dependencyType();
+
+    abstract TypeElement dependency();
+
+    abstract ImmutableSet<TypeElement> replacedDependencies();
+
+    private static Optional<TypeElement> getTestElement(
+        AnnotationValue testValue, Elements elements) {
+      checkNotNull(testValue);
+      String test = AnnotationValues.getString(testValue);
+      return test.isEmpty() ? Optional.empty() : Optional.of(elements.getTypeElement(test));
+    }
+
+    private static ImmutableList<ComponentDescriptor> getComponents(
+        AnnotationValue componentsValue, Map<String, ComponentDescriptor> descriptorLookup) {
+      checkNotNull(componentsValue);
+      ImmutableList<String> componentNames =
+          AnnotationValues.getAnnotationValues(componentsValue).stream()
+              .map(AnnotationValues::getString)
+              .collect(toImmutableList());
+
+      checkState(!componentNames.isEmpty());
+      ImmutableList.Builder<ComponentDescriptor> components = ImmutableList.builder();
+      for (String componentName : componentNames) {
+        checkState(
+            descriptorLookup.containsKey(componentName),
+            "%s is not a valid Component. Did you add or remove code in package %s?",
+            componentName,
+            AGGREGATING_PACKAGE);
+        components.add(descriptorLookup.get(componentName));
+      }
+      return components.build();
+    }
+
+    private static DependencyType getDependencyType(
+        AnnotationValue modulesValue,
+        AnnotationValue entryPointsValue,
+        AnnotationValue componentEntryPointsValue) {
+      checkNotNull(modulesValue);
+      checkNotNull(entryPointsValue);
+      checkNotNull(componentEntryPointsValue);
+
+      ImmutableSet.Builder<DependencyType> dependencyTypes = ImmutableSet.builder();
+      if (!AnnotationValues.getAnnotationValues(modulesValue).isEmpty()) {
+        dependencyTypes.add(DependencyType.MODULE);
+      }
+      if (!AnnotationValues.getAnnotationValues(entryPointsValue).isEmpty()) {
+        dependencyTypes.add(DependencyType.ENTRY_POINT);
+      }
+      if (!AnnotationValues.getAnnotationValues(componentEntryPointsValue).isEmpty()) {
+        dependencyTypes.add(DependencyType.COMPONENT_ENTRY_POINT);
+      }
+      return getOnlyElement(dependencyTypes.build());
+    }
+
+    private static TypeElement getDependency(
+        AnnotationValue modulesValue,
+        AnnotationValue entryPointsValue,
+        AnnotationValue componentEntryPointsValue,
+        Elements elements) {
+      checkNotNull(modulesValue);
+      checkNotNull(entryPointsValue);
+      checkNotNull(componentEntryPointsValue);
+
+      return elements.getTypeElement(
+          AnnotationValues.getString(
+              getOnlyElement(
+                  ImmutableList.<AnnotationValue>builder()
+                      .addAll(AnnotationValues.getAnnotationValues(modulesValue))
+                      .addAll(AnnotationValues.getAnnotationValues(entryPointsValue))
+                      .addAll(AnnotationValues.getAnnotationValues(componentEntryPointsValue))
+                      .build())));
+    }
+
+    private static ImmutableSet<TypeElement> getReplacedDependencies(
+        AnnotationValue replacedDependenciesValue, Elements elements) {
+      // Allow null values to support libraries using a Hilt version before @TestInstallIn was added
+      return replacedDependenciesValue == null
+          ? ImmutableSet.of()
+          : AnnotationValues.getAnnotationValues(replacedDependenciesValue).stream()
+              .map(AnnotationValues::getString)
+              .map(elements::getTypeElement)
+              .map(replacedDep -> getPublicDependency(replacedDep, elements))
+              .collect(toImmutableSet());
+    }
   }
 }
diff --git a/java/dagger/hilt/processor/internal/aggregateddeps/PkgPrivateMetadata.java b/java/dagger/hilt/processor/internal/aggregateddeps/PkgPrivateMetadata.java
index ff344a6..66f1751 100644
--- a/java/dagger/hilt/processor/internal/aggregateddeps/PkgPrivateMetadata.java
+++ b/java/dagger/hilt/processor/internal/aggregateddeps/PkgPrivateMetadata.java
@@ -24,35 +24,16 @@
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.TypeName;
 import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.KotlinMetadataUtils;
 import dagger.hilt.processor.internal.Processors;
 import java.util.Optional;
 import javax.lang.model.element.AnnotationMirror;
+import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.util.Elements;
 
 /** PkgPrivateModuleMetadata contains a set of utilities for processing package private modules. */
 @AutoValue
-public abstract class PkgPrivateMetadata {
-  /** Returns the public Hilt wrapped type or the type itself if it is already public. */
-  public static TypeElement publicModule(TypeElement element, Elements elements) {
-    return publicDep(element, elements, ClassNames.MODULE);
-  }
-
-  /** Returns the public Hilt wrapped type or the type itself if it is already public. */
-  public static TypeElement publicEarlyEntryPoint(TypeElement element, Elements elements) {
-    return publicDep(element, elements, ClassNames.EARLY_ENTRY_POINT);
-  }
-
-  private static TypeElement publicDep(
-      TypeElement element, Elements elements, ClassName annotation) {
-    return of(elements, element, annotation)
-        .map(PkgPrivateMetadata::generatedClassName)
-        .map(ClassName::canonicalName)
-        .map(elements::getTypeElement)
-        .orElse(element);
-  }
-
+abstract class PkgPrivateMetadata {
   private static final String PREFIX = "HiltWrapper_";
 
   /** Returns the base class name of the elemenet. */
@@ -82,11 +63,9 @@
    * Returns an Optional PkgPrivateMetadata requiring Hilt processing, otherwise returns an empty
    * Optional.
    */
-  static Optional<PkgPrivateMetadata> of(
-      Elements elements, TypeElement element, ClassName annotation) {
+  static Optional<PkgPrivateMetadata> of(Elements elements, Element element, ClassName annotation) {
     // If this is a public element no wrapping is needed
-    if (effectiveVisibilityOfElement(element) == Visibility.PUBLIC
-        && !KotlinMetadataUtils.getMetadataUtil().isVisibilityInternal(element)) {
+    if (effectiveVisibilityOfElement(element) == Visibility.PUBLIC) {
       return Optional.empty();
     }
 
diff --git a/java/dagger/hilt/processor/internal/aliasof/AliasOfProcessor.java b/java/dagger/hilt/processor/internal/aliasof/AliasOfProcessor.java
index 02e7f5d..6efd643 100644
--- a/java/dagger/hilt/processor/internal/aliasof/AliasOfProcessor.java
+++ b/java/dagger/hilt/processor/internal/aliasof/AliasOfProcessor.java
@@ -16,7 +16,6 @@
 
 package dagger.hilt.processor.internal.aliasof;
 
-import static com.google.auto.common.MoreElements.asType;
 import static net.ltgt.gradle.incap.IncrementalAnnotationProcessorType.ISOLATING;
 
 import com.google.auto.service.AutoService;
@@ -49,14 +48,13 @@
         "%s should only be used on scopes." + " However, it was found annotating %s",
         annotation,
         element);
-
     AnnotationMirror annotationMirror =
         Processors.getAnnotationMirror(element, ClassNames.ALIAS_OF);
 
-    TypeElement defineComponentScope =
+    Element defineComponentScope =
         Processors.getAnnotationClassValue(getElementUtils(), annotationMirror, "value");
 
-    new AliasOfPropagatedDataGenerator(getProcessingEnv(), asType(element), defineComponentScope)
+    new AliasOfPropagatedDataGenerator(getProcessingEnv(), element, defineComponentScope)
         .generate();
   }
 }
diff --git a/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataGenerator.java b/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataGenerator.java
index 1d7edf2..75c4c15 100644
--- a/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataGenerator.java
+++ b/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataGenerator.java
@@ -17,37 +17,43 @@
 package dagger.hilt.processor.internal.aliasof;
 
 import com.squareup.javapoet.AnnotationSpec;
+import com.squareup.javapoet.JavaFile;
+import com.squareup.javapoet.TypeSpec;
 import dagger.hilt.processor.internal.ClassNames;
 import dagger.hilt.processor.internal.Processors;
 import java.io.IOException;
 import javax.annotation.processing.ProcessingEnvironment;
-import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.Element;
 
 /** Generates resource files for {@link dagger.hilt.migration.AliasOf}. */
 final class AliasOfPropagatedDataGenerator {
 
   private final ProcessingEnvironment processingEnv;
-  private final TypeElement aliasScope;
-  private final TypeElement defineComponentScope;
+  private final Element aliasScope;
+  private final Element defineComponentScope;
 
   AliasOfPropagatedDataGenerator(
-      ProcessingEnvironment processingEnv,
-      TypeElement aliasScope,
-      TypeElement defineComponentScope) {
+      ProcessingEnvironment processingEnv, Element aliasScope, Element defineComponentScope) {
     this.processingEnv = processingEnv;
     this.aliasScope = aliasScope;
     this.defineComponentScope = defineComponentScope;
   }
 
   void generate() throws IOException {
-    Processors.generateAggregatingClass(
-        ClassNames.ALIAS_OF_PROPAGATED_DATA_PACKAGE,
-        AnnotationSpec.builder(ClassNames.ALIAS_OF_PROPAGATED_DATA)
+    TypeSpec.Builder generator =
+        TypeSpec.classBuilder(Processors.getFullEnclosedName(aliasScope))
+            .addOriginatingElement(aliasScope)
+            .addAnnotation(
+                AnnotationSpec.builder(ClassNames.ALIAS_OF_PROPAGATED_DATA)
                     .addMember("defineComponentScope", "$T.class", defineComponentScope)
                     .addMember("alias", "$T.class", aliasScope)
-                    .build(),
-        aliasScope,
-        getClass(),
-        processingEnv);
+                    .build())
+            .addJavadoc("Generated class for aggregating scope aliases. \n");
+
+    Processors.addGeneratedAnnotation(generator, processingEnv, getClass());
+
+    JavaFile.builder(AliasOfs.AGGREGATING_PACKAGE, generator.build())
+        .build()
+        .writeTo(processingEnv.getFiler());
   }
 }
diff --git a/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataMetadata.java b/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataMetadata.java
deleted file mode 100644
index 30a2c70..0000000
--- a/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataMetadata.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.aliasof;
-
-import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import dagger.hilt.processor.internal.AggregatedElements;
-import dagger.hilt.processor.internal.AnnotationValues;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.Processors;
-import javax.lang.model.element.AnnotationMirror;
-import javax.lang.model.element.AnnotationValue;
-import javax.lang.model.element.TypeElement;
-import javax.lang.model.util.Elements;
-
-/**
- * A class that represents the values stored in an {@link
- * dagger.hilt.internal.aliasof.AliasOfPropagatedData} annotation.
- */
-@AutoValue
-abstract class AliasOfPropagatedDataMetadata {
-
-  abstract TypeElement defineComponentScopeElement();
-
-  abstract TypeElement aliasElement();
-
-  static ImmutableSet<AliasOfPropagatedDataMetadata> from(Elements elements) {
-    return AggregatedElements.from(
-            ClassNames.ALIAS_OF_PROPAGATED_DATA_PACKAGE,
-            ClassNames.ALIAS_OF_PROPAGATED_DATA,
-            elements)
-        .stream()
-        .map(aggregatedElement -> create(aggregatedElement, elements))
-        .collect(toImmutableSet());
-  }
-
-  private static AliasOfPropagatedDataMetadata create(TypeElement element, Elements elements) {
-    AnnotationMirror annotationMirror =
-        Processors.getAnnotationMirror(element, ClassNames.ALIAS_OF_PROPAGATED_DATA);
-
-    ImmutableMap<String, AnnotationValue> values =
-        Processors.getAnnotationValues(elements, annotationMirror);
-
-    return new AutoValue_AliasOfPropagatedDataMetadata(
-        AnnotationValues.getTypeElement(values.get("defineComponentScope")),
-        AnnotationValues.getTypeElement(values.get("alias")));
-  }
-}
diff --git a/java/dagger/hilt/processor/internal/aliasof/AliasOfs.java b/java/dagger/hilt/processor/internal/aliasof/AliasOfs.java
index 18951bd..930a72e 100644
--- a/java/dagger/hilt/processor/internal/aliasof/AliasOfs.java
+++ b/java/dagger/hilt/processor/internal/aliasof/AliasOfs.java
@@ -16,11 +16,23 @@
 
 package dagger.hilt.processor.internal.aliasof;
 
+import static com.google.common.base.Suppliers.memoize;
 
+import com.google.common.base.Preconditions;
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSetMultimap;
 import com.squareup.javapoet.ClassName;
+import dagger.hilt.processor.internal.ClassNames;
 import dagger.hilt.processor.internal.ProcessorErrors;
+import dagger.hilt.processor.internal.Processors;
+import java.util.List;
+import javax.annotation.processing.ProcessingEnvironment;
+import javax.lang.model.element.AnnotationMirror;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.PackageElement;
+import javax.lang.model.element.TypeElement;
 import javax.lang.model.util.Elements;
 
 /**
@@ -28,33 +40,69 @@
  * to scopes they are alias of.
  */
 public final class AliasOfs {
-  public static AliasOfs create(Elements elements, ImmutableSet<ClassName> defineComponentScopes) {
-    ImmutableSetMultimap.Builder<ClassName, ClassName> builder = ImmutableSetMultimap.builder();
-    AliasOfPropagatedDataMetadata.from(elements)
-        .forEach(
-            metadata -> {
-              ClassName defineComponentScopeName =
-                  ClassName.get(metadata.defineComponentScopeElement());
-              ClassName aliasScopeName = ClassName.get(metadata.aliasElement());
-              ProcessorErrors.checkState(
-                  defineComponentScopes.contains(defineComponentScopeName),
-                  metadata.aliasElement(),
-                  "The scope %s cannot be an alias for %s. You can only have aliases of a scope"
-                      + " defined directly on a @DefineComponent type.",
-                  aliasScopeName,
-                  defineComponentScopeName);
-              builder.put(defineComponentScopeName, aliasScopeName);
-            });
-    return new AliasOfs(builder.build());
-  }
+  static final String AGGREGATING_PACKAGE = AliasOfs.class.getPackage().getName() + ".codegen";
 
-  private final ImmutableSetMultimap<ClassName, ClassName> defineComponentScopeToAliases;
+  private final ProcessingEnvironment processingEnvironment;
+  private final ImmutableSet<ClassName> defineComponentScopes;
+  private final Supplier<ImmutableMultimap<ClassName, ClassName>> aliases =
+      memoize(() -> getAliases());
 
-  private AliasOfs(ImmutableSetMultimap<ClassName, ClassName> defineComponentScopeToAliases) {
-    this.defineComponentScopeToAliases = defineComponentScopeToAliases;
+  public AliasOfs(
+      ProcessingEnvironment processingEnvironment, ImmutableSet<ClassName> defineComponentScopes) {
+    this.defineComponentScopes = defineComponentScopes;
+    this.processingEnvironment = processingEnvironment;
   }
 
   public ImmutableSet<ClassName> getAliasesFor(ClassName defineComponentScope) {
-    return defineComponentScopeToAliases.get(defineComponentScope);
+    return ImmutableSet.copyOf(aliases.get().get(defineComponentScope));
+  }
+
+  private ImmutableMultimap<ClassName, ClassName> getAliases() {
+    Elements elements = processingEnvironment.getElementUtils();
+    PackageElement packageElement = elements.getPackageElement(AGGREGATING_PACKAGE);
+    if (packageElement == null) {
+      return ImmutableMultimap.of();
+    }
+    List<? extends Element> scopeAliasElements = packageElement.getEnclosedElements();
+    Preconditions.checkState(
+        !scopeAliasElements.isEmpty(), "No scope aliases Found in package %s.", packageElement);
+
+    ImmutableMultimap.Builder<ClassName, ClassName> builder = ImmutableMultimap.builder();
+    for (Element element : scopeAliasElements) {
+      ProcessorErrors.checkState(
+          element.getKind() == ElementKind.CLASS,
+          element,
+          "Only classes may be in package %s. Did you add custom code in the package?",
+          packageElement);
+
+      AnnotationMirror annotationMirror =
+          Processors.getAnnotationMirror(element, ClassNames.ALIAS_OF_PROPAGATED_DATA);
+
+      ProcessorErrors.checkState(
+          annotationMirror != null,
+          element,
+          "Classes in package %s must be annotated with @%s: %s."
+              + " Found: %s. Files in this package are generated, did you add custom code in the"
+              + " package? ",
+          packageElement,
+          ClassNames.ALIAS_OF_PROPAGATED_DATA,
+          element.getSimpleName(),
+          element.getAnnotationMirrors());
+
+      TypeElement defineComponentScope =
+          Processors.getAnnotationClassValue(elements, annotationMirror, "defineComponentScope");
+      TypeElement alias = Processors.getAnnotationClassValue(elements, annotationMirror, "alias");
+
+      Preconditions.checkState(
+          defineComponentScopes.contains(ClassName.get(defineComponentScope)),
+          "The scope %s cannot be an alias for %s. You can only have aliases of a scope defined"
+              + " directly on a @DefineComponent type.",
+          ClassName.get(alias),
+          ClassName.get(defineComponentScope));
+
+      builder.put(ClassName.get(defineComponentScope), ClassName.get(alias));
+    }
+
+    return builder.build();
   }
 }
diff --git a/java/dagger/hilt/processor/internal/aliasof/BUILD b/java/dagger/hilt/processor/internal/aliasof/BUILD
index ffd0c9a..d3f90f2 100644
--- a/java/dagger/hilt/processor/internal/aliasof/BUILD
+++ b/java/dagger/hilt/processor/internal/aliasof/BUILD
@@ -31,6 +31,7 @@
         "AliasOfPropagatedDataGenerator.java",
     ],
     deps = [
+        ":alias_ofs",
         "//java/dagger/hilt/processor/internal:base_processor",
         "//java/dagger/hilt/processor/internal:classnames",
         "//java/dagger/hilt/processor/internal:processor_errors",
@@ -39,24 +40,20 @@
         "@google_bazel_common//third_party/java/auto:service",
         "@google_bazel_common//third_party/java/incap",
         "@google_bazel_common//third_party/java/javapoet",
-        "@maven//:com_google_auto_auto_common",
     ],
 )
 
 java_library(
     name = "alias_ofs",
     srcs = [
-        "AliasOfPropagatedDataMetadata.java",
         "AliasOfs.java",
     ],
     deps = [
-        "//java/dagger/hilt/processor/internal:aggregated_elements",
         "//java/dagger/hilt/processor/internal:classnames",
         "//java/dagger/hilt/processor/internal:processor_errors",
         "//java/dagger/hilt/processor/internal:processors",
-        "//java/dagger/internal/codegen/extension",
+        "//java/dagger/internal/guava:base",
         "//java/dagger/internal/guava:collect",
-        "@google_bazel_common//third_party/java/auto:value",
         "@google_bazel_common//third_party/java/javapoet",
     ],
 )
diff --git a/java/dagger/hilt/processor/internal/definecomponent/BUILD b/java/dagger/hilt/processor/internal/definecomponent/BUILD
index 43f4dfd..7edec1c 100644
--- a/java/dagger/hilt/processor/internal/definecomponent/BUILD
+++ b/java/dagger/hilt/processor/internal/definecomponent/BUILD
@@ -45,18 +45,18 @@
     name = "define_components",
     srcs = [
         "DefineComponentBuilderMetadatas.java",
-        "DefineComponentClassesMetadata.java",
         "DefineComponentMetadatas.java",
         "DefineComponents.java",
     ],
     deps = [
-        "//java/dagger/hilt/processor/internal:aggregated_elements",
         "//java/dagger/hilt/processor/internal:classnames",
         "//java/dagger/hilt/processor/internal:component_descriptor",
         "//java/dagger/hilt/processor/internal:processor_errors",
         "//java/dagger/hilt/processor/internal:processors",
         "//java/dagger/internal/codegen/extension",
+        "//java/dagger/internal/guava:base",
         "//java/dagger/internal/guava:collect",
+        "//java/dagger/internal/guava:graph",
         "@google_bazel_common//third_party/java/auto:value",
         "@google_bazel_common//third_party/java/javapoet",
         "@maven//:com_google_auto_auto_common",
diff --git a/java/dagger/hilt/processor/internal/definecomponent/DefineComponentClassesMetadata.java b/java/dagger/hilt/processor/internal/definecomponent/DefineComponentClassesMetadata.java
deleted file mode 100644
index 36ac28f..0000000
--- a/java/dagger/hilt/processor/internal/definecomponent/DefineComponentClassesMetadata.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.definecomponent;
-
-import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import dagger.hilt.processor.internal.AggregatedElements;
-import dagger.hilt.processor.internal.AnnotationValues;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.ProcessorErrors;
-import dagger.hilt.processor.internal.Processors;
-import javax.lang.model.element.AnnotationMirror;
-import javax.lang.model.element.AnnotationValue;
-import javax.lang.model.element.TypeElement;
-import javax.lang.model.util.Elements;
-
-/**
- * A class that represents the values stored in an {@link
- * dagger.hilt.internal.definecomponent.DefineComponentClasses} annotation.
- */
-@AutoValue
-abstract class DefineComponentClassesMetadata {
-
-  /**
-   * Returns the element annotated with {@code dagger.hilt.internal.definecomponent.DefineComponent}
-   * or {@code dagger.hilt.internal.definecomponent.DefineComponent.Builder}.
-   */
-  abstract TypeElement element();
-
-  /** Returns {@code true} if this element represents a component. */
-  abstract boolean isComponent();
-
-  /** Returns {@code true} if this element represents a component builder. */
-  boolean isComponentBuilder() {
-    return !isComponent();
-  }
-
-  static ImmutableSet<DefineComponentClassesMetadata> from(Elements elements) {
-    return AggregatedElements.from(
-            ClassNames.DEFINE_COMPONENT_CLASSES_PACKAGE,
-            ClassNames.DEFINE_COMPONENT_CLASSES,
-            elements)
-        .stream()
-        .map(aggregatedElement -> create(aggregatedElement, elements))
-        .collect(toImmutableSet());
-  }
-
-  private static DefineComponentClassesMetadata create(TypeElement element, Elements elements) {
-    AnnotationMirror annotationMirror =
-        Processors.getAnnotationMirror(element, ClassNames.DEFINE_COMPONENT_CLASSES);
-
-    ImmutableMap<String, AnnotationValue> values =
-        Processors.getAnnotationValues(elements, annotationMirror);
-
-    String componentName = AnnotationValues.getString(values.get("component"));
-    String builderName = AnnotationValues.getString(values.get("builder"));
-
-    ProcessorErrors.checkState(
-        !(componentName.isEmpty() && builderName.isEmpty()),
-        element,
-        "@DefineComponentClasses missing both `component` and `builder` members.");
-
-    ProcessorErrors.checkState(
-        componentName.isEmpty() || builderName.isEmpty(),
-        element,
-        "@DefineComponentClasses should not include both `component` and `builder` members.");
-
-    boolean isComponent = !componentName.isEmpty();
-    String componentOrBuilderName = isComponent ? componentName : builderName;
-    TypeElement componentOrBuilderElement = elements.getTypeElement(componentOrBuilderName);
-    ProcessorErrors.checkState(
-        componentOrBuilderElement != null,
-        componentOrBuilderElement,
-        "%s.%s(), has invalid value: `%s`.",
-        ClassNames.DEFINE_COMPONENT_CLASSES.simpleName(),
-        isComponent ? "component" : "builder",
-        componentOrBuilderName);
-    return new AutoValue_DefineComponentClassesMetadata(componentOrBuilderElement, isComponent);
-  }
-}
diff --git a/java/dagger/hilt/processor/internal/definecomponent/DefineComponentMetadatas.java b/java/dagger/hilt/processor/internal/definecomponent/DefineComponentMetadatas.java
index 60864c2..aa69e40 100644
--- a/java/dagger/hilt/processor/internal/definecomponent/DefineComponentMetadatas.java
+++ b/java/dagger/hilt/processor/internal/definecomponent/DefineComponentMetadatas.java
@@ -163,25 +163,15 @@
             ? Optional.empty()
             : Optional.of(get(parent, childPath));
 
-    ClassName componentClassName = ClassName.get(component);
-
     ProcessorErrors.checkState(
         parentComponent.isPresent()
-            || componentClassName.equals(ClassNames.SINGLETON_COMPONENT),
+            || ClassName.get(component).equals(ClassNames.SINGLETON_COMPONENT),
         component,
         "@DefineComponent %s is missing a parent declaration.\n"
             + "Please declare the parent, for example: @DefineComponent(parent ="
             + " SingletonComponent.class)",
         component);
 
-    ProcessorErrors.checkState(
-        componentClassName.equals(ClassNames.SINGLETON_COMPONENT)
-        || !componentClassName.simpleName().equals(ClassNames.SINGLETON_COMPONENT.simpleName()),
-        component,
-        "Cannot have a component with the same simple name as the reserved %s: %s",
-        ClassNames.SINGLETON_COMPONENT.simpleName(),
-        componentClassName);
-
     return new AutoValue_DefineComponentMetadatas_DefineComponentMetadata(
         component, scopes, parentComponent);
   }
diff --git a/java/dagger/hilt/processor/internal/definecomponent/DefineComponentProcessor.java b/java/dagger/hilt/processor/internal/definecomponent/DefineComponentProcessor.java
index f7e54a0..e0bfca9 100644
--- a/java/dagger/hilt/processor/internal/definecomponent/DefineComponentProcessor.java
+++ b/java/dagger/hilt/processor/internal/definecomponent/DefineComponentProcessor.java
@@ -22,6 +22,8 @@
 import com.google.common.collect.ImmutableSet;
 import com.squareup.javapoet.AnnotationSpec;
 import com.squareup.javapoet.ClassName;
+import com.squareup.javapoet.JavaFile;
+import com.squareup.javapoet.TypeSpec;
 import dagger.hilt.processor.internal.BaseProcessor;
 import dagger.hilt.processor.internal.ClassNames;
 import dagger.hilt.processor.internal.Processors;
@@ -68,13 +70,18 @@
   }
 
   private void generateFile(String member, TypeElement typeElement) throws IOException {
-    Processors.generateAggregatingClass(
-        ClassNames.DEFINE_COMPONENT_CLASSES_PACKAGE,
-        AnnotationSpec.builder(ClassNames.DEFINE_COMPONENT_CLASSES)
-            .addMember(member, "$S", typeElement.getQualifiedName())
-            .build(),
-        typeElement,
-        getClass(),
-        getProcessingEnv());
+    TypeSpec.Builder builder =
+        TypeSpec.interfaceBuilder(Processors.getFullEnclosedName(typeElement))
+            .addOriginatingElement(typeElement)
+            .addAnnotation(
+                AnnotationSpec.builder(ClassNames.DEFINE_COMPONENT_CLASSES)
+                    .addMember(member, "$S", typeElement.getQualifiedName())
+                    .build());
+
+    Processors.addGeneratedAnnotation(builder, processingEnv, getClass());
+
+    JavaFile.builder(DefineComponents.AGGREGATING_PACKAGE, builder.build())
+        .build()
+        .writeTo(processingEnv.getFiler());
   }
 }
diff --git a/java/dagger/hilt/processor/internal/definecomponent/DefineComponents.java b/java/dagger/hilt/processor/internal/definecomponent/DefineComponents.java
index efa5011..0b33011 100644
--- a/java/dagger/hilt/processor/internal/definecomponent/DefineComponents.java
+++ b/java/dagger/hilt/processor/internal/definecomponent/DefineComponents.java
@@ -16,22 +16,32 @@
 
 package dagger.hilt.processor.internal.definecomponent;
 
+import static com.google.auto.common.AnnotationMirrors.getAnnotationElementAndValue;
 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList;
 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
 
+import com.google.auto.common.MoreElements;
+import com.google.auto.value.AutoValue;
 import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ListMultimap;
 import com.squareup.javapoet.ClassName;
+import dagger.hilt.processor.internal.AnnotationValues;
 import dagger.hilt.processor.internal.ClassNames;
 import dagger.hilt.processor.internal.ComponentDescriptor;
+import dagger.hilt.processor.internal.ComponentTree;
 import dagger.hilt.processor.internal.ProcessorErrors;
+import dagger.hilt.processor.internal.Processors;
 import dagger.hilt.processor.internal.definecomponent.DefineComponentBuilderMetadatas.DefineComponentBuilderMetadata;
 import dagger.hilt.processor.internal.definecomponent.DefineComponentMetadatas.DefineComponentMetadata;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.Optional;
+import javax.lang.model.element.AnnotationMirror;
+import javax.lang.model.element.AnnotationValue;
 import javax.lang.model.element.Element;
+import javax.lang.model.element.PackageElement;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.util.Elements;
 
@@ -40,6 +50,8 @@
  * DefineComponentBuilderMetadata}.
  */
 public final class DefineComponents {
+  static final String AGGREGATING_PACKAGE =
+      DefineComponents.class.getPackage().getName() + ".codegen";
 
   public static DefineComponents create() {
     return new DefineComponents();
@@ -77,28 +89,14 @@
     return builder.build();
   }
 
-  /** Returns the set of aggregated {@link ComponentDescriptor}s. */
-  public ImmutableSet<ComponentDescriptor> getComponentDescriptors(Elements elements) {
-    ImmutableSet<DefineComponentClassesMetadata> aggregatedMetadatas =
-        DefineComponentClassesMetadata.from(elements);
-
-    ImmutableSet<DefineComponentMetadata> components =
-        aggregatedMetadatas.stream()
-            .filter(DefineComponentClassesMetadata::isComponent)
-            .map(DefineComponentClassesMetadata::element)
-            .map(componentMetadatas::get)
-            .collect(toImmutableSet());
-
-    ImmutableSet<DefineComponentBuilderMetadata> builders =
-        aggregatedMetadatas.stream()
-            .filter(DefineComponentClassesMetadata::isComponentBuilder)
-            .map(DefineComponentClassesMetadata::element)
-            .map(componentBuilderMetadatas::get)
-            .collect(toImmutableSet());
-
+  /** Returns the {@link ComponentTree} from the aggregated {@link ComponentDescriptor}s. */
+  public ComponentTree getComponentTree(Elements elements) {
+    AggregatedMetadata aggregatedMetadata =
+        AggregatedMetadata.from(elements, componentMetadatas, componentBuilderMetadatas);
     ListMultimap<DefineComponentMetadata, DefineComponentBuilderMetadata> builderMultimap =
         ArrayListMultimap.create();
-    builders.forEach(builder -> builderMultimap.put(builder.componentMetadata(), builder));
+    aggregatedMetadata.builders()
+        .forEach(builder -> builderMultimap.put(builder.componentMetadata(), builder));
 
     // Check that there are not multiple builders per component
     for (DefineComponentMetadata componentMetadata : builderMultimap.keySet()) {
@@ -121,9 +119,10 @@
     Map<DefineComponentMetadata, DefineComponentBuilderMetadata> builderMap = new LinkedHashMap<>();
     builderMultimap.entries().forEach(e -> builderMap.put(e.getKey(), e.getValue()));
 
-    return components.stream()
+
+    return ComponentTree.from(aggregatedMetadata.components().stream()
         .map(componentMetadata -> toComponentDescriptor(componentMetadata, builderMap))
-        .collect(toImmutableSet());
+        .collect(toImmutableSet()));
   }
 
   private static ComponentDescriptor toComponentDescriptor(
@@ -147,4 +146,80 @@
 
     return builder.build();
   }
+
+  @AutoValue
+  abstract static class AggregatedMetadata {
+    /** Returns the aggregated metadata for {@link DefineComponentClasses#component()}. */
+    abstract ImmutableList<DefineComponentMetadata> components();
+
+    /** Returns the aggregated metadata for {@link DefineComponentClasses#builder()}. */
+    abstract ImmutableList<DefineComponentBuilderMetadata> builders();
+
+    static AggregatedMetadata from(
+        Elements elements,
+        DefineComponentMetadatas componentMetadatas,
+        DefineComponentBuilderMetadatas componentBuilderMetadatas) {
+      PackageElement packageElement = elements.getPackageElement(AGGREGATING_PACKAGE);
+
+      if (packageElement == null) {
+        return new AutoValue_DefineComponents_AggregatedMetadata(
+            ImmutableList.of(), ImmutableList.of());
+      }
+
+      ImmutableList.Builder<DefineComponentMetadata> components = ImmutableList.builder();
+      ImmutableList.Builder<DefineComponentBuilderMetadata> builders = ImmutableList.builder();
+      for (Element element : packageElement.getEnclosedElements()) {
+        ProcessorErrors.checkState(
+            MoreElements.isType(element),
+            element,
+            "Only types may be in package %s. Did you add custom code in the package?",
+            packageElement);
+
+        TypeElement typeElement = MoreElements.asType(element);
+        ProcessorErrors.checkState(
+            Processors.hasAnnotation(typeElement, ClassNames.DEFINE_COMPONENT_CLASSES),
+            typeElement,
+            "Class, %s, must be annotated with @%s. Found: %s.",
+            typeElement,
+            ClassNames.DEFINE_COMPONENT_CLASSES.simpleName(),
+            typeElement.getAnnotationMirrors());
+
+        Optional<TypeElement> component = defineComponentClass(elements, typeElement, "component");
+        Optional<TypeElement> builder = defineComponentClass(elements, typeElement, "builder");
+        ProcessorErrors.checkState(
+            component.isPresent() || builder.isPresent(),
+            typeElement,
+            "@DefineComponentClasses missing both `component` and `builder` members.");
+
+        component.map(componentMetadatas::get).ifPresent(components::add);
+        builder.map(componentBuilderMetadatas::get).ifPresent(builders::add);
+      }
+
+      return new AutoValue_DefineComponents_AggregatedMetadata(
+          components.build(), builders.build());
+    }
+
+    private static Optional<TypeElement> defineComponentClass(
+        Elements elements, Element element, String annotationMember) {
+      AnnotationMirror mirror =
+          Processors.getAnnotationMirror(element, ClassNames.DEFINE_COMPONENT_CLASSES);
+      AnnotationValue value = getAnnotationElementAndValue(mirror, annotationMember).getValue();
+      String className = AnnotationValues.getString(value);
+
+      if (className.isEmpty()) { // The default value.
+        return Optional.empty();
+      }
+
+      TypeElement type = elements.getTypeElement(className);
+      ProcessorErrors.checkState(
+          type != null,
+          element,
+          "%s.%s(), has invalid value: `%s`.",
+          ClassNames.DEFINE_COMPONENT_CLASSES.simpleName(),
+          annotationMember,
+          className);
+
+      return Optional.of(type);
+    }
+  }
 }
diff --git a/java/dagger/hilt/processor/internal/earlyentrypoint/AggregatedEarlyEntryPointGenerator.java b/java/dagger/hilt/processor/internal/earlyentrypoint/AggregatedEarlyEntryPointGenerator.java
deleted file mode 100644
index ae34118..0000000
--- a/java/dagger/hilt/processor/internal/earlyentrypoint/AggregatedEarlyEntryPointGenerator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.earlyentrypoint;
-
-import com.squareup.javapoet.AnnotationSpec;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.Processors;
-import java.io.IOException;
-import javax.annotation.processing.ProcessingEnvironment;
-import javax.lang.model.element.TypeElement;
-
-/**
- * Generates an {@link dagger.hilt.android.internal.earlyentrypoint.AggregatedEarlyEntryPoint}
- * annotation.
- */
-final class AggregatedEarlyEntryPointGenerator {
-
-  private final ProcessingEnvironment env;
-  private final TypeElement earlyEntryPoint;
-
-  AggregatedEarlyEntryPointGenerator(TypeElement earlyEntryPoint, ProcessingEnvironment env) {
-    this.earlyEntryPoint = earlyEntryPoint;
-    this.env = env;
-  }
-
-  void generate() throws IOException {
-    Processors.generateAggregatingClass(
-        ClassNames.AGGREGATED_EARLY_ENTRY_POINT_PACKAGE,
-        AnnotationSpec.builder(ClassNames.AGGREGATED_EARLY_ENTRY_POINT)
-            .addMember("earlyEntryPoint", "$S", earlyEntryPoint.getQualifiedName())
-            .build(),
-        earlyEntryPoint,
-        getClass(),
-        env);
-  }
-}
diff --git a/java/dagger/hilt/processor/internal/earlyentrypoint/AggregatedEarlyEntryPointMetadata.java b/java/dagger/hilt/processor/internal/earlyentrypoint/AggregatedEarlyEntryPointMetadata.java
deleted file mode 100644
index ed347bd..0000000
--- a/java/dagger/hilt/processor/internal/earlyentrypoint/AggregatedEarlyEntryPointMetadata.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.earlyentrypoint;
-
-import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import dagger.hilt.processor.internal.AggregatedElements;
-import dagger.hilt.processor.internal.AnnotationValues;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.Processors;
-import javax.lang.model.element.AnnotationMirror;
-import javax.lang.model.element.AnnotationValue;
-import javax.lang.model.element.TypeElement;
-import javax.lang.model.util.Elements;
-
-/**
- * A class that represents the values stored in an {@link
- * dagger.hilt.android.internal.uninstallmodules.AggregatedUninstallModules} annotation.
- */
-@AutoValue
-public abstract class AggregatedEarlyEntryPointMetadata {
-
-  /** Returns the element annotated with {@link dagger.hilt.android.EarlyEntryPoint}. */
-  public abstract TypeElement earlyEntryPoint();
-
-  /** Returns all aggregated deps in the aggregating package. */
-  public static ImmutableSet<AggregatedEarlyEntryPointMetadata> from(Elements elements) {
-    return AggregatedElements.from(
-            ClassNames.AGGREGATED_EARLY_ENTRY_POINT_PACKAGE,
-            ClassNames.AGGREGATED_EARLY_ENTRY_POINT,
-            elements)
-        .stream()
-        .map(aggregatedElement -> create(aggregatedElement, elements))
-        .collect(toImmutableSet());
-  }
-
-  private static AggregatedEarlyEntryPointMetadata create(TypeElement element, Elements elements) {
-    AnnotationMirror annotationMirror =
-        Processors.getAnnotationMirror(element, ClassNames.AGGREGATED_EARLY_ENTRY_POINT);
-
-    ImmutableMap<String, AnnotationValue> values =
-        Processors.getAnnotationValues(elements, annotationMirror);
-
-    return new AutoValue_AggregatedEarlyEntryPointMetadata(
-        elements.getTypeElement(AnnotationValues.getString(values.get("earlyEntryPoint"))));
-  }
-}
diff --git a/java/dagger/hilt/processor/internal/earlyentrypoint/BUILD b/java/dagger/hilt/processor/internal/earlyentrypoint/BUILD
deleted file mode 100644
index 3573e86..0000000
--- a/java/dagger/hilt/processor/internal/earlyentrypoint/BUILD
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright (C) 2020 The Dagger Authors.
-#
-# 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.
-
-# Description:
-#   A processor for @dagger.hilt.android.EarlyEntryPoint.
-
-package(default_visibility = ["//:src"])
-
-java_plugin(
-    name = "processor",
-    generates_api = 1,
-    processor_class = "dagger.hilt.processor.internal.earlyentrypoint.EarlyEntryPointProcessor",
-    deps = [":processor_lib"],
-)
-
-java_library(
-    name = "processor_lib",
-    srcs = [
-        "AggregatedEarlyEntryPointGenerator.java",
-        "EarlyEntryPointProcessor.java",
-    ],
-    deps = [
-        "//java/dagger/hilt/processor/internal:base_processor",
-        "//java/dagger/hilt/processor/internal:classnames",
-        "//java/dagger/hilt/processor/internal:processors",
-        "//java/dagger/internal/guava:collect",
-        "@google_bazel_common//third_party/java/auto:service",
-        "@google_bazel_common//third_party/java/incap",
-        "@google_bazel_common//third_party/java/javapoet",
-        "@maven//:com_google_auto_auto_common",
-    ],
-)
-
-java_library(
-    name = "aggregated_early_entry_point_metadata",
-    srcs = [
-        "AggregatedEarlyEntryPointMetadata.java",
-    ],
-    deps = [
-        "//java/dagger/hilt/processor/internal:aggregated_elements",
-        "//java/dagger/hilt/processor/internal:classnames",
-        "//java/dagger/hilt/processor/internal:processors",
-        "//java/dagger/internal/codegen/extension",
-        "//java/dagger/internal/guava:collect",
-        "@google_bazel_common//third_party/java/auto:value",
-    ],
-)
-
-filegroup(
-    name = "srcs_filegroup",
-    srcs = glob(["*"]),
-)
diff --git a/java/dagger/hilt/processor/internal/earlyentrypoint/EarlyEntryPointProcessor.java b/java/dagger/hilt/processor/internal/earlyentrypoint/EarlyEntryPointProcessor.java
deleted file mode 100644
index 848fa31..0000000
--- a/java/dagger/hilt/processor/internal/earlyentrypoint/EarlyEntryPointProcessor.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.earlyentrypoint;
-
-import static com.google.auto.common.MoreElements.asType;
-import static net.ltgt.gradle.incap.IncrementalAnnotationProcessorType.ISOLATING;
-
-import com.google.auto.service.AutoService;
-import com.google.common.collect.ImmutableSet;
-import dagger.hilt.processor.internal.BaseProcessor;
-import dagger.hilt.processor.internal.ClassNames;
-import javax.annotation.processing.Processor;
-import javax.lang.model.element.Element;
-import javax.lang.model.element.TypeElement;
-import net.ltgt.gradle.incap.IncrementalAnnotationProcessor;
-
-/** Validates {@link dagger.hilt.android.EarlyEntryPoint} usages. */
-@IncrementalAnnotationProcessor(ISOLATING)
-@AutoService(Processor.class)
-public final class EarlyEntryPointProcessor extends BaseProcessor {
-
-  @Override
-  public ImmutableSet<String> getSupportedAnnotationTypes() {
-    return ImmutableSet.of(ClassNames.EARLY_ENTRY_POINT.toString());
-  }
-
-  @Override
-  public void processEach(TypeElement annotation, Element element) throws Exception {
-    new AggregatedEarlyEntryPointGenerator(asType(element), getProcessingEnv()).generate();
-  }
-}
diff --git a/java/dagger/hilt/processor/internal/root/AggregatedRootGenerator.java b/java/dagger/hilt/processor/internal/root/AggregatedRootGenerator.java
deleted file mode 100644
index 722b99b..0000000
--- a/java/dagger/hilt/processor/internal/root/AggregatedRootGenerator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.root;
-
-import com.squareup.javapoet.AnnotationSpec;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.Processors;
-import java.io.IOException;
-import javax.annotation.processing.ProcessingEnvironment;
-import javax.lang.model.element.TypeElement;
-
-/** Generates an {@link dagger.hilt.internal.aggregatedroot.AggregatedRoot}. */
-final class AggregatedRootGenerator {
-  private final TypeElement rootElement;
-  private final TypeElement rootAnnotation;
-  private final ProcessingEnvironment processingEnv;
-
-  AggregatedRootGenerator(
-      TypeElement rootElement, TypeElement rootAnnotation, ProcessingEnvironment processingEnv) {
-    this.rootElement = rootElement;
-    this.rootAnnotation = rootAnnotation;
-    this.processingEnv = processingEnv;
-  }
-
-  void generate() throws IOException {
-    Processors.generateAggregatingClass(
-        ClassNames.AGGREGATED_ROOT_PACKAGE,
-        AnnotationSpec.builder(ClassNames.AGGREGATED_ROOT)
-            .addMember("root", "$S", rootElement.getQualifiedName())
-            .addMember("rootAnnotation", "$T.class", rootAnnotation)
-            .build(),
-        rootElement,
-        getClass(),
-        processingEnv);
-  }
-}
diff --git a/java/dagger/hilt/processor/internal/root/AggregatedRootMetadata.java b/java/dagger/hilt/processor/internal/root/AggregatedRootMetadata.java
deleted file mode 100644
index 961689b..0000000
--- a/java/dagger/hilt/processor/internal/root/AggregatedRootMetadata.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.root;
-
-import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import dagger.hilt.processor.internal.AggregatedElements;
-import dagger.hilt.processor.internal.AnnotationValues;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.Processors;
-import javax.lang.model.element.AnnotationMirror;
-import javax.lang.model.element.AnnotationValue;
-import javax.lang.model.element.TypeElement;
-import javax.lang.model.util.Elements;
-
-/**
- * Represents the values stored in an {@link dagger.hilt.internal.aggregatedroot.AggregatedRoot}.
- */
-@AutoValue
-abstract class AggregatedRootMetadata {
-
-  /** Returns the element that was annotated with the root annotation. */
-  abstract TypeElement rootElement();
-
-  /** Returns the root annotation as an element. */
-  abstract TypeElement rootAnnotation();
-
-  static ImmutableSet<AggregatedRootMetadata> from(Elements elements) {
-    return AggregatedElements.from(
-            ClassNames.AGGREGATED_ROOT_PACKAGE, ClassNames.AGGREGATED_ROOT, elements)
-        .stream()
-        .map(aggregatedElement -> create(aggregatedElement, elements))
-        .collect(toImmutableSet());
-  }
-
-  private static AggregatedRootMetadata create(TypeElement element, Elements elements) {
-    AnnotationMirror annotationMirror =
-        Processors.getAnnotationMirror(element, ClassNames.AGGREGATED_ROOT);
-
-    ImmutableMap<String, AnnotationValue> values =
-        Processors.getAnnotationValues(elements, annotationMirror);
-
-    return new AutoValue_AggregatedRootMetadata(
-        elements.getTypeElement(AnnotationValues.getString(values.get("root"))),
-        AnnotationValues.getTypeElement(values.get("rootAnnotation")));
-  }
-}
diff --git a/java/dagger/hilt/processor/internal/root/BUILD b/java/dagger/hilt/processor/internal/root/BUILD
index 5ce762f..709eb7f 100644
--- a/java/dagger/hilt/processor/internal/root/BUILD
+++ b/java/dagger/hilt/processor/internal/root/BUILD
@@ -29,14 +29,11 @@
 java_library(
     name = "processor_lib",
     srcs = [
-        "AggregatedRootGenerator.java",
-        "ComponentGenerator.java",
-        "EarlySingletonComponentCreatorGenerator.java",
-        "ProcessedRootSentinelGenerator.java",
         "RootFileFormatter.java",
         "RootGenerator.java",
         "RootProcessor.java",
         "TestComponentDataGenerator.java",
+        "TestComponentDataSupplierGenerator.java",
         "TestInjectorGenerator.java",
     ],
     deps = [
@@ -44,7 +41,6 @@
         ":root_type",
         "//java/dagger/hilt/processor/internal:base_processor",
         "//java/dagger/hilt/processor/internal:classnames",
-        "//java/dagger/hilt/processor/internal:compiler_options",
         "//java/dagger/hilt/processor/internal:component_descriptor",
         "//java/dagger/hilt/processor/internal:component_names",
         "//java/dagger/hilt/processor/internal:processor_errors",
@@ -66,18 +62,13 @@
 java_library(
     name = "root_metadata",
     srcs = [
-        "AggregatedRootMetadata.java",
-        "ComponentTree.java",
-        "ProcessedRootSentinelMetadata.java",
         "Root.java",
         "RootMetadata.java",
         "TestRootMetadata.java",
     ],
     deps = [
         ":root_type",
-        "//java/dagger/hilt/processor/internal:aggregated_elements",
         "//java/dagger/hilt/processor/internal:classnames",
-        "//java/dagger/hilt/processor/internal:compiler_options",
         "//java/dagger/hilt/processor/internal:component_descriptor",
         "//java/dagger/hilt/processor/internal:kotlin",
         "//java/dagger/hilt/processor/internal:processor_errors",
@@ -88,7 +79,6 @@
         "//java/dagger/internal/codegen/kotlin",
         "//java/dagger/internal/guava:base",
         "//java/dagger/internal/guava:collect",
-        "//java/dagger/internal/guava:graph",
         "@google_bazel_common//third_party/java/auto:value",
         "@google_bazel_common//third_party/java/javapoet",
         "@maven//:com_google_auto_auto_common",
@@ -100,6 +90,7 @@
     srcs = ["RootType.java"],
     deps = [
         "//java/dagger/hilt/processor/internal:classnames",
+        "//java/dagger/hilt/processor/internal:processor_errors",
         "//java/dagger/hilt/processor/internal:processors",
         "@google_bazel_common//third_party/java/javapoet",
     ],
diff --git a/java/dagger/hilt/processor/internal/root/EarlySingletonComponentCreatorGenerator.java b/java/dagger/hilt/processor/internal/root/EarlySingletonComponentCreatorGenerator.java
deleted file mode 100644
index 1dbda39..0000000
--- a/java/dagger/hilt/processor/internal/root/EarlySingletonComponentCreatorGenerator.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.root;
-
-import com.squareup.javapoet.ClassName;
-import com.squareup.javapoet.JavaFile;
-import com.squareup.javapoet.MethodSpec;
-import com.squareup.javapoet.TypeSpec;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.Processors;
-import java.io.IOException;
-import javax.annotation.processing.ProcessingEnvironment;
-
-/** Generator for the {@code EarlySingletonComponentCreator}. */
-final class EarlySingletonComponentCreatorGenerator {
-  private static final ClassName EARLY_SINGLETON_COMPONENT_CREATOR =
-      ClassName.get("dagger.hilt.android.internal.testing", "EarlySingletonComponentCreator");
-  private static final ClassName EARLY_SINGLETON_COMPONENT_CREATOR_IMPL =
-      ClassName.get(
-          "dagger.hilt.android.internal.testing", "EarlySingletonComponentCreatorImpl");
-  private static final ClassName DEFAULT_COMPONENT_IMPL =
-      ClassName.get(
-          "dagger.hilt.android.internal.testing.root", "DaggerDefault_HiltComponents_SingletonC");
-
-  static void generate(ProcessingEnvironment env) throws IOException {
-    TypeSpec.Builder builder =
-        TypeSpec.classBuilder(EARLY_SINGLETON_COMPONENT_CREATOR_IMPL)
-            .superclass(EARLY_SINGLETON_COMPONENT_CREATOR)
-            .addMethod(
-                MethodSpec.methodBuilder("create")
-                    .returns(ClassName.OBJECT)
-                    .addStatement(
-                        "return $T.builder()\n"
-                            + ".applicationContextModule(new $T($T.getApplicationContext()))\n"
-                            + ".build()",
-                        DEFAULT_COMPONENT_IMPL,
-                        ClassNames.APPLICATION_CONTEXT_MODULE,
-                        ClassNames.APPLICATION_PROVIDER)
-                    .build());
-
-    Processors.addGeneratedAnnotation(builder, env, ClassNames.ROOT_PROCESSOR.toString());
-
-    JavaFile.builder(EARLY_SINGLETON_COMPONENT_CREATOR_IMPL.packageName(), builder.build())
-        .build()
-        .writeTo(env.getFiler());
-  }
-
-  private EarlySingletonComponentCreatorGenerator() {}
-}
diff --git a/java/dagger/hilt/processor/internal/root/ProcessedRootSentinelGenerator.java b/java/dagger/hilt/processor/internal/root/ProcessedRootSentinelGenerator.java
deleted file mode 100644
index 87efa20..0000000
--- a/java/dagger/hilt/processor/internal/root/ProcessedRootSentinelGenerator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.root;
-
-import com.squareup.javapoet.AnnotationSpec;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.Processors;
-import java.io.IOException;
-import javax.annotation.processing.ProcessingEnvironment;
-import javax.lang.model.element.TypeElement;
-
-/** Generates an {@link dagger.hilt.internal.processedrootsentinel.ProcessedRootSentinel}. */
-final class ProcessedRootSentinelGenerator {
-  private final TypeElement processedRoot;
-  private final ProcessingEnvironment processingEnv;
-
-  ProcessedRootSentinelGenerator(TypeElement processedRoot, ProcessingEnvironment processingEnv) {
-    this.processedRoot = processedRoot;
-    this.processingEnv = processingEnv;
-  }
-
-  void generate() throws IOException {
-    Processors.generateAggregatingClass(
-        ClassNames.PROCESSED_ROOT_SENTINEL_PACKAGE,
-        AnnotationSpec.builder(ClassNames.PROCESSED_ROOT_SENTINEL)
-            .addMember("roots", "$S", processedRoot.getQualifiedName())
-            .build(),
-        processedRoot,
-        getClass(),
-        processingEnv);
-  }
-}
diff --git a/java/dagger/hilt/processor/internal/root/ProcessedRootSentinelMetadata.java b/java/dagger/hilt/processor/internal/root/ProcessedRootSentinelMetadata.java
deleted file mode 100644
index d600154..0000000
--- a/java/dagger/hilt/processor/internal/root/ProcessedRootSentinelMetadata.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.root;
-
-import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import dagger.hilt.processor.internal.AggregatedElements;
-import dagger.hilt.processor.internal.AnnotationValues;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.Processors;
-import javax.lang.model.element.AnnotationMirror;
-import javax.lang.model.element.AnnotationValue;
-import javax.lang.model.element.TypeElement;
-import javax.lang.model.util.Elements;
-
-/**
- * Represents the values stored in an {@link
- * dagger.hilt.internal.processedrootsentinel.ProcessedRootSentinel}.
- */
-@AutoValue
-abstract class ProcessedRootSentinelMetadata {
-
-  /** Returns the processed root elements. */
-  abstract ImmutableSet<TypeElement> rootElements();
-
-  static ImmutableSet<ProcessedRootSentinelMetadata> from(Elements elements) {
-    return AggregatedElements.from(
-            ClassNames.PROCESSED_ROOT_SENTINEL_PACKAGE,
-            ClassNames.PROCESSED_ROOT_SENTINEL,
-            elements)
-        .stream()
-        .map(aggregatedElement -> create(aggregatedElement, elements))
-        .collect(toImmutableSet());
-  }
-
-  private static ProcessedRootSentinelMetadata create(TypeElement element, Elements elements) {
-    AnnotationMirror annotationMirror =
-        Processors.getAnnotationMirror(element, ClassNames.PROCESSED_ROOT_SENTINEL);
-
-    ImmutableMap<String, AnnotationValue> values =
-        Processors.getAnnotationValues(elements, annotationMirror);
-
-    return new AutoValue_ProcessedRootSentinelMetadata(
-        AnnotationValues.getStrings(values.get("roots")).stream()
-            .map(elements::getTypeElement)
-            .collect(toImmutableSet()));
-  }
-}
diff --git a/java/dagger/hilt/processor/internal/root/Root.java b/java/dagger/hilt/processor/internal/root/Root.java
index 24440b0..981636d 100644
--- a/java/dagger/hilt/processor/internal/root/Root.java
+++ b/java/dagger/hilt/processor/internal/root/Root.java
@@ -19,7 +19,6 @@
 import com.google.auto.common.MoreElements;
 import com.google.auto.value.AutoValue;
 import com.squareup.javapoet.ClassName;
-import dagger.hilt.processor.internal.ClassNames;
 import javax.annotation.processing.ProcessingEnvironment;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
@@ -27,37 +26,18 @@
 /** Metadata for a root element that can trigger the {@link RootProcessor}. */
 @AutoValue
 abstract class Root {
-  /**
-   * Creates the default root for this (test) build compilation.
-   *
-   * <p>A default root installs only the global {@code InstallIn} and {@code TestInstallIn}
-   * dependencies. Test-specific dependencies are not installed in the default root.
-   *
-   * <p>The default root is used for two purposes:
-   *
-   * <ul>
-   *   <li>To inject {@code EarlyEntryPoint} annotated interfaces.
-   *   <li>To inject tests that only depend on global dependencies
-   * </ul>
-   */
-  static Root createDefaultRoot(ProcessingEnvironment env) {
-    TypeElement rootElement =
-        env.getElementUtils().getTypeElement(ClassNames.DEFAULT_ROOT.canonicalName());
-    return new AutoValue_Root(rootElement, /*isTestRoot=*/ true);
-  }
-
   /** Creates a {@plainlink Root root} for the given {@plainlink Element element}. */
   static Root create(Element element, ProcessingEnvironment env) {
     TypeElement rootElement = MoreElements.asType(element);
-    return new AutoValue_Root(rootElement, RootType.of(rootElement).isTestRoot());
+    return new AutoValue_Root(RootType.of(env, rootElement), rootElement);
   }
 
+  /** Returns the type of the root {@code element}. */
+  abstract RootType type();
+
   /** Returns the root element that should be used with processing. */
   abstract TypeElement element();
 
-  /** Returns {@code true} if this is a test root. */
-  abstract boolean isTestRoot();
-
   /** Returns the class name of the root element. */
   ClassName classname() {
     return ClassName.get(element());
@@ -68,8 +48,7 @@
     return element().toString();
   }
 
-  /** Returns {@code true} if this uses the default root. */
-  boolean isDefaultRoot() {
-    return classname().equals(ClassNames.DEFAULT_ROOT);
+  boolean isTestRoot() {
+    return type().isTestRoot();
   }
 }
diff --git a/java/dagger/hilt/processor/internal/root/RootGenerator.java b/java/dagger/hilt/processor/internal/root/RootGenerator.java
index f87fbd9..c2c55e6 100644
--- a/java/dagger/hilt/processor/internal/root/RootGenerator.java
+++ b/java/dagger/hilt/processor/internal/root/RootGenerator.java
@@ -16,7 +16,6 @@
 
 package dagger.hilt.processor.internal.root;
 
-import static com.google.common.base.Preconditions.checkState;
 import static dagger.hilt.processor.internal.Processors.toClassNames;
 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
 import static javax.lang.model.element.Modifier.ABSTRACT;
@@ -36,11 +35,11 @@
 import com.squareup.javapoet.TypeSpec;
 import dagger.hilt.processor.internal.ClassNames;
 import dagger.hilt.processor.internal.ComponentDescriptor;
+import dagger.hilt.processor.internal.ComponentGenerator;
 import dagger.hilt.processor.internal.ComponentNames;
+import dagger.hilt.processor.internal.ComponentTree;
 import dagger.hilt.processor.internal.Processors;
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Optional;
 import javax.annotation.processing.ProcessingEnvironment;
 import javax.lang.model.element.Modifier;
@@ -48,27 +47,20 @@
 /** Generates components and any other classes needed for a root. */
 final class RootGenerator {
 
-  static void generate(
-      RootMetadata metadata, ComponentNames componentNames, ProcessingEnvironment env)
-      throws IOException {
+  static void generate(RootMetadata metadata, ProcessingEnvironment env) throws IOException {
     new RootGenerator(
-            RootMetadata.copyWithNewTree(metadata, filterDescriptors(metadata.componentTree())),
-            componentNames,
-            env)
-        .generateComponents();
+        RootMetadata.copyWithNewTree(
+            metadata,
+            filterDescriptors(metadata.componentTree())),
+        env).generateComponents();
   }
 
   private final RootMetadata metadata;
   private final ProcessingEnvironment env;
   private final Root root;
-  private final Map<String, Integer> simpleComponentNamesToDedupeSuffix = new HashMap<>();
-  private final Map<ComponentDescriptor, ClassName> componentNameMap = new HashMap<>();
-  private final ComponentNames componentNames;
 
-  private RootGenerator(
-      RootMetadata metadata, ComponentNames componentNames, ProcessingEnvironment env) {
+  private RootGenerator(RootMetadata metadata, ProcessingEnvironment env) {
     this.metadata = metadata;
-    this.componentNames = componentNames;
     this.env = env;
     this.root = metadata.root();
   }
@@ -76,9 +68,8 @@
   private void generateComponents() throws IOException {
 
     // TODO(bcorso): Consider moving all of this logic into ComponentGenerator?
-    ClassName componentsWrapperClassName = getComponentsWrapperClassName();
     TypeSpec.Builder componentsWrapper =
-        TypeSpec.classBuilder(componentsWrapperClassName)
+        TypeSpec.classBuilder(getComponentsWrapperClassName())
             .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
             .addMethod(MethodSpec.constructorBuilder().addModifiers(Modifier.PRIVATE).build());
 
@@ -102,6 +93,7 @@
           new ComponentGenerator(
                   env,
                   getComponentClassName(componentDescriptor),
+                  root.element(),
                   Optional.empty(),
                   modules,
                   metadata.entryPoints(componentDescriptor.component()),
@@ -109,14 +101,11 @@
                   ImmutableList.of(),
                   componentAnnotation(componentDescriptor),
                   componentBuilder(componentDescriptor))
-              .typeSpecBuilder()
-              .addModifiers(Modifier.STATIC)
-              .build());
+              .generate().toBuilder().addModifiers(Modifier.STATIC).build());
     }
 
     RootFileFormatter.write(
-        JavaFile.builder(componentsWrapperClassName.packageName(), componentsWrapper.build())
-            .build(),
+        JavaFile.builder(root.classname().packageName(), componentsWrapper.build()).build(),
         env.getFiler());
   }
 
@@ -141,7 +130,7 @@
   }
 
   private ImmutableMap<ComponentDescriptor, ClassName> subcomponentBuilderModules(
-      TypeSpec.Builder componentsWrapper) {
+      TypeSpec.Builder componentsWrapper) throws IOException {
     ImmutableMap.Builder<ComponentDescriptor, ClassName> modules = ImmutableMap.builder();
     for (ComponentDescriptor descriptor : metadata.componentTree().getComponentDescriptors()) {
       // Root component builders don't have subcomponent builder modules
@@ -162,7 +151,7 @@
   //   @Binds FooSubcomponentInterfaceBuilder bind(FooSubcomponent.Builder builder);
   // }
   private TypeSpec subcomponentBuilderModule(
-      ClassName componentName, ClassName builderName, ClassName moduleName) {
+      ClassName componentName, ClassName builderName, ClassName moduleName) throws IOException {
     TypeSpec.Builder subcomponentBuilderModule =
         TypeSpec.interfaceBuilder(moduleName)
             .addOriginatingElement(root.element())
@@ -221,38 +210,10 @@
   }
 
   private ClassName getComponentsWrapperClassName() {
-    return componentNames.generatedComponentsWrapper(root.classname());
+    return ComponentNames.generatedComponentsWrapper(root.classname());
   }
 
   private ClassName getComponentClassName(ComponentDescriptor componentDescriptor) {
-    if (componentNameMap.containsKey(componentDescriptor)) {
-      return componentNameMap.get(componentDescriptor);
-    }
-
-    // Disallow any component names with the same name as our SingletonComponent because we treat
-    // that component specially and things may break.
-    checkState(
-        componentDescriptor.component().equals(ClassNames.SINGLETON_COMPONENT)
-        || !componentDescriptor.component().simpleName().equals(
-            ClassNames.SINGLETON_COMPONENT.simpleName()),
-        "Cannot have a component with the same simple name as the reserved %s: %s",
-        ClassNames.SINGLETON_COMPONENT.simpleName(),
-        componentDescriptor.component());
-
-    ClassName generatedComponent =
-        componentNames.generatedComponent(root.classname(), componentDescriptor.component());
-
-    Integer suffix = simpleComponentNamesToDedupeSuffix.get(generatedComponent.simpleName());
-    if (suffix != null) {
-      // If an entry exists, use the suffix in the map and the replace it with the value incremented
-      generatedComponent = Processors.append(generatedComponent, String.valueOf(suffix));
-      simpleComponentNamesToDedupeSuffix.put(generatedComponent.simpleName(), suffix + 1);
-    } else {
-      // Otherwise, just add an entry for any possible future duplicates
-      simpleComponentNamesToDedupeSuffix.put(generatedComponent.simpleName(), 2);
-    }
-
-    componentNameMap.put(componentDescriptor, generatedComponent);
-    return generatedComponent;
+    return ComponentNames.generatedComponent(root.classname(), componentDescriptor.component());
   }
 }
diff --git a/java/dagger/hilt/processor/internal/root/RootMetadata.java b/java/dagger/hilt/processor/internal/root/RootMetadata.java
index b39b590..4c43f1d 100644
--- a/java/dagger/hilt/processor/internal/root/RootMetadata.java
+++ b/java/dagger/hilt/processor/internal/root/RootMetadata.java
@@ -16,22 +16,20 @@
 
 package dagger.hilt.processor.internal.root;
 
-import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.base.Suppliers.memoize;
-import static dagger.hilt.processor.internal.HiltCompilerOptions.isSharedTestComponentsEnabled;
 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
 import static javax.lang.model.element.Modifier.ABSTRACT;
 import static javax.lang.model.element.Modifier.PRIVATE;
 import static javax.lang.model.element.Modifier.STATIC;
 
 import com.google.common.base.Supplier;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSetMultimap;
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.TypeName;
 import dagger.hilt.processor.internal.ClassNames;
 import dagger.hilt.processor.internal.ComponentDescriptor;
+import dagger.hilt.processor.internal.ComponentTree;
 import dagger.hilt.processor.internal.KotlinMetadataUtils;
 import dagger.hilt.processor.internal.Processors;
 import dagger.hilt.processor.internal.aggregateddeps.ComponentDependencies;
@@ -55,42 +53,22 @@
       ComponentTree componentTree,
       ComponentDependencies deps,
       ProcessingEnvironment env) {
-    return createInternal(root, ImmutableList.of(), componentTree, deps, env);
-  }
-
-  static RootMetadata createForDefaultRoot(
-      Root root,
-      ImmutableList<RootMetadata> rootsUsingDefaultComponents,
-      ComponentTree componentTree,
-      ComponentDependencies deps,
-      ProcessingEnvironment env) {
-    checkState(root.isDefaultRoot());
-    return createInternal(root, rootsUsingDefaultComponents, componentTree, deps, env);
-  }
-
-  static RootMetadata copyWithNewTree(RootMetadata other, ComponentTree componentTree) {
-    return createInternal(
-        other.root, other.rootsUsingDefaultComponents, componentTree, other.deps, other.env);
-  }
-
-  private static RootMetadata createInternal(
-      Root root,
-      ImmutableList<RootMetadata> rootsUsingDefaultComponents,
-      ComponentTree componentTree,
-      ComponentDependencies deps,
-      ProcessingEnvironment env) {
-    RootMetadata metadata =
-        new RootMetadata(root, componentTree, deps, rootsUsingDefaultComponents, env);
+    RootMetadata metadata = new RootMetadata(root, componentTree, deps, env);
     metadata.validate();
     return metadata;
   }
 
+  static RootMetadata copyWithNewTree(
+      RootMetadata other,
+      ComponentTree componentTree) {
+    return create(other.root, componentTree, other.deps, other.env);
+  }
+
   private final Root root;
   private final ProcessingEnvironment env;
   private final Elements elements;
   private final ComponentTree componentTree;
   private final ComponentDependencies deps;
-  private final ImmutableList<RootMetadata> rootsUsingDefaultComponents;
   private final Supplier<ImmutableSetMultimap<ClassName, ClassName>> scopesByComponent =
       memoize(this::getScopesByComponentUncached);
   private final Supplier<TestRootMetadata> testRootMetadata =
@@ -100,14 +78,12 @@
       Root root,
       ComponentTree componentTree,
       ComponentDependencies deps,
-      ImmutableList<RootMetadata> rootsUsingDefaultComponents,
       ProcessingEnvironment env) {
     this.root = root;
     this.env = env;
     this.elements = env.getElementUtils();
     this.componentTree = componentTree;
     this.deps = deps;
-    this.rootsUsingDefaultComponents = rootsUsingDefaultComponents;
   }
 
   public Root root() {
@@ -126,25 +102,9 @@
     return deps.modules().get(componentName, root.classname(), root.isTestRoot());
   }
 
-  /**
-   * Returns {@code true} if this is a test root that provides no test-specific dependencies or sets
-   * other options that would prevent it from sharing components with other test roots.
-   */
-  // TODO(groakley): Allow more tests to share modules, e.g. tests that uninstall the same module.
-  // In that case, this might instead return which shared dep grouping should be used.
-  public boolean canShareTestComponents() {
-    return isSharedTestComponentsEnabled(env)
-        && root.isTestRoot()
-        && !deps.includesTestDeps(root.classname());
-  }
-
   public ImmutableSet<TypeName> entryPoints(ClassName componentName) {
     return ImmutableSet.<TypeName>builder()
         .addAll(getUserDefinedEntryPoints(componentName))
-        .add(
-            root.isTestRoot() && componentName.equals(ClassNames.SINGLETON_COMPONENT)
-                ? ClassNames.TEST_SINGLETON_COMPONENT
-                : ClassNames.GENERATED_COMPONENT)
         .add(componentName)
         .build();
   }
@@ -168,7 +128,6 @@
   }
 
   public TestRootMetadata testRootMetadata() {
-    checkState(!root.isDefaultRoot(), "The default root does not have TestRootMetadata!");
     return testRootMetadata.get();
   }
 
@@ -190,7 +149,7 @@
     for (ComponentDescriptor componentDescriptor : componentTree.getComponentDescriptors()) {
       ClassName componentName = componentDescriptor.component();
       for (TypeElement extraModule : modulesThatDaggerCannotConstruct(componentName)) {
-        if (root.isTestRoot() && !componentName.equals(ClassNames.SINGLETON_COMPONENT)) {
+        if (root.type().isTestRoot() && !componentName.equals(ClassNames.SINGLETON_COMPONENT)) {
           env.getMessager()
               .printMessage(
                   Diagnostic.Kind.ERROR,
@@ -198,7 +157,7 @@
                       + "static provision methods or have a visible, no-arg constructor. Found: "
                       + extraModule.getQualifiedName(),
                   root.element());
-        } else if (!root.isTestRoot()) {
+        } else if (!root.type().isTestRoot()) {
           env.getMessager()
               .printMessage(
                   Diagnostic.Kind.ERROR,
@@ -213,19 +172,10 @@
 
   private ImmutableSet<TypeName> getUserDefinedEntryPoints(ClassName componentName) {
     ImmutableSet.Builder<TypeName> entryPointSet = ImmutableSet.builder();
-    if (root.isDefaultRoot() && !rootsUsingDefaultComponents.isEmpty()) {
-      // Add entry points for shared component
-      rootsUsingDefaultComponents.stream()
-          .flatMap(metadata -> metadata.entryPoints(componentName).stream())
-          .forEach(entryPointSet::add);
-    } else if (root.isDefaultRoot() && componentName.equals(ClassNames.SINGLETON_COMPONENT)) {
-      // We only do this for SingletonComponent because EarlyEntryPoints can only be installed
-      // in the SingletonComponent.
-      deps.earlyEntryPoints().forEach(entryPointSet::add);
-    } else {
-      deps.entryPoints().get(componentName, root.classname(), root.isTestRoot()).stream()
-          .map(ClassName::get)
-          .forEach(entryPointSet::add);
+    entryPointSet.add(ClassNames.GENERATED_COMPONENT);
+    for (TypeElement element :
+        deps.entryPoints().get(componentName, root.classname(), root.isTestRoot())) {
+      entryPointSet.add(ClassName.get(element));
     }
     return entryPointSet.build();
   }
@@ -238,7 +188,7 @@
             .flatMap(descriptor -> descriptor.scopes().stream())
             .collect(toImmutableSet());
 
-    AliasOfs aliasOfs = AliasOfs.create(env.getElementUtils(), defineComponentScopes);
+    AliasOfs aliasOfs = new AliasOfs(env, defineComponentScopes);
 
     for (ComponentDescriptor componentDescriptor : componentTree.getComponentDescriptors()) {
       for (ClassName scope : componentDescriptor.scopes()) {
diff --git a/java/dagger/hilt/processor/internal/root/RootProcessor.java b/java/dagger/hilt/processor/internal/root/RootProcessor.java
index 1ee4446..8f8c948 100644
--- a/java/dagger/hilt/processor/internal/root/RootProcessor.java
+++ b/java/dagger/hilt/processor/internal/root/RootProcessor.java
@@ -17,11 +17,8 @@
 package dagger.hilt.processor.internal.root;
 
 import static com.google.common.base.Preconditions.checkState;
-import static dagger.hilt.processor.internal.HiltCompilerOptions.isCrossCompilationRootValidationDisabled;
-import static dagger.hilt.processor.internal.HiltCompilerOptions.isSharedTestComponentsEnabled;
 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList;
 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
-import static java.util.Comparator.comparing;
 import static javax.lang.model.element.Modifier.PUBLIC;
 import static net.ltgt.gradle.incap.IncrementalAnnotationProcessorType.AGGREGATING;
 
@@ -31,17 +28,16 @@
 import com.google.common.collect.ImmutableSet;
 import com.squareup.javapoet.ClassName;
 import dagger.hilt.processor.internal.BaseProcessor;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.ComponentDescriptor;
-import dagger.hilt.processor.internal.ComponentNames;
+import dagger.hilt.processor.internal.ComponentTree;
 import dagger.hilt.processor.internal.ProcessorErrors;
 import dagger.hilt.processor.internal.aggregateddeps.ComponentDependencies;
 import dagger.hilt.processor.internal.definecomponent.DefineComponents;
 import dagger.hilt.processor.internal.generatesrootinput.GeneratesRootInputs;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Comparator;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import javax.annotation.processing.ProcessingEnvironment;
 import javax.annotation.processing.Processor;
@@ -54,10 +50,9 @@
 @IncrementalAnnotationProcessor(AGGREGATING)
 @AutoService(Processor.class)
 public final class RootProcessor extends BaseProcessor {
-  private static final Comparator<TypeElement> QUALIFIED_NAME_COMPARATOR =
-      comparing(TypeElement::getQualifiedName, (n1, n2) -> n1.toString().compareTo(n2.toString()));
-
+  private final List<ClassName> rootNames = new ArrayList<>();
   private final Set<ClassName> processed = new HashSet<>();
+  private boolean isTestEnv;
   // TODO(bcorso): Consider using a Dagger component to create/scope these objects
   private final DefineComponents defineComponents = DefineComponents.create();
   private GeneratesRootInputs generatesRootInputs;
@@ -81,13 +76,25 @@
   @Override
   public void processEach(TypeElement annotation, Element element) throws Exception {
     TypeElement rootElement = MoreElements.asType(element);
-    RootType rootType = RootType.of(rootElement);
-    if (rootType.isTestRoot()) {
+    boolean isTestRoot = RootType.of(getProcessingEnv(), rootElement).isTestRoot();
+    checkState(
+        rootNames.isEmpty() || isTestEnv == isTestRoot,
+        "Cannot mix test roots with non-test roots:"
+            + "\n\tNon-Test Roots: %s"
+            + "\n\tTest Roots: %s",
+        isTestRoot ? rootNames : rootElement,
+        isTestRoot ? rootElement : rootNames);
+    isTestEnv = isTestRoot;
+
+    rootNames.add(ClassName.get(rootElement));
+    if (isTestEnv) {
       new TestInjectorGenerator(
-              getProcessingEnv(), TestRootMetadata.of(getProcessingEnv(), rootElement))
-          .generate();
+          getProcessingEnv(),
+          TestRootMetadata.of(getProcessingEnv(), rootElement)).generate();
+    } else {
+      ProcessorErrors.checkState(
+          rootNames.size() <= 1, element, "More than one root found: %s", rootNames);
     }
-    new AggregatedRootGenerator(rootElement, annotation, getProcessingEnv()).generate();
   }
 
   @Override
@@ -107,22 +114,14 @@
       return;
     }
 
-    ImmutableSet<Root> allRoots =
-        AggregatedRootMetadata.from(getElementUtils()).stream()
-            .map(metadata -> Root.create(metadata.rootElement(), getProcessingEnv()))
-            .collect(toImmutableSet());
-
-    ImmutableSet<Root> processedRoots =
-        ProcessedRootSentinelMetadata.from(getElementUtils()).stream()
-            .flatMap(metadata -> metadata.rootElements().stream())
+    ImmutableList<Root> rootsToProcess =
+        rootNames.stream()
+            .filter(rootName -> !processed.contains(rootName))
+            // We create a new root element each round to avoid the jdk8 bug where
+            // TypeElement.equals does not work for elements across processing rounds.
+            .map(rootName -> getElementUtils().getTypeElement(rootName.toString()))
             .map(rootElement -> Root.create(rootElement, getProcessingEnv()))
-            .collect(toImmutableSet());
-
-    ImmutableSet<Root> rootsToProcess =
-        allRoots.stream()
-            .filter(root -> !processedRoots.contains(root))
-            .filter(root -> !processed.contains(rootName(root)))
-            .collect(toImmutableSet());
+            .collect(toImmutableList());
 
     if (rootsToProcess.isEmpty()) {
       // Skip further processing since there's no roots that need processing.
@@ -133,163 +132,40 @@
     // all roots. We should consider if it's worth trying to continue processing for other
     // roots. At the moment, I think it's rare that if one root failed the others would not.
     try {
-      validateRoots(allRoots, rootsToProcess);
-
-      boolean isTestEnv = rootsToProcess.stream().anyMatch(Root::isTestRoot);
-      ComponentNames componentNames =
-          isTestEnv && isSharedTestComponentsEnabled(getProcessingEnv())
-              ? ComponentNames.withRenamingIntoPackage(
-                  ClassNames.DEFAULT_ROOT.packageName(),
-                  rootsToProcess.stream().map(Root::element).collect(toImmutableList()))
-              : ComponentNames.withoutRenaming();
-
-      ImmutableSet<ComponentDescriptor> componentDescriptors =
-          defineComponents.getComponentDescriptors(getElementUtils());
-      ComponentTree tree = ComponentTree.from(componentDescriptors);
-      ComponentDependencies deps =
-          ComponentDependencies.from(componentDescriptors, getElementUtils());
+      ComponentTree tree = defineComponents.getComponentTree(getElementUtils());
+      ComponentDependencies deps = ComponentDependencies.from(
+          tree.getComponentDescriptors(), getElementUtils());
       ImmutableList<RootMetadata> rootMetadatas =
           rootsToProcess.stream()
               .map(root -> RootMetadata.create(root, tree, deps, getProcessingEnv()))
               .collect(toImmutableList());
 
       for (RootMetadata rootMetadata : rootMetadatas) {
-        if (!rootMetadata.canShareTestComponents()) {
-          generateComponents(rootMetadata, componentNames);
-        }
+        setProcessingState(rootMetadata.root());
+        generateComponents(rootMetadata);
       }
 
       if (isTestEnv) {
-        ImmutableList<RootMetadata> rootsThatCanShareComponents =
-            rootMetadatas.stream()
-                .filter(RootMetadata::canShareTestComponents)
-                .collect(toImmutableList());
-        generateTestComponentData(rootMetadatas, componentNames);
-        if (deps.hasEarlyEntryPoints() || !rootsThatCanShareComponents.isEmpty()) {
-          Root defaultRoot = Root.createDefaultRoot(getProcessingEnv());
-          generateComponents(
-              RootMetadata.createForDefaultRoot(
-                  defaultRoot, rootsThatCanShareComponents, tree, deps, getProcessingEnv()),
-              componentNames);
-          EarlySingletonComponentCreatorGenerator.generate(getProcessingEnv());
-        }
+        generateTestComponentData(rootMetadatas);
       }
     } catch (Exception e) {
       for (Root root : rootsToProcess) {
-        processed.add(rootName(root));
+        processed.add(root.classname());
       }
       throw e;
-    } finally {
-      rootsToProcess.forEach(this::setProcessingState);
-      // Calculate the roots processed in this round. We do this in the finally-block rather than in
-      // the try-block because the catch-block can change the processing state.
-      ImmutableSet<Root> rootsProcessedInRound =
-          rootsToProcess.stream()
-              // Only add a sentinel for processed roots. Skip preprocessed roots since those will
-              // will be processed in the next round.
-              .filter(root -> processed.contains(rootName(root)))
-              .collect(toImmutableSet());
-      for (Root root : rootsProcessedInRound) {
-        new ProcessedRootSentinelGenerator(rootElement(root), getProcessingEnv()).generate();
-      }
-    }
-  }
-
-  private void validateRoots(ImmutableSet<Root> allRoots, ImmutableSet<Root> rootsToProcess) {
-
-    ImmutableSet<TypeElement> rootElementsToProcess =
-        rootsToProcess.stream()
-            .map(Root::element)
-            .sorted(QUALIFIED_NAME_COMPARATOR)
-            .collect(toImmutableSet());
-
-    ImmutableSet<TypeElement> appRootElementsToProcess =
-        rootsToProcess.stream()
-            .filter(root -> !root.isTestRoot())
-            .map(Root::element)
-            .sorted(QUALIFIED_NAME_COMPARATOR)
-            .collect(toImmutableSet());
-
-    // Perform validation between roots in this compilation unit.
-    if (!appRootElementsToProcess.isEmpty()) {
-      ImmutableSet<TypeElement> testRootElementsToProcess =
-          rootsToProcess.stream()
-              .filter(Root::isTestRoot)
-              .map(Root::element)
-              .sorted(QUALIFIED_NAME_COMPARATOR)
-              .collect(toImmutableSet());
-
-      ProcessorErrors.checkState(
-          testRootElementsToProcess.isEmpty(),
-          "Cannot process test roots and app roots in the same compilation unit:"
-              + "\n\tApp root in this compilation unit: %s"
-              + "\n\tTest roots in this compilation unit: %s",
-          appRootElementsToProcess,
-          testRootElementsToProcess);
-
-      ProcessorErrors.checkState(
-          appRootElementsToProcess.size() == 1,
-          "Cannot process multiple app roots in the same compilation unit: %s",
-          appRootElementsToProcess);
-    }
-
-    // Perform validation across roots previous compilation units.
-    if (!isCrossCompilationRootValidationDisabled(rootElementsToProcess, getProcessingEnv())) {
-      ImmutableSet<TypeElement> processedTestRootElements =
-          allRoots.stream()
-              .filter(Root::isTestRoot)
-              .filter(root -> !rootsToProcess.contains(root))
-              .map(Root::element)
-              .sorted(QUALIFIED_NAME_COMPARATOR)
-              .collect(toImmutableSet());
-
-      // TODO(b/185742783): Add an explanation or link to docs to explain why we're forbidding this.
-      ProcessorErrors.checkState(
-          processedTestRootElements.isEmpty(),
-          "Cannot process new roots when there are test roots from a previous compilation unit:"
-              + "\n\tTest roots from previous compilation unit: %s"
-              + "\n\tAll roots from this compilation unit: %s",
-          processedTestRootElements,
-          rootElementsToProcess);
-
-      ImmutableSet<TypeElement> processedAppRootElements =
-          allRoots.stream()
-              .filter(root -> !root.isTestRoot())
-              .filter(root -> !rootsToProcess.contains(root))
-              .map(Root::element)
-              .sorted(QUALIFIED_NAME_COMPARATOR)
-              .collect(toImmutableSet());
-
-      ProcessorErrors.checkState(
-          processedAppRootElements.isEmpty() || appRootElementsToProcess.isEmpty(),
-          "Cannot process app roots in this compilation unit since there are app roots in a "
-              + "previous compilation unit:"
-              + "\n\tApp roots in previous compilation unit: %s"
-              + "\n\tApp roots in this compilation unit: %s",
-          processedAppRootElements,
-          appRootElementsToProcess);
     }
   }
 
   private void setProcessingState(Root root) {
-    processed.add(rootName(root));
+    processed.add(root.classname());
   }
 
-  private ClassName rootName(Root root) {
-    return ClassName.get(rootElement(root));
+  private void generateComponents(RootMetadata rootMetadata) throws IOException {
+    RootGenerator.generate(rootMetadata, getProcessingEnv());
   }
 
-  private TypeElement rootElement(Root root) {
-    return root.element();
-  }
-
-  private void generateComponents(RootMetadata rootMetadata, ComponentNames componentNames)
+  private void generateTestComponentData(ImmutableList<RootMetadata> rootMetadatas)
       throws IOException {
-    RootGenerator.generate(rootMetadata, componentNames, getProcessingEnv());
-  }
-
-  private void generateTestComponentData(
-      ImmutableList<RootMetadata> rootMetadatas, ComponentNames componentNames) throws IOException {
     for (RootMetadata rootMetadata : rootMetadatas) {
       // TODO(bcorso): Consider moving this check earlier into processEach.
       TypeElement testElement = rootMetadata.testRootMetadata().testElement();
@@ -298,7 +174,8 @@
           testElement,
           "Hilt tests must be public, but found: %s",
           testElement);
-      new TestComponentDataGenerator(getProcessingEnv(), rootMetadata, componentNames).generate();
+      new TestComponentDataGenerator(getProcessingEnv(), rootMetadata).generate();
     }
+    new TestComponentDataSupplierGenerator(getProcessingEnv(), rootMetadatas).generate();
   }
 }
diff --git a/java/dagger/hilt/processor/internal/root/RootType.java b/java/dagger/hilt/processor/internal/root/RootType.java
index 807f71d..3545231 100644
--- a/java/dagger/hilt/processor/internal/root/RootType.java
+++ b/java/dagger/hilt/processor/internal/root/RootType.java
@@ -19,6 +19,7 @@
 import com.squareup.javapoet.ClassName;
 import dagger.hilt.processor.internal.ClassNames;
 import dagger.hilt.processor.internal.Processors;
+import javax.annotation.processing.ProcessingEnvironment;
 import javax.lang.model.element.TypeElement;
 
 /** The valid root types for Hilt applications. */
@@ -46,7 +47,7 @@
     return annotation;
   }
 
-  public static RootType of(TypeElement element) {
+  public static RootType of(ProcessingEnvironment env, TypeElement element) {
     if (Processors.hasAnnotation(element, ClassNames.HILT_ANDROID_APP)) {
       return ROOT;
     } else if (Processors.hasAnnotation(element, ClassNames.HILT_ANDROID_TEST)) {
diff --git a/java/dagger/hilt/processor/internal/root/TestComponentDataGenerator.java b/java/dagger/hilt/processor/internal/root/TestComponentDataGenerator.java
index 101c124..284f8cd 100644
--- a/java/dagger/hilt/processor/internal/root/TestComponentDataGenerator.java
+++ b/java/dagger/hilt/processor/internal/root/TestComponentDataGenerator.java
@@ -20,7 +20,6 @@
 import static java.util.stream.Collectors.joining;
 import static javax.lang.model.element.Modifier.FINAL;
 import static javax.lang.model.element.Modifier.PRIVATE;
-import static javax.lang.model.element.Modifier.PROTECTED;
 import static javax.lang.model.element.Modifier.PUBLIC;
 import static javax.lang.model.element.Modifier.STATIC;
 import static javax.lang.model.util.ElementFilter.constructorsIn;
@@ -46,28 +45,24 @@
   private final ProcessingEnvironment processingEnv;
   private final RootMetadata rootMetadata;
   private final ClassName name;
-  private final ComponentNames componentNames;
 
   public TestComponentDataGenerator(
       ProcessingEnvironment processingEnv,
-      RootMetadata rootMetadata,
-      ComponentNames componentNames) {
+      RootMetadata rootMetadata) {
     this.processingEnv = processingEnv;
     this.rootMetadata = rootMetadata;
-    this.componentNames = componentNames;
     this.name =
         Processors.append(
             Processors.getEnclosedClassName(rootMetadata.testRootMetadata().testName()),
-            "_TestComponentDataSupplier");
+            "_ComponentDataHolder");
   }
 
   /**
    *
    *
    * <pre><code>{@code
-   * public final class FooTest_TestComponentDataSupplier extends TestComponentDataSupplier {
-   *   @Override
-   *   protected TestComponentData get() {
+   * public final class FooTest_ComponentDataHolder {
+   *   public static TestComponentData get() {
    *     return new TestComponentData(
    *         false, // waitForBindValue
    *         testInstance -> injectInternal(($1T) testInstance),
@@ -88,15 +83,15 @@
   public void generate() throws IOException {
     TypeSpec.Builder generator =
         TypeSpec.classBuilder(name)
-            .superclass(ClassNames.TEST_COMPONENT_DATA_SUPPLIER)
             .addModifiers(PUBLIC, FINAL)
+            .addMethod(MethodSpec.constructorBuilder().addModifiers(PRIVATE).build())
             .addMethod(getMethod())
             .addMethod(getTestInjectInternalMethod());
 
     Processors.addGeneratedAnnotation(
         generator, processingEnv, ClassNames.ROOT_PROCESSOR.toString());
 
-    JavaFile.builder(name.packageName(), generator.build())
+    JavaFile.builder(rootMetadata.testRootMetadata().testName().packageName(), generator.build())
         .build()
         .writeTo(processingEnv.getFiler());
   }
@@ -104,11 +99,8 @@
   private MethodSpec getMethod() {
     TypeElement testElement = rootMetadata.testRootMetadata().testElement();
     ClassName component =
-        componentNames.generatedComponent(
-            rootMetadata.canShareTestComponents()
-                ? ClassNames.DEFAULT_ROOT
-                : ClassName.get(testElement),
-            ClassNames.SINGLETON_COMPONENT);
+        ComponentNames.generatedComponent(
+            ClassName.get(testElement), ClassNames.SINGLETON_COMPONENT);
     ImmutableSet<TypeElement> daggerRequiredModules =
         rootMetadata.modulesThatDaggerCannotConstruct(ClassNames.SINGLETON_COMPONENT);
     ImmutableSet<TypeElement> hiltRequiredModules =
@@ -117,7 +109,7 @@
             .collect(toImmutableSet());
 
     return MethodSpec.methodBuilder("get")
-        .addModifiers(PROTECTED)
+        .addModifiers(PUBLIC, STATIC)
         .returns(ClassNames.TEST_COMPONENT_DATA)
         .addStatement(
             "return new $T($L, $L, $L, $L, $L)",
@@ -210,14 +202,14 @@
             AnnotationSpec.builder(SuppressWarnings.class)
                 .addMember("value", "$S", "unchecked")
                 .build())
-        .addStatement(callInjectTest(testElement))
+        .addStatement("$L.injectTest(testInstance)", getInjector(testElement))
         .build();
   }
 
-  private CodeBlock callInjectTest(TypeElement testElement) {
+  private static CodeBlock getInjector(TypeElement testElement) {
     return CodeBlock.of(
-        "(($T) (($T) $T.getApplicationContext()).generatedComponent()).injectTest(testInstance)",
-        rootMetadata.testRootMetadata().testInjectorName(),
+        "(($T) (($T) $T.getApplicationContext()).generatedComponent())",
+        ClassNames.TEST_INJECTOR,
         ClassNames.GENERATED_COMPONENT_MANAGER,
         ClassNames.APPLICATION_PROVIDER);
   }
diff --git a/java/dagger/hilt/processor/internal/root/TestComponentDataSupplierGenerator.java b/java/dagger/hilt/processor/internal/root/TestComponentDataSupplierGenerator.java
new file mode 100644
index 0000000..e5a83b6
--- /dev/null
+++ b/java/dagger/hilt/processor/internal/root/TestComponentDataSupplierGenerator.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2020 The Dagger Authors.
+ *
+ * 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 dagger.hilt.processor.internal.root;
+
+import static javax.lang.model.element.Modifier.FINAL;
+import static javax.lang.model.element.Modifier.PRIVATE;
+import static javax.lang.model.element.Modifier.PROTECTED;
+import static javax.lang.model.element.Modifier.PUBLIC;
+
+import com.google.common.collect.ImmutableList;
+import com.squareup.javapoet.ClassName;
+import com.squareup.javapoet.FieldSpec;
+import com.squareup.javapoet.JavaFile;
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.ParameterizedTypeName;
+import com.squareup.javapoet.TypeName;
+import com.squareup.javapoet.TypeSpec;
+import com.squareup.javapoet.WildcardTypeName;
+import dagger.hilt.processor.internal.ClassNames;
+import dagger.hilt.processor.internal.Processors;
+import java.io.IOException;
+import javax.annotation.processing.ProcessingEnvironment;
+
+/** Generates an implementation of {@link dagger.hilt.android.internal.TestComponentDataSupplier} */
+public final class TestComponentDataSupplierGenerator {
+  private static final ClassName TEST_COMPONENT_DATA_SUPPLIER_IMPL =
+      ClassName.get("dagger.hilt.android.internal.testing", "TestComponentDataSupplierImpl");
+  private static final ParameterizedTypeName CLASS_TYPE =
+      ParameterizedTypeName.get(ClassNames.CLASS, WildcardTypeName.subtypeOf(TypeName.OBJECT));
+  private static final ParameterizedTypeName TEST_COMPONENT_DATA_MAP_TYPE =
+      ParameterizedTypeName.get(ClassNames.MAP, CLASS_TYPE, ClassNames.TEST_COMPONENT_DATA);
+
+  private final ProcessingEnvironment processingEnv;
+  private final ImmutableList<RootMetadata> rootMetadatas;
+
+  public TestComponentDataSupplierGenerator(
+      ProcessingEnvironment processingEnv,
+      ImmutableList<RootMetadata> rootMetadatas) {
+    this.processingEnv = processingEnv;
+    this.rootMetadatas = rootMetadatas;
+  }
+
+  /**
+   * <pre><code>{@code
+   * public final class TestComponentDataSupplierImpl extends TestComponentDataSupplier {
+   *   private final Map<Class<?>, TestComponentData> testComponentDataMap = new HashMap<>();
+   *
+   *   protected TestComponentDataSupplierImpl() {
+   *     testComponentDataMap.put(FooTest.class, new FooTest_ComponentData());
+   *     testComponentDataMap.put(BarTest.class, new BarTest_ComponentData());
+   *     ...
+   *   }
+   *
+   *   @Override
+   *   protected Map<Class<?>, TestComponentData> get() {
+   *     return testComponentDataMap;
+   *   }
+   * }
+   * }</code></pre>
+   */
+  public void generate() throws IOException {
+    TypeSpec.Builder generator =
+        TypeSpec.classBuilder(TEST_COMPONENT_DATA_SUPPLIER_IMPL)
+            .addModifiers(PUBLIC, FINAL)
+            .superclass(ClassNames.TEST_COMPONENT_DATA_SUPPLIER)
+            .addField(
+                FieldSpec.builder(
+                        TEST_COMPONENT_DATA_MAP_TYPE, "testComponentDataMap", PRIVATE, FINAL)
+                    .initializer("new $T<>($L)", ClassNames.HASH_MAP, rootMetadatas.size())
+                    .build())
+            .addMethod(constructor())
+            .addMethod(getMethod());
+
+    Processors.addGeneratedAnnotation(
+        generator, processingEnv, ClassNames.ROOT_PROCESSOR.toString());
+
+    JavaFile.builder(TEST_COMPONENT_DATA_SUPPLIER_IMPL.packageName(), generator.build())
+        .build()
+        .writeTo(processingEnv.getFiler());
+  }
+
+
+  private MethodSpec constructor() {
+    MethodSpec.Builder constructor = MethodSpec.constructorBuilder();
+    for (RootMetadata rootMetadata : rootMetadatas) {
+      ClassName testName = rootMetadata.testRootMetadata().testName();
+      ClassName testComponentDataHolderName =
+          Processors.append(Processors.getEnclosedClassName(testName), "_ComponentDataHolder");
+      constructor.addStatement(
+          "testComponentDataMap.put($T.class, $T.get())",
+          testName,
+          testComponentDataHolderName);
+    }
+    return constructor.build();
+  }
+
+  private MethodSpec getMethod() {
+    return MethodSpec.methodBuilder("get")
+        .addAnnotation(Override.class)
+        .addModifiers(PROTECTED)
+        .returns(TEST_COMPONENT_DATA_MAP_TYPE)
+        .addStatement("return testComponentDataMap")
+        .build();
+  }
+}
diff --git a/java/dagger/hilt/processor/internal/root/TestInjectorGenerator.java b/java/dagger/hilt/processor/internal/root/TestInjectorGenerator.java
index b7200e7..fc97fed 100644
--- a/java/dagger/hilt/processor/internal/root/TestInjectorGenerator.java
+++ b/java/dagger/hilt/processor/internal/root/TestInjectorGenerator.java
@@ -20,6 +20,7 @@
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.JavaFile;
 import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.ParameterizedTypeName;
 import com.squareup.javapoet.TypeSpec;
 import dagger.hilt.processor.internal.ClassNames;
 import dagger.hilt.processor.internal.Processors;
@@ -40,9 +41,7 @@
 
   // @GeneratedEntryPoint
   // @InstallIn(SingletonComponent.class)
-  // public interface FooTest_GeneratedInjector {
-  //   void injectTest(FooTest fooTest);
-  // }
+  // public interface FooTest_GeneratedInjector extends TestInjector<FooTest> {}
   public void generate() throws IOException {
     TypeSpec.Builder builder =
         TypeSpec.interfaceBuilder(metadata.testInjectorName())
@@ -54,8 +53,11 @@
                     .addMember("value", "$T.class", installInComponent(metadata.testElement()))
                     .build())
             .addModifiers(Modifier.PUBLIC)
+            .addSuperinterface(
+                ParameterizedTypeName.get(ClassNames.TEST_INJECTOR, metadata.testName()))
             .addMethod(
                 MethodSpec.methodBuilder("injectTest")
+                    .addAnnotation(Override.class)
                     .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)
                     .addParameter(
                         metadata.testName(),
diff --git a/java/dagger/hilt/processor/internal/uninstallmodules/AggregatedUninstallModulesGenerator.java b/java/dagger/hilt/processor/internal/uninstallmodules/AggregatedUninstallModulesGenerator.java
deleted file mode 100644
index 654a690..0000000
--- a/java/dagger/hilt/processor/internal/uninstallmodules/AggregatedUninstallModulesGenerator.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.uninstallmodules;
-
-import com.google.common.collect.ImmutableList;
-import com.squareup.javapoet.AnnotationSpec;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.Processors;
-import java.io.IOException;
-import javax.annotation.processing.ProcessingEnvironment;
-import javax.lang.model.element.TypeElement;
-
-/**
- * Generates an {@link dagger.hilt.android.internal.uninstallmodules.AggregatedUninstallModules}
- * annotation.
- */
-final class AggregatedUninstallModulesGenerator {
-
-  private final ProcessingEnvironment env;
-  private final TypeElement testElement;
-  private final ImmutableList<TypeElement> uninstallModuleElements;
-
-  AggregatedUninstallModulesGenerator(
-      TypeElement testElement,
-      ImmutableList<TypeElement> uninstallModuleElements,
-      ProcessingEnvironment env) {
-    this.testElement = testElement;
-    this.uninstallModuleElements = uninstallModuleElements;
-    this.env = env;
-  }
-
-  void generate() throws IOException {
-    Processors.generateAggregatingClass(
-        ClassNames.AGGREGATED_UNINSTALL_MODULES_PACKAGE,
-        aggregatedUninstallModulesAnnotation(),
-        testElement,
-        getClass(),
-        env);
-  }
-
-  private AnnotationSpec aggregatedUninstallModulesAnnotation() {
-    AnnotationSpec.Builder builder =
-        AnnotationSpec.builder(ClassNames.AGGREGATED_UNINSTALL_MODULES);
-    builder.addMember("test", "$S", testElement.getQualifiedName());
-    uninstallModuleElements.stream()
-        .map(TypeElement::getQualifiedName)
-        .forEach(uninstallModule -> builder.addMember("uninstallModules", "$S", uninstallModule));
-    return builder.build();
-  }
-}
diff --git a/java/dagger/hilt/processor/internal/uninstallmodules/AggregatedUninstallModulesMetadata.java b/java/dagger/hilt/processor/internal/uninstallmodules/AggregatedUninstallModulesMetadata.java
deleted file mode 100644
index eee7849..0000000
--- a/java/dagger/hilt/processor/internal/uninstallmodules/AggregatedUninstallModulesMetadata.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.uninstallmodules;
-
-import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList;
-import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import dagger.hilt.processor.internal.AggregatedElements;
-import dagger.hilt.processor.internal.AnnotationValues;
-import dagger.hilt.processor.internal.ClassNames;
-import dagger.hilt.processor.internal.Processors;
-import javax.lang.model.element.AnnotationMirror;
-import javax.lang.model.element.AnnotationValue;
-import javax.lang.model.element.TypeElement;
-import javax.lang.model.util.Elements;
-
-/**
- * A class that represents the values stored in an
- * {@link dagger.hilt.android.internal.uninstallmodules.AggregatedUninstallModules} annotation.
- */
-@AutoValue
-public abstract class AggregatedUninstallModulesMetadata {
-
-  /** Returns the test annotated with {@link dagger.hilt.android.testing.UninstallModules}. */
-  public abstract TypeElement testElement();
-
-  /**
-   * Returns the list of uninstall modules in {@link dagger.hilt.android.testing.UninstallModules}.
-   */
-  public abstract ImmutableList<TypeElement> uninstallModuleElements();
-
-  /** Returns all aggregated deps in the aggregating package mapped by the top-level element. */
-  public static ImmutableSet<AggregatedUninstallModulesMetadata> from(Elements elements) {
-    return AggregatedElements.from(
-            ClassNames.AGGREGATED_UNINSTALL_MODULES_PACKAGE,
-            ClassNames.AGGREGATED_UNINSTALL_MODULES,
-            elements)
-        .stream()
-        .map(aggregatedElement -> create(aggregatedElement, elements))
-        .collect(toImmutableSet());
-  }
-
-  private static AggregatedUninstallModulesMetadata create(TypeElement element, Elements elements) {
-    AnnotationMirror annotationMirror =
-        Processors.getAnnotationMirror(element, ClassNames.AGGREGATED_UNINSTALL_MODULES);
-
-    ImmutableMap<String, AnnotationValue> values =
-        Processors.getAnnotationValues(elements, annotationMirror);
-
-    return new AutoValue_AggregatedUninstallModulesMetadata(
-        elements.getTypeElement(AnnotationValues.getString(values.get("test"))),
-        AnnotationValues.getAnnotationValues(values.get("uninstallModules")).stream()
-            .map(AnnotationValues::getString)
-            .map(elements::getTypeElement)
-            .collect(toImmutableList()));
-  }
-}
diff --git a/java/dagger/hilt/proguard-rules.pro b/java/dagger/hilt/proguard-rules.pro
deleted file mode 100644
index 3b953df..0000000
--- a/java/dagger/hilt/proguard-rules.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-# Keep for the reflective cast done in EntryPoints.
-# See b/183070411#comment4 for more info.
--keep,allowobfuscation,allowshrinking @dagger.hilt.EntryPoint class *
\ No newline at end of file
diff --git a/java/dagger/internal/DaggerGenerated.java b/java/dagger/internal/DaggerGenerated.java
deleted file mode 100644
index 6a872e0..0000000
--- a/java/dagger/internal/DaggerGenerated.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.internal;
-
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.CLASS;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/** Annotates the top-level class of each Dagger generated source file. */
-@Documented
-@Retention(CLASS)
-@Target(TYPE)
-public @interface DaggerGenerated {}
diff --git a/java/dagger/internal/codegen/AssistedFactoryProcessingStep.java b/java/dagger/internal/codegen/AssistedFactoryProcessingStep.java
index dbd2b33..abc0436 100644
--- a/java/dagger/internal/codegen/AssistedFactoryProcessingStep.java
+++ b/java/dagger/internal/codegen/AssistedFactoryProcessingStep.java
@@ -34,7 +34,6 @@
 import static javax.lang.model.element.Modifier.STATIC;
 
 import com.google.auto.common.MoreElements;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.CodeBlock;
@@ -138,7 +137,7 @@
       }
 
       ImmutableSet<ExecutableElement> abstractFactoryMethods =
-          AssistedInjectionAnnotations.assistedFactoryMethods(factory, elements);
+          AssistedInjectionAnnotations.assistedFactoryMethods(factory, elements, types);
 
       if (abstractFactoryMethods.isEmpty()) {
         report.addError(
@@ -227,6 +226,11 @@
     }
 
     @Override
+    public ClassName nameGeneratedType(ProvisionBinding binding) {
+      return generatedClassNameForBinding(binding);
+    }
+
+    @Override
     public Element originatingElement(ProvisionBinding binding) {
       return binding.bindingElement().get();
     }
@@ -264,10 +268,10 @@
     //   }
     // }
     @Override
-    public ImmutableList<TypeSpec.Builder> topLevelTypes(ProvisionBinding binding) {
+    public Optional<TypeSpec.Builder> write(ProvisionBinding binding) {
       TypeElement factory = asType(binding.bindingElement().get());
 
-      ClassName name = generatedClassNameForBinding(binding);
+      ClassName name = nameGeneratedType(binding);
       TypeSpec.Builder builder =
           TypeSpec.classBuilder(name)
               .addModifiers(PUBLIC, FINAL)
@@ -329,7 +333,7 @@
                       name,
                       delegateFactoryParam)
                   .build());
-      return ImmutableList.of(builder);
+      return Optional.of(builder);
     }
 
     /** Returns the generated factory {@link TypeName type} for an @AssistedInject constructor. */
diff --git a/java/dagger/internal/codegen/AssistedInjectProcessingStep.java b/java/dagger/internal/codegen/AssistedInjectProcessingStep.java
index 167c4ae..4f2f5b7 100644
--- a/java/dagger/internal/codegen/AssistedInjectProcessingStep.java
+++ b/java/dagger/internal/codegen/AssistedInjectProcessingStep.java
@@ -76,10 +76,7 @@
       for (AssistedParameter assistedParameter : assistedParameters) {
         if (!uniqueAssistedParameters.add(assistedParameter)) {
           report.addError(
-              String.format("@AssistedInject constructor has duplicate @Assisted type: %s. "
-                  + "Consider setting an identifier on the parameter by using "
-                  + "@Assisted(\"identifier\") in both the factory and @AssistedInject constructor",
-                  assistedParameter),
+              "@AssistedInject constructor has duplicate @Assisted type: " + assistedParameter,
               assistedParameter.variableElement());
         }
       }
diff --git a/java/dagger/internal/codegen/AssistedProcessingStep.java b/java/dagger/internal/codegen/AssistedProcessingStep.java
index 12a0d34..3173987 100644
--- a/java/dagger/internal/codegen/AssistedProcessingStep.java
+++ b/java/dagger/internal/codegen/AssistedProcessingStep.java
@@ -27,6 +27,7 @@
 import dagger.internal.codegen.binding.InjectionAnnotations;
 import dagger.internal.codegen.kotlin.KotlinMetadataUtil;
 import dagger.internal.codegen.langmodel.DaggerElements;
+import dagger.internal.codegen.langmodel.DaggerTypes;
 import dagger.internal.codegen.validation.TypeCheckingProcessingStep;
 import dagger.internal.codegen.validation.ValidationReport;
 import java.lang.annotation.Annotation;
@@ -46,6 +47,7 @@
   private final KotlinMetadataUtil kotlinMetadataUtil;
   private final InjectionAnnotations injectionAnnotations;
   private final DaggerElements elements;
+  private final DaggerTypes types;
   private final Messager messager;
 
   @Inject
@@ -53,11 +55,13 @@
       KotlinMetadataUtil kotlinMetadataUtil,
       InjectionAnnotations injectionAnnotations,
       DaggerElements elements,
+      DaggerTypes types,
       Messager messager) {
     super(MoreElements::asVariable);
     this.kotlinMetadataUtil = kotlinMetadataUtil;
     this.injectionAnnotations = injectionAnnotations;
     this.elements = elements;
+    this.types = types;
     this.messager = messager;
   }
 
@@ -109,7 +113,7 @@
       TypeElement enclosingElement = closestEnclosingTypeElement(element);
       return AssistedInjectionAnnotations.isAssistedFactoryType(enclosingElement)
           // This assumes we've already validated AssistedFactory and that a valid method exists.
-          && AssistedInjectionAnnotations.assistedFactoryMethod(enclosingElement, elements)
+          && AssistedInjectionAnnotations.assistedFactoryMethod(enclosingElement, elements, types)
               .equals(element);
     }
     return false;
diff --git a/java/dagger/internal/codegen/BUILD b/java/dagger/internal/codegen/BUILD
index e2f74e9..be970be 100644
--- a/java/dagger/internal/codegen/BUILD
+++ b/java/dagger/internal/codegen/BUILD
@@ -127,8 +127,6 @@
         "genclass=${package}.Dagger${outerclasses}${classname}",
         "annotation=dagger.producers.ProductionComponent;" +
         "genclass=${package}.Dagger${outerclasses}${classname}",
-        "annotation=dagger.MapKey;" +
-        "genclass=${package}.${outerclasses}${classname}Creator",
     ],
     deps = [":processor"],
 )
diff --git a/java/dagger/internal/codegen/ProcessingEnvironmentModule.java b/java/dagger/internal/codegen/ProcessingEnvironmentModule.java
index 120714b..8a535fe 100644
--- a/java/dagger/internal/codegen/ProcessingEnvironmentModule.java
+++ b/java/dagger/internal/codegen/ProcessingEnvironmentModule.java
@@ -22,18 +22,15 @@
 import dagger.Provides;
 import dagger.Reusable;
 import dagger.internal.codegen.SpiModule.ProcessorClassLoader;
-import dagger.internal.codegen.base.ClearableCache;
 import dagger.internal.codegen.compileroption.CompilerOptions;
 import dagger.internal.codegen.compileroption.ProcessingEnvironmentCompilerOptions;
 import dagger.internal.codegen.compileroption.ProcessingOptions;
 import dagger.internal.codegen.langmodel.DaggerElements;
-import dagger.multibindings.IntoSet;
 import dagger.spi.BindingGraphPlugin;
 import java.util.Map;
 import javax.annotation.processing.Filer;
 import javax.annotation.processing.Messager;
 import javax.annotation.processing.ProcessingEnvironment;
-import javax.inject.Singleton;
 import javax.lang.model.SourceVersion;
 import javax.lang.model.util.Types;
 
@@ -76,15 +73,10 @@
   }
 
   @Provides
-  @Singleton
   static DaggerElements daggerElements(ProcessingEnvironment processingEnvironment) {
     return new DaggerElements(processingEnvironment);
   }
 
-  @Binds
-  @IntoSet
-  ClearableCache daggerElementAsClearableCache(DaggerElements elements);
-
   @Provides
   @ProcessorClassLoader
   static ClassLoader processorClassloader(ProcessingEnvironment processingEnvironment) {
diff --git a/java/dagger/internal/codegen/base/ComponentAnnotation.java b/java/dagger/internal/codegen/base/ComponentAnnotation.java
index b70ef54..c9b3580 100644
--- a/java/dagger/internal/codegen/base/ComponentAnnotation.java
+++ b/java/dagger/internal/codegen/base/ComponentAnnotation.java
@@ -57,19 +57,6 @@
   private static final ImmutableSet<Class<? extends Annotation>> SUBCOMPONENT_ANNOTATIONS =
      ImmutableSet.of(Subcomponent.class, ProductionSubcomponent.class);
 
-  // TODO(erichang): Move ComponentCreatorAnnotation into /base and use that here?
-  /** The component/subcomponent creator annotation types. */
-  private static final ImmutableSet<Class<? extends Annotation>> CREATOR_ANNOTATIONS =
-      ImmutableSet.of(
-          Component.Builder.class,
-          Component.Factory.class,
-          ProductionComponent.Builder.class,
-          ProductionComponent.Factory.class,
-          Subcomponent.Builder.class,
-          Subcomponent.Factory.class,
-          ProductionSubcomponent.Builder.class,
-          ProductionSubcomponent.Factory.class);
-
   /** All component annotation types. */
   private static final ImmutableSet<Class<? extends Annotation>> ALL_COMPONENT_ANNOTATIONS =
      ImmutableSet.<Class<? extends Annotation>>builder()
@@ -77,13 +64,6 @@
          .addAll(SUBCOMPONENT_ANNOTATIONS)
          .build();
 
-  /** All component and creator annotation types. */
-  private static final ImmutableSet<Class<? extends Annotation>>
-      ALL_COMPONENT_AND_CREATOR_ANNOTATIONS = ImmutableSet.<Class<? extends Annotation>>builder()
-         .addAll(ALL_COMPONENT_ANNOTATIONS)
-         .addAll(CREATOR_ANNOTATIONS)
-         .build();
-
   /** The annotation itself. */
   public abstract AnnotationMirror annotation();
 
@@ -226,11 +206,6 @@
     return ALL_COMPONENT_ANNOTATIONS;
   }
 
-  /** All component and creator annotation types. */
-  public static ImmutableSet<Class<? extends Annotation>> allComponentAndCreatorAnnotations() {
-    return ALL_COMPONENT_AND_CREATOR_ANNOTATIONS;
-  }
-
   /**
    * An actual component annotation.
    *
diff --git a/java/dagger/internal/codegen/base/Keys.java b/java/dagger/internal/codegen/base/Keys.java
index 4d13926..a25f996 100644
--- a/java/dagger/internal/codegen/base/Keys.java
+++ b/java/dagger/internal/codegen/base/Keys.java
@@ -16,10 +16,6 @@
 
 package dagger.internal.codegen.base;
 
-import static com.google.auto.common.MoreTypes.asTypeElement;
-import static dagger.internal.codegen.base.ComponentAnnotation.allComponentAndCreatorAnnotations;
-import static dagger.internal.codegen.langmodel.DaggerElements.isAnyAnnotationPresent;
-
 import com.google.auto.common.MoreElements;
 import com.google.auto.common.MoreTypes;
 import dagger.internal.codegen.langmodel.DaggerTypes;
@@ -92,14 +88,4 @@
         },
         null);
   }
-
-  /**
-   * Returns {@code true} if the given key is for a component/subcomponent or a creator of a
-   * component/subcomponent.
-   */
-  public static boolean isComponentOrCreator(Key key) {
-    return !key.qualifier().isPresent()
-        && key.type().getKind() == TypeKind.DECLARED
-        && isAnyAnnotationPresent(asTypeElement(key.type()), allComponentAndCreatorAnnotations());
-  }
 }
diff --git a/java/dagger/internal/codegen/base/SourceFileGenerator.java b/java/dagger/internal/codegen/base/SourceFileGenerator.java
index ada67d3..02348a4 100644
--- a/java/dagger/internal/codegen/base/SourceFileGenerator.java
+++ b/java/dagger/internal/codegen/base/SourceFileGenerator.java
@@ -16,20 +16,17 @@
 
 package dagger.internal.codegen.base;
 
-
 import static com.google.auto.common.GeneratedAnnotations.generatedAnnotation;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static dagger.internal.codegen.javapoet.AnnotationSpecs.Suppression.RAWTYPES;
 import static dagger.internal.codegen.javapoet.AnnotationSpecs.Suppression.UNCHECKED;
 
 import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.squareup.javapoet.AnnotationSpec;
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.JavaFile;
 import com.squareup.javapoet.TypeSpec;
-import dagger.internal.DaggerGenerated;
 import dagger.internal.codegen.javapoet.AnnotationSpecs;
 import dagger.internal.codegen.javapoet.AnnotationSpecs.Suppression;
 import dagger.internal.codegen.langmodel.DaggerElements;
@@ -77,21 +74,22 @@
 
   /** Generates a source file to be compiled for {@code T}. */
   public void generate(T input) throws SourceFileGenerationException {
-    for (TypeSpec.Builder type : topLevelTypes(input)) {
-      try {
-        buildJavaFile(input, type).writeTo(filer);
-      } catch (Exception e) {
-        // if the code above threw a SFGE, use that
-        Throwables.propagateIfPossible(e, SourceFileGenerationException.class);
-        // otherwise, throw a new one
-        throw new SourceFileGenerationException(Optional.empty(), e, originatingElement(input));
-      }
+    Optional<TypeSpec.Builder> type = write(input);
+    if (!type.isPresent()) {
+      return;
+    }
+    try {
+      buildJavaFile(input, type.get()).writeTo(filer);
+    } catch (Exception e) {
+      // if the code above threw a SFGE, use that
+      Throwables.propagateIfPossible(e, SourceFileGenerationException.class);
+      // otherwise, throw a new one
+      throw new SourceFileGenerationException(Optional.empty(), e, originatingElement(input));
     }
   }
 
   private JavaFile buildJavaFile(T input, TypeSpec.Builder typeSpecBuilder) {
     typeSpecBuilder.addOriginatingElement(originatingElement(input));
-    typeSpecBuilder.addAnnotation(DaggerGenerated.class);
     Optional<AnnotationSpec> generatedAnnotation =
         generatedAnnotation(elements, sourceVersion)
             .map(
@@ -111,9 +109,7 @@
                 .build()));
 
     JavaFile.Builder javaFileBuilder =
-        JavaFile.builder(
-                elements.getPackageOf(originatingElement(input)).getQualifiedName().toString(),
-                typeSpecBuilder.build())
+        JavaFile.builder(nameGeneratedType(input).packageName(), typeSpecBuilder.build())
             .skipJavaLangImports(true);
     if (!generatedAnnotation.isPresent()) {
       javaFileBuilder.addFileComment("Generated by Dagger ($L).", GENERATED_COMMENTS);
@@ -121,16 +117,19 @@
     return javaFileBuilder.build();
   }
 
+  /** Implementations should return the {@link ClassName} for the top-level type to be generated. */
+  public abstract ClassName nameGeneratedType(T input);
+
   /** Returns the originating element of the generating type. */
   public abstract Element originatingElement(T input);
 
   /**
-   * Returns {@link TypeSpec.Builder types} be generated for {@code T}, or an empty list if no types
-   * should be generated.
-   *
-   * <p>Every type will be generated in its own file.
+   * Returns a {@link TypeSpec.Builder type} to be generated for {@code T}, or {@link
+   * Optional#empty()} if no file should be generated.
    */
-  public abstract ImmutableList<TypeSpec.Builder> topLevelTypes(T input);
+  // TODO(ronshapiro): write() makes more sense in JavaWriter where all writers are mutable.
+  // consider renaming to something like typeBuilder() which conveys the mutability of the result
+  public abstract Optional<TypeSpec.Builder> write(T input);
 
   /** Returns {@link Suppression}s that are applied to files generated by this generator. */
   // TODO(b/134590785): When suppressions are removed locally, remove this and inline the usages
diff --git a/java/dagger/internal/codegen/binding/AssistedInjectionAnnotations.java b/java/dagger/internal/codegen/binding/AssistedInjectionAnnotations.java
index f9929ae..8d6ee5d 100644
--- a/java/dagger/internal/codegen/binding/AssistedInjectionAnnotations.java
+++ b/java/dagger/internal/codegen/binding/AssistedInjectionAnnotations.java
@@ -59,14 +59,14 @@
 public final class AssistedInjectionAnnotations {
   /** Returns the factory method for the given factory {@link TypeElement}. */
   public static ExecutableElement assistedFactoryMethod(
-      TypeElement factory, DaggerElements elements) {
-    return getOnlyElement(assistedFactoryMethods(factory, elements));
+      TypeElement factory, DaggerElements elements, DaggerTypes types) {
+    return getOnlyElement(assistedFactoryMethods(factory, elements, types));
   }
 
   /** Returns the list of abstract factory methods for the given factory {@link TypeElement}. */
   public static ImmutableSet<ExecutableElement> assistedFactoryMethods(
-      TypeElement factory, DaggerElements elements) {
-    return elements.getLocalAndInheritedMethods(factory).stream()
+      TypeElement factory, DaggerElements elements, DaggerTypes types) {
+    return MoreElements.getLocalAndInheritedMethods(factory, types, elements).stream()
         .filter(method -> method.getModifiers().contains(ABSTRACT))
         .filter(method -> !method.isDefault())
         .collect(toImmutableSet());
@@ -170,7 +170,7 @@
         TypeMirror factory, DaggerElements elements, DaggerTypes types) {
       DeclaredType factoryType = asDeclared(factory);
       TypeElement factoryElement = asTypeElement(factoryType);
-      ExecutableElement factoryMethod = assistedFactoryMethod(factoryElement, elements);
+      ExecutableElement factoryMethod = assistedFactoryMethod(factoryElement, elements, types);
       ExecutableType factoryMethodType = asExecutable(types.asMemberOf(factoryType, factoryMethod));
       DeclaredType assistedInjectType = asDeclared(factoryMethodType.getReturnType());
       return new AutoValue_AssistedInjectionAnnotations_AssistedFactoryMetadata(
diff --git a/java/dagger/internal/codegen/binding/BindingFactory.java b/java/dagger/internal/codegen/binding/BindingFactory.java
index eb7c132..6f2fc80 100644
--- a/java/dagger/internal/codegen/binding/BindingFactory.java
+++ b/java/dagger/internal/codegen/binding/BindingFactory.java
@@ -191,7 +191,7 @@
     }
 
     ExecutableElement factoryMethod =
-        AssistedInjectionAnnotations.assistedFactoryMethod(factory, elements);
+        AssistedInjectionAnnotations.assistedFactoryMethod(factory, elements, types);
     ExecutableType factoryMethodType =
         MoreTypes.asExecutable(types.asMemberOf(factoryType, factoryMethod));
     return ProvisionBinding.builder()
diff --git a/java/dagger/internal/codegen/binding/BindingGraph.java b/java/dagger/internal/codegen/binding/BindingGraph.java
index 533d113..4936a05 100644
--- a/java/dagger/internal/codegen/binding/BindingGraph.java
+++ b/java/dagger/internal/codegen/binding/BindingGraph.java
@@ -16,7 +16,6 @@
 
 package dagger.internal.codegen.binding;
 
-import static com.google.common.collect.Iterables.transform;
 import static dagger.internal.codegen.extension.DaggerCollectors.toOptional;
 import static dagger.internal.codegen.extension.DaggerStreams.presentValues;
 import static dagger.internal.codegen.extension.DaggerStreams.stream;
@@ -27,12 +26,11 @@
 import com.google.auto.value.AutoValue;
 import com.google.auto.value.extension.memoized.Memoized;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.Multimaps;
 import com.google.common.collect.Sets;
+import com.google.common.graph.Graphs;
 import com.google.common.graph.ImmutableNetwork;
 import com.google.common.graph.Traverser;
 import dagger.model.BindingGraph.ChildFactoryMethodEdge;
@@ -41,9 +39,7 @@
 import dagger.model.BindingGraph.Node;
 import dagger.model.ComponentPath;
 import dagger.model.Key;
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import javax.lang.model.element.ExecutableElement;
@@ -108,15 +104,6 @@
     public ImmutableSetMultimap<Class<? extends Node>, ? extends Node> nodesByClass() {
       return super.nodesByClass();
     }
-
-    /**
-     * Returns an index of each {@link BindingNode} by its {@link ComponentPath}. Accessing this for
-     * a component and its parent components is faster than doing a graph traversal.
-     */
-    @Memoized
-    ImmutableListMultimap<ComponentPath, BindingNode> bindingsByComponent() {
-      return Multimaps.index(transform(bindings(), BindingNode.class::cast), Node::componentPath);
-    }
   }
 
   static BindingGraph create(
@@ -128,12 +115,12 @@
       Optional<BindingGraph> parent,
       ComponentNode componentNode,
       TopLevelBindingGraph topLevelBindingGraph) {
-    List<BindingNode> reachableBindingNodes = new ArrayList<>();
-    for (ComponentPath path = componentNode.componentPath();
-        !path.components().isEmpty();
-        path = ComponentPath.create(path.components().subList(0, path.components().size() - 1))) {
-      reachableBindingNodes.addAll(topLevelBindingGraph.bindingsByComponent().get(path));
-    }
+    ImmutableSet<BindingNode> reachableBindingNodes =
+        Graphs.reachableNodes(topLevelBindingGraph.network().asGraph(), componentNode).stream()
+            .filter(node -> isSubpath(componentNode.componentPath(), node.componentPath()))
+            .filter(node -> node instanceof BindingNode)
+            .map(node -> (BindingNode) node)
+            .collect(toImmutableSet());
 
     // Construct the maps of the ContributionBindings and MembersInjectionBindings.
     Map<Key, BindingNode> contributionBindings = new HashMap<>();
@@ -344,4 +331,17 @@
         .addAll(membersInjectionBindings.values())
         .build();
   }
+
+  // TODO(bcorso): Move this to ComponentPath
+  private static boolean isSubpath(ComponentPath path, ComponentPath subpath) {
+    if (path.components().size() < subpath.components().size()) {
+      return false;
+    }
+    for (int i = 0; i < subpath.components().size(); i++) {
+      if (!path.components().get(i).equals(subpath.components().get(i))) {
+        return false;
+      }
+    }
+    return true;
+  }
 }
diff --git a/java/dagger/internal/codegen/binding/BindingGraphFactory.java b/java/dagger/internal/codegen/binding/BindingGraphFactory.java
index a94f6b0..2c15e26 100644
--- a/java/dagger/internal/codegen/binding/BindingGraphFactory.java
+++ b/java/dagger/internal/codegen/binding/BindingGraphFactory.java
@@ -47,7 +47,6 @@
 import dagger.Reusable;
 import dagger.internal.codegen.base.ClearableCache;
 import dagger.internal.codegen.base.ContributionType;
-import dagger.internal.codegen.base.Keys;
 import dagger.internal.codegen.base.MapType;
 import dagger.internal.codegen.base.OptionalType;
 import dagger.internal.codegen.compileroption.CompilerOptions;
@@ -797,7 +796,7 @@
        * 2. If there are any explicit bindings in this component, they may conflict with those in
        *    the ancestor component, so resolve them here so that conflicts can be caught.
        */
-      if (getPreviouslyResolvedBindings(key).isPresent() && !Keys.isComponentOrCreator(key)) {
+      if (getPreviouslyResolvedBindings(key).isPresent()) {
         /* Resolve in the parent in case there are multibinding contributions or conflicts in some
          * component between this one and the previously-resolved one. */
         parentResolver.get().resolve(key);
diff --git a/java/dagger/internal/codegen/binding/BindsTypeChecker.java b/java/dagger/internal/codegen/binding/BindsTypeChecker.java
index d850fd3..f3e0a1b 100644
--- a/java/dagger/internal/codegen/binding/BindsTypeChecker.java
+++ b/java/dagger/internal/codegen/binding/BindsTypeChecker.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.collect.Iterables.getOnlyElement;
 
+import com.google.auto.common.MoreElements;
 import com.google.auto.common.MoreTypes;
 import com.google.common.collect.ImmutableList;
 import dagger.internal.codegen.base.ContributionType;
@@ -82,8 +83,8 @@
         // type.asElement().getEnclosedElements() is not used because some non-standard JDKs (e.g.
         // J2CL) don't redefine Set.add() (whose only purpose of being redefined in the standard JDK
         // is documentation, and J2CL's implementation doesn't declare docs for JDK types).
-        // getLocalAndInheritedMethods ensures that the method will always be present.
-        elements.getLocalAndInheritedMethods(MoreTypes.asTypeElement(type))) {
+        // MoreElements.getLocalAndInheritedMethods ensures that the method will always be present.
+        MoreElements.getLocalAndInheritedMethods(MoreTypes.asTypeElement(type), types, elements)) {
       if (method.getSimpleName().contentEquals(methodName)) {
         methodsForName.add(method);
       }
diff --git a/java/dagger/internal/codegen/binding/ComponentDescriptor.java b/java/dagger/internal/codegen/binding/ComponentDescriptor.java
index f6ea62c..a7e4cc4 100644
--- a/java/dagger/internal/codegen/binding/ComponentDescriptor.java
+++ b/java/dagger/internal/codegen/binding/ComponentDescriptor.java
@@ -45,8 +45,6 @@
 import dagger.model.Scope;
 import dagger.producers.CancellationPolicy;
 import dagger.producers.ProductionComponent;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Stream;
@@ -242,17 +240,19 @@
 
   /** Returns the first component method associated with this binding request, if one exists. */
   public Optional<ComponentMethodDescriptor> firstMatchingComponentMethod(BindingRequest request) {
-    return Optional.ofNullable(firstMatchingComponentMethods().get(request));
+    return componentMethods().stream()
+        .filter(method -> doesComponentMethodMatch(method, request))
+        .findFirst();
   }
 
-  @Memoized
-  ImmutableMap<BindingRequest, ComponentMethodDescriptor>
-      firstMatchingComponentMethods() {
-    Map<BindingRequest, ComponentMethodDescriptor> methods = new HashMap<>();
-    for (ComponentMethodDescriptor method : entryPointMethods()) {
-      methods.putIfAbsent(BindingRequest.bindingRequest(method.dependencyRequest().get()), method);
-    }
-    return ImmutableMap.copyOf(methods);
+  /** Returns true if the component method matches the binding request. */
+  private static boolean doesComponentMethodMatch(
+      ComponentMethodDescriptor componentMethod, BindingRequest request) {
+    return componentMethod
+        .dependencyRequest()
+        .map(BindingRequest::bindingRequest)
+        .filter(request::equals)
+        .isPresent();
   }
 
   /** The entry point methods on the component type. Each has a {@link DependencyRequest}. */
diff --git a/java/dagger/internal/codegen/binding/ComponentRequirement.java b/java/dagger/internal/codegen/binding/ComponentRequirement.java
index 9d54f4d..fa24b56 100644
--- a/java/dagger/internal/codegen/binding/ComponentRequirement.java
+++ b/java/dagger/internal/codegen/binding/ComponentRequirement.java
@@ -16,6 +16,7 @@
 
 package dagger.internal.codegen.binding;
 
+import static com.google.auto.common.MoreElements.getLocalAndInheritedMethods;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static dagger.internal.codegen.binding.SourceFiles.simpleVariableName;
@@ -37,6 +38,7 @@
 import dagger.Provides;
 import dagger.internal.codegen.kotlin.KotlinMetadataUtil;
 import dagger.internal.codegen.langmodel.DaggerElements;
+import dagger.internal.codegen.langmodel.DaggerTypes;
 import dagger.model.BindingKind;
 import dagger.model.Key;
 import dagger.multibindings.Multibinds;
@@ -113,12 +115,14 @@
    * of the default behavior in {@link #nullPolicy}.
    *
    * <p>Some implementations' null policy can be determined upon construction (e.g., for binding
-   * instances), but others' require Elements which must wait until {@link #nullPolicy} is called.
+   * instances), but others' require Elements and Types, which must wait until {@link #nullPolicy}
+   * is called.
    */
   abstract Optional<NullPolicy> overrideNullPolicy();
 
   /** The requirement's null policy. */
-  public NullPolicy nullPolicy(DaggerElements elements, KotlinMetadataUtil metadataUtil) {
+  public NullPolicy nullPolicy(
+      DaggerElements elements, DaggerTypes types, KotlinMetadataUtil metadataUtil) {
     if (overrideNullPolicy().isPresent()) {
       return overrideNullPolicy().get();
     }
@@ -126,7 +130,9 @@
       case MODULE:
         return componentCanMakeNewInstances(typeElement(), metadataUtil)
             ? NullPolicy.NEW
-            : requiresAPassedInstance(elements, metadataUtil) ? NullPolicy.THROW : NullPolicy.ALLOW;
+            : requiresAPassedInstance(elements, types, metadataUtil)
+                ? NullPolicy.THROW
+                : NullPolicy.ALLOW;
       case DEPENDENCY:
       case BOUND_INSTANCE:
         return NullPolicy.THROW;
@@ -138,12 +144,13 @@
    * Returns true if the passed {@link ComponentRequirement} requires a passed instance in order to
    * be used within a component.
    */
-  public boolean requiresAPassedInstance(DaggerElements elements, KotlinMetadataUtil metadataUtil) {
+  public boolean requiresAPassedInstance(
+      DaggerElements elements, DaggerTypes types, KotlinMetadataUtil metadataUtil) {
     if (!kind().isModule()) {
       // Bound instances and dependencies always require the user to provide an instance.
       return true;
     }
-    return requiresModuleInstance(elements, metadataUtil)
+    return requiresModuleInstance(elements, types, metadataUtil)
         && !componentCanMakeNewInstances(typeElement(), metadataUtil);
   }
 
@@ -157,7 +164,8 @@
    * <p>Alternatively, if the module is a Kotlin Object then the binding methods are considered
    * {@code static}, requiring no module instance.
    */
-  private boolean requiresModuleInstance(DaggerElements elements, KotlinMetadataUtil metadataUtil) {
+  private boolean requiresModuleInstance(
+      DaggerElements elements, DaggerTypes types, KotlinMetadataUtil metadataUtil) {
     boolean isKotlinObject =
         metadataUtil.isObjectClass(typeElement())
             || metadataUtil.isCompanionObjectClass(typeElement());
@@ -165,7 +173,8 @@
       return false;
     }
 
-    ImmutableSet<ExecutableElement> methods = elements.getLocalAndInheritedMethods(typeElement());
+    ImmutableSet<ExecutableElement> methods =
+        getLocalAndInheritedMethods(typeElement(), types, elements);
     return methods.stream()
         .filter(this::isBindingMethod)
         .map(ExecutableElement::getModifiers)
diff --git a/java/dagger/internal/codegen/componentgenerator/ComponentCreatorImplementationFactory.java b/java/dagger/internal/codegen/componentgenerator/ComponentCreatorImplementationFactory.java
index 66270c6..e1b35da 100644
--- a/java/dagger/internal/codegen/componentgenerator/ComponentCreatorImplementationFactory.java
+++ b/java/dagger/internal/codegen/componentgenerator/ComponentCreatorImplementationFactory.java
@@ -237,7 +237,7 @@
       method.addStatement(
           "this.$N = $L",
           fields.get(requirement),
-          requirement.nullPolicy(elements, metadataUtil).equals(NullPolicy.ALLOW)
+          requirement.nullPolicy(elements, types, metadataUtil).equals(NullPolicy.ALLOW)
               ? CodeBlock.of("$N", parameter)
               : CodeBlock.of("$T.checkNotNull($N)", Preconditions.class, parameter));
       return maybeReturnThis(method);
@@ -310,7 +310,7 @@
 
     private void addNullHandlingForField(
         ComponentRequirement requirement, FieldSpec field, MethodSpec.Builder factoryMethod) {
-      switch (requirement.nullPolicy(elements, metadataUtil)) {
+      switch (requirement.nullPolicy(elements, types, metadataUtil)) {
         case NEW:
           checkState(requirement.kind().isModule());
           factoryMethod
@@ -334,7 +334,7 @@
 
     private void addNullHandlingForParameter(
         ComponentRequirement requirement, String parameter, MethodSpec.Builder factoryMethod) {
-      if (!requirement.nullPolicy(elements, metadataUtil).equals(NullPolicy.ALLOW)) {
+      if (!requirement.nullPolicy(elements, types, metadataUtil).equals(NullPolicy.ALLOW)) {
         // Factory method parameters are always required unless they are a nullable
         // binds-instance (i.e. ALLOW)
         factoryMethod.addStatement("$T.checkNotNull($L)", Preconditions.class, parameter);
diff --git a/java/dagger/internal/codegen/componentgenerator/ComponentGenerator.java b/java/dagger/internal/codegen/componentgenerator/ComponentGenerator.java
index 098da81..e04ee14 100644
--- a/java/dagger/internal/codegen/componentgenerator/ComponentGenerator.java
+++ b/java/dagger/internal/codegen/componentgenerator/ComponentGenerator.java
@@ -19,7 +19,6 @@
 import static com.google.common.base.Verify.verify;
 import static dagger.internal.codegen.binding.SourceFiles.classFileName;
 
-import com.google.common.collect.ImmutableList;
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.TypeSpec;
 import dagger.Component;
@@ -27,6 +26,7 @@
 import dagger.internal.codegen.binding.BindingGraph;
 import dagger.internal.codegen.langmodel.DaggerElements;
 import dagger.internal.codegen.writing.ComponentImplementation;
+import java.util.Optional;
 import javax.annotation.processing.Filer;
 import javax.inject.Inject;
 import javax.lang.model.SourceVersion;
@@ -47,6 +47,11 @@
     this.componentImplementationFactory = componentImplementationFactory;
   }
 
+  @Override
+  public ClassName nameGeneratedType(BindingGraph input) {
+    return componentName(input.componentTypeElement());
+  }
+
   static ClassName componentName(TypeElement componentDefinitionType) {
     ClassName componentName = ClassName.get(componentDefinitionType);
     return ClassName.get(componentName.packageName(), "Dagger" + classFileName(componentName));
@@ -58,11 +63,10 @@
   }
 
   @Override
-  public ImmutableList<TypeSpec.Builder> topLevelTypes(BindingGraph bindingGraph) {
+  public Optional<TypeSpec.Builder> write(BindingGraph bindingGraph) {
     ComponentImplementation componentImplementation =
         componentImplementationFactory.createComponentImplementation(bindingGraph);
-    verify(
-        componentImplementation.name().equals(componentName(bindingGraph.componentTypeElement())));
-    return ImmutableList.of(componentImplementation.generate());
+    verify(componentImplementation.name().equals(nameGeneratedType(bindingGraph)));
+    return Optional.of(componentImplementation.generate());
   }
 }
diff --git a/java/dagger/internal/codegen/componentgenerator/ComponentGeneratorModule.java b/java/dagger/internal/codegen/componentgenerator/ComponentGeneratorModule.java
index 179c411..84179d6 100644
--- a/java/dagger/internal/codegen/componentgenerator/ComponentGeneratorModule.java
+++ b/java/dagger/internal/codegen/componentgenerator/ComponentGeneratorModule.java
@@ -18,9 +18,11 @@
 
 import dagger.Binds;
 import dagger.Module;
+import dagger.internal.codegen.base.ClearableCache;
 import dagger.internal.codegen.base.SourceFileGenerator;
 import dagger.internal.codegen.binding.BindingGraph;
 import dagger.internal.codegen.binding.ComponentDescriptor;
+import dagger.multibindings.IntoSet;
 
 /** Provides bindings needed to generated the component. */
 @Module(subcomponents = TopLevelImplementationComponent.class)
@@ -39,4 +41,8 @@
   @Binds
   abstract SourceFileGenerator<ComponentDescriptor> componentHjarGenerator(
       ComponentHjarGenerator hjarGenerator);
+
+  @Binds
+  @IntoSet
+  ClearableCache componentImplementationFactory(ComponentImplementationFactory cache);
 }
diff --git a/java/dagger/internal/codegen/componentgenerator/ComponentHjarGenerator.java b/java/dagger/internal/codegen/componentgenerator/ComponentHjarGenerator.java
index c8b8c97..b386a4f 100644
--- a/java/dagger/internal/codegen/componentgenerator/ComponentHjarGenerator.java
+++ b/java/dagger/internal/codegen/componentgenerator/ComponentHjarGenerator.java
@@ -33,7 +33,6 @@
 
 import com.google.auto.common.MoreTypes;
 import com.google.common.base.Ascii;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.MethodSpec;
@@ -49,6 +48,7 @@
 import dagger.internal.codegen.langmodel.DaggerElements;
 import dagger.internal.codegen.langmodel.DaggerTypes;
 import dagger.producers.internal.CancellationListener;
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Stream;
 import javax.annotation.processing.Filer;
@@ -91,13 +91,18 @@
   }
 
   @Override
+  public ClassName nameGeneratedType(ComponentDescriptor input) {
+    return componentName(input.typeElement());
+  }
+
+  @Override
   public Element originatingElement(ComponentDescriptor input) {
     return input.typeElement();
   }
 
   @Override
-  public ImmutableList<TypeSpec.Builder> topLevelTypes(ComponentDescriptor componentDescriptor) {
-    ClassName generatedTypeName = componentName(componentDescriptor.typeElement());
+  public Optional<TypeSpec.Builder> write(ComponentDescriptor componentDescriptor) {
+    ClassName generatedTypeName = nameGeneratedType(componentDescriptor);
     TypeSpec.Builder generatedComponent =
         TypeSpec.classBuilder(generatedTypeName)
             .addModifiers(FINAL)
@@ -143,7 +148,8 @@
         && !hasBindsInstanceMethods(componentDescriptor)
         && componentRequirements(componentDescriptor)
             .noneMatch(
-                requirement -> requirement.requiresAPassedInstance(elements, metadataUtil))) {
+                requirement ->
+                    requirement.requiresAPassedInstance(elements, types, metadataUtil))) {
       generatedComponent.addMethod(createMethod(componentDescriptor));
     }
 
@@ -168,7 +174,7 @@
           .addMethod(onProducerFutureCancelledMethod());
     }
 
-    return ImmutableList.of(generatedComponent);
+    return Optional.of(generatedComponent);
   }
 
   private MethodSpec emptyComponentMethod(TypeElement typeElement, ExecutableElement baseMethod) {
diff --git a/java/dagger/internal/codegen/componentgenerator/ComponentImplementationBuilder.java b/java/dagger/internal/codegen/componentgenerator/ComponentImplementationBuilder.java
index 2be7d38..04cb80f 100644
--- a/java/dagger/internal/codegen/componentgenerator/ComponentImplementationBuilder.java
+++ b/java/dagger/internal/codegen/componentgenerator/ComponentImplementationBuilder.java
@@ -16,6 +16,7 @@
 
 package dagger.internal.codegen.componentgenerator;
 
+import static com.google.auto.common.MoreElements.getLocalAndInheritedMethods;
 import static com.google.auto.common.MoreTypes.asDeclared;
 import static com.google.common.base.Preconditions.checkState;
 import static com.squareup.javapoet.MethodSpec.constructorBuilder;
@@ -145,8 +146,7 @@
         .map(ComponentCreatorImplementation::spec)
         .ifPresent(this::addCreatorClass);
 
-    elements
-        .getLocalAndInheritedMethods(graph.componentTypeElement())
+    getLocalAndInheritedMethods(graph.componentTypeElement(), types, elements)
         .forEach(method -> componentImplementation.claimMethodName(method.getSimpleName()));
 
     addFactoryMethods();
@@ -495,7 +495,7 @@
   private boolean canInstantiateAllRequirements() {
     return !Iterables.any(
         graph.componentRequirements(),
-        dependency -> dependency.requiresAPassedInstance(elements, metadataUtil));
+        dependency -> dependency.requiresAPassedInstance(elements, types, metadataUtil));
   }
 
   private void createSubcomponentFactoryMethod(ExecutableElement factoryMethod) {
diff --git a/java/dagger/internal/codegen/componentgenerator/ComponentImplementationFactory.java b/java/dagger/internal/codegen/componentgenerator/ComponentImplementationFactory.java
index 0d29b86..fdfcc9d 100644
--- a/java/dagger/internal/codegen/componentgenerator/ComponentImplementationFactory.java
+++ b/java/dagger/internal/codegen/componentgenerator/ComponentImplementationFactory.java
@@ -16,20 +16,26 @@
 
 package dagger.internal.codegen.componentgenerator;
 
+import static dagger.internal.codegen.base.Util.reentrantComputeIfAbsent;
 import static dagger.internal.codegen.componentgenerator.ComponentGenerator.componentName;
 
+import dagger.internal.codegen.base.ClearableCache;
 import dagger.internal.codegen.binding.BindingGraph;
 import dagger.internal.codegen.binding.KeyFactory;
 import dagger.internal.codegen.compileroption.CompilerOptions;
 import dagger.internal.codegen.writing.ComponentImplementation;
 import dagger.internal.codegen.writing.SubcomponentNames;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Singleton;
+import javax.lang.model.element.TypeElement;
 
 /** Factory for {@link ComponentImplementation}s. */
 @Singleton
-final class ComponentImplementationFactory {
+final class ComponentImplementationFactory implements ClearableCache {
+  private final Map<TypeElement, ComponentImplementation> topLevelComponentCache = new HashMap<>();
   private final KeyFactory keyFactory;
   private final CompilerOptions compilerOptions;
   private final TopLevelImplementationComponent.Builder topLevelImplementationComponentBuilder;
@@ -48,6 +54,13 @@
    * Returns a top-level (non-nested) component implementation for a binding graph.
    */
   ComponentImplementation createComponentImplementation(BindingGraph bindingGraph) {
+    return reentrantComputeIfAbsent(
+        topLevelComponentCache,
+        bindingGraph.componentTypeElement(),
+        component -> createComponentImplementationUncached(bindingGraph));
+  }
+
+  private ComponentImplementation createComponentImplementationUncached(BindingGraph bindingGraph) {
     ComponentImplementation componentImplementation =
         ComponentImplementation.topLevelComponentImplementation(
             bindingGraph,
@@ -69,4 +82,9 @@
         .componentImplementationBuilder()
         .build();
   }
+
+  @Override
+  public void clearCache() {
+    topLevelComponentCache.clear();
+  }
 }
diff --git a/java/dagger/internal/codegen/kotlin/KotlinMetadata.java b/java/dagger/internal/codegen/kotlin/KotlinMetadata.java
index 5fb49f0..296da44 100644
--- a/java/dagger/internal/codegen/kotlin/KotlinMetadata.java
+++ b/java/dagger/internal/codegen/kotlin/KotlinMetadata.java
@@ -362,7 +362,6 @@
 
       Builder addConstructor(FunctionMetadata constructor) {
         constructorsBuilder().add(constructor);
-        functionsBySignatureBuilder().put(constructor.signature(), constructor);
         return this;
       }
 
diff --git a/java/dagger/internal/codegen/kotlin/KotlinMetadataUtil.java b/java/dagger/internal/codegen/kotlin/KotlinMetadataUtil.java
index 980ff34..76d28f0 100644
--- a/java/dagger/internal/codegen/kotlin/KotlinMetadataUtil.java
+++ b/java/dagger/internal/codegen/kotlin/KotlinMetadataUtil.java
@@ -100,11 +100,6 @@
         && metadataFactory.create(typeElement).classMetadata().flags(IS_COMPANION_OBJECT);
   }
 
-  /** Returns {@code true} if this type element is a Kotlin object or companion object. */
-  public boolean isObjectOrCompanionObjectClass(TypeElement typeElement) {
-    return isObjectClass(typeElement) || isCompanionObjectClass(typeElement);
-  }
-
   /* Returns {@code true} if this type element has a Kotlin Companion Object. */
   public boolean hasEnclosedCompanionObject(TypeElement typeElement) {
     return hasMetadata(typeElement)
@@ -136,15 +131,6 @@
   }
 
   /**
-   * Returns {@code true} if the given type element was declared {@code internal} in its Kotlin
-   * source.
-   */
-  public boolean isVisibilityInternal(TypeElement type) {
-    return hasMetadata(type)
-        && metadataFactory.create(type).classMetadata().flags(Flag.IS_INTERNAL);
-  }
-
-  /**
    * Returns {@code true} if the given executable element was declared {@code internal} in its
    * Kotlin source.
    */
diff --git a/java/dagger/internal/codegen/langmodel/BUILD b/java/dagger/internal/codegen/langmodel/BUILD
index 25f1e62..670f4aa 100644
--- a/java/dagger/internal/codegen/langmodel/BUILD
+++ b/java/dagger/internal/codegen/langmodel/BUILD
@@ -26,7 +26,6 @@
     tags = ["maven:merged"],
     deps = [
         "//java/dagger:core",
-        "//java/dagger/internal/codegen/base:shared",
         "//java/dagger/internal/guava:base",
         "//java/dagger/internal/guava:collect",
         "//java/dagger/internal/guava:concurrent",
diff --git a/java/dagger/internal/codegen/langmodel/DaggerElements.java b/java/dagger/internal/codegen/langmodel/DaggerElements.java
index 51c2a60..12cec31 100644
--- a/java/dagger/internal/codegen/langmodel/DaggerElements.java
+++ b/java/dagger/internal/codegen/langmodel/DaggerElements.java
@@ -17,6 +17,7 @@
 package dagger.internal.codegen.langmodel;
 
 import static com.google.auto.common.MoreElements.asExecutable;
+import static com.google.auto.common.MoreElements.getLocalAndInheritedMethods;
 import static com.google.auto.common.MoreElements.hasModifiers;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.Lists.asList;
@@ -33,12 +34,10 @@
 import com.google.common.graph.Traverser;
 import com.squareup.javapoet.ClassName;
 import dagger.Reusable;
-import dagger.internal.codegen.base.ClearableCache;
 import java.io.Writer;
 import java.lang.annotation.Annotation;
 import java.util.Collection;
 import java.util.Comparator;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -76,9 +75,8 @@
 
 /** Extension of {@link Elements} that adds Dagger-specific methods. */
 @Reusable
-public final class DaggerElements implements Elements, ClearableCache {
-  private final Map<TypeElement, ImmutableSet<ExecutableElement>> getLocalAndInheritedMethodsCache =
-      new HashMap<>();
+public final class DaggerElements implements Elements {
+
   private final Elements elements;
   private final Types types;
 
@@ -102,13 +100,8 @@
   private static final Traverser<Element> GET_ENCLOSED_ELEMENTS =
       Traverser.forTree(Element::getEnclosedElements);
 
-  public ImmutableSet<ExecutableElement> getLocalAndInheritedMethods(TypeElement type) {
-    return getLocalAndInheritedMethodsCache.computeIfAbsent(
-        type, k -> MoreElements.getLocalAndInheritedMethods(type, types, elements));
-  }
-
   public ImmutableSet<ExecutableElement> getUnimplementedMethods(TypeElement type) {
-    return FluentIterable.from(getLocalAndInheritedMethods(type))
+    return FluentIterable.from(getLocalAndInheritedMethods(type, types, elements))
         .filter(hasModifiers(ABSTRACT))
         .toSet();
   }
@@ -125,7 +118,7 @@
 
   /** Returns the type element for a class name. */
   public TypeElement getTypeElement(ClassName className) {
-    return getTypeElement(className.canonicalName());
+    return getTypeElement(className.withoutAnnotations().toString());
   }
 
   /** Returns the argument or the closest enclosing element that is a {@link TypeElement}. */
@@ -499,9 +492,4 @@
   public boolean isFunctionalInterface(TypeElement type) {
     return elements.isFunctionalInterface(type);
   }
-
-  @Override
-  public void clearCache() {
-    getLocalAndInheritedMethodsCache.clear();
-  }
 }
diff --git a/java/dagger/internal/codegen/validation/BindingElementValidator.java b/java/dagger/internal/codegen/validation/BindingElementValidator.java
index b8f9912..4557745 100644
--- a/java/dagger/internal/codegen/validation/BindingElementValidator.java
+++ b/java/dagger/internal/codegen/validation/BindingElementValidator.java
@@ -17,6 +17,7 @@
 package dagger.internal.codegen.validation;
 
 import static com.google.auto.common.MoreTypes.asTypeElement;
+import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.base.Verify.verifyNotNull;
 import static dagger.internal.codegen.base.Scopes.scopesOf;
 import static dagger.internal.codegen.base.Util.reentrantComputeIfAbsent;
@@ -141,12 +142,10 @@
   protected abstract class ElementValidator {
     protected final E element;
     protected final ValidationReport.Builder<E> report;
-    private final ImmutableCollection<? extends AnnotationMirror> qualifiers;
 
     protected ElementValidator(E element) {
       this.element = element;
       this.report = ValidationReport.about(element);
-      qualifiers = injectionAnnotations.getQualifiers(element);
     }
 
     /** Checks the element for validity. */
@@ -186,15 +185,10 @@
     protected void checkType() {
       switch (ContributionType.fromBindingElement(element)) {
         case UNIQUE:
-          // Validate that a unique binding is not attempting to bind a framework type. This
-          // validation is only appropriate for unique bindings because multibindings may collect
-          // framework types.  E.g. Set<Provider<Foo>> is perfectly reasonable.
+          /* Validate that a unique binding is not attempting to bind a framework type. This
+           * validation is only appropriate for unique bindings because multibindings may collect
+           * framework types.  E.g. Set<Provider<Foo>> is perfectly reasonable. */
           checkFrameworkType();
-
-          // Validate that a unique binding is not attempting to bind an unqualified assisted type.
-          // This validation is only appropriate for unique bindings because multibindings may
-          // collect assisted types.
-          checkAssistedType();
           // fall through
 
         case SET:
@@ -214,26 +208,22 @@
       TypeKind kind = keyType.getKind();
       if (kind.equals(VOID)) {
         report.addError(bindingElements("must %s a value (not void)", bindingElementTypeVerb()));
-      } else if (!(kind.isPrimitive()
-          || kind.equals(DECLARED)
-          || kind.equals(ARRAY)
-          || kind.equals(TYPEVAR))) {
+      } else if (kind == DECLARED) {
+        checkNotAssistedInject(keyType);
+      } else if (!(kind.isPrimitive() || kind.equals(ARRAY) || kind.equals(TYPEVAR))) {
         report.addError(badTypeMessage());
       }
     }
 
-    /** Adds errors for unqualified assisted types. */
-    private void checkAssistedType() {
-      if (qualifiers.isEmpty()
-              && bindingElementType().isPresent()
-              && bindingElementType().get().getKind() == DECLARED) {
-        TypeElement keyElement = asTypeElement(bindingElementType().get());
-        if (isAssistedInjectionType(keyElement)) {
-          report.addError("Dagger does not support providing @AssistedInject types.", keyElement);
-        }
-        if (isAssistedFactoryType(keyElement)) {
-          report.addError("Dagger does not support providing @AssistedFactory types.", keyElement);
-        }
+    /** Adds errors for a method return type. */
+    private void checkNotAssistedInject(TypeMirror keyType) {
+      checkState(keyType.getKind() == TypeKind.DECLARED);
+      TypeElement keyElement = asTypeElement(keyType);
+      if (isAssistedInjectionType(keyElement)) {
+        report.addError("Dagger does not support providing @AssistedInject types.", keyElement);
+      }
+      if (isAssistedFactoryType(keyElement)) {
+        report.addError("Dagger does not support providing @AssistedFactory types.", keyElement);
       }
     }
 
@@ -264,6 +254,8 @@
      * Adds an error if the element has more than one {@linkplain Qualifier qualifier} annotation.
      */
     private void checkQualifiers() {
+      ImmutableCollection<? extends AnnotationMirror> qualifiers =
+          injectionAnnotations.getQualifiers(element);
       if (qualifiers.size() > 1) {
         for (AnnotationMirror qualifier : qualifiers) {
           report.addError(
diff --git a/java/dagger/internal/codegen/validation/ComponentDescriptorValidator.java b/java/dagger/internal/codegen/validation/ComponentDescriptorValidator.java
index 28b1c2b..aa20232 100644
--- a/java/dagger/internal/codegen/validation/ComponentDescriptorValidator.java
+++ b/java/dagger/internal/codegen/validation/ComponentDescriptorValidator.java
@@ -318,7 +318,7 @@
       Set<ComponentRequirement> mustBePassed =
           Sets.filter(
               componentModuleAndDependencyRequirements,
-              input -> input.nullPolicy(elements, metadataUtil).equals(NullPolicy.THROW));
+              input -> input.nullPolicy(elements, types, metadataUtil).equals(NullPolicy.THROW));
       // Component requirements that the creator must be able to set, but can't
       Set<ComponentRequirement> missingRequirements =
           Sets.difference(mustBePassed, creatorModuleAndDependencyRequirements);
diff --git a/java/dagger/internal/codegen/validation/ComponentValidator.java b/java/dagger/internal/codegen/validation/ComponentValidator.java
index 72a44f2..b3322e5 100644
--- a/java/dagger/internal/codegen/validation/ComponentValidator.java
+++ b/java/dagger/internal/codegen/validation/ComponentValidator.java
@@ -17,6 +17,7 @@
 package dagger.internal.codegen.validation;
 
 import static com.google.auto.common.MoreElements.asType;
+import static com.google.auto.common.MoreElements.getLocalAndInheritedMethods;
 import static com.google.auto.common.MoreElements.isAnnotationPresent;
 import static com.google.auto.common.MoreTypes.asDeclared;
 import static com.google.auto.common.MoreTypes.asExecutable;
@@ -242,7 +243,8 @@
     }
 
     private void validateComponentMethods() {
-      elements.getUnimplementedMethods(component).stream()
+      getLocalAndInheritedMethods(component, types, elements).stream()
+          .filter(method -> method.getModifiers().contains(ABSTRACT))
           .map(ComponentMethodValidator::new)
           .forEachOrdered(ComponentMethodValidator::validateMethod);
     }
diff --git a/java/dagger/internal/codegen/validation/DependencyRequestValidator.java b/java/dagger/internal/codegen/validation/DependencyRequestValidator.java
index f280497..68c9604 100644
--- a/java/dagger/internal/codegen/validation/DependencyRequestValidator.java
+++ b/java/dagger/internal/codegen/validation/DependencyRequestValidator.java
@@ -77,21 +77,11 @@
       // Don't validate assisted parameters. These are not dependency requests.
       return;
     }
-    if (missingQualifierMetadata(requestElement)) {
-      report.addError(
-          "Unable to read annotations on an injected Kotlin property. The Dagger compiler must"
-              + " also be applied to any project containing @Inject properties.",
-          requestElement);
-
-      // Skip any further validation if we don't have valid metadata for a type that needs it.
-      return;
-    }
-
-    new Validator(report, requestElement, requestType).validate();
+    checkQualifiers(report, requestElement);
+    checkType(report, requestElement, requestType);
   }
 
-  /** Returns {@code true} if a kotlin inject field is missing metadata about its qualifiers. */
-  private boolean missingQualifierMetadata(Element requestElement) {
+  private void checkQualifiers(ValidationReport.Builder<?> report, Element requestElement) {
     if (requestElement.getKind() == ElementKind.FIELD
         // static injected fields are not supported, no need to get qualifier from kotlin metadata
         && !requestElement.getModifiers().contains(STATIC)
@@ -101,80 +91,64 @@
           Optional.ofNullable(
               elements.getTypeElement(
                   membersInjectorNameForType(asType(requestElement.getEnclosingElement()))));
-      return !membersInjector.isPresent();
+      if (!membersInjector.isPresent()) {
+        report.addError(
+            "Unable to read annotations on an injected Kotlin property. The Dagger compiler must"
+                + " also be applied to any project containing @Inject properties.",
+            requestElement);
+        return; // finish checking qualifiers since current information is unreliable.
+      }
     }
-    return false;
+
+    ImmutableCollection<? extends AnnotationMirror> qualifiers =
+        injectionAnnotations.getQualifiers(requestElement);
+    if (qualifiers.size() > 1) {
+      for (AnnotationMirror qualifier : qualifiers) {
+        report.addError(
+            "A single dependency request may not use more than one @Qualifier",
+            requestElement,
+            qualifier);
+      }
+    }
   }
 
-  private final class Validator {
-    private final ValidationReport.Builder<?> report;
-    private final Element requestElement;
-    private final TypeMirror requestType;
-    private final TypeMirror keyType;
-    private final RequestKind requestKind;
-    private final ImmutableCollection<? extends AnnotationMirror> qualifiers;
-
-
-    Validator(ValidationReport.Builder<?> report, Element requestElement, TypeMirror requestType) {
-      this.report = report;
-      this.requestElement = requestElement;
-      this.requestType = requestType;
-      this.keyType = extractKeyType(requestType);
-      this.requestKind = RequestKinds.getRequestKind(requestType);
-      this.qualifiers = injectionAnnotations.getQualifiers(requestElement);
-    }
-
-    void validate() {
-      checkQualifiers();
-      checkType();
-    }
-
-    private void checkQualifiers() {
-      if (qualifiers.size() > 1) {
-        for (AnnotationMirror qualifier : qualifiers) {
-          report.addError(
-              "A single dependency request may not use more than one @Qualifier",
-              requestElement,
-              qualifier);
-        }
+  private void checkType(
+      ValidationReport.Builder<?> report, Element requestElement, TypeMirror requestType) {
+    TypeMirror keyType = extractKeyType(requestType);
+    RequestKind requestKind = RequestKinds.getRequestKind(requestType);
+    if (keyType.getKind() == TypeKind.DECLARED) {
+      TypeElement typeElement = asTypeElement(keyType);
+      if (isAssistedInjectionType(typeElement)) {
+        report.addError(
+            "Dagger does not support injecting @AssistedInject type, "
+                + requestType
+                + ". Did you mean to inject its assisted factory type instead?",
+            requestElement);
       }
-    }
-
-    private void checkType() {
-      if (qualifiers.isEmpty() && keyType.getKind() == TypeKind.DECLARED) {
-        TypeElement typeElement = asTypeElement(keyType);
-        if (isAssistedInjectionType(typeElement)) {
-          report.addError(
-              "Dagger does not support injecting @AssistedInject type, "
-                  + requestType
-                  + ". Did you mean to inject its assisted factory type instead?",
-              requestElement);
-        }
-        if (requestKind != RequestKind.INSTANCE && isAssistedFactoryType(typeElement)) {
-          report.addError(
-              "Dagger does not support injecting Provider<T>, Lazy<T>, Producer<T>, "
-                  + "or Produced<T> when T is an @AssistedFactory-annotated type such as "
-                  + keyType,
-              requestElement);
-        }
-      }
-      if (keyType.getKind().equals(WILDCARD)) {
-        // TODO(ronshapiro): Explore creating this message using RequestKinds.
+      if (requestKind != RequestKind.INSTANCE && isAssistedFactoryType(typeElement)) {
         report.addError(
             "Dagger does not support injecting Provider<T>, Lazy<T>, Producer<T>, "
-                + "or Produced<T> when T is a wildcard type such as "
+                + "or Produced<T> when T is an @AssistedFactory-annotated type such as "
                 + keyType,
             requestElement);
       }
-      if (MoreTypes.isType(keyType) && MoreTypes.isTypeOf(MembersInjector.class, keyType)) {
-        DeclaredType membersInjectorType = MoreTypes.asDeclared(keyType);
-        if (membersInjectorType.getTypeArguments().isEmpty()) {
-          report.addError("Cannot inject a raw MembersInjector", requestElement);
-        } else {
-          report.addSubreport(
-              membersInjectionValidator.validateMembersInjectionRequest(
-                  requestElement, membersInjectorType.getTypeArguments().get(0)));
-        }
+    }
+    if (keyType.getKind().equals(WILDCARD)) {
+      // TODO(ronshapiro): Explore creating this message using RequestKinds.
+      report.addError(
+          "Dagger does not support injecting Provider<T>, Lazy<T>, Producer<T>, "
+              + "or Produced<T> when T is a wildcard type such as "
+              + keyType,
+          requestElement);
+    }
+    if (MoreTypes.isType(keyType) && MoreTypes.isTypeOf(MembersInjector.class, keyType)) {
+      DeclaredType membersInjectorType = MoreTypes.asDeclared(keyType);
+      if (membersInjectorType.getTypeArguments().isEmpty()) {
+        report.addError("Cannot inject a raw MembersInjector", requestElement);
+      } else {
+        report.addSubreport(
+            membersInjectionValidator.validateMembersInjectionRequest(
+                requestElement, membersInjectorType.getTypeArguments().get(0)));
       }
     }
   }
diff --git a/java/dagger/internal/codegen/validation/InjectBindingRegistryImpl.java b/java/dagger/internal/codegen/validation/InjectBindingRegistryImpl.java
index 9787f4f..06f68f6 100644
--- a/java/dagger/internal/codegen/validation/InjectBindingRegistryImpl.java
+++ b/java/dagger/internal/codegen/validation/InjectBindingRegistryImpl.java
@@ -24,7 +24,6 @@
 import static dagger.internal.codegen.binding.AssistedInjectionAnnotations.assistedInjectedConstructors;
 import static dagger.internal.codegen.binding.InjectionAnnotations.injectedConstructors;
 import static dagger.internal.codegen.binding.SourceFiles.generatedClassNameForBinding;
-import static dagger.internal.codegen.langmodel.DaggerTypes.unwrapType;
 
 import com.google.auto.common.MoreElements;
 import com.google.auto.common.MoreTypes;
@@ -113,11 +112,7 @@
     /** Caches the binding and generates it if it needs generation. */
     void tryRegisterBinding(B binding, boolean warnIfNotAlreadyGenerated) {
       tryToCacheBinding(binding);
-
-      @SuppressWarnings("unchecked")
-      B maybeUnresolved =
-          binding.unresolved().isPresent() ? (B) binding.unresolved().get() : binding;
-      tryToGenerateBinding(maybeUnresolved, warnIfNotAlreadyGenerated);
+      tryToGenerateBinding(binding, warnIfNotAlreadyGenerated);
     }
 
     /**
@@ -204,6 +199,9 @@
    */
   private void registerBinding(ProvisionBinding binding, boolean warnIfNotAlreadyGenerated) {
     provisionBindings.tryRegisterBinding(binding, warnIfNotAlreadyGenerated);
+    if (binding.unresolved().isPresent()) {
+      provisionBindings.tryToGenerateBinding(binding.unresolved().get(), warnIfNotAlreadyGenerated);
+    }
   }
 
   /**
@@ -231,6 +229,10 @@
     }
 
     membersInjectionBindings.tryRegisterBinding(binding, warnIfNotAlreadyGenerated);
+    if (binding.unresolved().isPresent()) {
+      membersInjectionBindings.tryToGenerateBinding(
+          binding.unresolved().get(), warnIfNotAlreadyGenerated);
+    }
   }
 
   @Override
@@ -253,16 +255,15 @@
 
     ValidationReport<TypeElement> report = injectValidator.validateConstructor(constructorElement);
     report.printMessagesTo(messager);
-    if (!report.isClean()) {
-      return Optional.empty();
+    if (report.isClean()) {
+      ProvisionBinding binding = bindingFactory.injectionBinding(constructorElement, resolvedType);
+      registerBinding(binding, warnIfNotAlreadyGenerated);
+      if (!binding.injectionSites().isEmpty()) {
+        tryRegisterMembersInjectedType(typeElement, resolvedType, warnIfNotAlreadyGenerated);
+      }
+      return Optional.of(binding);
     }
-
-    ProvisionBinding binding = bindingFactory.injectionBinding(constructorElement, resolvedType);
-    registerBinding(binding, warnIfNotAlreadyGenerated);
-    if (!binding.injectionSites().isEmpty()) {
-      tryRegisterMembersInjectedType(typeElement, resolvedType, warnIfNotAlreadyGenerated);
-    }
-    return Optional.of(binding);
+    return Optional.empty();
   }
 
   @Override
@@ -285,18 +286,17 @@
     ValidationReport<TypeElement> report =
         injectValidator.validateMembersInjectionType(typeElement);
     report.printMessagesTo(messager);
-    if (!report.isClean()) {
-      return Optional.empty();
+    if (report.isClean()) {
+      MembersInjectionBinding binding = bindingFactory.membersInjectionBinding(type, resolvedType);
+      registerBinding(binding, warnIfNotAlreadyGenerated);
+      for (Optional<DeclaredType> supertype = types.nonObjectSuperclass(type);
+          supertype.isPresent();
+          supertype = types.nonObjectSuperclass(supertype.get())) {
+        getOrFindMembersInjectionBinding(keyFactory.forMembersInjectedType(supertype.get()));
+      }
+      return Optional.of(binding);
     }
-
-    MembersInjectionBinding binding = bindingFactory.membersInjectionBinding(type, resolvedType);
-    registerBinding(binding, warnIfNotAlreadyGenerated);
-    for (Optional<DeclaredType> supertype = types.nonObjectSuperclass(type);
-         supertype.isPresent();
-         supertype = types.nonObjectSuperclass(supertype.get())) {
-      getOrFindMembersInjectionBinding(keyFactory.forMembersInjectedType(supertype.get()));
-    }
-    return Optional.of(binding);
+    return Optional.empty();
   }
 
   @CanIgnoreReturnValue
@@ -352,7 +352,7 @@
     if (!isValidMembersInjectionKey(key)) {
       return Optional.empty();
     }
-    Key membersInjectionKey = keyFactory.forMembersInjectedType(unwrapType(key.type()));
+    Key membersInjectionKey = keyFactory.forMembersInjectedType(types.unwrapType(key.type()));
     return getOrFindMembersInjectionBinding(membersInjectionKey)
         .map(binding -> bindingFactory.membersInjectorBinding(key, binding));
   }
diff --git a/java/dagger/internal/codegen/validation/MonitoringModuleGenerator.java b/java/dagger/internal/codegen/validation/MonitoringModuleGenerator.java
index 1c2eb1c..2c72e5f 100644
--- a/java/dagger/internal/codegen/validation/MonitoringModuleGenerator.java
+++ b/java/dagger/internal/codegen/validation/MonitoringModuleGenerator.java
@@ -26,7 +26,6 @@
 import static javax.lang.model.element.Modifier.PRIVATE;
 import static javax.lang.model.element.Modifier.STATIC;
 
-import com.google.common.collect.ImmutableList;
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.MethodSpec;
 import com.squareup.javapoet.TypeSpec;
@@ -39,6 +38,7 @@
 import dagger.producers.ProductionScope;
 import dagger.producers.monitoring.ProductionComponentMonitor;
 import dagger.producers.monitoring.internal.Monitors;
+import java.util.Optional;
 import javax.annotation.processing.Filer;
 import javax.inject.Inject;
 import javax.lang.model.SourceVersion;
@@ -54,14 +54,19 @@
   }
 
   @Override
+  public ClassName nameGeneratedType(TypeElement componentElement) {
+    return SourceFiles.generatedMonitoringModuleName(componentElement);
+  }
+
+  @Override
   public Element originatingElement(TypeElement componentElement) {
     return componentElement;
   }
 
   @Override
-  public ImmutableList<TypeSpec.Builder> topLevelTypes(TypeElement componentElement) {
-    return ImmutableList.of(
-        classBuilder(SourceFiles.generatedMonitoringModuleName(componentElement))
+  public Optional<TypeSpec.Builder> write(TypeElement componentElement) {
+    return Optional.of(
+        classBuilder(nameGeneratedType(componentElement))
             .addAnnotation(Module.class)
             .addModifiers(ABSTRACT)
             .addMethod(privateConstructor())
diff --git a/java/dagger/internal/codegen/writing/AnnotationCreatorGenerator.java b/java/dagger/internal/codegen/writing/AnnotationCreatorGenerator.java
index fa3a16c..96e6340 100644
--- a/java/dagger/internal/codegen/writing/AnnotationCreatorGenerator.java
+++ b/java/dagger/internal/codegen/writing/AnnotationCreatorGenerator.java
@@ -39,6 +39,7 @@
 import dagger.internal.codegen.base.SourceFileGenerator;
 import dagger.internal.codegen.langmodel.DaggerElements;
 import java.util.LinkedHashSet;
+import java.util.Optional;
 import java.util.Set;
 import javax.annotation.processing.Filer;
 import javax.inject.Inject;
@@ -87,13 +88,18 @@
   }
 
   @Override
+  public ClassName nameGeneratedType(TypeElement annotationType) {
+    return getAnnotationCreatorClassName(annotationType);
+  }
+
+  @Override
   public Element originatingElement(TypeElement annotationType) {
     return annotationType;
   }
 
   @Override
-  public ImmutableList<TypeSpec.Builder> topLevelTypes(TypeElement annotationType) {
-    ClassName generatedTypeName = getAnnotationCreatorClassName(annotationType);
+  public Optional<TypeSpec.Builder> write(TypeElement annotationType) {
+    ClassName generatedTypeName = nameGeneratedType(annotationType);
     TypeSpec.Builder annotationCreatorBuilder =
         classBuilder(generatedTypeName)
             .addModifiers(PUBLIC, FINAL)
@@ -103,7 +109,7 @@
       annotationCreatorBuilder.addMethod(buildCreateMethod(generatedTypeName, annotationElement));
     }
 
-    return ImmutableList.of(annotationCreatorBuilder);
+    return Optional.of(annotationCreatorBuilder);
   }
 
   private MethodSpec buildCreateMethod(ClassName generatedTypeName, TypeElement annotationElement) {
diff --git a/java/dagger/internal/codegen/writing/AssistedFactoryBindingExpression.java b/java/dagger/internal/codegen/writing/AssistedFactoryBindingExpression.java
index d90ab71..d0c481c 100644
--- a/java/dagger/internal/codegen/writing/AssistedFactoryBindingExpression.java
+++ b/java/dagger/internal/codegen/writing/AssistedFactoryBindingExpression.java
@@ -83,7 +83,7 @@
   private TypeSpec anonymousfactoryImpl(Expression assistedInjectionExpression) {
     TypeElement factory = asType(binding.bindingElement().get());
     DeclaredType factoryType = asDeclared(binding.key().type());
-    ExecutableElement factoryMethod = assistedFactoryMethod(factory, elements);
+    ExecutableElement factoryMethod = assistedFactoryMethod(factory, elements, types);
 
     // We can't use MethodSpec.overriding directly because we need to control the parameter names.
     MethodSpec factoryOverride = MethodSpec.overriding(factoryMethod, factoryType, types).build();
diff --git a/java/dagger/internal/codegen/writing/ComponentBindingExpressions.java b/java/dagger/internal/codegen/writing/ComponentBindingExpressions.java
index dc15c99..5f1f0bd 100644
--- a/java/dagger/internal/codegen/writing/ComponentBindingExpressions.java
+++ b/java/dagger/internal/codegen/writing/ComponentBindingExpressions.java
@@ -212,14 +212,19 @@
   public MethodSpec getComponentMethod(ComponentMethodDescriptor componentMethod) {
     checkArgument(componentMethod.dependencyRequest().isPresent());
     BindingRequest request = bindingRequest(componentMethod.dependencyRequest().get());
-    return MethodSpec.overriding(
+    MethodSpec.Builder method =
+        MethodSpec.overriding(
             componentMethod.methodElement(),
             MoreTypes.asDeclared(graph.componentTypeElement().asType()),
-            types)
-        .addCode(
-            getBindingExpression(request)
-                .getComponentMethodImplementation(componentMethod, componentImplementation))
-        .build();
+            types);
+    // Even though this is not used if the method is abstract, we need to invoke the binding
+    // expression in order for the side of effect of the method being added to the
+    // ComponentImplementation
+    CodeBlock methodBody =
+        getBindingExpression(request)
+            .getComponentMethodImplementation(componentMethod, componentImplementation);
+
+    return method.addCode(methodBody).build();
   }
 
   /** Returns the {@link BindingExpression} for the given {@link BindingRequest}. */
@@ -455,7 +460,8 @@
   private BindingExpression providerBindingExpression(ContributionBinding binding) {
     if (binding.kind().equals(DELEGATE) && !needsCaching(binding)) {
       return new DelegateBindingExpression(binding, RequestKind.PROVIDER, this, types, elements);
-    } else if (isFastInit()
+    } else if (compilerOptions.fastInit(
+            topLevelComponentImplementation.componentDescriptor().typeElement())
         && frameworkInstanceCreationExpression(binding).useInnerSwitchingProvider()
         && !(instanceBindingExpression(binding)
             instanceof DerivedFromFrameworkInstanceBindingExpression)) {
@@ -487,27 +493,24 @@
 
   /**
    * Returns a binding expression for {@link RequestKind#INSTANCE} requests.
+   *
+   * <p>If there is a direct expression (not calling {@link Provider#get()}) we can use for an
+   * instance of this binding, return it, wrapped in a method if the binding {@linkplain
+   * #needsCaching(ContributionBinding) needs to be cached} or the expression has dependencies.
+   *
+   * <p>In fastInit mode, we can use direct expressions unless the binding needs to be cached.
    */
   private BindingExpression instanceBindingExpression(ContributionBinding binding) {
     Optional<BindingExpression> maybeDirectInstanceExpression =
         unscopedDirectInstanceExpression(binding);
-    if (maybeDirectInstanceExpression.isPresent()) {
-      // If this is the case where we don't need to use Provider#get() because there's no caching
-      // and it isn't an assisted factory, or because we're in fastInit mode (since fastInit avoids
-      // using Providers), we can try to use the direct expression, possibly wrapped in a method
-      // if necessary (e.g. it has dependencies).
-      if ((!needsCaching(binding) && binding.kind() != BindingKind.ASSISTED_FACTORY)
-          || isFastInit()) {
-        BindingExpression directInstanceExpression = maybeDirectInstanceExpression.get();
-        // While this can't require caching in default mode, if we're in fastInit mode and we need
-        // caching we also need to wrap it in a method.
-        return directInstanceExpression.requiresMethodEncapsulation() || needsCaching(binding)
-            ? wrapInMethod(
-                binding,
-                bindingRequest(binding.key(), RequestKind.INSTANCE),
-                directInstanceExpression)
-            : directInstanceExpression;
-      }
+    if (canUseDirectInstanceExpression(binding) && maybeDirectInstanceExpression.isPresent()) {
+      BindingExpression directInstanceExpression = maybeDirectInstanceExpression.get();
+      return directInstanceExpression.requiresMethodEncapsulation() || needsCaching(binding)
+          ? wrapInMethod(
+              binding,
+              bindingRequest(binding.key(), RequestKind.INSTANCE),
+              directInstanceExpression)
+          : directInstanceExpression;
     }
     return new DerivedFromFrameworkInstanceBindingExpression(
         binding.key(), FrameworkType.PROVIDER, RequestKind.INSTANCE, this, types);
@@ -607,12 +610,27 @@
    * MapFactory} or {@code SetFactory}.
    */
   private boolean useStaticFactoryCreation(ContributionBinding binding) {
-    return !isFastInit()
+    return !compilerOptions.fastInit(
+            topLevelComponentImplementation.componentDescriptor().typeElement())
         || binding.kind().equals(MULTIBOUND_MAP)
         || binding.kind().equals(MULTIBOUND_SET);
   }
 
   /**
+   * Returns {@code true} if we can use a direct (not {@code Provider.get()}) expression for this
+   * binding. If the binding doesn't {@linkplain #needsCaching(ContributionBinding) need to be
+   * cached} and the binding is not an {@link BindingKind.ASSISTED_FACTORY}, we can.
+   *
+   * <p>In fastInit mode, we can use a direct expression even if the binding {@linkplain
+   * #needsCaching(ContributionBinding) needs to be cached}.
+   */
+  private boolean canUseDirectInstanceExpression(ContributionBinding binding) {
+    return (!needsCaching(binding) && binding.kind() != BindingKind.ASSISTED_FACTORY)
+        || compilerOptions.fastInit(
+            topLevelComponentImplementation.componentDescriptor().typeElement());
+  }
+
+  /**
    * Returns a binding expression that uses a given one as the body of a method that users call. If
    * a component provision method matches it, it will be the method implemented. If it does not
    * match a component provision method and the binding is modifiable, then a new public modifiable
@@ -672,7 +690,8 @@
 
   private MethodImplementationStrategy methodImplementationStrategy(
       ContributionBinding binding, BindingRequest request) {
-    if (isFastInit()) {
+    if (compilerOptions.fastInit(
+        topLevelComponentImplementation.componentDescriptor().typeElement())) {
       if (request.isRequestKind(RequestKind.PROVIDER)) {
         return MethodImplementationStrategy.SINGLE_CHECK;
       } else if (request.isRequestKind(RequestKind.INSTANCE) && needsCaching(binding)) {
@@ -699,9 +718,4 @@
     }
     return true;
   }
-
-  private boolean isFastInit() {
-    return compilerOptions.fastInit(
-        topLevelComponentImplementation.componentDescriptor().typeElement());
-  }
 }
diff --git a/java/dagger/internal/codegen/writing/ComponentImplementation.java b/java/dagger/internal/codegen/writing/ComponentImplementation.java
index a09620e..ef69124 100644
--- a/java/dagger/internal/codegen/writing/ComponentImplementation.java
+++ b/java/dagger/internal/codegen/writing/ComponentImplementation.java
@@ -276,10 +276,7 @@
         "%s is not a child component of %s",
         childDescriptor.typeElement(),
         componentDescriptor().typeElement());
-    // TODO(erichang): Hacky fix to shorten the suffix if we're too deeply
-    // nested to save on file name length. 2 chosen arbitrarily.
-    String suffix = name.simpleNames().size() > 2 ? "I" : "Impl";
-    return name.nestedClass(subcomponentNames.get(childDescriptor) + suffix);
+    return name.nestedClass(subcomponentNames.get(childDescriptor) + "Impl");
   }
 
   /**
diff --git a/java/dagger/internal/codegen/writing/DependencyMethodProviderCreationExpression.java b/java/dagger/internal/codegen/writing/DependencyMethodProviderCreationExpression.java
index af5d45e..5a40c02 100644
--- a/java/dagger/internal/codegen/writing/DependencyMethodProviderCreationExpression.java
+++ b/java/dagger/internal/codegen/writing/DependencyMethodProviderCreationExpression.java
@@ -96,7 +96,7 @@
         COMPONENT_PROVISION_FACTORY,
         classBuilder(factoryClassName())
             .addSuperinterface(providerOf(keyType))
-            .addModifiers(PRIVATE, STATIC, FINAL)
+            .addModifiers(PRIVATE, STATIC)
             .addField(dependencyClassName, dependency().variableName(), PRIVATE, FINAL)
             .addMethod(
                 constructorBuilder()
diff --git a/java/dagger/internal/codegen/writing/FactoryGenerator.java b/java/dagger/internal/codegen/writing/FactoryGenerator.java
index 03ad27c..70edd1a 100644
--- a/java/dagger/internal/codegen/writing/FactoryGenerator.java
+++ b/java/dagger/internal/codegen/writing/FactoryGenerator.java
@@ -97,27 +97,32 @@
   }
 
   @Override
+  public ClassName nameGeneratedType(ProvisionBinding binding) {
+    return generatedClassNameForBinding(binding);
+  }
+
+  @Override
   public Element originatingElement(ProvisionBinding binding) {
     // we only create factories for bindings that have a binding element
     return binding.bindingElement().get();
   }
 
   @Override
-  public ImmutableList<TypeSpec.Builder> topLevelTypes(ProvisionBinding binding) {
+  public Optional<TypeSpec.Builder> write(ProvisionBinding binding) {
     // We don't want to write out resolved bindings -- we want to write out the generic version.
     checkArgument(!binding.unresolved().isPresent());
     checkArgument(binding.bindingElement().isPresent());
 
     if (binding.factoryCreationStrategy().equals(DELEGATE)) {
-      return ImmutableList.of();
+      return Optional.empty();
     }
 
-    return ImmutableList.of(factoryBuilder(binding));
+    return Optional.of(factoryBuilder(binding));
   }
 
   private TypeSpec.Builder factoryBuilder(ProvisionBinding binding) {
     TypeSpec.Builder factoryBuilder =
-        classBuilder(generatedClassNameForBinding(binding))
+        classBuilder(nameGeneratedType(binding))
             .addModifiers(PUBLIC, FINAL)
             .addTypeVariables(bindingTypeElementTypeVariableNames(binding));
 
@@ -189,9 +194,8 @@
     switch (binding.factoryCreationStrategy()) {
       case SINGLETON_INSTANCE:
         FieldSpec.Builder instanceFieldBuilder =
-            FieldSpec.builder(
-                    generatedClassNameForBinding(binding), "INSTANCE", PRIVATE, STATIC, FINAL)
-                .initializer("new $T()", generatedClassNameForBinding(binding));
+            FieldSpec.builder(nameGeneratedType(binding), "INSTANCE", PRIVATE, STATIC, FINAL)
+                .initializer("new $T()", nameGeneratedType(binding));
 
         if (!bindingTypeElementTypeVariableNames(binding).isEmpty()) {
           // If the factory has type parameters, ignore them in the field declaration & initializer
@@ -199,8 +203,7 @@
           createMethodBuilder.addAnnotation(suppressWarnings(UNCHECKED));
         }
 
-        ClassName instanceHolderName =
-            generatedClassNameForBinding(binding).nestedClass("InstanceHolder");
+        ClassName instanceHolderName = nameGeneratedType(binding).nestedClass("InstanceHolder");
         createMethodBuilder.addStatement("return $T.INSTANCE", instanceHolderName);
         factoryBuilder.addType(
             TypeSpec.classBuilder(instanceHolderName)
@@ -245,7 +248,7 @@
             request ->
                 frameworkTypeUsageStatement(
                     CodeBlock.of("$N", frameworkFields.get(request)), request.kind()),
-            generatedClassNameForBinding(binding),
+            nameGeneratedType(binding),
             moduleParameter(binding).map(module -> CodeBlock.of("$N", module)),
             compilerOptions,
             metadataUtil);
@@ -262,7 +265,7 @@
           .addCode(
               InjectionSiteMethod.invokeAll(
                   binding.injectionSites(),
-                  generatedClassNameForBinding(binding),
+                  nameGeneratedType(binding),
                   instance,
                   binding.key().type(),
                   frameworkFieldUsages(binding.dependencies(), frameworkFields)::get,
diff --git a/java/dagger/internal/codegen/writing/HjarSourceFileGenerator.java b/java/dagger/internal/codegen/writing/HjarSourceFileGenerator.java
index d4dbde7..5a4b6f1 100644
--- a/java/dagger/internal/codegen/writing/HjarSourceFileGenerator.java
+++ b/java/dagger/internal/codegen/writing/HjarSourceFileGenerator.java
@@ -19,15 +19,14 @@
 import static com.squareup.javapoet.MethodSpec.constructorBuilder;
 import static com.squareup.javapoet.MethodSpec.methodBuilder;
 import static com.squareup.javapoet.TypeSpec.classBuilder;
-import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList;
 import static javax.lang.model.element.Modifier.PRIVATE;
 
-import com.google.common.collect.ImmutableList;
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.FieldSpec;
 import com.squareup.javapoet.MethodSpec;
 import com.squareup.javapoet.TypeSpec;
 import dagger.internal.codegen.base.SourceFileGenerator;
+import java.util.Optional;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.Modifier;
 
@@ -48,15 +47,18 @@
   }
 
   @Override
+  public ClassName nameGeneratedType(T input) {
+    return delegate.nameGeneratedType(input);
+  }
+
+  @Override
   public Element originatingElement(T input) {
     return delegate.originatingElement(input);
   }
 
   @Override
-  public ImmutableList<TypeSpec.Builder> topLevelTypes(T input) {
-    return delegate.topLevelTypes(input).stream()
-        .map(completeType -> skeletonType(completeType.build()))
-        .collect(toImmutableList());
+  public Optional<TypeSpec.Builder> write(T input) {
+    return delegate.write(input).map(completeType -> skeletonType(completeType.build()));
   }
 
   private TypeSpec.Builder skeletonType(TypeSpec completeType) {
diff --git a/java/dagger/internal/codegen/writing/InaccessibleMapKeyProxyGenerator.java b/java/dagger/internal/codegen/writing/InaccessibleMapKeyProxyGenerator.java
index 889f898..d527359 100644
--- a/java/dagger/internal/codegen/writing/InaccessibleMapKeyProxyGenerator.java
+++ b/java/dagger/internal/codegen/writing/InaccessibleMapKeyProxyGenerator.java
@@ -22,13 +22,14 @@
 import static javax.lang.model.element.Modifier.PRIVATE;
 import static javax.lang.model.element.Modifier.PUBLIC;
 
-import com.google.common.collect.ImmutableList;
+import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.TypeSpec;
 import dagger.internal.codegen.base.SourceFileGenerator;
 import dagger.internal.codegen.binding.ContributionBinding;
 import dagger.internal.codegen.binding.MapKeys;
 import dagger.internal.codegen.langmodel.DaggerElements;
 import dagger.internal.codegen.langmodel.DaggerTypes;
+import java.util.Optional;
 import javax.annotation.processing.Filer;
 import javax.inject.Inject;
 import javax.lang.model.SourceVersion;
@@ -52,21 +53,24 @@
   }
 
   @Override
+  public ClassName nameGeneratedType(ContributionBinding binding) {
+    return MapKeys.mapKeyProxyClassName(binding);
+  }
+
+  @Override
   public Element originatingElement(ContributionBinding binding) {
     // a map key is only ever present on bindings that have a binding element
     return binding.bindingElement().get();
   }
 
   @Override
-  public ImmutableList<TypeSpec.Builder> topLevelTypes(ContributionBinding binding) {
+  public Optional<TypeSpec.Builder> write(ContributionBinding binding) {
     return MapKeys.mapKeyFactoryMethod(binding, types, elements)
         .map(
             method ->
-                classBuilder(MapKeys.mapKeyProxyClassName(binding))
+                classBuilder(nameGeneratedType(binding))
                     .addModifiers(PUBLIC, FINAL)
                     .addMethod(constructorBuilder().addModifiers(PRIVATE).build())
-                    .addMethod(method))
-        .map(ImmutableList::of)
-        .orElse(ImmutableList.of());
+                    .addMethod(method));
   }
 }
diff --git a/java/dagger/internal/codegen/writing/MembersInjectorGenerator.java b/java/dagger/internal/codegen/writing/MembersInjectorGenerator.java
index 8630ce6..df618b0 100644
--- a/java/dagger/internal/codegen/writing/MembersInjectorGenerator.java
+++ b/java/dagger/internal/codegen/writing/MembersInjectorGenerator.java
@@ -61,6 +61,7 @@
 import dagger.internal.codegen.writing.InjectionMethods.InjectionSiteMethod;
 import dagger.model.DependencyRequest;
 import java.util.Map.Entry;
+import java.util.Optional;
 import javax.annotation.processing.Filer;
 import javax.inject.Inject;
 import javax.lang.model.SourceVersion;
@@ -86,15 +87,20 @@
   }
 
   @Override
+  public ClassName nameGeneratedType(MembersInjectionBinding binding) {
+    return membersInjectorNameForType(binding.membersInjectedType());
+  }
+
+  @Override
   public Element originatingElement(MembersInjectionBinding binding) {
     return binding.membersInjectedType();
   }
 
   @Override
-  public ImmutableList<TypeSpec.Builder> topLevelTypes(MembersInjectionBinding binding) {
+  public Optional<TypeSpec.Builder> write(MembersInjectionBinding binding) {
     // Empty members injection bindings are special and don't need source files.
     if (binding.injectionSites().isEmpty()) {
-      return ImmutableList.of();
+      return Optional.empty();
     }
 
     // Members injectors for classes with no local injection sites and no @Inject
@@ -102,7 +108,7 @@
     if (!binding.hasLocalInjectionSites()
         && injectedConstructors(binding.membersInjectedType()).isEmpty()
         && assistedInjectedConstructors(binding.membersInjectedType()).isEmpty()) {
-      return ImmutableList.of();
+      return Optional.empty();
     }
 
 
@@ -112,7 +118,7 @@
         "tried to generate a MembersInjector for a binding of a resolved generic type: %s",
         binding);
 
-    ClassName generatedTypeName = membersInjectorNameForType(binding.membersInjectedType());
+    ClassName generatedTypeName = nameGeneratedType(binding);
     ImmutableList<TypeVariableName> typeParameters = bindingTypeElementTypeVariableNames(binding);
     TypeSpec.Builder injectorTypeBuilder =
         classBuilder(generatedTypeName)
@@ -216,6 +222,6 @@
 
     gwtIncompatibleAnnotation(binding).ifPresent(injectorTypeBuilder::addAnnotation);
 
-    return ImmutableList.of(injectorTypeBuilder);
+    return Optional.of(injectorTypeBuilder);
   }
 }
diff --git a/java/dagger/internal/codegen/writing/ModuleProxies.java b/java/dagger/internal/codegen/writing/ModuleProxies.java
index 6d174f8..fcd9b56 100644
--- a/java/dagger/internal/codegen/writing/ModuleProxies.java
+++ b/java/dagger/internal/codegen/writing/ModuleProxies.java
@@ -27,7 +27,6 @@
 import static javax.lang.model.element.Modifier.STATIC;
 import static javax.lang.model.util.ElementFilter.constructorsIn;
 
-import com.google.common.collect.ImmutableList;
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.CodeBlock;
 import com.squareup.javapoet.TypeSpec;
@@ -79,20 +78,25 @@
     }
 
     @Override
+    public ClassName nameGeneratedType(TypeElement moduleElement) {
+      return moduleProxies.constructorProxyTypeName(moduleElement);
+    }
+
+    @Override
     public Element originatingElement(TypeElement moduleElement) {
       return moduleElement;
     }
 
     @Override
-    public ImmutableList<TypeSpec.Builder> topLevelTypes(TypeElement moduleElement) {
+    public Optional<TypeSpec.Builder> write(TypeElement moduleElement) {
       ModuleKind.checkIsModule(moduleElement, metadataUtil);
       return moduleProxies.nonPublicNullaryConstructor(moduleElement).isPresent()
-          ? ImmutableList.of(buildProxy(moduleElement))
-          : ImmutableList.of();
+          ? Optional.of(buildProxy(moduleElement))
+          : Optional.empty();
     }
 
     private TypeSpec.Builder buildProxy(TypeElement moduleElement) {
-      return classBuilder(moduleProxies.constructorProxyTypeName(moduleElement))
+      return classBuilder(nameGeneratedType(moduleElement))
           .addModifiers(PUBLIC, FINAL)
           .addMethod(constructorBuilder().addModifiers(PRIVATE).build())
           .addMethod(
diff --git a/java/dagger/internal/codegen/writing/ProducerFactoryGenerator.java b/java/dagger/internal/codegen/writing/ProducerFactoryGenerator.java
index a013be9..5e52923 100644
--- a/java/dagger/internal/codegen/writing/ProducerFactoryGenerator.java
+++ b/java/dagger/internal/codegen/writing/ProducerFactoryGenerator.java
@@ -103,6 +103,10 @@
     this.keyFactory = keyFactory;
   }
 
+  @Override
+  public ClassName nameGeneratedType(ProductionBinding binding) {
+    return generatedClassNameForBinding(binding);
+  }
 
   @Override
   public Element originatingElement(ProductionBinding binding) {
@@ -111,7 +115,7 @@
   }
 
   @Override
-  public ImmutableList<TypeSpec.Builder> topLevelTypes(ProductionBinding binding) {
+  public Optional<TypeSpec.Builder> write(ProductionBinding binding) {
     // We don't want to write out resolved bindings -- we want to write out the generic version.
     checkArgument(!binding.unresolved().isPresent());
     checkArgument(binding.bindingElement().isPresent());
@@ -119,7 +123,7 @@
     TypeName providedTypeName = TypeName.get(binding.contributedType());
     TypeName futureTypeName = listenableFutureOf(providedTypeName);
 
-    ClassName generatedTypeName = generatedClassNameForBinding(binding);
+    ClassName generatedTypeName = nameGeneratedType(binding);
     TypeSpec.Builder factoryBuilder =
         classBuilder(generatedTypeName)
             .addModifiers(PUBLIC, FINAL)
@@ -229,7 +233,7 @@
     gwtIncompatibleAnnotation(binding).ifPresent(factoryBuilder::addAnnotation);
 
     // TODO(gak): write a sensible toString
-    return ImmutableList.of(factoryBuilder);
+    return Optional.of(factoryBuilder);
   }
 
   private MethodSpec staticFactoryMethod(ProductionBinding binding, MethodSpec constructor) {
diff --git a/javatests/artifacts/dagger-android/simple/build.gradle b/javatests/artifacts/dagger-android/simple/build.gradle
index d29aa0c..8c179e5 100644
--- a/javatests/artifacts/dagger-android/simple/build.gradle
+++ b/javatests/artifacts/dagger-android/simple/build.gradle
@@ -34,20 +34,5 @@
       mavenCentral()
       mavenLocal()
     }
-    // TODO(bcorso): Consider organizing all projects under a single project
-    // that share a build.gradle configuration to reduce the copy-paste.
-    // Local tests: Adds logs for individual local tests
-    tasks.withType(Test) {
-        testLogging {
-            exceptionFormat "full"
-            showCauses true
-            showExceptions true
-            showStackTraces true
-            showStandardStreams true
-            events = ["passed", "skipped", "failed", "standardOut", "standardError"]
-        }
-    }
 }
 
-// Instrumentation tests: Combines test reports for all modules
-apply plugin: 'android-reporting'
diff --git a/javatests/artifacts/hilt-android/gradleConfigCache/app/build.gradle b/javatests/artifacts/hilt-android/gradleConfigCache/app/build.gradle
index 4f21d0a..43ccd1d 100644
--- a/javatests/artifacts/hilt-android/gradleConfigCache/app/build.gradle
+++ b/javatests/artifacts/hilt-android/gradleConfigCache/app/build.gradle
@@ -38,9 +38,6 @@
     kotlinOptions {
         jvmTarget = '1.8'
     }
-    lintOptions {
-        checkReleaseBuilds = false
-    }
     testOptions {
         unitTests.includeAndroidResources = true
     }
@@ -48,7 +45,6 @@
 
 hilt {
     enableTransformForLocalTests = true
-    enableExperimentalClasspathAggregation = true
 }
 
 dependencies {
diff --git a/javatests/artifacts/hilt-android/gradleConfigCache/build.gradle b/javatests/artifacts/hilt-android/gradleConfigCache/build.gradle
index de0566c..3b0cdde 100644
--- a/javatests/artifacts/hilt-android/gradleConfigCache/build.gradle
+++ b/javatests/artifacts/hilt-android/gradleConfigCache/build.gradle
@@ -38,20 +38,4 @@
       mavenCentral()
       mavenLocal()
     }
-    // TODO(bcorso): Consider organizing all projects under a single project
-    // that share a build.gradle configuration to reduce the copy-paste.
-    // Local tests: Adds logs for individual local tests
-    tasks.withType(Test) {
-        testLogging {
-            exceptionFormat "full"
-            showCauses true
-            showExceptions true
-            showStackTraces true
-            showStandardStreams true
-            events = ["passed", "skipped", "failed", "standardOut", "standardError"]
-        }
-    }
 }
-
-// Instrumentation tests: Combines test reports for all modules
-apply plugin: 'android-reporting'
\ No newline at end of file
diff --git a/javatests/artifacts/hilt-android/simple/app/build.gradle b/javatests/artifacts/hilt-android/simple/app/build.gradle
index 1d76ec2..98b79e1 100644
--- a/javatests/artifacts/hilt-android/simple/app/build.gradle
+++ b/javatests/artifacts/hilt-android/simple/app/build.gradle
@@ -97,6 +97,7 @@
 
   // To help us catch version skew related issues in hilt extensions.
   // TODO(bcorso): Add examples testing the actual API.
+  implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01'
   implementation 'androidx.hilt:hilt-work:1.0.0-alpha01'
   annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
   testAnnotationProcessor 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
diff --git a/javatests/artifacts/hilt-android/simple/app/src/androidTest/java/dagger/hilt/android/simple/CustomTestApplicationTest.java b/javatests/artifacts/hilt-android/simple/app/src/androidTest/java/dagger/hilt/android/simple/CustomTestApplicationTest.java
deleted file mode 100644
index de2e37a..0000000
--- a/javatests/artifacts/hilt-android/simple/app/src/androidTest/java/dagger/hilt/android/simple/CustomTestApplicationTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android.simple;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.simple.BaseTestApplication.Foo;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/** Tests {@link dagger.hilt.android.testing.CustomTestApplication}. */
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-public final class CustomTestApplicationTest {
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Test
-  public void testApplicationBaseClass() throws Exception {
-    assertThat((Context) getApplicationContext()).isInstanceOf(BaseTestApplication.class);
-  }
-
-  @Test
-  public void testEarlyEntryPoint() throws Exception {
-    BaseTestApplication app = (BaseTestApplication) getApplicationContext();
-
-    // Assert that all scoped Foo instances from EarlyEntryPoint are equal
-    Foo earlyFoo = app.earlyFoo();
-    Foo lazyEarlyFoo1 = app.lazyEarlyFoo();
-    Foo lazyEarlyFoo2 = app.lazyEarlyFoo();
-    assertThat(earlyFoo).isNotNull();
-    assertThat(lazyEarlyFoo1).isNotNull();
-    assertThat(lazyEarlyFoo2).isNotNull();
-    assertThat(earlyFoo).isEqualTo(lazyEarlyFoo1);
-    assertThat(earlyFoo).isEqualTo(lazyEarlyFoo2);
-
-    // Assert that all scoped Foo instances from EntryPoint are equal
-    Foo lazyFoo1 = app.lazyFoo();
-    Foo lazyFoo2 = app.lazyFoo();
-    assertThat(lazyFoo1).isNotNull();
-    assertThat(lazyFoo2).isNotNull();
-    assertThat(lazyFoo1).isEqualTo(lazyFoo2);
-
-    // Assert that scoped Foo instances from EarlyEntryPoint and EntryPoint are not equal
-    assertThat(earlyFoo).isNotEqualTo(lazyFoo1);
-  }
-}
diff --git a/javatests/artifacts/hilt-android/simple/app/src/androidTest/java/dagger/hilt/android/simple/SimpleEmulatorTestRunner.java b/javatests/artifacts/hilt-android/simple/app/src/androidTest/java/dagger/hilt/android/simple/SimpleEmulatorTestRunner.java
index 8d4913b..6ee721c 100644
--- a/javatests/artifacts/hilt-android/simple/app/src/androidTest/java/dagger/hilt/android/simple/SimpleEmulatorTestRunner.java
+++ b/javatests/artifacts/hilt-android/simple/app/src/androidTest/java/dagger/hilt/android/simple/SimpleEmulatorTestRunner.java
@@ -19,15 +19,14 @@
 import android.app.Application;
 import android.content.Context;
 import androidx.test.runner.AndroidJUnitRunner;
-import dagger.hilt.android.testing.CustomTestApplication;
+import dagger.hilt.android.testing.HiltTestApplication;
 
 /** A custom runner to setup the emulator application class for tests. */
-@CustomTestApplication(BaseTestApplication.class)
 public final class SimpleEmulatorTestRunner extends AndroidJUnitRunner {
 
   @Override
   public Application newApplication(ClassLoader cl, String className, Context context)
       throws ClassNotFoundException, IllegalAccessException, InstantiationException {
-    return super.newApplication(cl, SimpleEmulatorTestRunner_Application.class.getName(), context);
+    return super.newApplication(cl, HiltTestApplication.class.getName(), context);
   }
 }
diff --git a/javatests/artifacts/hilt-android/simple/app/src/sharedTest/java/dagger/hilt/android/simple/BaseTestApplication.java b/javatests/artifacts/hilt-android/simple/app/src/sharedTest/java/dagger/hilt/android/simple/BaseTestApplication.java
deleted file mode 100644
index 7af0cb3..0000000
--- a/javatests/artifacts/hilt-android/simple/app/src/sharedTest/java/dagger/hilt/android/simple/BaseTestApplication.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android.simple;
-
-import android.app.Application;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.EarlyEntryPoint;
-import dagger.hilt.android.EarlyEntryPoints;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/** A custom application used to test @EarlyEntryPoint */
-public class BaseTestApplication extends Application {
-  @EarlyEntryPoint
-  @InstallIn(SingletonComponent.class)
-  interface EarlyFooEntryPoint {
-    Foo earlyFoo();
-  }
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  interface FooEntryPoint {
-    Foo lazyFoo();
-  }
-
-  @Singleton
-  public static final class Foo {
-    @Inject
-    Foo() {}
-  }
-
-  private Foo earlyFoo;
-
-  @Override
-  public void onCreate() {
-    super.onCreate();
-    earlyFoo = EarlyEntryPoints.get(this, EarlyFooEntryPoint.class).earlyFoo();
-  }
-
-  public Foo earlyFoo() {
-    return earlyFoo;
-  }
-
-  public Foo lazyEarlyFoo() {
-    return EarlyEntryPoints.get(this, EarlyFooEntryPoint.class).earlyFoo();
-  }
-
-  public Foo lazyFoo() {
-    return EntryPoints.get(this, FooEntryPoint.class).lazyFoo();
-  }
-}
diff --git a/javatests/artifacts/hilt-android/simple/app/src/test/java/dagger/hilt/android/simple/CustomTestApplicationTest.java b/javatests/artifacts/hilt-android/simple/app/src/test/java/dagger/hilt/android/simple/CustomTestApplicationTest.java
deleted file mode 100644
index 8c7f73f..0000000
--- a/javatests/artifacts/hilt-android/simple/app/src/test/java/dagger/hilt/android/simple/CustomTestApplicationTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android.simple;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.simple.BaseTestApplication.Foo;
-import dagger.hilt.android.testing.CustomTestApplication;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-/** Tests {@link dagger.hilt.android.testing.CustomTestApplication}. */
-@CustomTestApplication(BaseTestApplication.class)
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = CustomTestApplicationTest_Application.class)
-public final class CustomTestApplicationTest {
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Test
-  public void testApplicationBaseClass() throws Exception {
-    assertThat((Context) getApplicationContext()).isInstanceOf(BaseTestApplication.class);
-  }
-
-  @Test
-  public void testEarlyEntryPoint() throws Exception {
-    BaseTestApplication app = (BaseTestApplication) getApplicationContext();
-
-    // Assert that all scoped Foo instances from EarlyEntryPoint are equal
-    Foo earlyFoo = app.earlyFoo();
-    Foo lazyEarlyFoo1 = app.lazyEarlyFoo();
-    Foo lazyEarlyFoo2 = app.lazyEarlyFoo();
-    assertThat(earlyFoo).isNotNull();
-    assertThat(lazyEarlyFoo1).isNotNull();
-    assertThat(lazyEarlyFoo2).isNotNull();
-    assertThat(earlyFoo).isEqualTo(lazyEarlyFoo1);
-    assertThat(earlyFoo).isEqualTo(lazyEarlyFoo2);
-
-    // Assert that all scoped Foo instances from EntryPoint are equal
-    Foo lazyFoo1 = app.lazyFoo();
-    Foo lazyFoo2 = app.lazyFoo();
-    assertThat(lazyFoo1).isNotNull();
-    assertThat(lazyFoo2).isNotNull();
-    assertThat(lazyFoo1).isEqualTo(lazyFoo2);
-
-    // Assert that scoped Foo instances from EarlyEntryPoint and EntryPoint are not equal
-    assertThat(earlyFoo).isNotEqualTo(lazyFoo1);
-  }
-}
diff --git a/javatests/artifacts/hilt-android/simple/build.gradle b/javatests/artifacts/hilt-android/simple/build.gradle
index 59336bc..770fabd 100644
--- a/javatests/artifacts/hilt-android/simple/build.gradle
+++ b/javatests/artifacts/hilt-android/simple/build.gradle
@@ -39,20 +39,4 @@
       mavenCentral()
       mavenLocal()
     }
-    // TODO(bcorso): Consider organizing all projects under a single project
-    // that share a build.gradle configuration to reduce the copy-paste.
-    // Local tests: Adds logs for individual local tests
-    tasks.withType(Test) {
-        testLogging {
-            exceptionFormat "full"
-            showCauses true
-            showExceptions true
-            showStackTraces true
-            showStandardStreams true
-            events = ["passed", "skipped", "failed", "standardOut", "standardError"]
-        }
-    }
 }
-
-// Instrumentation tests: Combines test reports for all modules
-apply plugin: 'android-reporting'
diff --git a/javatests/artifacts/hilt-android/simpleKotlin/build.gradle b/javatests/artifacts/hilt-android/simpleKotlin/build.gradle
index e7eb9b2..d594476 100644
--- a/javatests/artifacts/hilt-android/simpleKotlin/build.gradle
+++ b/javatests/artifacts/hilt-android/simpleKotlin/build.gradle
@@ -38,17 +38,4 @@
       mavenCentral()
       mavenLocal()
     }
-    // TODO(bcorso): Consider organizing all projects under a single project
-    // that share a build.gradle configuration to reduce the copy-paste.
-    // Local tests: Adds logs for individual local tests
-    tasks.withType(Test) {
-        testLogging {
-            exceptionFormat "full"
-            showCauses true
-            showExceptions true
-            showStackTraces true
-            showStandardStreams true
-            events = ["passed", "skipped", "failed", "standardOut", "standardError"]
-        }
-    }
 }
diff --git a/javatests/dagger/android/AndroidInjectionTest.java b/javatests/dagger/android/AndroidInjectionTest.java
index 499e981..7e60ebd 100644
--- a/javatests/dagger/android/AndroidInjectionTest.java
+++ b/javatests/dagger/android/AndroidInjectionTest.java
@@ -23,19 +23,16 @@
 import android.app.Activity;
 import android.app.Application;
 import android.app.Fragment;
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.LooperMode;
 import org.robolectric.util.FragmentTestUtil;
 
 @LooperMode(LEGACY)
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P)
+@RunWith(RobolectricTestRunner.class)
 public final class AndroidInjectionTest {
 
   // Most positive tests are performed in javatests/dagger/android/support/functional, but
diff --git a/javatests/dagger/android/AndroidProguardTest.java b/javatests/dagger/android/AndroidProguardTest.java
index 899d1f5..0f51e49 100644
--- a/javatests/dagger/android/AndroidProguardTest.java
+++ b/javatests/dagger/android/AndroidProguardTest.java
@@ -18,17 +18,13 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
 import dagger.android.internal.AndroidInjectionKeys;
 import java.net.URL;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
+import org.robolectric.RobolectricTestRunner;
 
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P)
+@RunWith(RobolectricTestRunner.class)
 public class AndroidProguardTest {
 
   @Test
diff --git a/javatests/dagger/android/DispatchingAndroidInjectorTest.java b/javatests/dagger/android/DispatchingAndroidInjectorTest.java
index 4ae1b07..37d3d61 100644
--- a/javatests/dagger/android/DispatchingAndroidInjectorTest.java
+++ b/javatests/dagger/android/DispatchingAndroidInjectorTest.java
@@ -20,8 +20,6 @@
 import static org.junit.Assert.fail;
 
 import android.app.Activity;
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
 import com.google.common.collect.ImmutableMap;
 import dagger.android.AndroidInjector.Factory;
 import dagger.android.DispatchingAndroidInjector.InvalidInjectorBindingException;
@@ -30,11 +28,9 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
-import org.robolectric.annotation.Config;
+import org.robolectric.RobolectricTestRunner;
 
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P)
+@RunWith(RobolectricTestRunner.class)
 public final class DispatchingAndroidInjectorTest {
   @Test
   public void withClassKeys() {
@@ -112,7 +108,10 @@
       Map<String, Provider<AndroidInjector.Factory<?>>>
           injectorFactoriesWithStringKeys) {
     return new DispatchingAndroidInjector<>(
-        injectorFactoriesWithClassKeys, injectorFactoriesWithStringKeys);
+        injectorFactoriesWithClassKeys,
+        injectorFactoriesWithStringKeys ,
+        ImmutableMap.of(),
+        ImmutableMap.of());
   }
 
   static class FooActivity extends Activity {}
diff --git a/javatests/dagger/android/processor/BUILD b/javatests/dagger/android/processor/BUILD
index c639a41..d7b210c 100644
--- a/javatests/dagger/android/processor/BUILD
+++ b/javatests/dagger/android/processor/BUILD
@@ -36,10 +36,6 @@
         "@google_bazel_common//third_party/java/compile_testing",
         "@google_bazel_common//third_party/java/junit",
         "@google_bazel_common//third_party/java/truth",
-        "@maven//:androidx_activity_activity",
         "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
     ],
 )
diff --git a/javatests/dagger/android/support/AndroidSupportInjectionTest.java b/javatests/dagger/android/support/AndroidSupportInjectionTest.java
index f7d3009..25c5e94 100644
--- a/javatests/dagger/android/support/AndroidSupportInjectionTest.java
+++ b/javatests/dagger/android/support/AndroidSupportInjectionTest.java
@@ -20,25 +20,21 @@
 import static org.junit.Assert.fail;
 
 import android.app.Application;
-import android.os.Build;
 import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
 import dagger.android.AndroidInjector;
 import dagger.android.HasAndroidInjector;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadows.support.v4.SupportFragmentTestUtil;
 
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P)
+@RunWith(RobolectricTestRunner.class)
 public final class AndroidSupportInjectionTest {
   @Test
   public void injectFragment_simpleApplication() {
     Fragment fragment = new Fragment();
-    startFragment(fragment);
+    SupportFragmentTestUtil.startFragment(fragment);
 
     try {
       AndroidSupportInjection.inject(fragment);
@@ -60,7 +56,7 @@
   @Config(application = ApplicationReturnsNull.class)
   public void fragmentInjector_returnsNull() {
     Fragment fragment = new Fragment();
-    startFragment(fragment);
+    SupportFragmentTestUtil.startFragment(fragment);
 
     try {
       AndroidSupportInjection.inject(fragment);
@@ -79,12 +75,4 @@
       assertThat(e).hasMessageThat().contains("fragment");
     }
   }
-
-  void startFragment(Fragment fragment) {
-    Robolectric.setupActivity(FragmentActivity.class)
-        .getSupportFragmentManager()
-        .beginTransaction()
-        .add(fragment, "")
-        .commitNow();
-  }
 }
diff --git a/javatests/dagger/android/support/BUILD b/javatests/dagger/android/support/BUILD
index 2ef1ece..6bbfaa1 100644
--- a/javatests/dagger/android/support/BUILD
+++ b/javatests/dagger/android/support/BUILD
@@ -25,9 +25,6 @@
     srcs = glob(["*.java"]),
     functional = False,
     javacopts = DOCLINT_HTML_AND_SYNTAX,
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
     deps = [
         "//:dagger_with_compiler",
         "//java/dagger/android",
@@ -37,11 +34,7 @@
         "//java/dagger/internal/guava:concurrent",
         "@google_bazel_common//third_party/java/junit",
         "@google_bazel_common//third_party/java/truth",
-        "@maven//:androidx_activity_activity",
         "@maven//:androidx_appcompat_appcompat",
         "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
     ],
 )
diff --git a/javatests/dagger/android/support/functional/AndroidManifest.xml b/javatests/dagger/android/support/functional/AndroidManifest.xml
index 2b40e10..0b5f4cd 100644
--- a/javatests/dagger/android/support/functional/AndroidManifest.xml
+++ b/javatests/dagger/android/support/functional/AndroidManifest.xml
@@ -17,7 +17,7 @@
   package="dagger.android.support.functional">
 
   <!-- Bump targetSdk to 29 when we update to Java 11 -->
-  <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="28" />
+  <uses-sdk android:minSdkVersion="1" android:targetSdkVersion="28" />
 
   <application android:theme="@style/Theme.AppCompat"
       android:name=".UsesGeneratedModulesApplication">
diff --git a/javatests/dagger/android/support/functional/BUILD b/javatests/dagger/android/support/functional/BUILD
index 459d55f..1ae1108 100644
--- a/javatests/dagger/android/support/functional/BUILD
+++ b/javatests/dagger/android/support/functional/BUILD
@@ -29,13 +29,10 @@
     manifest = "AndroidManifest.xml",
     resource_files = glob(["res/**"]),
     deps = [
-        "@maven//:androidx_activity_activity",
         "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
         "@maven//:androidx_appcompat_appcompat",
         "@maven//:androidx_annotation_annotation",
+        "//java/dagger/internal/guava:collect-android",
         "//:dagger_with_compiler",
         "//:android",
         "//:android-support",
@@ -47,22 +44,13 @@
 GenRobolectricTests(
     name = "functional_tests",
     srcs = glob(["*Test.java"]),
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
     deps = [
         ":functional",
         "//:android",
         "//:android-support",
         "//:dagger_with_compiler",
         "@google_bazel_common//third_party/java/truth",
-        "@maven//:androidx_activity_activity",
         "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
-        "@maven//:androidx_test_core",
-        "@maven//:androidx_test_ext_junit",
         "@maven//:junit_junit",
         "@maven//:org_robolectric_robolectric",
     ],
diff --git a/javatests/dagger/android/support/functional/InjectorsTest.java b/javatests/dagger/android/support/functional/InjectorsTest.java
index eef8429..73bb98a 100644
--- a/javatests/dagger/android/support/functional/InjectorsTest.java
+++ b/javatests/dagger/android/support/functional/InjectorsTest.java
@@ -20,19 +20,16 @@
 
 import android.content.Intent;
 import android.content.res.Configuration;
-import android.os.Build;
 import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
 import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
 
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P)
+@RunWith(RobolectricTestRunner.class)
 public class InjectorsTest {
   private ActivityController<TestActivity> activityController;
   private TestActivity activity;
diff --git a/javatests/dagger/functional/assisted/AssistedFactoryAsQualifiedBindingTest.java b/javatests/dagger/functional/assisted/AssistedFactoryAsQualifiedBindingTest.java
deleted file mode 100644
index 494372a..0000000
--- a/javatests/dagger/functional/assisted/AssistedFactoryAsQualifiedBindingTest.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.functional.assisted;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import dagger.Binds;
-import dagger.BindsInstance;
-import dagger.BindsOptionalOf;
-import dagger.Component;
-import dagger.Module;
-import dagger.Provides;
-import dagger.assisted.AssistedFactory;
-import dagger.assisted.AssistedInject;
-import dagger.multibindings.IntoSet;
-import dagger.multibindings.Multibinds;
-import java.lang.annotation.Retention;
-import java.util.Optional;
-import java.util.Set;
-import javax.inject.Inject;
-import javax.inject.Qualifier;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests that qualified assisted types can be provided and injected as normal types. */
-@RunWith(JUnit4.class)
-public final class AssistedFactoryAsQualifiedBindingTest {
-
-  @Qualifier
-  @Retention(RUNTIME)
-  @interface AsComponentDependency {}
-
-  @Qualifier
-  @Retention(RUNTIME)
-  @interface AsProvides {}
-
-  @Qualifier
-  @Retention(RUNTIME)
-  @interface AsBinds {}
-
-  @Qualifier
-  @Retention(RUNTIME)
-  @interface AsOptional {}
-
-  @Qualifier
-  @Retention(RUNTIME)
-  @interface AsMultibinding {}
-
-  @Component(modules = BarFactoryModule.class)
-  interface TestComponent {
-    Foo foo();
-
-    @Component.Factory
-    interface Factory {
-      TestComponent create(
-          @BindsInstance @AsComponentDependency Bar bar,
-          @BindsInstance @AsComponentDependency BarFactory barFactory);
-    }
-  }
-
-  @Module
-  interface BarFactoryModule {
-
-    @Provides
-    @AsProvides
-    static Bar providesBar(@AsComponentDependency Bar bar) {
-      return bar;
-    }
-
-    @Provides
-    @AsProvides
-    static BarFactory providesBarFactory(@AsComponentDependency BarFactory barFactory) {
-      return barFactory;
-    }
-
-    @Binds
-    @AsBinds
-    Bar bindsBar(@AsComponentDependency Bar bar);
-
-    @Binds
-    @AsBinds
-    BarFactory bindsBarFactory(@AsComponentDependency BarFactory barFactory);
-
-    @BindsOptionalOf
-    @AsOptional
-    Bar optionalBar();
-
-    @BindsOptionalOf
-    @AsOptional
-    BarFactory optionalBarFactory();
-
-    @Provides
-    @AsOptional
-    static Bar providesOptionalBar(@AsComponentDependency Bar bar) {
-      return bar;
-    }
-
-    @Provides
-    @AsOptional
-    static BarFactory providesOptionalBarFactory(@AsComponentDependency BarFactory barFactory) {
-      return barFactory;
-    }
-
-    @Multibinds
-    @AsMultibinding
-    Set<Bar> barSet();
-
-    @Multibinds
-    @AsMultibinding
-    Set<BarFactory> barFactorySet();
-
-    @Provides
-    @IntoSet
-    @AsMultibinding
-    static Bar providesMultibindingBar(@AsComponentDependency Bar bar) {
-      return bar;
-    }
-
-    @Provides
-    @IntoSet
-    @AsMultibinding
-    static BarFactory providesMultibindingBarFactory(@AsComponentDependency BarFactory barFactory) {
-      return barFactory;
-    }
-
-    @Multibinds
-    Set<Bar> unqualifiedBarSet();
-
-    @Multibinds
-    Set<BarFactory> unqualifiedBarFactorySet();
-
-    @Provides
-    @IntoSet
-    static Bar providesUnqualifiedMultibindingBar(@AsComponentDependency Bar bar) {
-      return bar;
-    }
-
-    @Provides
-    @IntoSet
-    static BarFactory providesUnqualifiedMultibindingBarFactory(
-        @AsComponentDependency BarFactory barFactory) {
-      return barFactory;
-    }
-  }
-
-  static class Foo {
-    private final BarFactory barFactory;
-    private final Bar barAsComponentDependency;
-    private final BarFactory barFactoryAsComponentDependency;
-    private final Bar barAsProvides;
-    private final BarFactory barFactoryAsProvides;
-    private final Bar barAsBinds;
-    private final BarFactory barFactoryAsBinds;
-    private final Optional<Bar> optionalBar;
-    private final Optional<BarFactory> optionalBarFactory;
-    private final Set<Bar> barSet;
-    private final Set<BarFactory> barFactorySet;
-    private final Set<Bar> unqualifiedBarSet;
-    private final Set<BarFactory> unqualifiedBarFactorySet;
-
-    @Inject
-    Foo(
-        BarFactory barFactory,
-        @AsComponentDependency Bar barAsComponentDependency,
-        @AsComponentDependency BarFactory barFactoryAsComponentDependency,
-        @AsProvides Bar barAsProvides,
-        @AsProvides BarFactory barFactoryAsProvides,
-        @AsBinds Bar barAsBinds,
-        @AsBinds BarFactory barFactoryAsBinds,
-        @AsOptional Optional<Bar> optionalBar,
-        @AsOptional Optional<BarFactory> optionalBarFactory,
-        @AsMultibinding Set<Bar> barSet,
-        @AsMultibinding Set<BarFactory> barFactorySet,
-        Set<Bar> unqualifiedBarSet,
-        Set<BarFactory> unqualifiedBarFactorySet) {
-      this.barFactory = barFactory;
-      this.barAsComponentDependency = barAsComponentDependency;
-      this.barFactoryAsComponentDependency = barFactoryAsComponentDependency;
-      this.barAsProvides = barAsProvides;
-      this.barFactoryAsProvides = barFactoryAsProvides;
-      this.barAsBinds = barAsBinds;
-      this.barFactoryAsBinds = barFactoryAsBinds;
-      this.optionalBar = optionalBar;
-      this.optionalBarFactory = optionalBarFactory;
-      this.barSet = barSet;
-      this.barFactorySet = barFactorySet;
-      this.unqualifiedBarSet = unqualifiedBarSet;
-      this.unqualifiedBarFactorySet = unqualifiedBarFactorySet;
-    }
-  }
-
-  static class Bar {
-    @AssistedInject
-    Bar() {}
-  }
-
-  @AssistedFactory
-  interface BarFactory {
-    Bar create();
-  }
-
-  @Test
-  public void testFoo() {
-    Bar bar = new Bar();
-    BarFactory barFactory = () -> bar;
-    Foo foo =
-        DaggerAssistedFactoryAsQualifiedBindingTest_TestComponent.factory()
-            .create(bar, barFactory)
-            .foo();
-
-    // Test we can inject the "real" BarFactory implemented by Dagger
-    assertThat(foo.barFactory).isNotNull();
-    assertThat(foo.barFactory).isNotEqualTo(barFactory);
-    assertThat(foo.barFactory.create()).isNotEqualTo(bar);
-
-    // Test injection of a qualified Bar/BarFactory with custom @BindsInstance implementation
-    assertThat(foo.barAsComponentDependency).isEqualTo(bar);
-    assertThat(foo.barFactoryAsComponentDependency).isEqualTo(barFactory);
-
-    // Test injection of a qualified Bar/BarFactory with custom @Provides implementation
-    assertThat(foo.barAsProvides).isEqualTo(bar);
-    assertThat(foo.barFactoryAsProvides).isEqualTo(barFactory);
-
-    // Test injection of a qualified Bar/BarFactory with custom @Binds implementation
-    assertThat(foo.barAsBinds).isEqualTo(bar);
-    assertThat(foo.barFactoryAsBinds).isEqualTo(barFactory);
-
-    // Test injection of a qualified Bar/BarFactory with custom @BindsOptionalOf implementation
-    assertThat(foo.optionalBar).isPresent();
-    assertThat(foo.optionalBar).hasValue(bar);
-    assertThat(foo.optionalBarFactory).isPresent();
-    assertThat(foo.optionalBarFactory).hasValue(barFactory);
-
-    // Test injection of a qualified Bar/BarFactory as multibinding
-    assertThat(foo.barSet).containsExactly(bar);
-    assertThat(foo.barFactorySet).containsExactly(barFactory);
-
-    // Test injection of a unqualified Bar/BarFactory as multibinding
-    assertThat(foo.unqualifiedBarSet).containsExactly(bar);
-    assertThat(foo.unqualifiedBarFactorySet).containsExactly(barFactory);
-  }
-}
diff --git a/javatests/dagger/functional/subcomponent/SubcomponentBuilderMultibindingsTest.java b/javatests/dagger/functional/subcomponent/SubcomponentBuilderMultibindingsTest.java
deleted file mode 100644
index 7065acc..0000000
--- a/javatests/dagger/functional/subcomponent/SubcomponentBuilderMultibindingsTest.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (C) 2015 The Dagger Authors.
- *
- * 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 dagger.functional.subcomponent;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import dagger.Component;
-import dagger.Module;
-import dagger.Provides;
-import dagger.Subcomponent;
-import dagger.multibindings.IntoSet;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Set;
-import javax.inject.Inject;
-import javax.inject.Qualifier;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Regression tests for an issue where subcomponent builder bindings were incorrectly reused from
- * a parent even if the subcomponent were redeclared on the child component. This manifested via
- * multibindings, especially since subcomponent builder bindings are special in that we cannot
- * traverse them to see if they depend on local multibinding contributions.
- */
-@RunWith(JUnit4.class)
-public final class SubcomponentBuilderMultibindingsTest {
-
-  @Retention(RetentionPolicy.RUNTIME)
-  @Qualifier
-  public @interface ParentFoo{}
-
-  @Retention(RetentionPolicy.RUNTIME)
-  @Qualifier
-  public @interface ChildFoo{}
-
-  public static final class Foo {
-    final Set<String> multi;
-    @Inject Foo(Set<String> multi) {
-      this.multi = multi;
-    }
-  }
-
-  // This tests the case where a subcomponent is installed in both the parent and child component.
-  // In this case, we expect two subcomponents to be generated with the child one including the
-  // child multibinding contribution.
-  public static final class ChildInstallsFloating {
-    @Component(modules = ParentModule.class)
-    public interface Parent {
-      @ParentFoo Foo getParentFoo();
-
-      Child getChild();
-    }
-
-    @Subcomponent(modules = ChildModule.class)
-    public interface Child {
-      @ChildFoo Foo getChildFoo();
-    }
-
-    @Subcomponent
-    public interface FloatingSub {
-      Foo getFoo();
-
-      @Subcomponent.Builder
-      public interface Builder {
-        FloatingSub build();
-      }
-    }
-
-    @Module(subcomponents = FloatingSub.class)
-    public interface ParentModule {
-      @Provides
-      @IntoSet
-      static String provideStringMulti() {
-         return "parent";
-      }
-
-      @Provides
-      @ParentFoo
-      static Foo provideParentFoo(FloatingSub.Builder builder) {
-        return builder.build().getFoo();
-      }
-    }
-
-    // The subcomponent installation of FloatingSub here is the key difference
-    @Module(subcomponents = FloatingSub.class)
-    public interface ChildModule {
-      @Provides
-      @IntoSet
-      static String provideStringMulti() {
-         return "child";
-      }
-
-      @Provides
-      @ChildFoo
-      static Foo provideChildFoo(FloatingSub.Builder builder) {
-        return builder.build().getFoo();
-      }
-    }
-
-    private ChildInstallsFloating() {}
-  }
-
-  // This is the same as the above, except this time the child does not install the subcomponent
-  // builder. Here, we expect the child to reuse the parent subcomponent binding (we want to avoid
-  // any mistakes that might implicitly create a new subcomponent relationship) and so therefore
-  // we expect only one subcomponent to be generated in the parent resulting in the child not seeing
-  // the child multibinding contribution.
-  public static final class ChildDoesNotInstallFloating {
-    @Component(modules = ParentModule.class)
-    public interface Parent {
-      @ParentFoo Foo getParentFoo();
-
-      Child getChild();
-    }
-
-    @Subcomponent(modules = ChildModule.class)
-    public interface Child {
-      @ChildFoo Foo getChildFoo();
-    }
-
-    @Subcomponent
-    public interface FloatingSub {
-      Foo getFoo();
-
-      @Subcomponent.Builder
-      public interface Builder {
-        FloatingSub build();
-      }
-    }
-
-    @Module(subcomponents = FloatingSub.class)
-    public interface ParentModule {
-      @Provides
-      @IntoSet
-      static String provideStringMulti() {
-         return "parent";
-      }
-
-      @Provides
-      @ParentFoo
-      static Foo provideParentFoo(FloatingSub.Builder builder) {
-        return builder.build().getFoo();
-      }
-    }
-
-    // The lack of a subcomponent installation of FloatingSub here is the key difference
-    @Module
-    public interface ChildModule {
-      @Provides
-      @IntoSet
-      static String provideStringMulti() {
-         return "child";
-      }
-
-      @Provides
-      @ChildFoo
-      static Foo provideChildFoo(FloatingSub.Builder builder) {
-        return builder.build().getFoo();
-      }
-    }
-
-    private ChildDoesNotInstallFloating() {}
-  }
-
-  // This is similar to the first, except this time the components installs the subcomponent via
-  // factory methods. Here, we expect the child to get a new subcomponent and so should see its
-  // multibinding contribution.
-  public static final class ChildInstallsFloatingFactoryMethod {
-    @Component(modules = ParentModule.class)
-    public interface Parent {
-      @ParentFoo Foo getParentFoo();
-
-      Child getChild();
-
-      FloatingSub getFloatingSub();
-    }
-
-    @Subcomponent(modules = ChildModule.class)
-    public interface Child {
-      @ChildFoo Foo getChildFoo();
-
-      FloatingSub getFloatingSub();
-    }
-
-    @Subcomponent
-    public interface FloatingSub {
-      Foo getFoo();
-    }
-
-    @Module
-    public interface ParentModule {
-      @Provides
-      @IntoSet
-      static String provideStringMulti() {
-         return "parent";
-      }
-
-      @Provides
-      @ParentFoo
-      static Foo provideParentFoo(Parent componentSelf) {
-        return componentSelf.getFloatingSub().getFoo();
-      }
-    }
-
-    @Module
-    public interface ChildModule {
-      @Provides
-      @IntoSet
-      static String provideStringMulti() {
-         return "child";
-      }
-
-      @Provides
-      @ChildFoo
-      static Foo provideChildFoo(Child componentSelf) {
-        return componentSelf.getFloatingSub().getFoo();
-      }
-    }
-
-    private ChildInstallsFloatingFactoryMethod() {}
-  }
-
-  @Test
-  public void testChildInstallsFloating() {
-    ChildInstallsFloating.Parent parentComponent =
-        DaggerSubcomponentBuilderMultibindingsTest_ChildInstallsFloating_Parent.create();
-    assertThat(parentComponent.getParentFoo().multi).containsExactly("parent");
-    assertThat(parentComponent.getChild().getChildFoo().multi).containsExactly("parent", "child");
-  }
-
-  @Test
-  public void testChildDoesNotInstallFloating() {
-    ChildDoesNotInstallFloating.Parent parentComponent =
-        DaggerSubcomponentBuilderMultibindingsTest_ChildDoesNotInstallFloating_Parent.create();
-    assertThat(parentComponent.getParentFoo().multi).containsExactly("parent");
-    // Don't expect the child contribution because the child didn't redeclare the subcomponent
-    // dependency, meaning it intends to just use the subcomponent relationship from the parent
-    // component.
-    assertThat(parentComponent.getChild().getChildFoo().multi).containsExactly("parent");
-  }
-
-  @Test
-  public void testChildInstallsFloatingFactoryMethod() {
-    ChildInstallsFloatingFactoryMethod.Parent parentComponent =
-        DaggerSubcomponentBuilderMultibindingsTest_ChildInstallsFloatingFactoryMethod_Parent.create();
-    assertThat(parentComponent.getParentFoo().multi).containsExactly("parent");
-    assertThat(parentComponent.getChild().getChildFoo().multi).containsExactly("parent", "child");
-  }
-}
diff --git a/javatests/dagger/hilt/android/ActivityInjectedSavedStateViewModelTest.java b/javatests/dagger/hilt/android/ActivityInjectedSavedStateViewModelTest.java
deleted file mode 100644
index 03aa324..0000000
--- a/javatests/dagger/hilt/android/ActivityInjectedSavedStateViewModelTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.lifecycle.SavedStateHandle;
-import androidx.lifecycle.ViewModel;
-import androidx.lifecycle.ViewModelProvider;
-import android.content.Intent;
-import android.os.Build;
-import android.os.Bundle;
-import androidx.fragment.app.FragmentActivity;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.components.ActivityComponent;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public class ActivityInjectedSavedStateViewModelTest {
-
-  private static final String DATA_KEY = "TEST_KEY";
-
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Test
-  public void memberInjectedViewModelWithSavedState() {
-    Intent intent = new Intent(getApplicationContext(), TestActivity.class);
-    intent.putExtra(DATA_KEY, "test data");
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(intent)) {
-      scenario.onActivity(
-          activity -> {
-            String data = activity.myViewModel.handle.get(DATA_KEY);
-            assertThat(data).isEqualTo("test data");
-          });
-    }
-  }
-
-  // Note that assertion of object not being yet injected is in the SuperActivity, while the
-  // assertion in the scenario is confirming injection eventually does occur.
-  @Test
-  public void notYetMemberInjectedSuperActivity() {
-    try (ActivityScenario<TestActivityWithSuperActivity> scenario =
-        ActivityScenario.launch(TestActivityWithSuperActivity.class)) {
-      scenario.onActivity(activity -> assertThat(activity.someObject).isNotNull());
-    }
-  }
-
-  @AndroidEntryPoint(FragmentActivity.class)
-  public static final class TestActivity
-      extends Hilt_ActivityInjectedSavedStateViewModelTest_TestActivity {
-    @Inject MyViewModel myViewModel;
-  }
-
-  @AndroidEntryPoint(SuperActivity.class)
-  public static final class TestActivityWithSuperActivity
-      extends Hilt_ActivityInjectedSavedStateViewModelTest_TestActivityWithSuperActivity {}
-
-  public static class SuperActivity extends FragmentActivity {
-    @Inject Object someObject;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-      assertThat(someObject).isNull(); // not yet injected
-      super.onCreate(savedInstanceState);
-    }
-  }
-
-  @Module
-  @InstallIn(ActivityComponent.class)
-  static final class MyViewModelModel {
-    @Provides
-    static MyViewModel provideModel(FragmentActivity activity) {
-      return new ViewModelProvider(activity).get(MyViewModel.class);
-    }
-
-    @Provides
-    static Object provideObject() {
-      return new Object();
-    }
-  }
-
-  public static final class MyViewModel extends ViewModel {
-    final SavedStateHandle handle;
-
-    public MyViewModel(SavedStateHandle handle) {
-      this.handle = handle;
-    }
-  }
-}
diff --git a/javatests/dagger/hilt/android/ActivityInjectedViewModelTest.java b/javatests/dagger/hilt/android/ActivityInjectedViewModelTest.java
deleted file mode 100644
index 0e75741..0000000
--- a/javatests/dagger/hilt/android/ActivityInjectedViewModelTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.lifecycle.ViewModel;
-import androidx.lifecycle.ViewModelProvider;
-import android.content.Intent;
-import android.os.Build;
-import androidx.fragment.app.FragmentActivity;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.components.ActivityComponent;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-/**
- * Tests that the Hilt view model factory doesn't cause errors with non-Hilt view models. This was
- * a problem at one point because if the non-Hilt view model is accessed before saved state
- * restoration happens, even if the non-Hilt view model doesn't use saved state, it can cause an
- * error because the default Hilt view model factory does use saved state. This test ensures we
- * still allow non-Hilt view models without saved state to be used before saved state is restored.
- */
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public class ActivityInjectedViewModelTest {
-
-  private static final String DATA_KEY = "TEST_KEY";
-
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Test
-  public void memberInjectedViewModelWithSavedState() {
-    final Intent intent = new Intent(getApplicationContext(), TestActivity.class);
-    intent.putExtra(DATA_KEY, "test data");
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(intent)) {
-      scenario.onActivity(activity -> assertThat(activity.myViewModel).isNotNull());
-    }
-  }
-
-  @AndroidEntryPoint(FragmentActivity.class)
-  public static final class TestActivity extends Hilt_ActivityInjectedViewModelTest_TestActivity {
-    @Inject MyViewModel myViewModel;
-  }
-
-  @Module
-  @InstallIn(ActivityComponent.class)
-  static final class MyViewModelModel {
-    @Provides
-    static MyViewModel provideModel(FragmentActivity activity) {
-      return new ViewModelProvider(activity).get(MyViewModel.class);
-    }
-  }
-
-  public static final class MyViewModel extends ViewModel {}
-}
diff --git a/javatests/dagger/hilt/android/ActivityRetainedClearedListenerTest.java b/javatests/dagger/hilt/android/ActivityRetainedClearedListenerTest.java
deleted file mode 100644
index 286998c..0000000
--- a/javatests/dagger/hilt/android/ActivityRetainedClearedListenerTest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import androidx.lifecycle.Lifecycle.State;
-import android.os.Build;
-import androidx.fragment.app.FragmentActivity;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.ActivityRetainedLifecycle.OnClearedListener;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import java.util.concurrent.atomic.AtomicReference;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public class ActivityRetainedClearedListenerTest {
-
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Test
-  public void onClearedInvoked() {
-    final TestClearedListener callback = new TestClearedListener();
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(TestActivity.class)) {
-      scenario.onActivity(
-          activity -> activity.activityRetainedLifecycle.addOnClearedListener(callback));
-      assertThat(callback.onClearedInvoked).isEqualTo(0);
-
-      // Recreate should not cause ViewModel to be cleared
-      scenario.recreate();
-      assertThat(callback.onClearedInvoked).isEqualTo(0);
-
-      // Destroying activity (not due to recreate) should cause ViewModel to be cleared
-      scenario.moveToState(State.DESTROYED);
-      assertThat(callback.onClearedInvoked).isEqualTo(1);
-    }
-  }
-
-  @Test
-  public void addOnClearedListener_tooLate() {
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(TestActivity.class)) {
-      // Grab the activity (leak it a bit) from the scenario and destroy it.
-      AtomicReference<TestActivity> testActivity = new AtomicReference<>();
-      scenario.onActivity(testActivity::set);
-      scenario.moveToState(State.DESTROYED);
-
-      try {
-        TestClearedListener callback = new TestClearedListener();
-        testActivity.get().activityRetainedLifecycle.addOnClearedListener(callback);
-        fail("An exception should have been thrown.");
-      } catch (IllegalStateException e) {
-        assertThat(e)
-            .hasMessageThat()
-            .contains(
-                "There was a race between the call to add/remove an OnClearedListener and "
-                    + "onCleared(). This can happen when posting to the Main thread from a "
-                    + "background thread, which is not supported.");
-      }
-    }
-  }
-
-  @Test
-  public void removeOnClearedListener_tooLate() {
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(TestActivity.class)) {
-      // Grab the activity (leak it a bit) from the scenario and destroy it.
-      AtomicReference<TestActivity> testActivity = new AtomicReference<>();
-      scenario.onActivity(testActivity::set);
-      scenario.moveToState(State.DESTROYED);
-
-      try {
-        TestClearedListener callback = new TestClearedListener();
-        testActivity.get().activityRetainedLifecycle.removeOnClearedListener(callback);
-        fail("An exception should have been thrown.");
-      } catch (IllegalStateException e) {
-        assertThat(e)
-            .hasMessageThat()
-            .contains(
-                "There was a race between the call to add/remove an OnClearedListener and "
-                    + "onCleared(). This can happen when posting to the Main thread from a "
-                    + "background thread, which is not supported.");
-      }
-    }
-  }
-
-  static class TestClearedListener implements OnClearedListener {
-    int onClearedInvoked = 0;
-
-    @Override
-    public void onCleared() {
-      onClearedInvoked++;
-    }
-  }
-
-  @AndroidEntryPoint(FragmentActivity.class)
-  public static final class TestActivity
-      extends Hilt_ActivityRetainedClearedListenerTest_TestActivity {
-    @Inject ActivityRetainedLifecycle activityRetainedLifecycle;
-  }
-}
diff --git a/javatests/dagger/hilt/android/ActivityScenarioRuleTest.java b/javatests/dagger/hilt/android/ActivityScenarioRuleTest.java
deleted file mode 100644
index c716225..0000000
--- a/javatests/dagger/hilt/android/ActivityScenarioRuleTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.lifecycle.Lifecycle.State.RESUMED;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.os.Build;
-import androidx.activity.ComponentActivity;
-import androidx.test.ext.junit.rules.ActivityScenarioRule;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.testing.BindValue;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.RuleChain;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-/** Tests that {@link ActivityScenarioRule} works with Hilt tests. */
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class ActivityScenarioRuleTest {
-  private static final String STR_VALUE = "STR_VALUE";
-
-  /** An activity to test injection. */
-  @AndroidEntryPoint(ComponentActivity.class)
-  public static final class TestActivity extends Hilt_ActivityScenarioRuleTest_TestActivity {
-    @Inject String str;
-  }
-
-  public HiltAndroidRule hiltRule = new HiltAndroidRule(this);
-
-  public ActivityScenarioRule<TestActivity> scenarioRule =
-      new ActivityScenarioRule<>(TestActivity.class);
-
-  @Rule public RuleChain chain = RuleChain.outerRule(hiltRule).around(scenarioRule);
-
-  @BindValue String str = STR_VALUE;
-
-  @Test
-  public void testState() {
-    assertThat(scenarioRule.getScenario().getState()).isEqualTo(RESUMED);
-  }
-
-  @Test
-  public void testInjection() {
-    scenarioRule
-        .getScenario()
-        .onActivity(activity -> assertThat(activity.str).isEqualTo(STR_VALUE));
-  }
-}
diff --git a/javatests/dagger/hilt/android/AndroidEntryPointBaseClassOtherPkg.java b/javatests/dagger/hilt/android/AndroidEntryPointBaseClassOtherPkg.java
deleted file mode 100644
index 048e0f7..0000000
--- a/javatests/dagger/hilt/android/AndroidEntryPointBaseClassOtherPkg.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.other.pkg;
-
-import androidx.activity.ComponentActivity;
-import dagger.hilt.android.AndroidEntryPoint;
-
-/** Used in {@link AndroidEntryPointBaseClassTest}. */
-public final class AndroidEntryPointBaseClassOtherPkg {
-
-  @AndroidEntryPoint(ComponentActivity.class)
-  public static class LBaseActivity extends Hilt_AndroidEntryPointBaseClassOtherPkg_LBaseActivity {}
-
-  @AndroidEntryPoint
-  public static class SBaseActivity extends ComponentActivity {}
-
-  private AndroidEntryPointBaseClassOtherPkg() {}
-}
diff --git a/javatests/dagger/hilt/android/AndroidEntryPointBaseClassTest.java b/javatests/dagger/hilt/android/AndroidEntryPointBaseClassTest.java
deleted file mode 100644
index 1078e7d..0000000
--- a/javatests/dagger/hilt/android/AndroidEntryPointBaseClassTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.os.Build;
-import androidx.activity.ComponentActivity;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.other.pkg.AndroidEntryPointBaseClassOtherPkg;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-/**
- * Regression test for https://github.com/google/dagger/issues/1910
- *
- * <p>There are 8 different tests to cover 3 levels of inheritance where each level uses either the
- * long-form (L) or short-form (S) of @AndroidEntryPoint:
- *
- * <ol>
- *   <li> L -> L -> L
- *   <li> L -> L -> S
- *   <li> L -> S -> L
- *   <li> L -> S -> S
- *   <li> S -> L -> L
- *   <li> S -> L -> S
- *   <li> S -> S -> L
- *   <li> S -> S -> S
- * </ol>
- *
- * Note: We don't actually test injection in this class because Bazel doesn't do bytecode injection.
- * We're only testing that the classes build, and verifying their inheritance matches what we
- * expect.
- */
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P)
-public final class AndroidEntryPointBaseClassTest {
-
-  @AndroidEntryPoint
-  public static final class SSActivity extends AndroidEntryPointBaseClassOtherPkg.SBaseActivity {}
-
-  @AndroidEntryPoint
-  public static final class SLActivity extends AndroidEntryPointBaseClassOtherPkg.LBaseActivity {}
-
-  @AndroidEntryPoint(AndroidEntryPointBaseClassOtherPkg.SBaseActivity.class)
-  public static final class LSActivity extends Hilt_AndroidEntryPointBaseClassTest_LSActivity {}
-
-  @AndroidEntryPoint(AndroidEntryPointBaseClassOtherPkg.LBaseActivity.class)
-  public static final class LLActivity extends Hilt_AndroidEntryPointBaseClassTest_LLActivity {}
-
-  @AndroidEntryPoint(LL.class)
-  public static final class LLL extends Hilt_AndroidEntryPointBaseClassTest_LLL {}
-
-  @AndroidEntryPoint(LS.class)
-  public static final class LLS extends Hilt_AndroidEntryPointBaseClassTest_LLS {}
-
-  @AndroidEntryPoint(SL.class)
-  public static final class LSL extends Hilt_AndroidEntryPointBaseClassTest_LSL {}
-
-  @AndroidEntryPoint(SS.class)
-  public static final class LSS extends Hilt_AndroidEntryPointBaseClassTest_LSS {}
-
-  @AndroidEntryPoint
-  public static final class SLL extends LL {}
-
-  @AndroidEntryPoint
-  public static final class SLS extends LS {}
-
-  @AndroidEntryPoint
-  public static final class SSL extends SL {}
-
-  @AndroidEntryPoint
-  public static final class SSS extends SS {}
-
-  @AndroidEntryPoint(L.class)
-  public static class LL extends Hilt_AndroidEntryPointBaseClassTest_LL {}
-
-  @AndroidEntryPoint(S.class)
-  public static class LS extends Hilt_AndroidEntryPointBaseClassTest_LS {}
-
-  @AndroidEntryPoint
-  public static class SL extends L {}
-
-  @AndroidEntryPoint
-  public static class SS extends S {}
-
-  @AndroidEntryPoint(ComponentActivity.class)
-  public static class L extends Hilt_AndroidEntryPointBaseClassTest_L {}
-
-  @AndroidEntryPoint
-  public static class S extends ComponentActivity {}
-
-  @Test
-  public void checkGeneratedClassHierarchy_shortForm() throws Exception {
-    // When using the short form notation, the generated top level class is not actually assignable
-    // to the generated base classes at compile time
-    assertIsNotAssignableTo(
-        Hilt_AndroidEntryPointBaseClassTest_SSS.class,
-        Hilt_AndroidEntryPointBaseClassTest_S.class);
-    assertIsNotAssignableTo(
-        Hilt_AndroidEntryPointBaseClassTest_SS.class,
-        Hilt_AndroidEntryPointBaseClassTest_S.class);
-  }
-
-  @Test
-  public void checkGeneratedClassHierarchy_longForm() throws Exception {
-    // When using the long form notation, they are assignable at compile time
-    assertIsAssignableTo(
-        Hilt_AndroidEntryPointBaseClassTest_LLL.class,
-        Hilt_AndroidEntryPointBaseClassTest_LL.class);
-    assertIsAssignableTo(
-        Hilt_AndroidEntryPointBaseClassTest_LL.class,
-        Hilt_AndroidEntryPointBaseClassTest_L.class);
-  }
-
-  @Test
-  public void checkGeneratedClassHierarchy_shortFormRoot() throws Exception {
-    // If the root is short-form, then the child class cannot be assigned to it.
-    assertIsNotAssignableTo(
-        Hilt_AndroidEntryPointBaseClassTest_LLS.class,
-        Hilt_AndroidEntryPointBaseClassTest_S.class);
-    assertIsNotAssignableTo(
-        Hilt_AndroidEntryPointBaseClassTest_LS.class,
-        Hilt_AndroidEntryPointBaseClassTest_S.class);
-  }
-
-  @Test
-  public void checkGeneratedClassHierarchy_longFormRoot() throws Exception {
-    // If the root is long-form, then the child class can be assigned to it.
-    assertIsAssignableTo(
-        Hilt_AndroidEntryPointBaseClassTest_SSL.class,
-        Hilt_AndroidEntryPointBaseClassTest_L.class);
-    assertIsAssignableTo(
-        Hilt_AndroidEntryPointBaseClassTest_SL.class,
-        Hilt_AndroidEntryPointBaseClassTest_L.class);
-  }
-
-  /** Asserts that the {@code class1} is not assignable to the {@code class2}. */
-  private static void assertIsNotAssignableTo(Class<?> class1, Class<?> class2) {
-    assertThat(class2.isAssignableFrom(class1)).isFalse();
-  }
-
-  /** Asserts that the {@code class1} is assignable to the {@code class2}. */
-  private static void assertIsAssignableTo(Class<?> class1, Class<?> class2) {
-    assertThat(class1).isAssignableTo(class2);
-  }
-}
diff --git a/javatests/dagger/hilt/android/AndroidManifest.xml b/javatests/dagger/hilt/android/AndroidManifest.xml
deleted file mode 100644
index 7f6ede6..0000000
--- a/javatests/dagger/hilt/android/AndroidManifest.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="dagger.hilt.android">
-
-  <uses-sdk android:minSdkVersion="14" />
-
-  <application>
-    <activity
-        android:name=".ActivityInjectedSavedStateViewModelTest$TestActivity"
-        android:exported="false"/>
-    <activity
-        android:name=".ActivityInjectedSavedStateViewModelTest$TestActivityWithSuperActivity"
-        android:exported="false"/>
-    <activity
-        android:name=".ActivityInjectedViewModelTest$TestActivity"
-        android:exported="false"/>
-    <activity
-        android:name=".ActivityRetainedClearedListenerTest$TestActivity"
-        android:exported="false"/>
-    <activity
-        android:name=".ActivityScenarioRuleTest$TestActivity"
-        android:exported="false"/>
-    <activity
-        android:name=".DefaultViewModelFactoryTest$TestActivity"
-        android:exported="false"/>
-    <activity
-        android:name=".QualifierInKotlinFieldsTest$TestActivity"
-        android:exported="false"/>
-    <activity
-        android:name=".UsesSharedComponent1Test$TestActivity"
-        android:exported="false"/>
-    <activity
-        android:name=".UsesSharedComponent2Test$TestActivity"
-        android:exported="false"/>
-    <activity
-        android:name=".UsesSharedComponentEnclosedTest$EnclosedTest$TestActivity"
-        android:exported="false"/>
-    <activity
-        android:name=".ViewModelScopedTest$TestActivity"
-        android:exported="false"/>
-    <activity
-        android:name=".ViewModelWithBaseTest$TestActivity"
-        android:exported="false"/>
-    <activity
-        android:name="dagger.hilt.android.testsubpackage.UsesSharedComponent1Test$TestActivity"
-        android:exported="false"/>
-  </application>
-</manifest>
diff --git a/javatests/dagger/hilt/android/BUILD b/javatests/dagger/hilt/android/BUILD
deleted file mode 100644
index 1f9bd08..0000000
--- a/javatests/dagger/hilt/android/BUILD
+++ /dev/null
@@ -1,649 +0,0 @@
-# Copyright (C) 2020 The Dagger Authors.
-#
-# 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.
-# Description:
-#   Tests for internal code for implementing Hilt processors.
-
-load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library")
-
-package(default_visibility = ["//:src"])
-
-# Checks that multiple test roots can be compiled together. This library
-# only compiles the sources. they are tested in the android_local_tests.
-android_library(
-    name = "multi_test_root_tests",
-    srcs = [
-        "ActivityScenarioRuleTest.java",
-        "CustomTestApplicationTest.java",
-        "MultiTestRoot1Test.java",
-        "MultiTestRoot2Test.java",
-        "MultiTestRootExternalModules.java",
-    ],
-    exports_manifest = 1,
-    manifest = "AndroidManifest.xml",
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/testing:bind_value",
-        "//java/dagger/hilt/android/testing:custom_test_application",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "//java/dagger/hilt/android/testing:uninstall_modules",
-        "@google_bazel_common//third_party/java/truth",
-        "@maven//:androidx_test_core",
-        "@maven//:androidx_test_ext_junit",
-        "@maven//:junit_junit",
-        "@maven//:org_robolectric_robolectric",
-    ],
-)
-
-android_local_test(
-    name = "ActivityScenarioRuleTest",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        ":multi_test_root_tests",
-    ],
-)
-
-android_local_test(
-    name = "CustomTestApplicationTest",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        ":multi_test_root_tests",
-    ],
-)
-
-android_local_test(
-    name = "MultiTestRoot1Test",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        ":multi_test_root_tests",
-    ],
-)
-
-android_local_test(
-    name = "MultiTestRoot2Test",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        ":multi_test_root_tests",
-    ],
-)
-
-android_local_test(
-    name = "EarlyEntryPointHiltAndroidAppRuntimeTest",
-    size = "small",
-    srcs = ["EarlyEntryPointHiltAndroidAppRuntimeTest.java"],
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        ":EarlyEntryPointHiltAndroidAppRuntimeClasses",
-        "//:android_local_test_exports",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt/android:early_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "@google_bazel_common//third_party/java/truth",
-        "@maven//:junit_junit",
-    ],
-)
-
-android_library(
-    name = "EarlyEntryPointHiltAndroidAppRuntimeClasses",
-    srcs = ["EarlyEntryPointHiltAndroidAppRuntimeClasses.java"],
-    deps = [
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt/android:early_entry_point",
-        "//java/dagger/hilt/android:hilt_android_app",
-        "//java/dagger/hilt/android:package_info",
-    ],
-)
-
-android_local_test(
-    name = "EarlyEntryPointHiltAndroidTestRuntimeTest",
-    size = "small",
-    srcs = [
-        "EarlyEntryPointHiltAndroidTestRuntimeClasses.java",
-        "EarlyEntryPointHiltAndroidTestRuntimeTest.java",
-    ],
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:define_component",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:early_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-android_local_test(
-    name = "EarlyEntryPointCustomApplicationTest",
-    size = "small",
-    srcs = [
-        "EarlyEntryPointCustomApplicationClasses.java",
-        "EarlyEntryPointCustomApplicationTest.java",
-    ],
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:early_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/testing:custom_test_application",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-android_local_test(
-    name = "EarlyEntryPointNoEntryPointsDefinedTest",
-    size = "small",
-    srcs = ["EarlyEntryPointNoEntryPointsDefinedTest.java"],
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:early_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-android_local_test(
-    name = "AndroidEntryPointBaseClassTest",
-    size = "small",
-    srcs = [
-        "AndroidEntryPointBaseClassOtherPkg.java",
-        "AndroidEntryPointBaseClassTest.java",
-    ],
-    javacopts = [
-        # Note: Hilt's bytecode injection doesn't work in Blaze but we disable
-        # superclass validation in this test just to verify everything builds.
-        "-Adagger.hilt.android.internal.disableAndroidSuperclassValidation=true",
-        # Note: Used to test base classes across java packages.
-        "-Xep:PackageLocation:OFF",
-    ],
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-android_local_test(
-    name = "ModuleTest",
-    srcs = ["ModuleTest.java"],
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-android_local_test(
-    name = "InjectionTest",
-    size = "small",
-    srcs = ["InjectionTest.java"],
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-android_local_test(
-    name = "InstallInObjectModuleTest",
-    srcs = ["InstallInObjectModuleTest.java"],
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        ":InstallInObjectModuleClasses",
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@google_bazel_common//third_party/java/junit",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-kt_android_library(
-    name = "InstallInObjectModuleClasses",
-    testonly = True,
-    srcs = ["InstallInObjectModule.kt"],
-    deps = [
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/components",
-    ],
-)
-
-android_local_test(
-    name = "InternalKtModuleTest",
-    size = "small",
-    srcs = ["InternalKtModuleTest.java"],
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "//javatests/dagger/hilt/testmodules",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-android_local_test(
-    name = "DefaultViewModelFactoryTest",
-    srcs = ["DefaultViewModelFactoryTest.java"],
-    manifest = "AndroidManifest.xml",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/lifecycle",
-        "//java/dagger/hilt/android/testing:bind_value",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "@maven//:androidx_activity_activity",
-        "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
-        "@maven//:junit_junit",
-    ],
-)
-
-android_local_test(
-    name = "QualifierInKotlinFieldsTest",
-    srcs = ["QualifierInKotlinFieldsTest.java"],
-    manifest = "AndroidManifest.xml",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        ":QualifierInFieldsClass",
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "@maven//:androidx_activity_activity",
-        "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
-        "@maven//:junit_junit",
-    ],
-)
-
-kt_android_library(
-    name = "QualifierInFieldsClass",
-    testonly = True,
-    srcs = ["QualifierInFieldsClass.kt"],
-    deps = [
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt/android/qualifiers",
-    ],
-)
-
-android_local_test(
-    name = "ActivityRetainedClearedListenerTest",
-    srcs = ["ActivityRetainedClearedListenerTest.java"],
-    manifest = "AndroidManifest.xml",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:activity_retained_lifecycle",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "@maven//:androidx_activity_activity",
-        "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
-        "@maven//:junit_junit",
-    ],
-)
-
-android_local_test(
-    name = "ActivityInjectedViewModelTest",
-    srcs = ["ActivityInjectedViewModelTest.java"],
-    manifest = "AndroidManifest.xml",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "@maven//:androidx_activity_activity",
-        "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
-        "@maven//:junit_junit",
-    ],
-)
-
-android_local_test(
-    name = "ViewModelScopedTest",
-    srcs = ["ViewModelScopedTest.java"],
-    manifest = "AndroidManifest.xml",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/lifecycle",
-        "//java/dagger/hilt/android/scopes",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "@maven//:androidx_activity_activity",
-        "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
-        "@maven//:junit_junit",
-    ],
-)
-
-android_local_test(
-    name = "ViewModelWithBaseTest",
-    srcs = ["ViewModelWithBaseTest.java"],
-    manifest = "AndroidManifest.xml",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/lifecycle",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "@maven//:androidx_activity_activity",
-        "@maven//:androidx_fragment_fragment",
-        "@maven//:androidx_lifecycle_lifecycle_common",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel",
-        "@maven//:androidx_lifecycle_lifecycle_viewmodel_savedstate",
-        "@maven//:junit_junit",
-    ],
-)
-
-android_local_test(
-    name = "ActivityInjectedSavedStateViewModelTest",
-    srcs = ["ActivityInjectedSavedStateViewModelTest.java"],
-    manifest = "AndroidManifest.xml",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "//java/dagger/internal/guava:base-android",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "@maven//:junit_junit",
-    ],
-)
-
-android_library(
-    name = "uses_component_common",
-    srcs = [
-        "UsesComponentHelper.java",
-        "UsesComponentTestClasses.java",
-    ],
-    deps = [
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:define_component",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android/components",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-    ],
-)
-
-# This has to be split into a separate target in order to avoid
-# being compiled as "test bindings" in the compilation unit of
-# the test class itself.
-android_library(
-    name = "uses_component_test_module",
-    srcs = ["UsesComponentTestModule.java"],
-    deps = [
-        ":uses_component_common",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android/components",
-    ],
-)
-
-android_library(
-    name = "shared_component_test_classes",
-    srcs = [
-        "UsesLocalComponentTestBindingsTest.java",
-        "UsesLocalComponentUninstallModuleTest.java",
-        "UsesSharedComponent1Test.java",
-        "UsesSharedComponent2Test.java",
-        "UsesSharedComponentEnclosedTest.java",
-        "//javatests/dagger/hilt/android/testsubpackage:UsesLocalComponentTestBindingsTest.java",
-        "//javatests/dagger/hilt/android/testsubpackage:UsesSharedComponent1Test.java",
-    ],
-    exports_manifest = 1,
-    javacopts = ["-Adagger.hilt.shareTestComponents=true"],
-    manifest = "AndroidManifest.xml",
-    deps = [
-        ":uses_component_common",
-        ":uses_component_test_module",
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android:hilt_android_app",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/testing:bind_value",
-        "//java/dagger/hilt/android/testing:custom_test_application",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "//java/dagger/hilt/android/testing:uninstall_modules",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "@maven//:androidx_test_core",
-        "@maven//:androidx_test_ext_junit",
-        "@maven//:junit_junit",
-        "@maven//:org_robolectric_annotations",
-        "@maven//:org_robolectric_robolectric",
-    ],
-)
-
-# Separate target that uses @TestInstallIn to replace the global binding
-android_library(
-    name = "test_install_in_test_classes",
-    srcs = [
-        "TestInstallInModules.java",
-        "UsesSharedComponentTestInstallInTest.java",
-    ],
-    javacopts = ["-Adagger.hilt.shareTestComponents=true"],
-    deps = [
-        ":uses_component_common",
-        ":uses_component_test_module",
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:hilt_android_app",
-        "//java/dagger/hilt/android:package_info",
-        "//java/dagger/hilt/android/components",
-        "//java/dagger/hilt/android/testing:bind_value",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "//java/dagger/hilt/testing:test_install_in",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "@maven//:androidx_test_core",
-        "@maven//:androidx_test_ext_junit",
-        "@maven//:junit_junit",
-        "@maven//:org_robolectric_annotations",
-        "@maven//:org_robolectric_robolectric",
-    ],
-)
-
-android_local_test(
-    name = "UsesLocalComponentTestBindingsTest",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        ":shared_component_test_classes",
-    ],
-)
-
-android_local_test(
-    name = "UsesLocalComponentUninstallModuleTest",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        ":shared_component_test_classes",
-    ],
-)
-
-android_local_test(
-    name = "UsesSharedComponent1Test",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        ":shared_component_test_classes",
-    ],
-)
-
-android_local_test(
-    name = "UsesSharedComponent2Test",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        ":shared_component_test_classes",
-    ],
-)
-
-android_local_test(
-    name = "UsesSharedComponentEnclosedTest",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        ":shared_component_test_classes",
-    ],
-)
-
-android_local_test(
-    name = "UsesSharedComponentTestInstallInTest",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        ":test_install_in_test_classes",
-    ],
-)
diff --git a/javatests/dagger/hilt/android/CustomTestApplicationTest.java b/javatests/dagger/hilt/android/CustomTestApplicationTest.java
deleted file mode 100644
index 26de8d4..0000000
--- a/javatests/dagger/hilt/android/CustomTestApplicationTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.Application;
-import android.content.Context;
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.testing.CustomTestApplication;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-/** Tests {@link dagger.hilt.android.testing.CustomTestApplication}. */
-@CustomTestApplication(CustomTestApplicationTest.BaseApplication.class)
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = CustomTestApplicationTest_Application.class)
-public final class CustomTestApplicationTest {
-  static class BaseApplication extends Application {}
-
-  static class OtherBaseApplication extends Application {}
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Test
-  public void testApplicationBaseClass() throws Exception {
-    assertThat((Context) getApplicationContext()).isInstanceOf(BaseApplication.class);
-  }
-
-  @CustomTestApplication(OtherBaseApplication.class)
-  public static class Other {}
-
-  @Test
-  @Config(application = CustomTestApplicationTest_Other_Application.class)
-  public void testOtherApplicationBaseClass() throws Exception {
-    assertThat((Context) getApplicationContext()).isInstanceOf(OtherBaseApplication.class);
-  }
-}
diff --git a/javatests/dagger/hilt/android/DefaultViewModelFactoryTest.java b/javatests/dagger/hilt/android/DefaultViewModelFactoryTest.java
deleted file mode 100644
index 78cd568..0000000
--- a/javatests/dagger/hilt/android/DefaultViewModelFactoryTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.lifecycle.ViewModel;
-import androidx.lifecycle.ViewModelProvider;
-import android.os.Build;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.lifecycle.HiltViewModel;
-import dagger.hilt.android.testing.BindValue;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public class DefaultViewModelFactoryTest {
-
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @BindValue String hiltStringValue = "hilt";
-
-  @Test
-  public void activityFactoryFallsBackToBase() {
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(TestActivity.class)) {
-      scenario.onActivity(
-          activity -> {
-            assertThat(new ViewModelProvider(activity).get(TestHiltViewModel.class).value)
-                .isEqualTo("hilt");
-            assertThat(new ViewModelProvider(activity).get(TestViewModel.class).value)
-                .isEqualTo("non-hilt");
-          });
-    }
-  }
-
-  @Test
-  public void fragmentFactoryFallbsBackToBase() {
-    // TODO(danysantiago): Use FragmentScenario when it becomes available.
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(TestActivity.class)) {
-      scenario.onActivity(
-          activity -> {
-            TestFragment fragment = new TestFragment();
-            activity.getSupportFragmentManager().beginTransaction().add(fragment, "").commitNow();
-            assertThat(new ViewModelProvider(fragment).get(TestHiltViewModel.class).value)
-                .isEqualTo("hilt");
-            assertThat(new ViewModelProvider(fragment).get(TestViewModel.class).value)
-                .isEqualTo("non-hilt");
-          });
-    }
-  }
-
-  @HiltViewModel
-  public static final class TestHiltViewModel extends ViewModel {
-    final String value;
-
-    @Inject
-    TestHiltViewModel(String value) {
-      this.value = value;
-    }
-  }
-
-  public static final class TestViewModel extends ViewModel {
-    final String value;
-    // Take in a string so it cannot be constructed by the default view model factory
-    public TestViewModel(String value) {
-      this.value = value;
-    }
-  }
-
-  @AndroidEntryPoint(BaseActivity.class)
-  public static final class TestActivity extends Hilt_DefaultViewModelFactoryTest_TestActivity {}
-
-  public static class BaseActivity extends FragmentActivity {
-    @SuppressWarnings("unchecked")
-    @Override public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
-      return new ViewModelProvider.Factory() {
-        @Override public <T extends ViewModel> T create(Class<T> clazz) {
-          assertThat(clazz).isEqualTo(TestViewModel.class);
-          return (T) new TestViewModel("non-hilt");
-        }
-      };
-    }
-  }
-
-  @AndroidEntryPoint(BaseFragment.class)
-  public static final class TestFragment extends Hilt_DefaultViewModelFactoryTest_TestFragment {}
-
-  public static class BaseFragment extends Fragment {
-    @SuppressWarnings("unchecked")
-    @Override public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
-      return new ViewModelProvider.Factory() {
-        @Override public <T extends ViewModel> T create(Class<T> clazz) {
-          assertThat(clazz).isEqualTo(TestViewModel.class);
-          return (T) new TestViewModel("non-hilt");
-        }
-      };
-    }
-  }
-}
diff --git a/javatests/dagger/hilt/android/EarlyEntryPointCustomApplicationClasses.java b/javatests/dagger/hilt/android/EarlyEntryPointCustomApplicationClasses.java
deleted file mode 100644
index 3e48ee2..0000000
--- a/javatests/dagger/hilt/android/EarlyEntryPointCustomApplicationClasses.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import dagger.hilt.InstallIn;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/** Classes for {@link EarlyEntryPointCustomApplicationTest}. */
-public final class EarlyEntryPointCustomApplicationClasses {
-  private EarlyEntryPointCustomApplicationClasses() {}
-
-  // @EarlyEntryPoint cannot be nested in tests, so we've separated it out into this class.
-  @EarlyEntryPoint
-  @InstallIn(SingletonComponent.class)
-  interface EarlyFooEntryPoint {
-    Foo foo();
-  }
-
-  @Singleton
-  public static class Foo {
-    @Inject
-    Foo() {}
-  }
-}
diff --git a/javatests/dagger/hilt/android/EarlyEntryPointCustomApplicationTest.java b/javatests/dagger/hilt/android/EarlyEntryPointCustomApplicationTest.java
deleted file mode 100644
index 3d88190..0000000
--- a/javatests/dagger/hilt/android/EarlyEntryPointCustomApplicationTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.Application;
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.EarlyEntryPointCustomApplicationClasses.EarlyFooEntryPoint;
-import dagger.hilt.android.EarlyEntryPointCustomApplicationClasses.Foo;
-import dagger.hilt.android.testing.CustomTestApplication;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.components.SingletonComponent;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@CustomTestApplication(EarlyEntryPointCustomApplicationTest.BaseApplication.class)
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(
-    sdk = Build.VERSION_CODES.P,
-    application = EarlyEntryPointCustomApplicationTest_Application.class)
-public final class EarlyEntryPointCustomApplicationTest {
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  interface FooEntryPoint {
-    Foo foo();
-  }
-
-  public static class BaseApplication extends Application {
-    Foo earlyFoo = null;
-    IllegalStateException entryPointsException = null;
-
-    @Override
-    public void onCreate() {
-      super.onCreate();
-
-      // Test that calling EarlyEntryPoints works before the test instance is created.
-      earlyFoo = EarlyEntryPoints.get(this, EarlyFooEntryPoint.class).foo();
-
-      // Test that calling EntryPoints fails if called before the test instance is created.
-      try {
-        EntryPoints.get(this, FooEntryPoint.class);
-      } catch (IllegalStateException e) {
-        entryPointsException = e;
-      }
-    }
-  }
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Test
-  public void testEarlyEntryPointsPasses() throws Exception {
-    BaseApplication baseApplication = (BaseApplication) getApplicationContext();
-    assertThat(baseApplication.earlyFoo).isNotNull();
-  }
-
-  @Test
-  public void testEntryPointsFails() throws Exception {
-    BaseApplication baseApplication = (BaseApplication) getApplicationContext();
-    assertThat(baseApplication.entryPointsException).isNotNull();
-    assertThat(baseApplication.entryPointsException)
-        .hasMessageThat()
-        .contains("The component was not created.");
-  }
-}
diff --git a/javatests/dagger/hilt/android/EarlyEntryPointHiltAndroidAppRuntimeClasses.java b/javatests/dagger/hilt/android/EarlyEntryPointHiltAndroidAppRuntimeClasses.java
deleted file mode 100644
index 80defd1..0000000
--- a/javatests/dagger/hilt/android/EarlyEntryPointHiltAndroidAppRuntimeClasses.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import android.app.Application;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.InstallIn;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/** Classes for {@link EarlyEntryPointHiltAndroidAppRuntimeTest}. */
-public final class EarlyEntryPointHiltAndroidAppRuntimeClasses {
-  private EarlyEntryPointHiltAndroidAppRuntimeClasses() {}
-
-  // @HiltAndroidApp cannot be nested in tests because @Config.application won't accept it.
-  @HiltAndroidApp(Application.class)
-  public static class TestApplication
-      extends Hilt_EarlyEntryPointHiltAndroidAppRuntimeClasses_TestApplication {}
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  interface FooEntryPoint {
-    Foo foo();
-  }
-
-  // @EarlyEntryPoint cannot be nested in tests, so we've separated it out into this class.
-  @EarlyEntryPoint
-  @InstallIn(SingletonComponent.class)
-  interface EarlyFooEntryPoint {
-    Foo foo();
-  }
-
-  @Singleton
-  static class Foo {
-    @Inject
-    Foo() {}
-  }
-}
diff --git a/javatests/dagger/hilt/android/EarlyEntryPointHiltAndroidAppRuntimeTest.java b/javatests/dagger/hilt/android/EarlyEntryPointHiltAndroidAppRuntimeTest.java
deleted file mode 100644
index fe75ae3..0000000
--- a/javatests/dagger/hilt/android/EarlyEntryPointHiltAndroidAppRuntimeTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.android.EarlyEntryPointHiltAndroidAppRuntimeClasses.EarlyFooEntryPoint;
-import dagger.hilt.android.EarlyEntryPointHiltAndroidAppRuntimeClasses.Foo;
-import dagger.hilt.android.EarlyEntryPointHiltAndroidAppRuntimeClasses.FooEntryPoint;
-import dagger.hilt.android.EarlyEntryPointHiltAndroidAppRuntimeClasses.TestApplication;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = TestApplication.class)
-public final class EarlyEntryPointHiltAndroidAppRuntimeTest {
-  // Tests that when using @HiltAndroidApp
-  //   1) calling with the wrong parameters doesn't throw
-  //   2) EarlyEntryPoints returns the same thing as EntryPoints.
-  @Test
-  public void testEntryPoints() throws Exception {
-    Object generatedComponent = ((TestApplication) getApplicationContext()).generatedComponent();
-
-    Foo foo1 = EntryPoints.get(getApplicationContext(), FooEntryPoint.class).foo();
-    Foo foo2 = EntryPoints.get(getApplicationContext(), EarlyFooEntryPoint.class).foo();
-    Foo foo3 = EntryPoints.get(generatedComponent, FooEntryPoint.class).foo();
-    Foo foo4 = EntryPoints.get(generatedComponent, EarlyFooEntryPoint.class).foo();
-    Foo foo5 = EarlyEntryPoints.get(getApplicationContext(), FooEntryPoint.class).foo();
-    Foo foo6 = EarlyEntryPoints.get(getApplicationContext(), EarlyFooEntryPoint.class).foo();
-
-    assertThat(foo1).isEqualTo(foo2);
-    assertThat(foo1).isEqualTo(foo3);
-    assertThat(foo1).isEqualTo(foo4);
-    assertThat(foo1).isEqualTo(foo5);
-    assertThat(foo1).isEqualTo(foo6);
-  }
-}
diff --git a/javatests/dagger/hilt/android/EarlyEntryPointHiltAndroidTestRuntimeClasses.java b/javatests/dagger/hilt/android/EarlyEntryPointHiltAndroidTestRuntimeClasses.java
deleted file mode 100644
index 85d7c7c..0000000
--- a/javatests/dagger/hilt/android/EarlyEntryPointHiltAndroidTestRuntimeClasses.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import dagger.BindsInstance;
-import dagger.hilt.DefineComponent;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.EarlyEntryPointHiltAndroidTestRuntimeClasses.MySubcomponentScoped;
-import dagger.hilt.android.EarlyEntryPointHiltAndroidTestRuntimeTest.Bar;
-import dagger.hilt.android.EarlyEntryPointHiltAndroidTestRuntimeTest.Foo;
-import dagger.hilt.components.SingletonComponent;
-import java.lang.annotation.Retention;
-import javax.inject.Scope;
-
-/** Classes for {@link EarlyEntryPointHiltAndroidTestRuntimeTest}. */
-public final class EarlyEntryPointHiltAndroidTestRuntimeClasses {
-  private EarlyEntryPointHiltAndroidTestRuntimeClasses() {}
-
-  // @EarlyEntryPoint cannot be nested in tests, so we've separated it out into this class.
-  @EarlyEntryPoint
-  @InstallIn(SingletonComponent.class)
-  interface EarlyFooEntryPoint {
-    Foo foo();
-  }
-
-  // @EarlyEntryPoint cannot be nested in tests, so we've separated it out into this class.
-  @EarlyEntryPoint
-  @InstallIn(SingletonComponent.class)
-  interface EarlyMySubcomponentBuilderEntryPoint {
-    MySubcomponent.Builder mySubcomponentBuilder();
-  }
-
-  @Scope
-  @Retention(RUNTIME)
-  public @interface MySubcomponentScoped {}
-
-  @MySubcomponentScoped
-  @DefineComponent(parent = SingletonComponent.class)
-  public interface MySubcomponent {
-    @DefineComponent.Builder
-    interface Builder {
-      @BindsInstance
-      Builder id(int id);
-
-      MySubcomponent build();
-    }
-  }
-
-  // This needs to be defined outside the test so that it gets installed in the early component.
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  interface MySubcomponentBuilderEntryPoint {
-    MySubcomponent.Builder mySubcomponentBuilder();
-  }
-
-  // This needs to be defined outside the test so that it gets installed in the early component.
-  @EntryPoint
-  @InstallIn(MySubcomponent.class)
-  interface BarEntryPoint {
-    Bar bar();
-  }
-}
diff --git a/javatests/dagger/hilt/android/EarlyEntryPointHiltAndroidTestRuntimeTest.java b/javatests/dagger/hilt/android/EarlyEntryPointHiltAndroidTestRuntimeTest.java
deleted file mode 100644
index 2050d67..0000000
--- a/javatests/dagger/hilt/android/EarlyEntryPointHiltAndroidTestRuntimeTest.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.EarlyEntryPointHiltAndroidTestRuntimeClasses.BarEntryPoint;
-import dagger.hilt.android.EarlyEntryPointHiltAndroidTestRuntimeClasses.EarlyFooEntryPoint;
-import dagger.hilt.android.EarlyEntryPointHiltAndroidTestRuntimeClasses.EarlyMySubcomponentBuilderEntryPoint;
-import dagger.hilt.android.EarlyEntryPointHiltAndroidTestRuntimeClasses.MySubcomponent;
-import dagger.hilt.android.EarlyEntryPointHiltAndroidTestRuntimeClasses.MySubcomponentBuilderEntryPoint;
-import dagger.hilt.android.EarlyEntryPointHiltAndroidTestRuntimeClasses.MySubcomponentScoped;
-import dagger.hilt.android.internal.testing.TestApplicationComponentManager;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class EarlyEntryPointHiltAndroidTestRuntimeTest {
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  interface FooEntryPoint {
-    Foo foo();
-  }
-
-  @Singleton
-  public static class Foo {
-    @Inject
-    Foo() {}
-  }
-
-  @MySubcomponentScoped
-  public static class Bar {
-    final Foo foo;
-    final int id;
-
-    @Inject
-    Bar(Foo foo, int id) {
-      this.foo = foo;
-      this.id = id;
-    }
-  }
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Test
-  public void testEarlyEntryPointsWrongEntryPointFails() throws Exception {
-    IllegalStateException exception =
-        assertThrows(
-            IllegalStateException.class,
-            () -> EarlyEntryPoints.get(getApplicationContext(), FooEntryPoint.class));
-
-    assertThat(exception)
-        .hasMessageThat()
-        .contains(
-            "FooEntryPoint should be called with EntryPoints.get() rather than "
-                + "EarlyEntryPoints.get()");
-  }
-
-  @Test
-  public void testEntryPointsWrongEntryPointFails() throws Exception {
-    IllegalStateException exception =
-        assertThrows(
-            IllegalStateException.class,
-            () -> EntryPoints.get(getApplicationContext(), EarlyFooEntryPoint.class));
-
-    assertThat(exception)
-        .hasMessageThat()
-        .contains(
-            "Interface, dagger.hilt.android.EarlyEntryPointHiltAndroidTestRuntimeClasses."
-                + "EarlyFooEntryPoint, annotated with @EarlyEntryPoint should be called with "
-                + "EarlyEntryPoints.get() rather than EntryPoints.get()");
-  }
-
-  @Test
-  public void testComponentInstances() {
-    Object componentManager = ((HiltTestApplication) getApplicationContext()).componentManager();
-    Object component1 = ((TestApplicationComponentManager) componentManager).generatedComponent();
-    Object component2 = ((TestApplicationComponentManager) componentManager).generatedComponent();
-    assertThat(component1).isNotNull();
-    assertThat(component2).isNotNull();
-    assertThat(component1).isEqualTo(component2);
-
-    Object earlyComponent1 =
-        ((TestApplicationComponentManager) componentManager).earlySingletonComponent();
-    Object earlyComponent2 =
-        ((TestApplicationComponentManager) componentManager).earlySingletonComponent();
-    assertThat(earlyComponent1).isNotNull();
-    assertThat(earlyComponent2).isNotNull();
-    assertThat(earlyComponent1).isEqualTo(earlyComponent2);
-    assertThat(earlyComponent1).isNotEqualTo(component1);
-  }
-
-  // Test that the early entry point returns a different @Singleton binding instance.
-  @Test
-  public void testScopedEntryPointValues() {
-    Foo foo1 = EntryPoints.get(getApplicationContext(), FooEntryPoint.class).foo();
-    Foo foo2 = EntryPoints.get(getApplicationContext(), FooEntryPoint.class).foo();
-    Foo earlyFoo1 =
-        EarlyEntryPoints.get(getApplicationContext(), EarlyFooEntryPoint.class).foo();
-    Foo earlyFoo2 =
-        EarlyEntryPoints.get(getApplicationContext(), EarlyFooEntryPoint.class).foo();
-
-    assertThat(foo1).isNotNull();
-    assertThat(foo2).isNotNull();
-    assertThat(earlyFoo1).isNotNull();
-    assertThat(earlyFoo2).isNotNull();
-
-    assertThat(foo1).isEqualTo(foo2);
-    assertThat(earlyFoo1).isEqualTo(earlyFoo2);
-    assertThat(earlyFoo1).isNotEqualTo(foo1);
-  }
-
-  // Test that the a subcomponent of the early component does not need to use EarlyEntryPoints.
-  @Test
-  public void testSubcomponentEntryPoints() {
-    MySubcomponent subcomponent =
-        EntryPoints.get(getApplicationContext(), MySubcomponentBuilderEntryPoint.class)
-            .mySubcomponentBuilder()
-            .id(5)
-            .build();
-
-    MySubcomponent earlySubcomponent =
-        EarlyEntryPoints.get(
-                getApplicationContext(), EarlyMySubcomponentBuilderEntryPoint.class)
-            .mySubcomponentBuilder()
-            .id(11)
-            .build();
-
-    assertThat(subcomponent).isNotNull();
-    assertThat(earlySubcomponent).isNotNull();
-    assertThat(subcomponent).isNotEqualTo(earlySubcomponent);
-
-    // Test that subcomponents can use EntryPoints
-    Bar bar1 = EntryPoints.get(subcomponent, BarEntryPoint.class).bar();
-    Bar bar2 = EntryPoints.get(subcomponent, BarEntryPoint.class).bar();
-
-    // Test that early subcomponents can use EntryPoints or EarlyEntryPoints
-    Bar earlyBar1 = EntryPoints.get(earlySubcomponent, BarEntryPoint.class).bar();
-    Bar earlyBar2 = EntryPoints.get(earlySubcomponent, BarEntryPoint.class).bar();
-
-    assertThat(bar1).isNotNull();
-    assertThat(bar2).isNotNull();
-    assertThat(earlyBar1).isNotNull();
-    assertThat(earlyBar2).isNotNull();
-    assertThat(bar1).isEqualTo(bar2);
-    assertThat(earlyBar1).isEqualTo(earlyBar2);
-    assertThat(bar1).isNotEqualTo(earlyBar1);
-  }
-}
diff --git a/javatests/dagger/hilt/android/EarlyEntryPointNoEntryPointsDefinedTest.java b/javatests/dagger/hilt/android/EarlyEntryPointNoEntryPointsDefinedTest.java
deleted file mode 100644
index a912615..0000000
--- a/javatests/dagger/hilt/android/EarlyEntryPointNoEntryPointsDefinedTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.internal.testing.TestApplicationComponentManager;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-// The main purpose of this test is to check the error messages if EarlyEntryPoints is called
-// without the EarlyComponent being generated (i.e. if no @EarlyEntryPoints are defined).
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class EarlyEntryPointNoEntryPointsDefinedTest {
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  interface FooEntryPoint {
-    Foo foo();
-  }
-
-  @Singleton
-  public static class Foo {
-    @Inject
-    Foo() {}
-  }
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Test
-  public void testEarlyComponentDoesNotExist() throws Exception {
-    HiltTestApplication app = (HiltTestApplication) getApplicationContext();
-    TestApplicationComponentManager componentManager =
-        (TestApplicationComponentManager) app.componentManager();
-
-    RuntimeException exception =
-        assertThrows(RuntimeException.class, () -> componentManager.earlySingletonComponent());
-
-    assertThat(exception)
-        .hasMessageThat()
-        .contains(
-            "The EarlyComponent was requested but does not exist. Check that you have "
-                + "annotated your test class with @HiltAndroidTest and that the processor is "
-                + "running over your test");
-  }
-
-  @Test
-  public void testEarlyEntryPointsWrongEntryPointFails() throws Exception {
-    IllegalStateException exception =
-        assertThrows(
-            IllegalStateException.class,
-            () -> EarlyEntryPoints.get(getApplicationContext(), FooEntryPoint.class));
-
-    assertThat(exception)
-        .hasMessageThat()
-        .contains(
-            "FooEntryPoint should be called with EntryPoints.get() rather than "
-                + "EarlyEntryPoints.get()");
-  }
-}
diff --git a/javatests/dagger/hilt/android/InjectionTest.java b/javatests/dagger/hilt/android/InjectionTest.java
deleted file mode 100644
index 7c34279..0000000
--- a/javatests/dagger/hilt/android/InjectionTest.java
+++ /dev/null
@@ -1,706 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.fail;
-
-import android.annotation.TargetApi;
-import android.app.Activity;
-import android.app.IntentService;
-import android.app.Service;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.IBinder;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-import android.util.AttributeSet;
-import android.widget.LinearLayout;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.components.ActivityComponent;
-import dagger.hilt.android.components.FragmentComponent;
-import dagger.hilt.android.components.ServiceComponent;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import dagger.hilt.components.SingletonComponent;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-import java.util.concurrent.atomic.AtomicLong;
-import javax.inject.Inject;
-import javax.inject.Qualifier;
-import javax.inject.Singleton;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.android.controller.ActivityController;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class InjectionTest {
-  private static final String APP_BINDING = "APP_BINDING";
-  private static final String ACTIVITY_BINDING = "ACTIVIY_BINDING";
-  private static final String FRAGMENT_BINDING = "FRAGMENT_BINDING";
-  private static final String SERVICE_BINDING = "SERVICE_BINDING";
-
-  @Retention(RUNTIME)
-  @Qualifier
-  @Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
-  @interface ApplicationLevel {}
-
-  @Retention(RUNTIME)
-  @Qualifier
-  @Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
-  @interface ActivityLevel {}
-
-  @Retention(RUNTIME)
-  @Qualifier
-  @Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
-  @interface FragmentLevel {}
-
-  @Retention(RUNTIME)
-  @Qualifier
-  @Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
-  @interface ServiceLevel {}
-
-  /** Application level bindings */
-  @Module
-  @InstallIn(SingletonComponent.class)
-  static final class AppModule {
-    @Provides
-    @ApplicationLevel
-    static String providesAppBinding() {
-      return APP_BINDING;
-    }
-
-    @Provides
-    @Singleton
-    static AtomicLong provideCounter() {
-      return new AtomicLong();
-    }
-
-    @Provides
-    static Long provideCount(AtomicLong counter) {
-      return counter.incrementAndGet();
-    }
-  }
-
-  /** Activity level bindings */
-  @Module
-  @InstallIn(ActivityComponent.class)
-  static final class ActivityModule {
-    @Provides
-    @ActivityLevel
-    static String providesActivityBinding() {
-      return ACTIVITY_BINDING;
-    }
-  }
-
-  /** Fragment level bindings */
-  @Module
-  @InstallIn(FragmentComponent.class)
-  static final class FragmentModule {
-    @Provides
-    @FragmentLevel
-    static String providesFragmentBinding() {
-      return FRAGMENT_BINDING;
-    }
-  }
-
-  /** Service level bindings */
-  @Module
-  @InstallIn(ServiceComponent.class)
-  static final class ServiceModule {
-    @Provides
-    @ServiceLevel
-    static String providesServiceBinding() {
-      return SERVICE_BINDING;
-    }
-  }
-
-  /** Hilt Activity */
-  @AndroidEntryPoint(FragmentActivity.class)
-  public static final class TestActivity extends Hilt_InjectionTest_TestActivity {
-    @Inject @ApplicationLevel String appBinding;
-    @Inject @ActivityLevel String activityBinding;
-    boolean onCreateCalled;
-
-    @Override
-    public void onCreate(Bundle onSavedInstanceState) {
-      assertThat(appBinding).isNull();
-      assertThat(activityBinding).isNull();
-
-      super.onCreate(onSavedInstanceState);
-
-      assertThat(appBinding).isEqualTo(APP_BINDING);
-      assertThat(activityBinding).isEqualTo(ACTIVITY_BINDING);
-
-      onCreateCalled = true;
-    }
-  }
-
-  /** Non-Hilt Activity */
-  public static final class NonHiltActivity extends FragmentActivity {}
-
-  /** Hilt Fragment */
-  @AndroidEntryPoint(Fragment.class)
-  public static final class TestFragment extends Hilt_InjectionTest_TestFragment {
-    @Inject @ApplicationLevel String appBinding;
-    @Inject @ActivityLevel String activityBinding;
-    @Inject @FragmentLevel String fragmentBinding;
-    boolean onAttachContextCalled;
-    boolean onAttachActivityCalled;
-
-    @Override
-    public void onAttach(Context context) {
-      preInjectionAssert();
-      super.onAttach(context);
-      postInjectionAssert();
-      onAttachContextCalled = true;
-    }
-
-    @Override
-    public void onAttach(Activity activity) {
-      preInjectionAssert();
-      super.onAttach(activity);
-      postInjectionAssert();
-      onAttachActivityCalled = true;
-    }
-
-    private void preInjectionAssert() {
-      assertThat(appBinding).isNull();
-      assertThat(activityBinding).isNull();
-      assertThat(fragmentBinding).isNull();
-    }
-
-    private void postInjectionAssert() {
-      assertThat(appBinding).isEqualTo(APP_BINDING);
-      assertThat(activityBinding).isEqualTo(ACTIVITY_BINDING);
-      assertThat(fragmentBinding).isEqualTo(FRAGMENT_BINDING);
-    }
-  }
-
-  /** Non-Hilt Fragment */
-  public static final class NonHiltFragment extends Fragment {}
-
-  /** Hilt extends parameterized fragment. */
-  @AndroidEntryPoint(ParameterizedFragment.class)
-  public static final class TestParameterizedFragment
-      extends Hilt_InjectionTest_TestParameterizedFragment<Integer> {
-    @Inject @ApplicationLevel String appBinding;
-    @Inject @ActivityLevel String activityBinding;
-    @Inject @FragmentLevel String fragmentBinding;
-    boolean onAttachContextCalled;
-    boolean onAttachActivityCalled;
-
-    @Override
-    public void onAttach(Context context) {
-      preInjectionAssert();
-      super.onAttach(context);
-      postInjectionAssert();
-      onAttachContextCalled = true;
-    }
-
-    @Override
-    public void onAttach(Activity activity) {
-      preInjectionAssert();
-      super.onAttach(activity);
-      postInjectionAssert();
-      onAttachActivityCalled = true;
-    }
-
-    private void preInjectionAssert() {
-      assertThat(appBinding).isNull();
-      assertThat(activityBinding).isNull();
-      assertThat(fragmentBinding).isNull();
-    }
-
-    private void postInjectionAssert() {
-      assertThat(appBinding).isEqualTo(APP_BINDING);
-      assertThat(activityBinding).isEqualTo(ACTIVITY_BINDING);
-      assertThat(fragmentBinding).isEqualTo(FRAGMENT_BINDING);
-    }
-  }
-
-  /** Non-Hilt parameterized fragment */
-  public static class ParameterizedFragment<T> extends Fragment {}
-
-  /** Hilt View */
-  @AndroidEntryPoint(LinearLayout.class)
-  public static final class TestView extends Hilt_InjectionTest_TestView {
-    @Inject @ApplicationLevel String appBinding;
-    @Inject @ActivityLevel String activityBinding;
-
-    TestView(Context context) {
-      super(context);
-    }
-
-    TestView(Context context, AttributeSet attrs) {
-      super(context, attrs);
-    }
-
-    TestView(Context context, AttributeSet attrs, int defStyleAttr) {
-      super(context, attrs, defStyleAttr);
-    }
-
-    @TargetApi(21)
-    TestView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
-      super(context, attrs, defStyleAttr, defStyleRes);
-    }
-  }
-
-  /** Hilt View (With Fragment bindings) */
-  @WithFragmentBindings
-  @AndroidEntryPoint(LinearLayout.class)
-  public static final class TestViewWithFragmentBindings
-      extends Hilt_InjectionTest_TestViewWithFragmentBindings {
-    @Inject @ApplicationLevel String appBinding;
-    @Inject @ActivityLevel String activityBinding;
-    @Inject @FragmentLevel String fragmentBinding;
-
-    TestViewWithFragmentBindings(Context context) {
-      super(context);
-    }
-  }
-
-  @AndroidEntryPoint(Service.class)
-  public static final class TestService extends Hilt_InjectionTest_TestService {
-    @Inject @ApplicationLevel String appBinding;
-    @Inject @ServiceLevel String serviceBinding;
-
-    @Override
-    public IBinder onBind(Intent intent) {
-      return null;
-    }
-  }
-
-  @AndroidEntryPoint(IntentService.class)
-  public static final class TestIntentService extends Hilt_InjectionTest_TestIntentService {
-    private static final String NAME = "TestIntentServiceName";
-    @Inject @ApplicationLevel String appBinding;
-    @Inject @ServiceLevel String serviceBinding;
-
-    TestIntentService() {
-      super(NAME);
-    }
-
-    @Override
-    public void onHandleIntent(Intent intent) {}
-  }
-
-  @AndroidEntryPoint(BroadcastReceiver.class)
-  public static final class TestBroadcastReceiver extends Hilt_InjectionTest_TestBroadcastReceiver {
-    @Inject @ApplicationLevel String appBinding;
-    Intent lastIntent = null;
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-      super.onReceive(context, intent);
-      lastIntent = intent;
-    }
-  }
-
-  @AndroidEntryPoint(BaseBroadcastReceiver.class)
-  public static final class TestBroadcastReceiverWithBaseImplementingOnReceive
-      extends Hilt_InjectionTest_TestBroadcastReceiverWithBaseImplementingOnReceive {
-    @Inject @ApplicationLevel String appBinding;
-    Intent baseLastIntent = null;
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-      super.onReceive(context, intent);
-      baseLastIntent = intent;
-    }
-  }
-
-  abstract static class BaseBroadcastReceiver extends BroadcastReceiver {
-    Intent lastIntent = null;
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-      lastIntent = intent;
-    }
-  }
-
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Inject @ApplicationLevel String appBinding;
-
-  @Before
-  public void setup() {
-    rule.inject();
-  }
-
-  @Test
-  public void testAppInjection() throws Exception {
-    assertThat(appBinding).isEqualTo(APP_BINDING);
-  }
-
-  @Test
-  public void testActivityInjection() throws Exception {
-    ActivityController<TestActivity> controller = Robolectric.buildActivity(TestActivity.class);
-
-    assertThat(controller.get().onCreateCalled).isFalse();
-    controller.create();
-    assertThat(controller.get().onCreateCalled).isTrue();
-  }
-
-  @Test
-  public void testFragmentInjection() throws Exception {
-    TestFragment fragment = new TestFragment();
-    assertThat(fragment.onAttachContextCalled).isFalse();
-    assertThat(fragment.onAttachActivityCalled).isFalse();
-    setupFragment(TestActivity.class, fragment);
-    assertThat(fragment.onAttachContextCalled).isTrue();
-    assertThat(fragment.onAttachActivityCalled).isTrue();
-  }
-
-  @Test
-  public void testParameterizedFragmentInjection() throws Exception {
-    TestParameterizedFragment fragment = new TestParameterizedFragment();
-    assertThat(fragment.onAttachContextCalled).isFalse();
-    assertThat(fragment.onAttachActivityCalled).isFalse();
-    setupFragment(TestActivity.class, fragment);
-    assertThat(fragment.onAttachContextCalled).isTrue();
-    assertThat(fragment.onAttachActivityCalled).isTrue();
-  }
-
-  @Test
-  public void testViewNoFragmentBindingsWithActivity() throws Exception {
-    TestActivity activity = Robolectric.setupActivity(TestActivity.class);
-    TestView view = new TestView(activity);
-    assertThat(view.appBinding).isEqualTo(APP_BINDING);
-    assertThat(view.activityBinding).isEqualTo(ACTIVITY_BINDING);
-  }
-
-  @Test
-  public void testViewNoFragmentBindingsWithFragment() throws Exception {
-    TestFragment fragment = setupFragment(TestActivity.class, new TestFragment());
-    TestView view = new TestView(fragment.getContext());
-    assertThat(view.appBinding).isEqualTo(APP_BINDING);
-    assertThat(view.activityBinding).isEqualTo(ACTIVITY_BINDING);
-  }
-
-  @Test
-  public void testViewNoFragmentBindingsWithFragment_secondConstructor() throws Exception {
-    TestFragment fragment = setupFragment(TestActivity.class, new TestFragment());
-    TestView view = new TestView(fragment.getContext(), /* attrs= */ null);
-    assertThat(view.appBinding).isEqualTo(APP_BINDING);
-    assertThat(view.activityBinding).isEqualTo(ACTIVITY_BINDING);
-  }
-
-  @Test
-  public void testViewNoFragmentBindingsWithFragment_thirdConstructor() throws Exception {
-    TestFragment fragment = setupFragment(TestActivity.class, new TestFragment());
-    TestView view = new TestView(fragment.getContext(), /* attrs= */ null, /* defStyleAttr= */ 0);
-    assertThat(view.appBinding).isEqualTo(APP_BINDING);
-    assertThat(view.activityBinding).isEqualTo(ACTIVITY_BINDING);
-  }
-
-  @Test
-  @Config(sdk = 21)
-  public void testViewNoFragmentBindingsWithFragment_fourthConstructor_presentOnTwentyOne()
-      throws Exception {
-    TestFragment fragment = setupFragment(TestActivity.class, new TestFragment());
-    TestView view =
-        new TestView(
-            fragment.getContext(), /* attrs= */ null, /* defStyleAttr= */ 0, /* defStyleRes= */ 0);
-    assertThat(view.appBinding).isEqualTo(APP_BINDING);
-    assertThat(view.activityBinding).isEqualTo(ACTIVITY_BINDING);
-  }
-
-  @Test
-  @Config(sdk = 19)
-  public void testViewNoFragmentBindingsWithFragment_fourthConstructor_notPresentOnTwenty() {
-    TestFragment fragment = setupFragment(TestActivity.class, new TestFragment());
-
-    assertThrows(
-        NoSuchMethodError.class,
-        () ->
-            new TestView(
-                fragment.getContext(),
-                /* attrs= */ null,
-                /* defStyleAttr= */ 0,
-                /* defStyleRes= */ 0));
-  }
-
-  @Test
-  public void testServiceInjection() throws Exception {
-    TestService testService = Robolectric.setupService(TestService.class);
-    assertThat(testService.appBinding).isEqualTo(APP_BINDING);
-    assertThat(testService.serviceBinding).isEqualTo(SERVICE_BINDING);
-  }
-
-  @Test
-  public void testIntentServiceInjection() throws Exception {
-    TestIntentService testIntentService = Robolectric.setupService(TestIntentService.class);
-    assertThat(testIntentService.appBinding).isEqualTo(APP_BINDING);
-    assertThat(testIntentService.serviceBinding).isEqualTo(SERVICE_BINDING);
-  }
-
-  @Test
-  public void testBroadcastReceiverInjection() throws Exception {
-    TestBroadcastReceiver testBroadcastReceiver = new TestBroadcastReceiver();
-    Intent intent = new Intent();
-    testBroadcastReceiver.onReceive(getApplicationContext(), intent);
-    assertThat(testBroadcastReceiver.appBinding).isEqualTo(APP_BINDING);
-    assertThat(testBroadcastReceiver.lastIntent).isSameInstanceAs(intent);
-  }
-
-  @Test
-  public void testBroadcastReceiverWithBaseImplementingOnReceiveInjection() throws Exception {
-    TestBroadcastReceiverWithBaseImplementingOnReceive testBroadcastReceiver =
-        new TestBroadcastReceiverWithBaseImplementingOnReceive();
-    Intent intent = new Intent();
-    testBroadcastReceiver.onReceive(getApplicationContext(), intent);
-    assertThat(testBroadcastReceiver.appBinding).isEqualTo(APP_BINDING);
-    assertThat(testBroadcastReceiver.lastIntent).isSameInstanceAs(intent);
-    assertThat(testBroadcastReceiver.baseLastIntent).isSameInstanceAs(intent);
-  }
-
-  @Test
-  public void testViewWithFragmentBindingsWithFragment() throws Exception {
-    TestFragment fragment = setupFragment(TestActivity.class, new TestFragment());
-
-    Context fragmentContext = fragment.getContext();
-    TestViewWithFragmentBindings view = new TestViewWithFragmentBindings(fragmentContext);
-    assertThat(view.appBinding).isEqualTo(APP_BINDING);
-    assertThat(view.activityBinding).isEqualTo(ACTIVITY_BINDING);
-    assertThat(view.fragmentBinding).isEqualTo(FRAGMENT_BINDING);
-  }
-
-  @Test
-  public void testViewWithFragmentBindingsFailsWithActivity() throws Exception {
-    TestActivity activity = Robolectric.setupActivity(TestActivity.class);
-    try {
-      new TestViewWithFragmentBindings(activity);
-      fail("Expected test to fail but it passes!");
-    } catch (IllegalStateException e) {
-      assertThat(e)
-          .hasMessageThat()
-      .contains(
-      "@WithFragmentBindings Hilt view must be attached to an @AndroidEntryPoint Fragment");
-    }
-  }
-
-  @Test
-  public void testFragmentAttachedToNonHiltActivityFails() throws Exception {
-    NonHiltActivity activity = Robolectric.setupActivity(NonHiltActivity.class);
-    try {
-      activity
-          .getSupportFragmentManager()
-          .beginTransaction()
-          .add(new TestFragment(), null)
-          .commitNow();
-      fail("Expected test to fail but it passes!");
-    } catch (IllegalStateException e) {
-      assertThat(e)
-          .hasMessageThat()
-      .contains("Hilt Fragments must be attached to an @AndroidEntryPoint Activity");
-    }
-  }
-
-  @Test
-  public void testViewAttachedToNonHiltActivityFails() throws Exception {
-    NonHiltActivity activity = Robolectric.setupActivity(NonHiltActivity.class);
-    try {
-      new TestView(activity);
-      fail("Expected test to fail but it passes!");
-    } catch (IllegalStateException e) {
-      assertThat(e)
-          .hasMessageThat()
-      .contains("Hilt view must be attached to an @AndroidEntryPoint Fragment or Activity");
-    }
-  }
-
-  @Test
-  public void testViewAttachedToNonHiltFragmentFails() throws Exception {
-    NonHiltActivity activity = Robolectric.setupActivity(NonHiltActivity.class);
-    NonHiltFragment fragment = new NonHiltFragment();
-    activity.getSupportFragmentManager().beginTransaction().add(fragment, null).commitNow();
-    Context nonHiltContext = fragment.getContext();
-    try {
-      new TestView(nonHiltContext);
-      fail("Expected test to fail but it passes!");
-    } catch (IllegalStateException e) {
-      assertThat(e)
-          .hasMessageThat()
-      .contains("Hilt view must be attached to an @AndroidEntryPoint Fragment or Activity");
-    }
-  }
-
-  @Test
-  public void testViewAttachedToApplicationContextFails() throws Exception {
-    try {
-      new TestView(getApplicationContext());
-      fail("Expected test to fail but it passes!");
-    } catch (IllegalStateException e) {
-      assertThat(e)
-          .hasMessageThat()
-      .contains(
-          "Hilt view cannot be created using the application context. "
-              + "Use a Hilt Fragment or Activity context");
-    }
-  }
-
-  /** Hilt Activity that manually calls inject(). */
-  @AndroidEntryPoint(FragmentActivity.class)
-  public static final class DoubleInjectActivity extends Hilt_InjectionTest_DoubleInjectActivity {
-    @Inject Long counter;
-
-    @Override
-    public void onCreate(Bundle onSavedInstanceState) {
-      inject();
-      super.onCreate(onSavedInstanceState);
-    }
-  }
-
-  @Test
-  public void testActivityDoesNotInjectTwice() throws Exception {
-    ActivityController<DoubleInjectActivity> controller =
-        Robolectric.buildActivity(DoubleInjectActivity.class);
-    controller.create();
-    assertThat(controller.get().counter).isEqualTo(1L);
-  }
-
-  /** Hilt Fragment that manually calls inject(). */
-  @AndroidEntryPoint(Fragment.class)
-  public static final class DoubleInjectFragment extends Hilt_InjectionTest_DoubleInjectFragment {
-    @Inject Long counter;
-
-    @Override
-    public void onAttach(Context context) {
-      inject();
-      super.onAttach(context);
-    }
-
-    @Override
-    public void onAttach(Activity activity) {
-      inject();
-      super.onAttach(activity);
-    }
-  }
-
-  @Test
-  public void testFragmentDoesNotInjectTwice() throws Exception {
-    DoubleInjectFragment fragment = setupFragment(TestActivity.class, new DoubleInjectFragment());
-    assertThat(fragment.counter).isEqualTo(1L);
-  }
-
-  /** Hilt View that manually calls inject(). */
-  @AndroidEntryPoint(LinearLayout.class)
-  public static final class DoubleInjectView extends Hilt_InjectionTest_DoubleInjectView {
-    @Inject Long counter;
-
-    DoubleInjectView(Context context) {
-      super(context);
-      inject();
-    }
-
-    DoubleInjectView(Context context, AttributeSet attrs) {
-      super(context, attrs);
-      inject();
-    }
-
-    DoubleInjectView(Context context, AttributeSet attrs, int defStyleAttr) {
-      super(context, attrs, defStyleAttr);
-      inject();
-    }
-
-    @TargetApi(21)
-    DoubleInjectView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
-      super(context, attrs, defStyleAttr, defStyleRes);
-      inject();
-    }
-  }
-
-  @Test
-  public void testViewDoesNotInjectTwice() throws Exception {
-    TestActivity activity = Robolectric.setupActivity(TestActivity.class);
-    DoubleInjectView view = new DoubleInjectView(activity);
-    assertThat(view.counter).isEqualTo(1L);
-  }
-
-  /** Hilt Service that manually calls inject(). */
-  @AndroidEntryPoint(Service.class)
-  public static final class DoubleInjectService extends Hilt_InjectionTest_DoubleInjectService {
-    @Inject Long counter;
-
-    @Override public void onCreate() {
-      inject();
-      super.onCreate();
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-      return null;
-    }
-  }
-
-  @Test
-  public void testServiceDoesNotInjectTwice() throws Exception {
-    DoubleInjectService testService = Robolectric.setupService(DoubleInjectService.class);
-    assertThat(testService.counter).isEqualTo(1L);
-  }
-
-  /** Hilt BroadcastReceiver that manually calls inject(). */
-  @AndroidEntryPoint(BroadcastReceiver.class)
-  public static final class DoubleInjectBroadcastReceiver
-      extends Hilt_InjectionTest_DoubleInjectBroadcastReceiver {
-    @Inject Long counter;
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-      inject(context);
-      super.onReceive(context, intent);
-    }
-  }
-
-  @Test
-  public void testBroadcastReceiverDoesNotInjectTwice() throws Exception {
-    DoubleInjectBroadcastReceiver testBroadcastReceiver = new DoubleInjectBroadcastReceiver();
-    Intent intent = new Intent();
-    testBroadcastReceiver.onReceive(getApplicationContext(), intent);
-    assertThat(testBroadcastReceiver.counter).isEqualTo(1L);
-  }
-
-  private static <T extends Fragment> T setupFragment(
-      Class<? extends FragmentActivity> activityClass, T fragment) {
-    FragmentActivity activity = Robolectric.setupActivity(activityClass);
-    attachFragment(activity, fragment);
-    return fragment;
-  }
-
-  private static void attachFragment(FragmentActivity activity, Fragment fragment) {
-    activity.getSupportFragmentManager().beginTransaction().add(fragment, "").commitNow();
-  }
-}
diff --git a/javatests/dagger/hilt/android/InstallInObjectModule.kt b/javatests/dagger/hilt/android/InstallInObjectModule.kt
deleted file mode 100644
index dba8571..0000000
--- a/javatests/dagger/hilt/android/InstallInObjectModule.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android
-
-import dagger.Module
-import dagger.Provides
-import dagger.hilt.EntryPoint
-import dagger.hilt.InstallIn
-import dagger.hilt.components.SingletonComponent
-
-@EntryPoint
-@InstallIn(SingletonComponent::class)
-interface TestEntryPoint {
-  fun getInteger(): Int
-  fun getDouble(): Double
-  fun getBoolean(): Boolean
-}
-
-@Module
-@InstallIn(SingletonComponent::class)
-object InstallInObjectModule {
-  @Provides
-  fun provideBoolean() = true
-}
-
-@Module
-@InstallIn(SingletonComponent::class)
-class InstallInCompanionObjectModule {
-  @Provides
-  fun provideDouble() = 2.0
-
-  companion object {
-    @Provides
-    fun provideInt() = 1
-  }
-}
diff --git a/javatests/dagger/hilt/android/InstallInObjectModuleTest.java b/javatests/dagger/hilt/android/InstallInObjectModuleTest.java
deleted file mode 100644
index 760d181..0000000
--- a/javatests/dagger/hilt/android/InstallInObjectModuleTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public class InstallInObjectModuleTest {
-
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Test
-  public void verifyObjectModule() {
-    TestEntryPoint entryPoint = EntryPoints.get(getApplicationContext(), TestEntryPoint.class);
-    assertThat(entryPoint.getInteger()).isEqualTo(1);
-    assertThat(entryPoint.getDouble()).isEqualTo(2.0);
-    assertThat(entryPoint.getBoolean()).isTrue();
-  }
-}
diff --git a/javatests/dagger/hilt/android/InternalKtModuleTest.java b/javatests/dagger/hilt/android/InternalKtModuleTest.java
deleted file mode 100644
index 0b48989..0000000
--- a/javatests/dagger/hilt/android/InternalKtModuleTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import javax.inject.Inject;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class InternalKtModuleTest {
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Inject String string;
-  @Inject Integer intValue;
-
-  @Before
-  public void setUp() {
-    rule.inject();
-  }
-
-  @Test
-  public void testBindingFromInternalKtModule() {
-    assertThat(string).isEqualTo("expected_string_value");
-    assertThat(intValue).isEqualTo(9);
-  }
-}
diff --git a/javatests/dagger/hilt/android/ModuleTest.java b/javatests/dagger/hilt/android/ModuleTest.java
deleted file mode 100644
index 0dadfe0..0000000
--- a/javatests/dagger/hilt/android/ModuleTest.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.Binds;
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Inject;
-import javax.inject.Named;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class ModuleTest {
-  public static class Dep1 {}
-  public static class Dep2 {}
-  public static class Dep3 {}
-  public static class Dep4 { @Inject Dep4() {}}
-  public static class Dep5 { @Inject Dep5() {}}
-  public static class Dep6 {}
-  public static class Dep7 {}
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  // Test that modules with only static methods can have private constructors.
-  @Module
-  @InstallIn(SingletonComponent.class)
-  static final class TestModule1 {
-    private TestModule1() {} // This is fine because Dagger doesn't need an instance.
-
-    @Provides
-    static Dep1 provide() {
-      return new Dep1();
-    }
-  }
-
-  // Test that modules with only static methods can have constructors with parameters.
-  @Module
-  @InstallIn(SingletonComponent.class)
-  static final class TestModule2 {
-    TestModule2(String str) {} // This is fine because Dagger doesn't need an instance.
-
-    @Provides
-    static Dep2 provide() {
-      return new Dep2();
-    }
-  }
-
-  // Test that modules with non-static methods can have constructors with parameters if no-arg
-  // constructor exists.
-  @Module
-  @InstallIn(SingletonComponent.class)
-  static final class TestModule3 {
-    TestModule3() {
-      this("");
-    }
-
-    TestModule3(String str) {} // This is fine because Dagger can use the other constructor
-
-    @Provides
-    Dep3 provide() {
-      return new Dep3();
-    }
-  }
-
-  // Test that modules with only abstract methods can have private constructors.
-  @Module
-  @InstallIn(SingletonComponent.class)
-  @SuppressWarnings("ClassCanBeStatic") // purposely testing non-static class here
-  abstract class TestModule4 {
-    private TestModule4() {}  // This is fine because Dagger doesn't need an instance.
-
-    @Binds @Named("Dep4") abstract Object bind(Dep4 impl);
-  }
-
-  // Test that modules with only abstract methods can have constructors with parameters.
-  @Module
-  @InstallIn(SingletonComponent.class)
-  @SuppressWarnings("ClassCanBeStatic") // purposely testing non-static class here
-  abstract class TestModule5 {
-    TestModule5(String str) {} // This is fine because Dagger doesn't need an instance.
-
-    @Binds @Named("Dep5") abstract Object bind(Dep5 impl);
-  }
-
-  // Test that static modules with no methods can have private constructors.
-  @Module
-  @InstallIn(SingletonComponent.class)
-  static final class TestModule6 {
-    private TestModule6() {} // This is fine because Dagger doesn't need an instance.
-  }
-
-  // Test that static modules with no methods can have constructors with parameters.
-  @Module
-  @InstallIn(SingletonComponent.class)
-  static final class TestModule7 {
-    TestModule7(String str) {} // This is fine because Dagger doesn't need an instance.
-  }
-
-  // Test that abstract modules with no methods can have private constructors.
-  @Module
-  @InstallIn(SingletonComponent.class)
-  @SuppressWarnings("ClassCanBeStatic") // purposely testing non-static class here
-  abstract class TestModule8 {
-    private TestModule8() {} // This is fine because Dagger doesn't need an instance.
-  }
-
-  // Test that abstract modules with no methods can have constructors with parameters.
-  @Module
-  @InstallIn(SingletonComponent.class)
-  @SuppressWarnings("ClassCanBeStatic") // purposely testing non-static class here
-  abstract class TestModule9 {
-    TestModule9(String str) {} // This is fine because Dagger doesn't need an instance.
-  }
-
-  @Inject Dep1 dep1;
-  @Inject Dep2 dep2;
-  @Inject Dep5 dep3;
-  @Inject @Named("Dep4") Object dep4;
-  @Inject @Named("Dep5") Object dep5;
-
-  @Before
-  public void setup() {
-    rule.inject();
-  }
-
-  @Test
-  public void testDep1() throws Exception {
-    assertThat(dep1).isNotNull();
-  }
-
-  @Test
-  public void testDep2() throws Exception {
-    assertThat(dep2).isNotNull();
-  }
-
-  @Test
-  public void testDep3() throws Exception {
-    assertThat(dep3).isNotNull();
-  }
-
-  @Test
-  public void testDep4() throws Exception {
-    assertThat(dep4).isNotNull();
-    assertThat(dep4).isInstanceOf(Dep4.class);
-  }
-
-  @Test
-  public void testDep5() throws Exception {
-    assertThat(dep5).isNotNull();
-    assertThat(dep5).isInstanceOf(Dep5.class);
-  }
-}
diff --git a/javatests/dagger/hilt/android/MultiTestRoot1Test.java b/javatests/dagger/hilt/android/MultiTestRoot1Test.java
deleted file mode 100644
index 49c03bc..0000000
--- a/javatests/dagger/hilt/android/MultiTestRoot1Test.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import android.os.Build;
-import androidx.activity.ComponentActivity;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.components.ActivityComponent;
-import dagger.hilt.android.testing.BindValue;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import dagger.hilt.android.testing.UninstallModules;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Inject;
-import javax.inject.Named;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.android.controller.ActivityController;
-import org.robolectric.annotation.Config;
-
-// TODO(bcorso): Support transitively ignoring the @Module.includes of ignored modules?
-// TODO(bcorso): Support including non-test @UninstallModules using @UninstallModules.includes?
-@UninstallModules({
-  MultiTestRootExternalModules.PkgPrivateAppModule.class,
-  MultiTestRootExternalModules.PkgPrivateActivityModule.class
-})
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class MultiTestRoot1Test {
-  private static final int INT_VALUE = 9;
-  private static final String STR_VALUE = "MultiTestRoot1TestValue";
-  private static final long LONG_VALUE = 11L;
-  private static final String REPLACE_EXTERNAL_STR_VALUE = "REPLACED_EXTERNAL_STR_VALUE";
-  private static final long REPLACE_EXTERNAL_LONG_VALUE = 17L;
-  private static final String BIND_VALUE_STRING = "BIND_VALUE_STRING";
-  private static final String TEST_QUALIFIER = "TEST_QUALIFIER";
-
-  @AndroidEntryPoint(ComponentActivity.class)
-  public static class TestActivity extends Hilt_MultiTestRoot1Test_TestActivity {
-    @Inject Baz baz;
-    @Inject @MultiTestRootExternalModules.External Long externalLongValue;
-  }
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  public interface BindValueEntryPoint {
-    @Named(TEST_QUALIFIER)
-    String bindValueString();
-  }
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public interface ReplaceExternalAppModule {
-    @Provides
-    @MultiTestRootExternalModules.External
-    static String provideString() {
-      return REPLACE_EXTERNAL_STR_VALUE;
-    }
-  }
-
-  @Module
-  @InstallIn(ActivityComponent.class)
-  public interface ReplaceExternalActivityModule {
-    @Provides
-    @MultiTestRootExternalModules.External
-    static Long provideString() {
-      return REPLACE_EXTERNAL_LONG_VALUE;
-    }
-  }
-
-  @Module
-  @InstallIn(ActivityComponent.class)
-  public interface TestActivityModule {
-    @Provides
-    static Baz provideBaz() {
-      return new Baz(LONG_VALUE);
-    }
-  }
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  interface PkgPrivateTestModule {
-    @Provides
-    static Qux provideQux() {
-      return new Qux();
-    }
-  }
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public interface TestModule {
-    @Provides
-    static int provideInt() {
-      return INT_VALUE;
-    }
-
-    @Provides
-    static String provideString() {
-      return STR_VALUE;
-    }
-  }
-
-  public static final class Outer {
-    @Module
-    @InstallIn(SingletonComponent.class)
-    public interface NestedTestModule {
-      @Provides
-      static long provideLong() {
-        return LONG_VALUE;
-      }
-    }
-
-    private Outer() {}
-  }
-
-  static class Foo {
-    final int value;
-
-    @Inject
-    Foo(int value) {
-      this.value = value;
-    }
-  }
-
-  static class Bar {
-    final String value;
-
-    Bar(String value) {
-      this.value = value;
-    }
-  }
-
-  static class Baz {
-    final long value;
-
-    Baz(long value) {
-      this.value = value;
-    }
-  }
-
-  static class Qux {}
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public interface BarModule {
-    @Provides
-    static Bar provideBar(String value) {
-      return new Bar(value);
-    }
-  }
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  public interface BarEntryPoint {
-    Bar getBar();
-  }
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  interface PkgPrivateQuxEntryPoint {
-    Qux getQux();
-  }
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Inject Foo foo;
-  @Inject Qux qux;
-  @Inject Long longValue;
-  @Inject @MultiTestRootExternalModules.External String externalStrValue;
-
-  @BindValue
-  @Named(TEST_QUALIFIER)
-  String bindValueString = BIND_VALUE_STRING;
-
-  @Test
-  public void testInjectFromTestModule() throws Exception {
-    assertThat(foo).isNull();
-    setupComponent();
-    assertThat(foo).isNotNull();
-    assertThat(foo.value).isEqualTo(INT_VALUE);
-  }
-
-  @Test
-  public void testInjectFromNestedTestModule() throws Exception {
-    assertThat(longValue).isNull();
-    setupComponent();
-    assertThat(longValue).isNotNull();
-    assertThat(longValue).isEqualTo(LONG_VALUE);
-  }
-
-  @Test
-  public void testInjectFromExternalAppModule() throws Exception {
-    assertThat(externalStrValue).isNull();
-    setupComponent();
-    assertThat(externalStrValue).isNotNull();
-    assertThat(externalStrValue).isEqualTo(REPLACE_EXTERNAL_STR_VALUE);
-    assertThat(externalStrValue).isNotEqualTo(MultiTestRootExternalModules.EXTERNAL_STR_VALUE);
-  }
-
-  @Test
-  public void testInjectFromExternalActivityModule() throws Exception {
-    setupComponent();
-    ActivityController<TestActivity> ac = Robolectric.buildActivity(TestActivity.class);
-    assertThat(ac.get().externalLongValue).isNull();
-    ac.create();
-    assertThat(ac.get().externalLongValue).isNotNull();
-    assertThat(ac.get().externalLongValue).isEqualTo(REPLACE_EXTERNAL_LONG_VALUE);
-    assertThat(ac.get().externalLongValue)
-        .isNotEqualTo(MultiTestRootExternalModules.EXTERNAL_LONG_VALUE);
-  }
-
-  @Test
-  public void testInjectFromPkgPrivateTestModule() throws Exception {
-    assertThat(qux).isNull();
-    setupComponent();
-    assertThat(qux).isNotNull();
-  }
-
-  @Test
-  public void testLocalEntryPoint() throws Exception {
-    setupComponent();
-    Bar bar = EntryPoints.get(getApplicationContext(), BarEntryPoint.class).getBar();
-    assertThat(bar).isNotNull();
-    assertThat(bar.value).isEqualTo(STR_VALUE);
-  }
-
-  @Test
-  public void testLocalPkgPrivateEntryPoint() throws Exception {
-    setupComponent();
-    Qux qux = EntryPoints.get(getApplicationContext(), PkgPrivateQuxEntryPoint.class).getQux();
-    assertThat(qux).isNotNull();
-  }
-
-  @Test
-  public void testAndroidEntryPoint() throws Exception {
-    setupComponent();
-    ActivityController<TestActivity> ac = Robolectric.buildActivity(TestActivity.class);
-    assertThat(ac.get().baz).isNull();
-    ac.create();
-    assertThat(ac.get().baz).isNotNull();
-    assertThat(ac.get().baz.value).isEqualTo(LONG_VALUE);
-  }
-
-  @Test
-  public void testMissingMultiTestRoot2EntryPoint() throws Exception {
-    setupComponent();
-    ClassCastException exception =
-        assertThrows(
-            ClassCastException.class,
-            () -> EntryPoints.get(getApplicationContext(), MultiTestRoot2Test.BarEntryPoint.class));
-    assertThat(exception)
-          .hasMessageThat()
-          .isEqualTo(
-              "Cannot cast dagger.hilt.android.DaggerMultiTestRoot1Test_HiltComponents_SingletonC"
-              + " to dagger.hilt.android.MultiTestRoot2Test$BarEntryPoint");
-  }
-
-  @Test
-  public void testBindValueFieldIsProvided() throws Exception {
-    setupComponent();
-    assertThat(bindValueString).isEqualTo(BIND_VALUE_STRING);
-    assertThat(getBinding()).isEqualTo(BIND_VALUE_STRING);
-  }
-
-  @Test
-  public void testBindValueIsMutable() throws Exception {
-    setupComponent();
-    bindValueString = "newValue";
-    assertThat(getBinding()).isEqualTo("newValue");
-  }
-
-  void setupComponent() {
-    rule.inject();
-  }
-
-  private static String getBinding() {
-    return EntryPoints.get(getApplicationContext(), BindValueEntryPoint.class).bindValueString();
-  }
-}
diff --git a/javatests/dagger/hilt/android/MultiTestRoot2Test.java b/javatests/dagger/hilt/android/MultiTestRoot2Test.java
deleted file mode 100644
index 39aecfa..0000000
--- a/javatests/dagger/hilt/android/MultiTestRoot2Test.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import android.os.Build;
-import androidx.activity.ComponentActivity;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.components.ActivityComponent;
-import dagger.hilt.android.testing.BindValue;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Inject;
-import javax.inject.Named;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.android.controller.ActivityController;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class MultiTestRoot2Test {
-  private static final int INT_VALUE = 13;
-  private static final String STR_VALUE = "MultiTestRoot2TestValue";
-  private static final long LONG_VALUE = 17L;
-  private static final String BIND_VALUE_STRING = "BIND_VALUE_STRING";
-  private static final String TEST_QUALIFIER = "TEST_QUALIFIER";
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  public interface BindValueEntryPoint {
-    @Named(TEST_QUALIFIER)
-    String bindValueString();
-  }
-
-  @AndroidEntryPoint(ComponentActivity.class)
-  public static class TestActivity extends Hilt_MultiTestRoot2Test_TestActivity {
-    @Inject Baz baz;
-    @Inject @MultiTestRootExternalModules.External Long externalLongValue;
-  }
-
-  @Module
-  @InstallIn(ActivityComponent.class)
-  public interface TestActivityModule {
-    @Provides
-    static Baz provideBaz() {
-      return new Baz(LONG_VALUE);
-    }
-  }
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  interface PkgPrivateTestModule {
-    @Provides
-    static Qux provideQux() {
-      return new Qux();
-    }
-  }
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public interface TestModule {
-    @Provides
-    static int provideInt() {
-      return INT_VALUE;
-    }
-
-    @Provides
-    static String provideString() {
-      return STR_VALUE;
-    }
-  }
-
-  public static final class Outer {
-    @Module
-    @InstallIn(SingletonComponent.class)
-    public interface NestedTestModule {
-      @Provides
-      static long provideLong() {
-        return LONG_VALUE;
-      }
-    }
-
-    private Outer() {}
-  }
-
-  static class Foo {
-    final int value;
-
-    @Inject
-    Foo(int value) {
-      this.value = value;
-    }
-  }
-
-  static class Bar {
-    final String value;
-
-    Bar(String value) {
-      this.value = value;
-    }
-  }
-
-  static class Baz {
-    final long value;
-
-    Baz(long value) {
-      this.value = value;
-    }
-  }
-
-  static class Qux {}
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public interface BarModule {
-    @Provides
-    static Bar provideBar(String value) {
-      return new Bar(value);
-    }
-  }
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  public interface BarEntryPoint {
-    Bar getBar();
-  }
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  interface PkgPrivateQuxEntryPoint {
-    Qux getQux();
-  }
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Inject Foo foo;
-  @Inject Qux qux;
-  @Inject String str;
-  @Inject Long longValue;
-  @Inject @MultiTestRootExternalModules.External String externalStrValue;
-
-  @BindValue
-  @Named(TEST_QUALIFIER)
-  String bindValueString = BIND_VALUE_STRING;
-
-  @Test
-  public void testInjectFromTestModule() throws Exception {
-    assertThat(foo).isNull();
-    rule.inject();
-    assertThat(foo).isNotNull();
-    assertThat(foo.value).isEqualTo(INT_VALUE);
-  }
-
-  @Test
-  public void testInjectFromTestModuleWithArgs() throws Exception {
-    assertThat(str).isNull();
-    rule.inject();
-    assertThat(str).isNotNull();
-    assertThat(str).isEqualTo(STR_VALUE);
-  }
-
-  @Test
-  public void testInjectFromNestedTestModule() throws Exception {
-    assertThat(longValue).isNull();
-    rule.inject();
-    assertThat(longValue).isNotNull();
-    assertThat(longValue).isEqualTo(LONG_VALUE);
-  }
-
-  @Test
-  public void testInjectFromPkgPrivateTestModule() throws Exception {
-    assertThat(qux).isNull();
-    rule.inject();
-    assertThat(qux).isNotNull();
-  }
-
-  @Test
-  public void testInjectFromExternalAppModule() throws Exception {
-    assertThat(externalStrValue).isNull();
-    rule.inject();
-    assertThat(externalStrValue).isNotNull();
-    assertThat(externalStrValue).isEqualTo(MultiTestRootExternalModules.EXTERNAL_STR_VALUE);
-  }
-
-  @Test
-  public void testInjectFromExternalActivityModule() throws Exception {
-    rule.inject();
-    ActivityController<TestActivity> ac = Robolectric.buildActivity(TestActivity.class);
-    assertThat(ac.get().externalLongValue).isNull();
-    ac.create();
-    assertThat(ac.get().externalLongValue).isNotNull();
-    assertThat(ac.get().externalLongValue)
-        .isEqualTo(MultiTestRootExternalModules.EXTERNAL_LONG_VALUE);
-  }
-
-  @Test
-  public void testLocalEntryPoint() throws Exception {
-    rule.inject();
-    Bar bar = EntryPoints.get(getApplicationContext(), BarEntryPoint.class).getBar();
-    assertThat(bar).isNotNull();
-    assertThat(bar.value).isEqualTo(STR_VALUE);
-  }
-
-  @Test
-  public void testLocalPkgPrivateEntryPoint() throws Exception {
-    rule.inject();
-    Qux qux = EntryPoints.get(getApplicationContext(), PkgPrivateQuxEntryPoint.class).getQux();
-    assertThat(qux).isNotNull();
-  }
-
-  @Test
-  public void testAndroidEntryPoint() throws Exception {
-    rule.inject();
-    ActivityController<TestActivity> ac = Robolectric.buildActivity(TestActivity.class);
-    assertThat(ac.get().baz).isNull();
-    ac.create();
-    assertThat(ac.get().baz).isNotNull();
-    assertThat(ac.get().baz.value).isEqualTo(LONG_VALUE);
-  }
-
-  @Test
-  public void testMissingMultiTestRoot1EntryPoint() throws Exception {
-    rule.inject();
-    ClassCastException exception =
-        assertThrows(
-            ClassCastException.class,
-            () -> EntryPoints.get(getApplicationContext(), MultiTestRoot1Test.BarEntryPoint.class));
-    assertThat(exception)
-          .hasMessageThat()
-          .isEqualTo(
-              "Cannot cast dagger.hilt.android.DaggerMultiTestRoot2Test_HiltComponents_SingletonC"
-              + " to dagger.hilt.android.MultiTestRoot1Test$BarEntryPoint");
-  }
-
-  @Test
-  public void testBindValueFieldIsProvided() throws Exception {
-    rule.inject();
-    assertThat(bindValueString).isEqualTo(BIND_VALUE_STRING);
-    assertThat(getBinding()).isEqualTo(BIND_VALUE_STRING);
-  }
-
-  @Test
-  public void testBindValueIsMutable() throws Exception {
-    rule.inject();
-    bindValueString = "newValue";
-    assertThat(getBinding()).isEqualTo("newValue");
-  }
-
-  private static String getBinding() {
-    return EntryPoints.get(getApplicationContext(), BindValueEntryPoint.class).bindValueString();
-  }
-}
diff --git a/javatests/dagger/hilt/android/MultiTestRootExternalModules.java b/javatests/dagger/hilt/android/MultiTestRootExternalModules.java
deleted file mode 100644
index 5d2c7f8..0000000
--- a/javatests/dagger/hilt/android/MultiTestRootExternalModules.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.components.ActivityComponent;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Qualifier;
-
-public final class MultiTestRootExternalModules {
-  static final long EXTERNAL_LONG_VALUE = 43L;
-  static final String EXTERNAL_STR_VALUE = "EXTERNAL_STRING_VALUE";
-
-  @Qualifier
-  @interface External {}
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  interface PkgPrivateAppModule {
-    @Provides
-    @External
-    static String provideStringValue() {
-      return EXTERNAL_STR_VALUE;
-    }
-  }
-
-  @Module
-  @InstallIn(ActivityComponent.class)
-  interface PkgPrivateActivityModule {
-    @Provides
-    @External
-    static Long provideLongValue() {
-      return EXTERNAL_LONG_VALUE;
-    }
-  }
-
-  private MultiTestRootExternalModules() {}
-}
diff --git a/javatests/dagger/hilt/android/QualifierInFieldsClass.kt b/javatests/dagger/hilt/android/QualifierInFieldsClass.kt
deleted file mode 100644
index ec3f6ff..0000000
--- a/javatests/dagger/hilt/android/QualifierInFieldsClass.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android
-
-import android.content.Context
-import dagger.hilt.android.qualifiers.ActivityContext
-import dagger.hilt.android.qualifiers.ApplicationContext
-import javax.inject.Inject
-
-class QualifierInFieldsClass @Inject constructor() {
-  @Inject
-  @ApplicationContext
-  lateinit var appContext: Context
-
-  @Inject
-  @ActivityContext
-  lateinit var activityContext: Context
-}
diff --git a/javatests/dagger/hilt/android/QualifierInKotlinFieldsTest.java b/javatests/dagger/hilt/android/QualifierInKotlinFieldsTest.java
deleted file mode 100644
index 8e62b99..0000000
--- a/javatests/dagger/hilt/android/QualifierInKotlinFieldsTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.os.Build;
-import androidx.fragment.app.FragmentActivity;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public class QualifierInKotlinFieldsTest {
-
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Test
-  public void activityFactory() {
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(TestActivity.class)) {
-      scenario.onActivity(
-          activity -> {
-            assertThat(activity.object.appContext).isNotNull();
-            assertThat(activity.object.activityContext).isNotNull();
-          });
-    }
-  }
-
-  // This test activity injects a class that is defined in Kotlin because we want to test the
-  // qualifiers in Kotlin fields / properties (generated getters and setter with backing field).
-  // Ideally we would write this test in Kotlin, but there is no open fule for writting android
-  // local tests in Kotlin.
-  @AndroidEntryPoint(FragmentActivity.class)
-  public static final class TestActivity extends Hilt_QualifierInKotlinFieldsTest_TestActivity {
-    @Inject QualifierInFieldsClass object;
-  }
-}
diff --git a/javatests/dagger/hilt/android/TestInstallInModules.java b/javatests/dagger/hilt/android/TestInstallInModules.java
deleted file mode 100644
index 0affa73..0000000
--- a/javatests/dagger/hilt/android/TestInstallInModules.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentQualifier;
-import dagger.hilt.components.SingletonComponent;
-import dagger.hilt.testing.TestInstallIn;
-
-/** Replaces a production binding in tests. */
-final class TestInstallInModules {
-  private TestInstallInModules() {}
-
-  @Module
-  @TestInstallIn(components = SingletonComponent.class, replaces = UsesComponentTestModule.class)
-  interface TestInstallInModule {
-    @Provides
-    @UsesComponentQualifier
-    static String provideLocalString() {
-      return "test_install_in_string";
-    }
-  }
-}
diff --git a/javatests/dagger/hilt/android/UsesComponentHelper.java b/javatests/dagger/hilt/android/UsesComponentHelper.java
deleted file mode 100644
index 179bf71..0000000
--- a/javatests/dagger/hilt/android/UsesComponentHelper.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-/**
- * Utility methods for tests that verify which generated component is used to inject the test class.
- */
-public abstract class UsesComponentHelper {
-
-  public static String defaultComponentName() {
-    return "dagger.hilt.android.internal.testing.root.DaggerDefault_HiltComponents_SingletonC";
-  }
-
-  /**
-   * Returns the name of a component that cannot use the default component. Does not handle deduping
-   * if test class names clash.
-   */
-  public static String perTestComponentName(Object testInstance) {
-    return "dagger.hilt.android.internal.testing.root.Dagger"
-        + testInstance.getClass().getSimpleName()
-        + "_HiltComponents_SingletonC";
-  }
-
-  /**
-   * Returns the name of a component that cannot use the default component, including the expected
-   * prefix applied by Hilt to dedupe clashing class names.
-   */
-  public static String perTestComponentNameWithDedupePrefix(
-      String expectedPrefix, Object testInstance) {
-    return "dagger.hilt.android.internal.testing.root.Dagger"
-        + expectedPrefix
-        + testInstance.getClass().getSimpleName()
-        + "_HiltComponents_SingletonC";
-  }
-
-  private UsesComponentHelper() {}
-}
diff --git a/javatests/dagger/hilt/android/UsesComponentTestClasses.java b/javatests/dagger/hilt/android/UsesComponentTestClasses.java
deleted file mode 100644
index 9445f2a..0000000
--- a/javatests/dagger/hilt/android/UsesComponentTestClasses.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import dagger.BindsInstance;
-import dagger.hilt.DefineComponent;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.InstallIn;
-import dagger.hilt.components.SingletonComponent;
-import java.lang.annotation.Retention;
-import javax.inject.Inject;
-import javax.inject.Qualifier;
-import javax.inject.Scope;
-
-/**
- * Subcomponent used to verify that subcomponents are correctly installed in shared test components.
- */
-public abstract class UsesComponentTestClasses {
-  /** Qualifier for test bindings. */
-  @Qualifier
-  public @interface UsesComponentQualifier {}
-
-  @UsesComponentTestSubcomponentScoped
-  public static class Foo {
-    final int id;
-
-    @Inject
-    Foo(int id) {
-      this.id = id;
-    }
-  }
-
-  @Scope
-  @Retention(RUNTIME)
-  public @interface UsesComponentTestSubcomponentScoped {}
-
-  @UsesComponentTestSubcomponentScoped
-  @DefineComponent(parent = SingletonComponent.class)
-  public interface UsesComponentTestSubcomponent {
-    @DefineComponent.Builder
-    interface Builder {
-      @BindsInstance
-      Builder id(int id);
-
-      UsesComponentTestSubcomponent build();
-    }
-  }
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  public interface UsesComponentTestSubcomponentBuilderEntryPoint {
-    UsesComponentTestSubcomponent.Builder mySubcomponentBuilder();
-  }
-
-  @EntryPoint
-  @InstallIn(UsesComponentTestSubcomponent.class)
-  public interface FooEntryPoint {
-    Foo foo();
-  }
-
-  private UsesComponentTestClasses() {}
-}
diff --git a/javatests/dagger/hilt/android/UsesComponentTestModule.java b/javatests/dagger/hilt/android/UsesComponentTestModule.java
deleted file mode 100644
index 2b16a1c..0000000
--- a/javatests/dagger/hilt/android/UsesComponentTestModule.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentQualifier;
-import dagger.hilt.components.SingletonComponent;
-
-/** Module for shared test component tests. */
-@Module
-@InstallIn(SingletonComponent.class)
-final class UsesComponentTestModule {
-
-  @Provides
-  @UsesComponentQualifier
-  static String provideString() {
-    return "shared_string";
-  }
-
-  private UsesComponentTestModule() {}
-}
diff --git a/javatests/dagger/hilt/android/UsesLocalComponentTestBindingsTest.java b/javatests/dagger/hilt/android/UsesLocalComponentTestBindingsTest.java
deleted file mode 100644
index 6c878e7..0000000
--- a/javatests/dagger/hilt/android/UsesLocalComponentTestBindingsTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.UsesComponentTestClasses.Foo;
-import dagger.hilt.android.UsesComponentTestClasses.FooEntryPoint;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentQualifier;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponent;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponentBuilderEntryPoint;
-import dagger.hilt.android.internal.testing.TestApplicationComponentManager;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Inject;
-import javax.inject.Qualifier;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-/**
- * A test that provides its own test bindings, and therefore cannot use the shared components.
- *
- * <p>Note that this test class exactly matches the simple name of {@link
- * dagger.hilt.android.testsubpackage.UsesLocalComponentTestBindingsTest}. This is intentional and
- * used to verify generated code class names do not clash.
- */
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class UsesLocalComponentTestBindingsTest {
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Qualifier
-  @interface TestQualifier {}
-
-  @Inject @UsesComponentQualifier String injectedString;
-  @Inject @TestQualifier String localString;
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public static final class TestModule {
-    @Provides
-    @TestQualifier
-    static String provideString() {
-      return "local_string";
-    }
-
-    private TestModule() {}
-  }
-
-  @Test
-  public void testInject() {
-    rule.inject();
-    assertThat(injectedString).isEqualTo("shared_string");
-    assertThat(localString).isEqualTo("local_string");
-  }
-
-  @Test
-  public void testSubcomponent() {
-    UsesComponentTestSubcomponent subcomponent =
-        EntryPoints.get(
-                getApplicationContext(), UsesComponentTestSubcomponentBuilderEntryPoint.class)
-            .mySubcomponentBuilder()
-            .id(123)
-            .build();
-
-    Foo foo1 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-    Foo foo2 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-
-    assertThat(foo1).isNotNull();
-    assertThat(foo2).isNotNull();
-    assertThat(foo1).isSameInstanceAs(foo2);
-  }
-
-  @Test
-  public void testUsesLocalComponent() {
-    HiltTestApplication app = (HiltTestApplication) getApplicationContext();
-    Object generatedComponent =
-        ((TestApplicationComponentManager) app.componentManager()).generatedComponent();
-    assertThat(generatedComponent.getClass().getName())
-        .isEqualTo(UsesComponentHelper.perTestComponentNameWithDedupePrefix("dha_", this));
-  }
-}
diff --git a/javatests/dagger/hilt/android/UsesLocalComponentUninstallModuleTest.java b/javatests/dagger/hilt/android/UsesLocalComponentUninstallModuleTest.java
deleted file mode 100644
index 624ba83..0000000
--- a/javatests/dagger/hilt/android/UsesLocalComponentUninstallModuleTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.UsesComponentTestClasses.Foo;
-import dagger.hilt.android.UsesComponentTestClasses.FooEntryPoint;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentQualifier;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponent;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponentBuilderEntryPoint;
-import dagger.hilt.android.internal.testing.TestApplicationComponentManager;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import dagger.hilt.android.testing.UninstallModules;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-@UninstallModules(UsesComponentTestModule.class)
-public final class UsesLocalComponentUninstallModuleTest {
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Inject @UsesComponentQualifier String injectedString;
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public interface LocalTestModule {
-
-    @Provides
-    @UsesComponentQualifier
-    static String provideString() {
-      return "local_string";
-    }
-  }
-
-  @Test
-  public void testInject() {
-    rule.inject();
-    assertThat(injectedString).isEqualTo("local_string");
-  }
-
-  @Test
-  public void testSubcomponent() {
-    UsesComponentTestSubcomponent subcomponent =
-        EntryPoints.get(
-                getApplicationContext(), UsesComponentTestSubcomponentBuilderEntryPoint.class)
-            .mySubcomponentBuilder()
-            .id(123)
-            .build();
-
-    Foo foo1 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-    Foo foo2 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-
-    assertThat(foo1).isNotNull();
-    assertThat(foo2).isNotNull();
-    assertThat(foo1).isSameInstanceAs(foo2);
-  }
-
-  @Test
-  public void testUsesLocalComponent() {
-    HiltTestApplication app = (HiltTestApplication) getApplicationContext();
-    Object generatedComponent =
-        ((TestApplicationComponentManager) app.componentManager()).generatedComponent();
-    assertThat(generatedComponent.getClass().getName())
-        .isEqualTo(UsesComponentHelper.perTestComponentName(this));
-  }
-}
diff --git a/javatests/dagger/hilt/android/UsesSharedComponent1Test.java b/javatests/dagger/hilt/android/UsesSharedComponent1Test.java
deleted file mode 100644
index 9b8f287..0000000
--- a/javatests/dagger/hilt/android/UsesSharedComponent1Test.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import android.os.Build;
-import androidx.fragment.app.FragmentActivity;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.android.UsesComponentTestClasses.Foo;
-import dagger.hilt.android.UsesComponentTestClasses.FooEntryPoint;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentQualifier;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponent;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponentBuilderEntryPoint;
-import dagger.hilt.android.internal.testing.TestApplicationComponentManager;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-/**
- * A test that provides none of its own test bindings, and therefore uses the shared components.
- *
- * <p>Note that this test class exactly matches the simple name of {@link
- * dagger.hilt.android.testsubpackage.UsesSharedComponent1Test}. This is intentional and used to
- * verify generated code class names do not clash.
- */
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class UsesSharedComponent1Test {
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Inject @UsesComponentQualifier String injectedString;
-
-  @Test
-  public void testInject() {
-    rule.inject();
-    assertThat(injectedString).isEqualTo("shared_string");
-  }
-
-  @Test
-  public void testSubcomponent() {
-    UsesComponentTestSubcomponent subcomponent =
-        EntryPoints.get(
-                getApplicationContext(), UsesComponentTestSubcomponentBuilderEntryPoint.class)
-            .mySubcomponentBuilder()
-            .id(123)
-            .build();
-
-    Foo foo1 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-    Foo foo2 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-
-    assertThat(foo1).isNotNull();
-    assertThat(foo2).isNotNull();
-    assertThat(foo1).isSameInstanceAs(foo2);
-  }
-
-  @Test
-  public void testActivity() {
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(TestActivity.class)) {
-      scenario.onActivity(
-          activity -> {
-            assertThat(activity.activityString).isEqualTo("shared_string");
-          });
-    }
-  }
-
-  @Test
-  public void testUsesSharedComponent() {
-    HiltTestApplication app = (HiltTestApplication) getApplicationContext();
-    Object generatedComponent =
-        ((TestApplicationComponentManager) app.componentManager()).generatedComponent();
-    assertThat(generatedComponent.getClass().getName())
-        .isEqualTo(UsesComponentHelper.defaultComponentName());
-  }
-
-  @Test
-  public void testLocalComponentNotGenerated() {
-    assertThrows(
-        ClassNotFoundException.class,
-        () -> Class.forName(UsesComponentHelper.perTestComponentName(this)));
-  }
-
-  @AndroidEntryPoint(FragmentActivity.class)
-  public static final class TestActivity extends Hilt_UsesSharedComponent1Test_TestActivity {
-    @Inject @UsesComponentQualifier String activityString;
-  }
-}
diff --git a/javatests/dagger/hilt/android/UsesSharedComponent2Test.java b/javatests/dagger/hilt/android/UsesSharedComponent2Test.java
deleted file mode 100644
index d3b247d..0000000
--- a/javatests/dagger/hilt/android/UsesSharedComponent2Test.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import android.os.Build;
-import androidx.fragment.app.FragmentActivity;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.android.UsesComponentTestClasses.Foo;
-import dagger.hilt.android.UsesComponentTestClasses.FooEntryPoint;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentQualifier;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponent;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponentBuilderEntryPoint;
-import dagger.hilt.android.internal.testing.TestApplicationComponentManager;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-/**
- * A test that provides none of its own test bindings, and therefore uses the shared components. A
- * duplicate of {@link SharedComponent1Test} to test that multiple test roots with shared components
- * can be compiled in the same target.
- */
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class UsesSharedComponent2Test {
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Inject @UsesComponentQualifier String injectedString;
-
-  @Test
-  public void testInject() {
-    rule.inject();
-    assertThat(injectedString).isEqualTo("shared_string");
-  }
-
-  @Test
-  public void testSubcomponent() {
-    UsesComponentTestSubcomponent subcomponent =
-        EntryPoints.get(
-                getApplicationContext(), UsesComponentTestSubcomponentBuilderEntryPoint.class)
-            .mySubcomponentBuilder()
-            .id(123)
-            .build();
-
-    Foo foo1 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-    Foo foo2 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-
-    assertThat(foo1).isNotNull();
-    assertThat(foo2).isNotNull();
-    assertThat(foo1).isSameInstanceAs(foo2);
-  }
-
-  @Test
-  public void testActivity() {
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(TestActivity.class)) {
-      scenario.onActivity(
-          activity -> {
-            assertThat(activity.activityString).isEqualTo("shared_string");
-          });
-    }
-  }
-
-  @Test
-  public void testUsesSharedComponent() {
-    HiltTestApplication app = (HiltTestApplication) getApplicationContext();
-    Object generatedComponent =
-        ((TestApplicationComponentManager) app.componentManager()).generatedComponent();
-    assertThat(generatedComponent.getClass().getName())
-        .isEqualTo(UsesComponentHelper.defaultComponentName());
-  }
-
-  @Test
-  public void testLocalComponentNotGenerated() {
-    assertThrows(
-        ClassNotFoundException.class,
-        () -> Class.forName(UsesComponentHelper.perTestComponentName(this)));
-  }
-
-  @AndroidEntryPoint(FragmentActivity.class)
-  public static final class TestActivity extends Hilt_UsesSharedComponent2Test_TestActivity {
-    @Inject @UsesComponentQualifier String activityString;
-  }
-}
diff --git a/javatests/dagger/hilt/android/UsesSharedComponentEnclosedTest.java b/javatests/dagger/hilt/android/UsesSharedComponentEnclosedTest.java
deleted file mode 100644
index 60ef2fc..0000000
--- a/javatests/dagger/hilt/android/UsesSharedComponentEnclosedTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import android.os.Build;
-import androidx.fragment.app.FragmentActivity;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.android.UsesComponentTestClasses.Foo;
-import dagger.hilt.android.UsesComponentTestClasses.FooEntryPoint;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentQualifier;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponent;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponentBuilderEntryPoint;
-import dagger.hilt.android.internal.testing.TestApplicationComponentManager;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.runners.Enclosed;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-/**
- * A test that uses the {@link Enclosed} test runner and provides none of its own test bindings, and
- * therefore uses the shared components.
- */
-@RunWith(Enclosed.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class UsesSharedComponentEnclosedTest {
-
-  @HiltAndroidTest
-  @RunWith(AndroidJUnit4.class)
-  // Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-  @Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-  public static final class EnclosedTest {
-
-    @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-    @Inject @UsesComponentQualifier String injectedString;
-
-    @Test
-    public void testInject() {
-      rule.inject();
-      assertThat(injectedString).isEqualTo("shared_string");
-    }
-
-    @Test
-    public void testSubcomponent() {
-      UsesComponentTestSubcomponent subcomponent =
-          EntryPoints.get(
-                  getApplicationContext(), UsesComponentTestSubcomponentBuilderEntryPoint.class)
-              .mySubcomponentBuilder()
-              .id(123)
-              .build();
-
-      Foo foo1 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-      Foo foo2 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-
-      assertThat(foo1).isNotNull();
-      assertThat(foo2).isNotNull();
-      assertThat(foo1).isSameInstanceAs(foo2);
-    }
-
-    @Test
-    public void testActivity() {
-      try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(TestActivity.class)) {
-        scenario.onActivity(
-            activity -> {
-              assertThat(activity.activityString).isEqualTo("shared_string");
-            });
-      }
-    }
-
-    @Test
-    public void testUsesSharedComponent() {
-      HiltTestApplication app = (HiltTestApplication) getApplicationContext();
-      Object generatedComponent =
-          ((TestApplicationComponentManager) app.componentManager()).generatedComponent();
-      assertThat(generatedComponent.getClass().getName())
-          .isEqualTo(UsesComponentHelper.defaultComponentName());
-    }
-
-    @Test
-    public void testLocalComponentNotGenerated() {
-      assertThrows(
-          ClassNotFoundException.class,
-          () -> Class.forName(UsesComponentHelper.perTestComponentName(this)));
-    }
-
-    @AndroidEntryPoint(FragmentActivity.class)
-    public static final class TestActivity
-        extends Hilt_UsesSharedComponentEnclosedTest_EnclosedTest_TestActivity {
-      @Inject @UsesComponentQualifier String activityString;
-    }
-  }
-}
diff --git a/javatests/dagger/hilt/android/UsesSharedComponentTestInstallInTest.java b/javatests/dagger/hilt/android/UsesSharedComponentTestInstallInTest.java
deleted file mode 100644
index 8de562b..0000000
--- a/javatests/dagger/hilt/android/UsesSharedComponentTestInstallInTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentQualifier;
-import dagger.hilt.android.internal.testing.TestApplicationComponentManager;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class UsesSharedComponentTestInstallInTest {
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Inject @UsesComponentQualifier String injectedString;
-
-  @Test
-  public void testInject() {
-    rule.inject();
-    assertThat(injectedString).isEqualTo("test_install_in_string");
-  }
-
-  @Test
-  public void testUsesLocalComponent() {
-    HiltTestApplication app = (HiltTestApplication) getApplicationContext();
-    Object generatedComponent =
-        ((TestApplicationComponentManager) app.componentManager()).generatedComponent();
-    assertThat(generatedComponent.getClass().getName())
-        .isEqualTo(UsesComponentHelper.defaultComponentName());
-  }
-
-  @Test
-  public void testLocalComponentNotGenerated() {
-    assertThrows(
-        ClassNotFoundException.class,
-        () -> Class.forName(UsesComponentHelper.perTestComponentName(this)));
-  }
-}
diff --git a/javatests/dagger/hilt/android/ViewModelScopedTest.java b/javatests/dagger/hilt/android/ViewModelScopedTest.java
deleted file mode 100644
index e37e42a..0000000
--- a/javatests/dagger/hilt/android/ViewModelScopedTest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.lifecycle.ViewModel;
-import androidx.lifecycle.ViewModelProvider;
-import android.os.Build;
-import android.os.Bundle;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.lifecycle.HiltViewModel;
-import dagger.hilt.android.scopes.ViewModelScoped;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public class ViewModelScopedTest {
-
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Test
-  public void testViewModelScopeInFragment() {
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(TestActivity.class)) {
-      scenario.onActivity(
-          activity -> {
-            TestFragment fragment =
-                (TestFragment) activity.getSupportFragmentManager().findFragmentByTag("tag");
-            assertThat(fragment.vm.one.bar).isEqualTo(fragment.vm.two.bar);
-          });
-    }
-  }
-
-  @AndroidEntryPoint(FragmentActivity.class)
-  public static class TestActivity extends Hilt_ViewModelScopedTest_TestActivity {
-
-    @Override
-    protected void onCreate(@Nullable Bundle savedInstanceState) {
-      super.onCreate(savedInstanceState);
-      if (savedInstanceState == null) {
-        Fragment f =
-            getSupportFragmentManager()
-                .getFragmentFactory()
-                .instantiate(TestFragment.class.getClassLoader(), TestFragment.class.getName());
-        getSupportFragmentManager().beginTransaction().add(0, f, "tag").commitNow();
-      }
-    }
-  }
-
-  @AndroidEntryPoint(Fragment.class)
-  public static class TestFragment extends Hilt_ViewModelScopedTest_TestFragment {
-    MyViewModel vm;
-
-    @Override
-    public void onCreate(@Nullable Bundle bundle) {
-      super.onCreate(bundle);
-      vm = new ViewModelProvider(this).get(MyViewModel.class);
-    }
-  }
-
-  @HiltViewModel
-  static class MyViewModel extends ViewModel {
-
-    final DependsOnBarOne one;
-    final DependsOnBarTwo two;
-
-    @Inject
-    MyViewModel(DependsOnBarOne one, DependsOnBarTwo two) {
-      this.one = one;
-      this.two = two;
-    }
-  }
-
-  @ViewModelScoped
-  static class Bar {
-    @Inject
-    Bar() {}
-  }
-
-  static class DependsOnBarOne {
-    final Bar bar;
-
-    @Inject
-    DependsOnBarOne(Bar bar) {
-      this.bar = bar;
-    }
-  }
-
-  static class DependsOnBarTwo {
-    final Bar bar;
-
-    @Inject
-    DependsOnBarTwo(Bar bar) {
-      this.bar = bar;
-    }
-  }
-}
diff --git a/javatests/dagger/hilt/android/ViewModelWithBaseTest.java b/javatests/dagger/hilt/android/ViewModelWithBaseTest.java
deleted file mode 100644
index 4e4a47c..0000000
--- a/javatests/dagger/hilt/android/ViewModelWithBaseTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.lifecycle.SavedStateHandle;
-import androidx.lifecycle.ViewModel;
-import androidx.lifecycle.ViewModelProvider;
-import android.os.Build;
-import android.os.Bundle;
-import androidx.fragment.app.FragmentActivity;
-import androidx.annotation.Nullable;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.lifecycle.HiltViewModel;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public class ViewModelWithBaseTest {
-
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Test
-  public void verifyBaseInjection() {
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(TestActivity.class)) {
-      scenario.onActivity(
-          activity -> {
-            assertThat(activity.myViewModel.foo).isNotNull();
-            assertThat(activity.myViewModel.bar).isNotNull();
-          });
-    }
-  }
-
-  @AndroidEntryPoint(FragmentActivity.class)
-  public static class TestActivity extends Hilt_ViewModelWithBaseTest_TestActivity {
-
-    MyViewModel myViewModel;
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-      super.onCreate(savedInstanceState);
-      myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
-    }
-  }
-
-  @HiltViewModel
-  static class MyViewModel extends BaseViewModel {
-
-    final Foo foo;
-
-    @Inject
-    MyViewModel(SavedStateHandle handle, Foo foo) {
-      this.foo = foo;
-    }
-  }
-
-  abstract static class BaseViewModel extends ViewModel {
-    @Inject Bar bar;
-  }
-
-  static class Foo {
-    @Inject
-    Foo() {}
-  }
-
-  static class Bar {
-    @Inject
-    Bar() {}
-  }
-}
diff --git a/javatests/dagger/hilt/android/internal/managers/AndroidManifest.xml b/javatests/dagger/hilt/android/internal/managers/AndroidManifest.xml
deleted file mode 100644
index cc5128e..0000000
--- a/javatests/dagger/hilt/android/internal/managers/AndroidManifest.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="dagger.hilt.android.internal.managers">
-
-  <uses-sdk android:minSdkVersion="14" />
-
-  <application>
-    <activity
-        android:name=".FragmentContextWrapperLeakTest$TestActivity"
-        android:exported="false"/>
-  </application>
-</manifest>
diff --git a/javatests/dagger/hilt/android/internal/managers/BUILD b/javatests/dagger/hilt/android/internal/managers/BUILD
deleted file mode 100644
index ff4f432..0000000
--- a/javatests/dagger/hilt/android/internal/managers/BUILD
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright (C) 2021 The Dagger Authors.
-#
-# 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.
-# Description:
-#   Tests for internal code for implementing Hilt processors.
-
-package(default_visibility = ["//:src"])
-
-android_local_test(
-    name = "FragmentContextWrapperLeakTest",
-    size = "small",
-    srcs = ["FragmentContextWrapperLeakTest.java"],
-    manifest = "AndroidManifest.xml",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@maven//:junit_junit",
-        "@google_bazel_common//third_party/java/truth",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android/lifecycle",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-    ],
-)
diff --git a/javatests/dagger/hilt/android/internal/managers/FragmentContextWrapperLeakTest.java b/javatests/dagger/hilt/android/internal/managers/FragmentContextWrapperLeakTest.java
deleted file mode 100644
index 38086c6..0000000
--- a/javatests/dagger/hilt/android/internal/managers/FragmentContextWrapperLeakTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android.internal.managers;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import androidx.lifecycle.Lifecycle;
-import android.os.Build;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.AndroidEntryPoint;
-import dagger.hilt.android.internal.managers.ViewComponentManager.FragmentContextWrapper;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class FragmentContextWrapperLeakTest {
-  /** An activity to test injection. */
-  @AndroidEntryPoint(FragmentActivity.class)
-  public static final class TestActivity extends Hilt_FragmentContextWrapperLeakTest_TestActivity {}
-
-  /** A fragment to test injection. */
-  @AndroidEntryPoint(Fragment.class)
-  public static final class TestFragment extends Hilt_FragmentContextWrapperLeakTest_TestFragment {}
-
-  @Rule public HiltAndroidRule hiltRule = new HiltAndroidRule(this);
-
-  @Test
-  public void testFragmentContextWrapperDoesNotLeakFragment() {
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(TestActivity.class)) {
-      TestFragment fragment = new TestFragment();
-      scenario.onActivity(
-          activity ->
-              activity
-                  .getSupportFragmentManager()
-                  .beginTransaction()
-                  .add(fragment, "TestFragment")
-                  .commitNow());
-
-      FragmentContextWrapper fragmentContextWrapper =
-          (FragmentContextWrapper) fragment.getContext();
-      assertThat(fragmentContextWrapper.getFragment()).isEqualTo(fragment);
-      scenario.moveToState(Lifecycle.State.DESTROYED);
-      NullPointerException exception =
-          assertThrows(NullPointerException.class, fragmentContextWrapper::getFragment);
-      assertThat(exception).hasMessageThat().contains("The fragment has already been destroyed");
-    }
-  }
-}
diff --git a/javatests/dagger/hilt/android/processor/AndroidCompilers.java b/javatests/dagger/hilt/android/processor/AndroidCompilers.java
index 1fb19ae..5ce0a2a 100644
--- a/javatests/dagger/hilt/android/processor/AndroidCompilers.java
+++ b/javatests/dagger/hilt/android/processor/AndroidCompilers.java
@@ -22,13 +22,12 @@
 import com.google.testing.compile.Compiler;
 import dagger.hilt.android.processor.internal.androidentrypoint.AndroidEntryPointProcessor;
 import dagger.hilt.android.processor.internal.customtestapplication.CustomTestApplicationProcessor;
+import dagger.hilt.android.processor.internal.uninstallmodules.UninstallModulesProcessor;
 import dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsProcessor;
 import dagger.hilt.processor.internal.definecomponent.DefineComponentProcessor;
-import dagger.hilt.processor.internal.earlyentrypoint.EarlyEntryPointProcessor;
 import dagger.hilt.processor.internal.generatesrootinput.GeneratesRootInputProcessor;
 import dagger.hilt.processor.internal.originatingelement.OriginatingElementProcessor;
 import dagger.hilt.processor.internal.root.RootProcessor;
-import dagger.hilt.processor.internal.uninstallmodules.UninstallModulesProcessor;
 import dagger.internal.codegen.ComponentProcessor;
 import dagger.testing.compile.CompilerTests;
 import java.util.Arrays;
@@ -69,7 +68,6 @@
         new AndroidEntryPointProcessor(),
         new ComponentProcessor(),
         new DefineComponentProcessor(),
-        new EarlyEntryPointProcessor(),
         new GeneratesRootInputProcessor(),
         new OriginatingElementProcessor(),
         new CustomTestApplicationProcessor(),
diff --git a/javatests/dagger/hilt/android/processor/BUILD b/javatests/dagger/hilt/android/processor/BUILD
index 4ec4d56..7fb2320 100644
--- a/javatests/dagger/hilt/android/processor/BUILD
+++ b/javatests/dagger/hilt/android/processor/BUILD
@@ -22,13 +22,13 @@
     deps = [
         "//java/dagger/hilt/android/processor/internal/androidentrypoint:processor_lib",
         "//java/dagger/hilt/android/processor/internal/customtestapplication:processor_lib",
+        "//java/dagger/hilt/android/processor/internal/uninstallmodules:processor_lib",
+        "//java/dagger/hilt/android/processor/internal/viewmodel:processor_lib",
         "//java/dagger/hilt/processor/internal/aggregateddeps:processor_lib",
         "//java/dagger/hilt/processor/internal/definecomponent:processor_lib",
-        "//java/dagger/hilt/processor/internal/earlyentrypoint:processor_lib",
         "//java/dagger/hilt/processor/internal/generatesrootinput:processor_lib",
         "//java/dagger/hilt/processor/internal/originatingelement:processor_lib",
         "//java/dagger/hilt/processor/internal/root:processor_lib",
-        "//java/dagger/hilt/processor/internal/uninstallmodules:processor_lib",
         "//java/dagger/internal/codegen:processor",
         "//java/dagger/internal/guava:collect",
         "//java/dagger/testing/compile",
diff --git a/javatests/dagger/hilt/android/processor/internal/BUILD b/javatests/dagger/hilt/android/processor/internal/BUILD
deleted file mode 100644
index 9a0a8f2..0000000
--- a/javatests/dagger/hilt/android/processor/internal/BUILD
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (C) 2020 The Dagger Authors.
-#
-# 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.
-# Description:
-#   Tests for internal code for implementing Hilt processors.
-
-load("//java/dagger/testing/compile:macros.bzl", "compiler_test")
-
-package(default_visibility = ["//:src"])
-
-compiler_test(
-    name = "GeneratorsTest",
-    srcs = ["GeneratorsTest.java"],
-    compiler_deps = [
-        "//java/dagger/hilt/android:hilt_android_app",
-        "//java/dagger/hilt/android:android_entry_point",
-        "@androidsdk//:platforms/android-30/android.jar",
-        "@maven//:androidx_annotation_annotation",
-    ],
-    deps = [
-        "@google_bazel_common//third_party/java/compile_testing",
-        "@google_bazel_common//third_party/java/junit",
-        "@google_bazel_common//third_party/java/truth",
-        "//javatests/dagger/hilt/android/processor:android_compilers",
-    ],
-)
diff --git a/javatests/dagger/hilt/android/processor/internal/GeneratorsTest.java b/javatests/dagger/hilt/android/processor/internal/GeneratorsTest.java
deleted file mode 100644
index ecfd1f6..0000000
--- a/javatests/dagger/hilt/android/processor/internal/GeneratorsTest.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.processor.internal;
-
-import static com.google.testing.compile.CompilationSubject.assertThat;
-import static dagger.hilt.android.processor.AndroidCompilers.compiler;
-
-import com.google.testing.compile.Compilation;
-import com.google.testing.compile.JavaFileObjects;
-import javax.tools.JavaFileObject;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public final class GeneratorsTest {
-
-  @Test
-  public void copyConstructorParametersCopiesExternalNullables() {
-    JavaFileObject baseActivity =
-        JavaFileObjects.forSourceLines(
-            "test.BaseActivity",
-            "package test;",
-            "",
-            "import androidx.fragment.app.FragmentActivity;",
-            "",
-            "public abstract class BaseActivity extends FragmentActivity {",
-            "  protected BaseActivity(",
-            "      @androidx.annotation.Nullable String supportNullable,",
-            "      @androidx.annotation.Nullable String androidxNullable,",
-            "      @javax.annotation.Nullable String javaxNullable) { }",
-            "}");
-    JavaFileObject myActivity =
-        JavaFileObjects.forSourceLines(
-            "test.MyActivity",
-            "package test;",
-            "",
-            "import dagger.hilt.android.AndroidEntryPoint;",
-            "",
-            "@AndroidEntryPoint(BaseActivity.class)",
-            "public class MyActivity extends Hilt_MyActivity {",
-            "  public MyActivity(",
-            "      String supportNullable,",
-            "      String androidxNullable,",
-            "      String javaxNullable) {",
-            "    super(supportNullable, androidxNullable, javaxNullable);",
-            "  }",
-            "}");
-    Compilation compilation = compiler().compile(baseActivity, myActivity);
-    assertThat(compilation).succeeded();
-    assertThat(compilation)
-        .generatedSourceFile("test/Hilt_MyActivity")
-        .containsElementsIn(
-            JavaFileObjects.forSourceLines(
-                "test.Hilt_MyActivity",
-                "package test;",
-                "",
-                "import androidx.annotation.Nullable;",
-                "",
-                "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ActivityGenerator\")",
-                "abstract class Hilt_MyActivity extends BaseActivity implements",
-                "    GeneratedComponentManagerHolder {",
-                "  Hilt_MyActivity(",
-                "      @Nullable String supportNullable,",
-                "      @Nullable String androidxNullable,",
-                "      @javax.annotation.Nullable String javaxNullable) {",
-                "    super(supportNullable, androidxNullable, javaxNullable);",
-                "    _initHiltInternal();",
-                "  }",
-                "}"));
-  }
-
-  @Test
-  public void copyConstructorParametersConvertsAndroidInternalNullableToExternal() {
-    // Relies on View(Context, AttributeSet), which has android-internal
-    // @android.annotation.Nullable on AttributeSet.
-    JavaFileObject myView =
-        JavaFileObjects.forSourceLines(
-            "test.MyView",
-            "package test;",
-            "",
-            "import android.content.Context;",
-            "import android.util.AttributeSet;",
-            "import android.view.View;",
-            "import dagger.hilt.android.AndroidEntryPoint;",
-            "",
-            "@AndroidEntryPoint(View.class)",
-            "public class MyView extends Hilt_MyView {",
-            "  public MyView(Context context, AttributeSet attrs) {",
-            "    super(context, attrs);",
-            "  }",
-            "}");
-    Compilation compilation = compiler().compile(myView);
-    assertThat(compilation).succeeded();
-    assertThat(compilation)
-        .generatedSourceFile("test/Hilt_MyView")
-        .containsElementsIn(
-            JavaFileObjects.forSourceLines(
-                "test.Hilt_MyView",
-                "package test;",
-                "",
-                "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ViewGenerator\")",
-                "abstract class Hilt_MyView extends View implements",
-                "GeneratedComponentManagerHolder {",
-                // The generated parameter names are copied from the base class. Since we only have
-                // the jar and not the source for these base classes the parameter names are missing
-                "  Hilt_MyView(Context arg0, @Nullable AttributeSet arg1) {",
-                "    super(arg0, arg1);",
-                "    inject();",
-                "  }",
-                "}"));
-  }
-
-  @Test
-  public void copyTargetApiAnnotationActivity() {
-    JavaFileObject myActivity =
-        JavaFileObjects.forSourceLines(
-            "test.MyActivity",
-            "package test;",
-            "",
-            "import android.annotation.TargetApi;",
-            "import androidx.fragment.app.FragmentActivity;",
-            "import dagger.hilt.android.AndroidEntryPoint;",
-            "",
-            "@TargetApi(24)",
-            "@AndroidEntryPoint(FragmentActivity.class)",
-            "public class MyActivity extends Hilt_MyActivity {}");
-    Compilation compilation = compiler().compile(myActivity);
-    assertThat(compilation).succeeded();
-    assertThat(compilation)
-        .generatedSourceFile("test/Hilt_MyActivity")
-        .containsElementsIn(
-            JavaFileObjects.forSourceLines(
-                "test.Hilt_MyActivity",
-                " package test;",
-                "",
-                "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ActivityGenerator\")",
-                "@TargetApi(24)",
-                "abstract class Hilt_MyActivity extends FragmentActivity ",
-                "implements GeneratedComponentManagerHolder {",
-                "}"));
-  }
-
-  @Test
-  public void copyTargetApiAnnotationOverView() {
-    JavaFileObject myView =
-        JavaFileObjects.forSourceLines(
-            "test.MyView",
-            "package test;",
-            "",
-            "import android.annotation.TargetApi;",
-            "import android.widget.LinearLayout;",
-            "import android.content.Context;",
-            "import android.util.AttributeSet;",
-            "import dagger.hilt.android.AndroidEntryPoint;",
-            "",
-            "@TargetApi(24)",
-            "@AndroidEntryPoint(LinearLayout.class)",
-            "public class MyView extends Hilt_MyView {",
-            " public MyView(Context context, AttributeSet attributeSet){",
-            "   super(context, attributeSet);",
-            " }",
-            "",
-            "}");
-    Compilation compilation = compiler().compile(myView);
-    assertThat(compilation).succeeded();
-    assertThat(compilation)
-        .generatedSourceFile("test/Hilt_MyView")
-        .containsElementsIn(
-            JavaFileObjects.forSourceLines(
-                "test.Hilt_MyView",
-                "",
-                "package test;",
-                "",
-                "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ViewGenerator\")",
-                "@TargetApi(24)",
-                "abstract class Hilt_MyView extends LinearLayout implements"
-                    + " GeneratedComponentManagerHolder {",
-                "}"));
-  }
-
-  @Test
-  public void copyTargetApiAnnotationApplication() {
-    JavaFileObject myApplication =
-        JavaFileObjects.forSourceLines(
-            "test.MyApplication",
-            "package test;",
-            "",
-            "import android.annotation.TargetApi;",
-            "import android.app.Application;",
-            "import dagger.hilt.android.HiltAndroidApp;",
-            "",
-            "@TargetApi(24)",
-            "@HiltAndroidApp(Application.class)",
-            "public class MyApplication extends Hilt_MyApplication {}");
-    Compilation compilation = compiler().compile(myApplication);
-    assertThat(compilation).succeeded();
-    assertThat(compilation)
-        .generatedSourceFile("test/Hilt_MyApplication")
-        .containsElementsIn(
-            JavaFileObjects.forSourceLines(
-                "test.Hilt_MyApplication",
-                " package test;",
-                "",
-                "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ApplicationGenerator\")",
-                "@TargetApi(24)",
-                "abstract class Hilt_MyApplication extends Application implements"
-                    + " GeneratedComponentManagerHolder {}"));
-  }
-
-  @Test
-  public void copyTargetApiAnnotationFragment() {
-    JavaFileObject myApplication =
-        JavaFileObjects.forSourceLines(
-            "test.MyFragment",
-            "package test;",
-            "",
-            "import android.annotation.TargetApi;",
-            "import androidx.fragment.app.Fragment;",
-            "import dagger.hilt.android.AndroidEntryPoint;",
-            "",
-            "@TargetApi(24)",
-            "@AndroidEntryPoint(Fragment.class)",
-            "public class MyFragment extends Hilt_MyFragment {}");
-    Compilation compilation = compiler().compile(myApplication);
-    assertThat(compilation).succeeded();
-    assertThat(compilation)
-        .generatedSourceFile("test/Hilt_MyFragment")
-        .containsElementsIn(
-            JavaFileObjects.forSourceLines(
-                "test.Hilt_MyFragment",
-                "package test;",
-                "",
-                "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.FragmentGenerator\")",
-                "@TargetApi(24)",
-                "@SuppressWarnings(\"deprecation\")",
-                "abstract class Hilt_MyFragment extends Fragment implements"
-                    + " GeneratedComponentManagerHolder {}"));
-  }
-
-  @Test
-  public void copyTargetApiBroadcastRecieverGenerator() {
-    JavaFileObject myBroadcastReceiver =
-        JavaFileObjects.forSourceLines(
-            "test.MyBroadcastReceiver",
-            "package test;",
-            "",
-            "import android.content.BroadcastReceiver;",
-            "import android.annotation.TargetApi;",
-            "import dagger.hilt.android.AndroidEntryPoint;",
-            "",
-            "@TargetApi(24)",
-            "@AndroidEntryPoint(BroadcastReceiver.class)",
-            "public class MyBroadcastReceiver extends Hilt_MyBroadcastReceiver {}");
-    Compilation compilation = compiler().compile(myBroadcastReceiver);
-    assertThat(compilation).succeeded();
-    assertThat(compilation)
-        .generatedSourceFile("test/Hilt_MyBroadcastReceiver")
-        .containsElementsIn(
-            JavaFileObjects.forSourceLines(
-                "test.Hilt_MyBroadcastReceiver",
-                "package test;",
-                "",
-                "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.BroadcastReceiverGenerator\")",
-                "@TargetApi(24)",
-                "abstract class Hilt_MyBroadcastReceiver extends BroadcastReceiver {}"));
-  }
-
-  @Test
-  public void copyTargetApiServiceGenerator() {
-    JavaFileObject myService =
-        JavaFileObjects.forSourceLines(
-            "test.MyService",
-            "package test;",
-            "",
-            "import android.annotation.TargetApi;",
-            "import android.content.Intent;",
-            "import android.app.Service;",
-            "import android.os.IBinder;",
-            "import dagger.hilt.android.AndroidEntryPoint;",
-            "",
-            "@TargetApi(24)",
-            "@AndroidEntryPoint(Service.class)",
-            "public class MyService extends Hilt_MyService {",
-            "   @Override",
-            "   public IBinder onBind(Intent intent){",
-            "     return null;",
-            "   }",
-            "}");
-    Compilation compilation = compiler().compile(myService);
-    assertThat(compilation).succeeded();
-    assertThat(compilation)
-        .generatedSourceFile("test/Hilt_MyService")
-        .containsElementsIn(
-            JavaFileObjects.forSourceLines(
-                "test.Hilt_MyService",
-                "package test;",
-                "",
-                "@Generated(\"dagger.hilt.android.processor.internal.androidentrypoint.ServiceGenerator\")",
-                "@TargetApi(24)",
-                "abstract class Hilt_MyService extends Service implements"
-                    + " GeneratedComponentManagerHolder{}"));
-  }
-}
diff --git a/javatests/dagger/hilt/android/processor/internal/aggregateddeps/BUILD b/javatests/dagger/hilt/android/processor/internal/aggregateddeps/BUILD
index 654b573..bf2ed4c 100644
--- a/javatests/dagger/hilt/android/processor/internal/aggregateddeps/BUILD
+++ b/javatests/dagger/hilt/android/processor/internal/aggregateddeps/BUILD
@@ -40,25 +40,6 @@
     ],
 )
 
-compiler_test(
-    name = "EarlyEntryPointProcessorTest",
-    srcs = ["EarlyEntryPointProcessorTest.java"],
-    compiler_deps = [
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:early_entry_point",
-        "//java/dagger/hilt/android/components",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@androidsdk//:platforms/android-30/android.jar",
-    ],
-    deps = [
-        "@google_bazel_common//third_party/java/compile_testing",
-        "@google_bazel_common//third_party/java/junit",
-        "@google_bazel_common//third_party/java/truth",
-        "//javatests/dagger/hilt/android/processor:android_compilers",
-    ],
-)
-
 java_library(
     name = "InstallInModule",
     srcs = ["InstallInModule.java"],
diff --git a/javatests/dagger/hilt/android/processor/internal/aggregateddeps/EarlyEntryPointProcessorTest.java b/javatests/dagger/hilt/android/processor/internal/aggregateddeps/EarlyEntryPointProcessorTest.java
deleted file mode 100644
index 3bf3a31..0000000
--- a/javatests/dagger/hilt/android/processor/internal/aggregateddeps/EarlyEntryPointProcessorTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android.processor.internal.aggregateddeps;
-
-import static com.google.testing.compile.CompilationSubject.assertThat;
-import static dagger.hilt.android.processor.AndroidCompilers.compiler;
-
-import com.google.testing.compile.Compilation;
-import com.google.testing.compile.JavaFileObjects;
-import javax.tools.JavaFileObject;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public class EarlyEntryPointProcessorTest {
-
-  @Test
-  public void testUsedWithEntryPoint_fails() {
-    JavaFileObject entryPoint =
-        JavaFileObjects.forSourceLines(
-            "test.UsedWithEntryPoint",
-            "package test;",
-            "",
-            "import dagger.hilt.android.EarlyEntryPoint;",
-            "import dagger.hilt.EntryPoint;",
-            "import dagger.hilt.InstallIn;",
-            "import dagger.hilt.components.SingletonComponent;",
-            "",
-            "@EarlyEntryPoint",
-            "@EntryPoint",
-            "@InstallIn(SingletonComponent.class)",
-            "public interface UsedWithEntryPoint {}");
-    Compilation compilation = compiler().compile(entryPoint);
-
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            "Only one of the following annotations can be used on test.UsedWithEntryPoint: "
-                + "[dagger.hilt.EntryPoint, dagger.hilt.android.EarlyEntryPoint]")
-        .inFile(entryPoint)
-        .onLine(11);
-  }
-
-  @Test
-  public void testNotSingletonComponent_fails() {
-    JavaFileObject entryPoint =
-        JavaFileObjects.forSourceLines(
-            "test.NotSingletonComponent",
-            "package test;",
-            "",
-            "import dagger.hilt.android.EarlyEntryPoint;",
-            "import dagger.hilt.android.components.ActivityComponent;",
-            "import dagger.hilt.EntryPoint;",
-            "import dagger.hilt.InstallIn;",
-            "",
-            "@EarlyEntryPoint",
-            "@InstallIn(ActivityComponent.class)",
-            "public interface NotSingletonComponent {}");
-
-    Compilation compilation = compiler().compile(entryPoint);
-
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@EarlyEntryPoint can only be installed into the SingletonComponent. "
-                + "Found: [dagger.hilt.android.components.ActivityComponent]")
-        .inFile(entryPoint)
-        .onLine(10);
-  }
-
-  @Test
-  public void testThatTestInstallInCannotOriginateFromTest() {
-    JavaFileObject test =
-        JavaFileObjects.forSourceLines(
-            "test.MyTest",
-            "package test;",
-            "",
-            "import dagger.hilt.EntryPoint;",
-            "import dagger.hilt.InstallIn;",
-            "import dagger.hilt.android.EarlyEntryPoint;",
-            "import dagger.hilt.android.testing.HiltAndroidTest;",
-            "import dagger.hilt.components.SingletonComponent;",
-            "",
-            "@HiltAndroidTest",
-            "public class MyTest {",
-            "  @EarlyEntryPoint",
-            "  @InstallIn(SingletonComponent.class)",
-            "  interface NestedEarlyEntryPoint {}",
-            "}");
-    Compilation compilation = compiler().compile(test);
-    assertThat(compilation).failed();
-    assertThat(compilation).hadErrorCount(1);
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@EarlyEntryPoint-annotated entry point, test.MyTest.NestedEarlyEntryPoint, cannot "
-                + "be nested in (or originate from) a @HiltAndroidTest-annotated class, "
-                + "test.MyTest.")
-        .inFile(test)
-        .onLine(13);
-  }
-}
diff --git a/javatests/dagger/hilt/android/processor/internal/customtestapplication/BUILD b/javatests/dagger/hilt/android/processor/internal/customtestapplication/BUILD
deleted file mode 100644
index 6fc39e4..0000000
--- a/javatests/dagger/hilt/android/processor/internal/customtestapplication/BUILD
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (C) 2020 The Dagger Authors.
-#
-# 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.
-# Description:
-#   Tests for internal code for implementing Hilt processors.
-
-load("//java/dagger/testing/compile:macros.bzl", "compiler_test")
-
-package(default_visibility = ["//:src"])
-
-compiler_test(
-    name = "CustomTestApplicationProcessorTest",
-    srcs = ["CustomTestApplicationProcessorTest.java"],
-    compiler_deps = [
-        "//java/dagger/hilt/android/testing:custom_test_application",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "//java/dagger/hilt/android:hilt_android_app",
-        "@androidsdk//:platforms/android-30/android.jar",
-    ],
-    deps = [
-        "@google_bazel_common//third_party/java/compile_testing",
-        "@google_bazel_common//third_party/java/junit",
-        "@google_bazel_common//third_party/java/truth",
-        "//javatests/dagger/hilt/android/processor:android_compilers",
-    ],
-)
diff --git a/javatests/dagger/hilt/android/processor/internal/customtestapplication/CustomTestApplicationProcessorTest.java b/javatests/dagger/hilt/android/processor/internal/customtestapplication/CustomTestApplicationProcessorTest.java
deleted file mode 100644
index f0372ab..0000000
--- a/javatests/dagger/hilt/android/processor/internal/customtestapplication/CustomTestApplicationProcessorTest.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.processor.internal.customtestapplication;
-
-import static com.google.testing.compile.CompilationSubject.assertThat;
-import static dagger.hilt.android.processor.AndroidCompilers.compiler;
-
-import com.google.testing.compile.Compilation;
-import com.google.testing.compile.JavaFileObjects;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public class CustomTestApplicationProcessorTest {
-
-  @Test
-  public void validBaseClass_succeeds() {
-    Compilation compilation =
-        compiler().compile(
-            JavaFileObjects.forSourceLines(
-                "test.HiltTest",
-                "package test;",
-                "",
-                "import android.app.Application;",
-                "import dagger.hilt.android.testing.CustomTestApplication;",
-                "import dagger.hilt.android.testing.HiltAndroidTest;",
-                "",
-                "@CustomTestApplication(Application.class)",
-                "@HiltAndroidTest",
-                "public class HiltTest {}"));
-
-    assertThat(compilation).succeeded();
-  }
-
-  @Test
-  public void incorrectBaseType_fails() {
-    Compilation compilation =
-        compiler().compile(
-            JavaFileObjects.forSourceLines(
-                "test.Foo",
-                "package test;",
-                "",
-                "public class Foo {}"),
-            JavaFileObjects.forSourceLines(
-                "test.HiltTest",
-                "package test;",
-                "",
-                "import dagger.hilt.android.testing.CustomTestApplication;",
-                "",
-                "@CustomTestApplication(Foo.class)",
-                "public class HiltTest {}"));
-
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@CustomTestApplication value should be an instance of android.app.Application. "
-                + "Found: test.Foo");
-  }
-
-  @Test
-  public void baseWithHiltAndroidApp_fails() {
-    Compilation compilation =
-        compiler().compile(
-            JavaFileObjects.forSourceLines(
-                "test.BaseApplication",
-                "package test;",
-                "",
-                "import android.app.Application;",
-                "import dagger.hilt.android.HiltAndroidApp;",
-                "",
-                "@HiltAndroidApp(Application.class)",
-                "public class BaseApplication extends Hilt_BaseApplication {}"),
-            JavaFileObjects.forSourceLines(
-                "test.HiltTest",
-                "package test;",
-                "",
-                "import dagger.hilt.android.testing.CustomTestApplication;",
-                "",
-                "@CustomTestApplication(BaseApplication.class)",
-                "public class HiltTest {}"));
-
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@CustomTestApplication value cannot be annotated with @HiltAndroidApp. "
-                + "Found: test.BaseApplication");
-  }
-
-  @Test
-  public void superclassWithHiltAndroidApp_fails() {
-    Compilation compilation =
-        compiler().compile(
-            JavaFileObjects.forSourceLines(
-                "test.BaseApplication",
-                "package test;",
-                "",
-                "import android.app.Application;",
-                "import dagger.hilt.android.HiltAndroidApp;",
-                "",
-                "@HiltAndroidApp(Application.class)",
-                "public class BaseApplication extends Hilt_BaseApplication {}"),
-            JavaFileObjects.forSourceLines(
-                "test.ParentApplication",
-                "package test;",
-                "",
-                "public class ParentApplication extends BaseApplication {}"),
-            JavaFileObjects.forSourceLines(
-                "test.HiltTest",
-                "package test;",
-                "",
-                "import dagger.hilt.android.testing.CustomTestApplication;",
-                "",
-                "@CustomTestApplication(ParentApplication.class)",
-                "public class HiltTest {}"));
-
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@CustomTestApplication value cannot be annotated with @HiltAndroidApp. "
-                + "Found: test.BaseApplication");
-  }
-
-  @Test
-  public void withInjectField_fails() {
-    Compilation compilation =
-        compiler().compile(
-            JavaFileObjects.forSourceLines(
-                "test.BaseApplication",
-                "package test;",
-                "",
-                "import android.app.Application;",
-                "import javax.inject.Inject;",
-                "",
-                "public class BaseApplication extends Application {",
-                "  @Inject String str;",
-                "}"),
-            JavaFileObjects.forSourceLines(
-                "test.HiltTest",
-                "package test;",
-                "",
-                "import dagger.hilt.android.testing.CustomTestApplication;",
-                "",
-                "@CustomTestApplication(BaseApplication.class)",
-                "public class HiltTest {}"));
-
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@CustomTestApplication does not support application classes (or super classes) with "
-                + "@Inject fields. Found test.BaseApplication with @Inject fields [str]");
-  }
-
-  @Test
-  public void withSuperclassInjectField_fails() {
-    Compilation compilation =
-        compiler().compile(
-            JavaFileObjects.forSourceLines(
-                "test.BaseApplication",
-                "package test;",
-                "",
-                "import android.app.Application;",
-                "import javax.inject.Inject;",
-                "",
-                "public class BaseApplication extends Application {",
-                "  @Inject String str;",
-                "}"),
-            JavaFileObjects.forSourceLines(
-                "test.ParentApplication",
-                "package test;",
-                "",
-                "public class ParentApplication extends BaseApplication {}"),
-            JavaFileObjects.forSourceLines(
-                "test.HiltTest",
-                "package test;",
-                "",
-                "import dagger.hilt.android.testing.CustomTestApplication;",
-                "",
-                "@CustomTestApplication(ParentApplication.class)",
-                "public class HiltTest {}"));
-
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@CustomTestApplication does not support application classes (or super classes) with "
-                + "@Inject fields. Found test.BaseApplication with @Inject fields [str]");
-  }
-
-  @Test
-  public void withInjectMethod_fails() {
-    Compilation compilation =
-        compiler().compile(
-            JavaFileObjects.forSourceLines(
-                "test.BaseApplication",
-                "package test;",
-                "",
-                "import android.app.Application;",
-                "import javax.inject.Inject;",
-                "",
-                "public class BaseApplication extends Application {",
-                "  @Inject String str() { return null; }",
-                "}"),
-            JavaFileObjects.forSourceLines(
-                "test.HiltTest",
-                "package test;",
-                "",
-                "import dagger.hilt.android.testing.CustomTestApplication;",
-                "",
-                "@CustomTestApplication(BaseApplication.class)",
-                "public class HiltTest {}"));
-
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@CustomTestApplication does not support application classes (or super classes) with "
-                + "@Inject methods. Found test.BaseApplication with @Inject methods [str()]");
-  }
-
-  @Test
-  public void withSuperclassInjectMethod_fails() {
-    Compilation compilation =
-        compiler().compile(
-            JavaFileObjects.forSourceLines(
-                "test.BaseApplication",
-                "package test;",
-                "",
-                "import android.app.Application;",
-                "import javax.inject.Inject;",
-                "",
-                "public class BaseApplication extends Application {",
-                "  @Inject String str() { return null; }",
-                "}"),
-            JavaFileObjects.forSourceLines(
-                "test.ParentApplication",
-                "package test;",
-                "",
-                "public class ParentApplication extends BaseApplication {}"),
-            JavaFileObjects.forSourceLines(
-                "test.HiltTest",
-                "package test;",
-                "",
-                "import dagger.hilt.android.testing.CustomTestApplication;",
-                "",
-                "@CustomTestApplication(ParentApplication.class)",
-                "public class HiltTest {}"));
-
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@CustomTestApplication does not support application classes (or super classes) with "
-                + "@Inject methods. Found test.BaseApplication with @Inject methods [str()]");
-  }
-
-  @Test
-  public void withInjectConstructor_fails() {
-    Compilation compilation =
-        compiler().compile(
-            JavaFileObjects.forSourceLines(
-                "test.BaseApplication",
-                "package test;",
-                "",
-                "import android.app.Application;",
-                "import javax.inject.Inject;",
-                "",
-                "public class BaseApplication extends Application {",
-                "  @Inject BaseApplication() {}",
-                "}"),
-            JavaFileObjects.forSourceLines(
-                "test.HiltTest",
-                "package test;",
-                "",
-                "import dagger.hilt.android.testing.CustomTestApplication;",
-                "",
-                "@CustomTestApplication(BaseApplication.class)",
-                "public class HiltTest {}"));
-
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@CustomTestApplication does not support application classes (or super classes) with "
-                + "@Inject constructors. Found test.BaseApplication with @Inject constructors "
-                + "[BaseApplication()]");
-  }
-
-  @Test
-  public void withSuperclassInjectConstructor_fails() {
-    Compilation compilation =
-        compiler().compile(
-            JavaFileObjects.forSourceLines(
-                "test.BaseApplication",
-                "package test;",
-                "",
-                "import android.app.Application;",
-                "import javax.inject.Inject;",
-                "",
-                "public class BaseApplication extends Application {",
-                "  @Inject BaseApplication() {}",
-                "}"),
-            JavaFileObjects.forSourceLines(
-                "test.ParentApplication",
-                "package test;",
-                "",
-                "public class ParentApplication extends BaseApplication {}"),
-            JavaFileObjects.forSourceLines(
-                "test.HiltTest",
-                "package test;",
-                "",
-                "import dagger.hilt.android.testing.CustomTestApplication;",
-                "",
-                "@CustomTestApplication(ParentApplication.class)",
-                "public class HiltTest {}"));
-
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@CustomTestApplication does not support application classes (or super classes) with "
-                + "@Inject constructors. Found test.BaseApplication with @Inject constructors "
-                + "[BaseApplication()]");
-  }
-}
diff --git a/javatests/dagger/hilt/android/processor/internal/viewmodel/ViewModelGeneratorTest.kt b/javatests/dagger/hilt/android/processor/internal/viewmodel/ViewModelGeneratorTest.kt
index df020ff..7c3e45f 100644
--- a/javatests/dagger/hilt/android/processor/internal/viewmodel/ViewModelGeneratorTest.kt
+++ b/javatests/dagger/hilt/android/processor/internal/viewmodel/ViewModelGeneratorTest.kt
@@ -45,7 +45,7 @@
 
     val expected = """
         package dagger.hilt.android.test;
-
+        
         import androidx.lifecycle.ViewModel;
         import dagger.Binds;
         import dagger.Module;
@@ -60,7 +60,7 @@
         import dagger.multibindings.StringKey;
         import java.lang.String;
         import $GENERATED_TYPE
-
+        
         $GENERATED_ANNOTATION
         @OriginatingElement(
             topLevelClass = MyViewModel.class
@@ -68,25 +68,23 @@
         public final class MyViewModel_HiltModules {
           private MyViewModel_HiltModules() {
           }
-
+        
           @Module
           @InstallIn(ViewModelComponent.class)
           public static abstract class BindsModule {
-            private BindsModule() {}
-
             @Binds
             @IntoMap
             @StringKey("dagger.hilt.android.test.MyViewModel")
             @HiltViewModelMap
             public abstract ViewModel binds(MyViewModel vm);
           }
-
+        
           @Module
           @InstallIn(ActivityRetainedComponent.class)
           public static final class KeyModule {
             private KeyModule() {
             }
-
+        
             @Provides
             @IntoSet
             @HiltViewModelMap.KeySet
@@ -125,7 +123,7 @@
 
     val expected = """
         package dagger.hilt.android.test;
-
+        
         import androidx.lifecycle.ViewModel;
         import dagger.Binds;
         import dagger.Module;
@@ -140,7 +138,7 @@
         import dagger.multibindings.StringKey;
         import java.lang.String;
         import $GENERATED_TYPE
-
+        
         $GENERATED_ANNOTATION
         @OriginatingElement(
             topLevelClass = MyViewModel.class
@@ -148,25 +146,23 @@
         public final class MyViewModel_HiltModules {
           private MyViewModel_HiltModules() {
           }
-
+        
           @Module
           @InstallIn(ViewModelComponent.class)
           public static abstract class BindsModule {
-            private BindsModule() {}
-
             @Binds
             @IntoMap
             @StringKey("dagger.hilt.android.test.MyViewModel")
             @HiltViewModelMap
             public abstract ViewModel binds(MyViewModel vm);
           }
-
+        
           @Module
           @InstallIn(ActivityRetainedComponent.class)
           public static final class KeyModule {
             private KeyModule() {
             }
-
+        
             @Provides
             @IntoSet
             @HiltViewModelMap.KeySet
@@ -212,7 +208,7 @@
 
     val expected = """
         package dagger.hilt.android.test;
-
+        
         import androidx.lifecycle.ViewModel;
         import dagger.Binds;
         import dagger.Module;
@@ -227,7 +223,7 @@
         import dagger.multibindings.StringKey;
         import java.lang.String;
         import $GENERATED_TYPE
-
+        
         $GENERATED_ANNOTATION
         @OriginatingElement(
             topLevelClass = MyViewModel.class
@@ -235,25 +231,23 @@
         public final class MyViewModel_HiltModules {
           private MyViewModel_HiltModules() {
           }
-
+        
           @Module
           @InstallIn(ViewModelComponent.class)
           public static abstract class BindsModule {
-            private BindsModule() {}
-
             @Binds
             @IntoMap
             @StringKey("dagger.hilt.android.test.MyViewModel")
             @HiltViewModelMap
             public abstract ViewModel binds(MyViewModel vm);
           }
-
+        
           @Module
           @InstallIn(ActivityRetainedComponent.class)
           public static final class KeyModule {
             private KeyModule() {
             }
-
+        
             @Provides
             @IntoSet
             @HiltViewModelMap.KeySet
@@ -300,7 +294,7 @@
 
     val expected = """
         package dagger.hilt.android.test;
-
+    
         import androidx.lifecycle.ViewModel;
         import dagger.Binds;
         import dagger.Module;
@@ -315,7 +309,7 @@
         import dagger.multibindings.StringKey;
         import java.lang.String;
         import $GENERATED_TYPE;
-
+        
         $GENERATED_ANNOTATION
         @OriginatingElement(
             topLevelClass = MyViewModel.class
@@ -323,25 +317,23 @@
         public final class MyViewModel_HiltModules {
           private MyViewModel_HiltModules() {
           }
-
+        
           @Module
           @InstallIn(ViewModelComponent.class)
           public static abstract class BindsModule {
-            private BindsModule() {}
-
             @Binds
             @IntoMap
             @StringKey("dagger.hilt.android.test.MyViewModel")
             @HiltViewModelMap
             public abstract ViewModel binds(MyViewModel vm);
           }
-
+        
           @Module
           @InstallIn(ActivityRetainedComponent.class)
           public static final class KeyModule {
             private KeyModule() {
             }
-
+        
             @Provides
             @IntoSet
             @HiltViewModelMap.KeySet
@@ -395,7 +387,7 @@
 
     val expected = """
         package dagger.hilt.android.test;
-
+        
         import androidx.lifecycle.ViewModel;
         import dagger.Binds;
         import dagger.Module;
@@ -410,7 +402,7 @@
         import dagger.multibindings.StringKey;
         import java.lang.String;
         import $GENERATED_TYPE;
-
+        
         $GENERATED_ANNOTATION
         @OriginatingElement(
             topLevelClass = MyViewModel.class
@@ -418,25 +410,23 @@
         public final class MyViewModel_HiltModules {
           private MyViewModel_HiltModules() {
           }
-
+        
           @Module
           @InstallIn(ViewModelComponent.class)
           public static abstract class BindsModule {
-            private BindsModule() {}
-
             @Binds
             @IntoMap
             @StringKey("dagger.hilt.android.test.MyViewModel")
             @HiltViewModelMap
             public abstract ViewModel binds(MyViewModel vm);
           }
-
+        
           @Module
           @InstallIn(ActivityRetainedComponent.class)
           public static final class KeyModule {
             private KeyModule() {
             }
-
+        
             @Provides
             @IntoSet
             @HiltViewModelMap.KeySet
@@ -476,7 +466,7 @@
 
     val expectedModule = """
         package dagger.hilt.android.test;
-
+        
         import androidx.lifecycle.ViewModel;
         import dagger.Binds;
         import dagger.Module;
@@ -491,7 +481,7 @@
         import dagger.multibindings.StringKey;
         import java.lang.String;
         import $GENERATED_TYPE
-
+        
         $GENERATED_ANNOTATION
         @OriginatingElement(
             topLevelClass = Outer.class
@@ -499,25 +489,23 @@
         public final class Outer_InnerViewModel_HiltModules {
           private Outer_InnerViewModel_HiltModules() {
           }
-
+        
           @Module
           @InstallIn(ViewModelComponent.class)
           public static abstract class BindsModule {
-            private BindsModule() {}
-
             @Binds
             @IntoMap
             @StringKey("dagger.hilt.android.test.Outer${'$'}InnerViewModel")
             @HiltViewModelMap
             public abstract ViewModel binds(Outer.InnerViewModel vm);
           }
-
+        
           @Module
           @InstallIn(ActivityRetainedComponent.class)
           public static final class KeyModule {
             private KeyModule() {
             }
-
+        
             @Provides
             @IntoSet
             @HiltViewModelMap.KeySet
diff --git a/javatests/dagger/hilt/android/testing/BUILD b/javatests/dagger/hilt/android/testing/BUILD
deleted file mode 100644
index e336777..0000000
--- a/javatests/dagger/hilt/android/testing/BUILD
+++ /dev/null
@@ -1,162 +0,0 @@
-# Copyright (C) 2020 The Dagger Authors.
-#
-# 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.
-# Description:
-#   Tests for internal code for implementing Hilt processors.
-
-package(default_visibility = ["//:src"])
-
-android_local_test(
-    name = "BindValueTest",
-    srcs = ["BindValueTest.java"],
-    manifest_values = {
-        "minSdkVersion": "15",
-        "targetSdkVersion": "27",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android/testing:bind_value",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-    ],
-)
-
-android_local_test(
-    name = "BindValueIntoMapTest",
-    size = "small",
-    srcs = ["BindValueIntoMapTest.java"],
-    manifest_values = {
-        "minSdkVersion": "15",
-        "targetSdkVersion": "27",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "@google_bazel_common//third_party/java/auto:value",
-        "//:dagger_with_compiler",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android/testing:bind_value",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-    ],
-)
-
-android_local_test(
-    name = "BindValueIntoSetTest",
-    size = "small",
-    srcs = ["BindValueIntoSetTest.java"],
-    manifest_values = {
-        "minSdkVersion": "15",
-        "targetSdkVersion": "27",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android/testing:bind_value",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-    ],
-)
-
-android_local_test(
-    name = "BindElementsIntoSetTest",
-    size = "small",
-    srcs = ["BindElementsIntoSetTest.java"],
-    manifest_values = {
-        "minSdkVersion": "15",
-        "targetSdkVersion": "27",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//java/dagger/internal/guava:collect",
-        "//:dagger_with_compiler",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android/testing:bind_value",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-    ],
-)
-
-android_local_test(
-    name = "TestRootModulesTest",
-    size = "small",
-    srcs = ["TestRootModulesTest.java"],
-    manifest_values = {
-        "minSdkVersion": "15",
-        "targetSdkVersion": "27",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-    ],
-)
-
-android_local_test(
-    name = "HiltAndroidRuleTest",
-    size = "small",
-    srcs = ["HiltAndroidRuleTest.java"],
-    manifest_values = {
-        "minSdkVersion": "15",
-        "targetSdkVersion": "27",
-    },
-    deps = [
-        ":HiltAndroidRuleTestApp",
-        "//:android_local_test_exports",
-        "//java/dagger/internal/guava:collect",
-        "//:dagger_with_compiler",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "//java/dagger/hilt/android/qualifiers",
-        "//java/dagger/hilt/android/testing:hilt_android_rule",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-    ],
-)
-
-android_library(
-    name = "HiltAndroidRuleTestApp",
-    srcs = ["HiltAndroidRuleTestApp.java"],
-    deps = [
-        "//java/dagger/hilt/android:hilt_android_app",
-    ],
-)
-
-android_local_test(
-    name = "DelayComponentReadyTest",
-    srcs = ["DelayComponentReadyTest.java"],
-    manifest_values = {
-        "minSdkVersion": "15",
-        "targetSdkVersion": "27",
-    },
-    deps = [
-        "//:android_local_test_exports",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-        "@google_bazel_common//third_party/java/truth",
-        "//java/dagger/hilt:entry_point",
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android/testing:bind_value",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-    ],
-)
diff --git a/javatests/dagger/hilt/android/testing/BindElementsIntoSetTest.java b/javatests/dagger/hilt/android/testing/BindElementsIntoSetTest.java
deleted file mode 100644
index e92565f..0000000
--- a/javatests/dagger/hilt/android/testing/BindElementsIntoSetTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testing;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.google.common.collect.ImmutableSet;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.InstallIn;
-import dagger.hilt.components.SingletonComponent;
-import java.util.Set;
-import javax.inject.Inject;
-import javax.inject.Provider;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-@Config(application = HiltTestApplication.class)
-public final class BindElementsIntoSetTest {
-  private static final String SET_STRING_1 = "SetString1";
-  private static final String SET_STRING_2 = "SetString2";
-  private static final String SET_STRING_3 = "SetString3";
-
-  @BindElementsIntoSet Set<String> bindElementsSet1 = ImmutableSet.of(SET_STRING_1);
-
-  @BindElementsIntoSet Set<String> bindElementsSet2 = ImmutableSet.of(SET_STRING_2);
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  public interface BindElementsIntoSetEntryPoint {
-    Set<String> getStringSet();
-  }
-
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Inject Set<String> stringSet;
-
-  @Inject Provider<Set<String>> providedStringSet;
-
-  @Test
-  public void testMutated() throws Exception {
-    rule.inject();
-    // basic check that initial/default values are properly injected
-    assertThat(providedStringSet.get()).containsExactly(SET_STRING_1, SET_STRING_2);
-    // Test empty sets (something that cannot be done with @BindValueIntoSet)
-    bindElementsSet1 = ImmutableSet.of();
-    bindElementsSet2 = ImmutableSet.of();
-    assertThat(providedStringSet.get()).isEmpty();
-    // Test multiple elements in set.
-    bindElementsSet1 = ImmutableSet.of(SET_STRING_1, SET_STRING_2, SET_STRING_3);
-    assertThat(providedStringSet.get()).containsExactly(SET_STRING_1, SET_STRING_2, SET_STRING_3);
-  }
-
-}
diff --git a/javatests/dagger/hilt/android/testing/BindValueInKotlinValTest.kt b/javatests/dagger/hilt/android/testing/BindValueInKotlinValTest.kt
deleted file mode 100644
index e0f6079..0000000
--- a/javatests/dagger/hilt/android/testing/BindValueInKotlinValTest.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-package dagger.hilt.android.testing
-
-import androidx.test.core.app.ApplicationProvider.getApplicationContext
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.google.common.truth.Truth.assertThat
-import dagger.hilt.EntryPoint
-import dagger.hilt.EntryPoints
-import dagger.hilt.InstallIn
-import dagger.hilt.components.SingletonComponent
-import javax.inject.Named
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.robolectric.annotation.Config
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4::class)
-@Config(application = HiltTestApplication::class)
-class BindValueInKotlinValTest {
-
-  @EntryPoint
-  @InstallIn(SingletonComponent::class)
-  interface BindValueEntryPoint {
-    fun bindValueString1(): String
-
-    @Named(TEST_QUALIFIER)
-    fun bindValueString2(): String
-  }
-
-  @get:Rule
-  val rule = HiltAndroidRule(this)
-
-  @BindValue
-  val bindValueString1 = BIND_VALUE_STRING1
-
-  @BindValue
-  @Named(TEST_QUALIFIER)
-  val bindValueString2 = BIND_VALUE_STRING2
-
-  @Test
-  fun testBindValueFieldIsProvided() {
-    assertThat(bindValueString1).isEqualTo(BIND_VALUE_STRING1)
-    assertThat(getBinding1()).isEqualTo(BIND_VALUE_STRING1)
-    assertThat(bindValueString2).isEqualTo(BIND_VALUE_STRING2)
-    assertThat(getBinding2()).isEqualTo(BIND_VALUE_STRING2)
-  }
-
-  companion object {
-    private const val BIND_VALUE_STRING1 = "BIND_VALUE_STRING1"
-    private const val BIND_VALUE_STRING2 = "BIND_VALUE_STRING2"
-    private const val TEST_QUALIFIER = "TEST_QUALIFIER"
-
-    private fun getBinding1() =
-      EntryPoints.get(getApplicationContext(), BindValueEntryPoint::class.java).bindValueString1()
-
-    private fun getBinding2() =
-      EntryPoints.get(getApplicationContext(), BindValueEntryPoint::class.java).bindValueString2()
-  }
-}
diff --git a/javatests/dagger/hilt/android/testing/BindValueIntoMapTest.java b/javatests/dagger/hilt/android/testing/BindValueIntoMapTest.java
deleted file mode 100644
index 588edcb..0000000
--- a/javatests/dagger/hilt/android/testing/BindValueIntoMapTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testing;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.MapKey;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.InstallIn;
-import dagger.hilt.components.SingletonComponent;
-import java.util.Map;
-import javax.inject.Inject;
-import javax.inject.Provider;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-@Config(application = HiltTestApplication.class)
-public final class BindValueIntoMapTest {
-  private static final String KEY1 = "SOME_KEY";
-  private static final String KEY2 = "SOME_OTHER_KEY";
-  private static final String VALUE1 = "SOME_VALUE";
-  private static final String VALUE2 = "SOME_OTHER_VALUE";
-  private static final String VALUE3 = "A_THIRD_VALUE";
-
-  @BindValueIntoMap
-  @MyMapKey(KEY1)
-  String boundValue1 = VALUE1;
-
-  @BindValueIntoMap
-  @MyMapKey(KEY2)
-  String boundValue2 = VALUE2;
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  public interface BindValuesIntoMapEntryPoint {
-    Map<String, String> getStringStringMap();
-  }
-
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Inject Provider<Map<String, String>> mapProvider;
-
-  @Test
-  public void testInjectedAndModified() throws Exception {
-    rule.inject();
-    Map<String, String> oldMap = mapProvider.get();
-    assertThat(oldMap).containsExactly(KEY1, VALUE1, KEY2, VALUE2);
-    boundValue1 = VALUE3;
-    Map<String, String> newMap = mapProvider.get();
-    assertThat(oldMap).containsExactly(KEY1, VALUE1, KEY2, VALUE2);
-    assertThat(newMap).containsExactly(KEY1, VALUE3, KEY2, VALUE2);
-  }
-
-  @MapKey
-  @interface MyMapKey {
-    String value();
-  }
-}
diff --git a/javatests/dagger/hilt/android/testing/BindValueIntoSetTest.java b/javatests/dagger/hilt/android/testing/BindValueIntoSetTest.java
deleted file mode 100644
index 276a3d8..0000000
--- a/javatests/dagger/hilt/android/testing/BindValueIntoSetTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testing;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.InstallIn;
-import dagger.hilt.components.SingletonComponent;
-import java.util.Set;
-import javax.inject.Inject;
-import javax.inject.Provider;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-@Config(application = HiltTestApplication.class)
-public final class BindValueIntoSetTest {
-  private static final String SET_STRING_1 = "SetString1";
-  private static final String SET_STRING_2 = "SetString2";
-  private static final String SET_STRING_3 = "SetString3";
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  public interface BindValueIntoSetEntryPoint {
-    Set<String> getStringSet();
-  }
-
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @BindValueIntoSet String bindValueSetString1 = SET_STRING_1;
-  @BindValueIntoSet String bindValueSetString2 = SET_STRING_2;
-
-  @Inject Set<String> stringSet;
-  @Inject Provider<Set<String>> providedStringSet;
-
-  @Test
-  public void testMutated() throws Exception {
-    rule.inject();
-    // basic check that initial/default values are properly injected
-    assertThat(providedStringSet.get()).containsExactly(SET_STRING_1, SET_STRING_2);
-    bindValueSetString1 = SET_STRING_3;
-    // change the value for bindValueSetString1 from 1 to 3
-    assertThat(providedStringSet.get()).containsExactly(SET_STRING_2, SET_STRING_3);
-  }
-
-
-}
diff --git a/javatests/dagger/hilt/android/testing/BindValueTest.java b/javatests/dagger/hilt/android/testing/BindValueTest.java
deleted file mode 100644
index 2e85f6b..0000000
--- a/javatests/dagger/hilt/android/testing/BindValueTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testing;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.InstallIn;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Named;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-@Config(application = HiltTestApplication.class)
-public final class BindValueTest {
-  private static final String BIND_VALUE_STRING1 = "BIND_VALUE_STRING1";
-  private static final String BIND_VALUE_STRING2 = "BIND_VALUE_STRING2";
-  private static final String TEST_QUALIFIER1 = "TEST_QUALIFIER1";
-  private static final String TEST_QUALIFIER2 = "TEST_QUALIFIER2";
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  public interface BindValueEntryPoint {
-    @Named(TEST_QUALIFIER1)
-    String bindValueString1();
-
-    @Named(TEST_QUALIFIER2)
-    String bindValueString2();
-  }
-
-  @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @BindValue
-  @Named(TEST_QUALIFIER1)
-  String bindValueString1 = BIND_VALUE_STRING1;
-
-  @BindValue
-  @Named(TEST_QUALIFIER2)
-  String bindValueString2 = BIND_VALUE_STRING2;
-
-  @Test
-  public void testBindValueFieldIsProvided() throws Exception {
-    assertThat(bindValueString1).isEqualTo(BIND_VALUE_STRING1);
-    assertThat(getBinding1()).isEqualTo(BIND_VALUE_STRING1);
-
-    assertThat(bindValueString2).isEqualTo(BIND_VALUE_STRING2);
-    assertThat(getBinding2()).isEqualTo(BIND_VALUE_STRING2);
-  }
-
-  @Test
-  public void testBindValueIsMutable() throws Exception {
-    bindValueString1 = "newValue";
-    assertThat(getBinding1()).isEqualTo("newValue");
-  }
-
-  @Test
-  public void testCallingComponentReadyWithoutDelayComponentReady_fails() throws Exception {
-    IllegalStateException expected =
-        assertThrows(IllegalStateException.class, rule::componentReady);
-    assertThat(expected)
-        .hasMessageThat()
-        .isEqualTo("Called componentReady(), even though delayComponentReady() was not used.");
-  }
-
-  private static String getBinding1() {
-    return EntryPoints.get(getApplicationContext(), BindValueEntryPoint.class).bindValueString1();
-  }
-
-  private static String getBinding2() {
-    return EntryPoints.get(getApplicationContext(), BindValueEntryPoint.class).bindValueString2();
-  }
-}
diff --git a/javatests/dagger/hilt/android/testing/DelayComponentReadyTest.java b/javatests/dagger/hilt/android/testing/DelayComponentReadyTest.java
deleted file mode 100644
index 760e018..0000000
--- a/javatests/dagger/hilt/android/testing/DelayComponentReadyTest.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testing;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.EntryPoint;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.InstallIn;
-import dagger.hilt.components.SingletonComponent;
-import java.util.concurrent.atomic.AtomicReference;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.RuleChain;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.junit.runners.model.Statement;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-@Config(application = HiltTestApplication.class)
-public final class DelayComponentReadyTest {
-  private static final String EXPECTED_VALUE = "expected";
-
-  @EntryPoint
-  @InstallIn(SingletonComponent.class)
-  public interface FooEntryPoint {
-    String foo();
-  }
-
-  // If true, verifies that HiltAndroidRule threw an IllegalStateException
-  private boolean verifyTestRuleThrew = false;
-
-  // A test rule that wraps HiltAndroidRule to verify it throws
-  private final TestRule exceptionVerifyingRule =
-      (base, description) -> {
-        return new Statement() {
-          @Override
-          public void evaluate() throws Throwable {
-            AtomicReference<IllegalStateException> caught = new AtomicReference<>();
-            try {
-              base.evaluate();
-            } catch (IllegalStateException e) {
-              caught.set(e);
-              if (!verifyTestRuleThrew) {
-                throw e;
-              }
-            }
-            if (verifyTestRuleThrew) {
-              IllegalStateException expected = caught.get();
-              if (expected == null) {
-                throw new AssertionError("Did not throw expected expection");
-              }
-              assertThat(expected)
-                  .hasMessageThat()
-                  .isEqualTo("Used delayComponentReady(), but never called componentReady()");
-            }
-          }
-        };
-      };
-
-  private final HiltAndroidRule rule = new HiltAndroidRule(this).delayComponentReady();
-
-  @Rule public final RuleChain ruleChain = RuleChain.outerRule(exceptionVerifyingRule).around(rule);
-
-  @BindValue String foo;
-
-  @Test
-  public void testLateBindValue() throws Exception {
-    AtomicReference<String> fooRef = new AtomicReference<>();
-    OnComponentReadyRunner.addListener(
-        ApplicationProvider.getApplicationContext(),
-        FooEntryPoint.class,
-        entryPoint -> fooRef.set(entryPoint.foo()));
-
-    // Test that setting the listener before the component is ready doesn't run the listener.
-    assertThat(fooRef.get()).isNull();
-
-    foo = EXPECTED_VALUE;
-    rule.componentReady().inject();
-    assertThat(EntryPoints.get(getApplicationContext(), FooEntryPoint.class).foo())
-        .isEqualTo(EXPECTED_VALUE);
-  }
-
-  @Test
-  public void testUnitializedBindValue_fails() throws Exception {
-    OnComponentReadyRunner.addListener(
-        ApplicationProvider.getApplicationContext(), FooEntryPoint.class, FooEntryPoint::foo);
-
-    // foo not set
-    NullPointerException expected = assertThrows(NullPointerException.class, rule::componentReady);
-    // This is not the best error message, but it is equivalent to the message from a regular
-    // (non-delayed) @BindValue returning null;
-    assertThat(expected)
-        .hasMessageThat()
-        .isEqualTo("Cannot return null from a non-@Nullable @Provides method");
-  }
-
-  @Test
-  public void testDoubleComponentReady_fails() throws Exception {
-    foo = EXPECTED_VALUE;
-    rule.componentReady();
-    IllegalStateException expected =
-        assertThrows(IllegalStateException.class, rule::componentReady);
-    assertThat(expected).hasMessageThat().isEqualTo("Called componentReady() multiple times");
-  }
-
-  @Test
-  public void testMissingComponentReady_fails() throws Exception {
-    // componentReady not called
-    foo = EXPECTED_VALUE;
-    IllegalStateException expected = assertThrows(IllegalStateException.class, rule::inject);
-    assertThat(expected)
-        .hasMessageThat()
-        .isEqualTo("Called inject() before calling componentReady()");
-  }
-
-  @Test
-  public void testDelayComponentReadyAfterStart_fails() throws Exception {
-    IllegalStateException expected =
-        assertThrows(IllegalStateException.class, rule::delayComponentReady);
-    assertThat(expected)
-        .hasMessageThat()
-        .isEqualTo("Called delayComponentReady after test execution started");
-    // Prevents failure due to never calling componentReady()
-    foo = EXPECTED_VALUE;
-    rule.componentReady();
-  }
-
-  @Test
-  public void neverCallsComponentReady_fails() throws Exception {
-    // Does not call componentReady()
-    verifyTestRuleThrew = true;
-  }
-}
diff --git a/javatests/dagger/hilt/android/testing/HiltAndroidRuleTest.java b/javatests/dagger/hilt/android/testing/HiltAndroidRuleTest.java
deleted file mode 100644
index 2f5fcd2..0000000
--- a/javatests/dagger/hilt/android/testing/HiltAndroidRuleTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testing;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import android.app.Application;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-public final class HiltAndroidRuleTest {
-  public static final class NonHiltTest {}
-
-  @Test
-  @Config(application = HiltTestApplication.class)
-  public void testMissingHiltAndroidTest_fails() throws Exception {
-    IllegalStateException exception =
-        assertThrows(
-            IllegalStateException.class,
-            () -> new HiltAndroidRule(new NonHiltTest()));
-    assertThat(exception)
-          .hasMessageThat()
-          .isEqualTo(
-              "Expected dagger.hilt.android.testing.HiltAndroidRuleTest$NonHiltTest to be "
-                  + "annotated with @HiltAndroidTest.");
-
-  }
-
-  @Test
-  @Config(application = Application.class)
-  public void testNonHiltTestApplication_fails() throws Exception {
-    IllegalStateException exception =
-        assertThrows(
-            IllegalStateException.class,
-            () -> new HiltAndroidRule(HiltAndroidRuleTest.this));
-    assertThat(exception)
-          .hasMessageThat()
-          .isEqualTo(
-              "Hilt test, dagger.hilt.android.testing.HiltAndroidRuleTest, must use a Hilt test "
-                  + "application but found android.app.Application. To fix, configure the test to "
-                  + "use HiltTestApplication or a custom Hilt test application generated with "
-                  + "@CustomTestApplication.");
-
-  }
-
-  @Test
-  @Config(application = HiltAndroidRuleTestApp.class)
-  public void testHiltAndroidApplication_fails() throws Exception {
-    IllegalStateException exception =
-        assertThrows(
-            IllegalStateException.class,
-            () -> new HiltAndroidRule(HiltAndroidRuleTest.this));
-    assertThat(exception)
-          .hasMessageThat()
-          .isEqualTo(
-              "Hilt test, dagger.hilt.android.testing.HiltAndroidRuleTest, cannot use a "
-                  + "@HiltAndroidApp application but found "
-                  + "dagger.hilt.android.testing.HiltAndroidRuleTestApp. To fix, configure the "
-                  + "test to use HiltTestApplication or a custom Hilt test application generated "
-                  + "with @CustomTestApplication.");
-
-  }
-}
diff --git a/javatests/dagger/hilt/android/testing/HiltAndroidRuleTestApp.java b/javatests/dagger/hilt/android/testing/HiltAndroidRuleTestApp.java
deleted file mode 100644
index 9ec7d08..0000000
--- a/javatests/dagger/hilt/android/testing/HiltAndroidRuleTestApp.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testing;
-
-import android.app.Application;
-import dagger.hilt.android.HiltAndroidApp;
-
-/** A Hilt application used to test errors in {@link HiltAndroidRuleTest}. */
-@HiltAndroidApp(Application.class)
-final class HiltAndroidRuleTestApp extends Hilt_HiltAndroidRuleTestApp {}
diff --git a/javatests/dagger/hilt/android/testing/TestRootModulesTest.java b/javatests/dagger/hilt/android/testing/TestRootModulesTest.java
deleted file mode 100644
index 97753cc..0000000
--- a/javatests/dagger/hilt/android/testing/TestRootModulesTest.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testing;
-
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static org.junit.Assert.assertEquals;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.Binds;
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.InstallIn;
-import dagger.hilt.components.SingletonComponent;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-import javax.inject.Inject;
-import javax.inject.Qualifier;
-import javax.inject.Singleton;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-@Config(application = HiltTestApplication.class)
-public final class TestRootModulesTest {
-  @Rule public final HiltAndroidRule rules = new HiltAndroidRule(this);
-
-  @Retention(RUNTIME)
-  @Qualifier
-  @Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
-  public @interface TestQualifier {
-    int value();
-  }
-
-  @Inject
-  @TestQualifier(0)
-  String testString0;
-
-  @Inject
-  @TestQualifier(1)
-  String testString1;
-
-  @Inject
-  @TestQualifier(2)
-  String testString2;
-
-  @Inject
-  @TestQualifier(3)
-  String testString3;
-
-  @Inject
-  @TestQualifier(4)
-  String testString4;
-
-  @Inject FooImpl fooImpl;
-  @Inject Foo foo;
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public final class NonStaticModuleNonStaticProvidesDefaultConstructor {
-    @Provides
-    @TestQualifier(0)
-    String provideString() {
-      return "0";
-    }
-
-    NonStaticModuleNonStaticProvidesDefaultConstructor() {}
-  }
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public final class NonStaticModuleNonStaticProvides {
-    @Provides
-    @TestQualifier(1)
-    String provideString() {
-      return "1";
-    }
-  }
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public static final class StaticModuleStaticProvides {
-    @Provides
-    @TestQualifier(2)
-    static String provideString() {
-      return "2";
-    }
-
-    private StaticModuleStaticProvides() {}
-  }
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public static final class StaticModuleNonStaticProvidesDefaultConstructor {
-    @Provides
-    @TestQualifier(3)
-    String provideString() {
-      return "3";
-    }
-  }
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public abstract static class AbstractModuleStaticProvides {
-    @Provides
-    @TestQualifier(4)
-    static String provideString() {
-      return "4";
-    }
-
-    private AbstractModuleStaticProvides() {}
-  }
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public abstract static class AbstractModuleBindsMethod {
-    @Binds
-    abstract Foo foo(FooImpl fooImpl);
-  }
-
-  interface Foo {}
-
-  @Singleton
-  static final class FooImpl implements Foo {
-    @Inject
-    FooImpl() {}
-  }
-
-  @Test
-  public void testInjection() throws Exception {
-    rules.inject();
-    assertEquals("0", testString0);
-    assertEquals("1", testString1);
-    assertEquals("2", testString2);
-    assertEquals("3", testString3);
-    assertEquals("4", testString4);
-    assertEquals(fooImpl, foo);
-  }
-}
diff --git a/javatests/dagger/hilt/android/testing/testinstallin/BUILD b/javatests/dagger/hilt/android/testing/testinstallin/BUILD
deleted file mode 100644
index 63d0bca..0000000
--- a/javatests/dagger/hilt/android/testing/testinstallin/BUILD
+++ /dev/null
@@ -1,107 +0,0 @@
-# Copyright (C) 2020 The Dagger Authors.
-#
-# 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.
-# Description:
-#   Tests for internal code for implementing Hilt processors.
-
-package(default_visibility = ["//:src"])
-
-android_local_test(
-    name = "TestInstallInFooTest",
-    srcs = ["TestInstallInFooTest.java"],
-    manifest_values = {
-        "minSdkVersion": "15",
-        "targetSdkVersion": "27",
-    },
-    deps = [
-        ":TestInstallInModules",
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "@maven//:junit_junit",
-        
-                        "@maven//:org_robolectric_robolectric",
-                        "@maven//:androidx_test_ext_junit",
-                        "@maven//:androidx_test_core",
-                        
-        "@google_bazel_common//third_party/java/truth",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-    ],
-)
-
-android_local_test(
-    name = "TestInstallInBarTest",
-    srcs = ["TestInstallInBarTest.java"],
-    manifest_values = {
-        "minSdkVersion": "15",
-        "targetSdkVersion": "27",
-    },
-    deps = [
-        ":TestInstallInModules",
-        "//:android_local_test_exports",
-        "//:dagger_with_compiler",
-        "@maven//:junit_junit",
-        
-                        "@maven//:org_robolectric_robolectric",
-                        "@maven//:androidx_test_ext_junit",
-                        "@maven//:androidx_test_core",
-                        
-        "@google_bazel_common//third_party/java/truth",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "//java/dagger/hilt/android/testing:uninstall_modules",
-        "//java/dagger/hilt/testing:test_install_in",
-    ],
-)
-
-android_local_test(
-    name = "TestInstallInAppTest",
-    srcs = ["TestInstallInAppTest.java"],
-    manifest_values = {
-        "minSdkVersion": "15",
-        "targetSdkVersion": "27",
-    },
-    deps = [
-        ":TestInstallInApp",
-        ":TestInstallInModules",
-        "//:android_local_test_exports",
-        "@maven//:junit_junit",
-        
-                        "@maven//:org_robolectric_robolectric",
-                        "@maven//:androidx_test_ext_junit",
-                        "@maven//:androidx_test_core",
-                        
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-android_library(
-    name = "TestInstallInApp",
-    testonly = True,
-    srcs = ["TestInstallInApp.java"],
-    deps = [
-        ":TestInstallInModules",
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt/android:hilt_android_app",
-    ],
-)
-
-android_library(
-    name = "TestInstallInModules",
-    testonly = True,
-    srcs = ["TestInstallInModules.java"],
-    deps = [
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/android/components",
-        "//java/dagger/hilt/testing:test_install_in",
-    ],
-)
diff --git a/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInApp.java b/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInApp.java
deleted file mode 100644
index 0ad35df..0000000
--- a/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInApp.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testing.testinstallin;
-
-import android.app.Application;
-import dagger.hilt.android.HiltAndroidApp;
-import dagger.hilt.android.testing.testinstallin.TestInstallInModules.Bar;
-import dagger.hilt.android.testing.testinstallin.TestInstallInModules.Foo;
-import javax.inject.Inject;
-
-/**
- * An application to test {@link dagger.hilt.testing.TestInstallIn} are ignored when using {@link
- * HiltAndroidApp}.
- *
- * <p>This class is used by {@link TestInstallInAppTest}.
- */
-@HiltAndroidApp(Application.class)
-public class TestInstallInApp extends Hilt_TestInstallInApp {
-  @Inject Foo foo;
-  @Inject Bar bar;
-}
diff --git a/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInAppTest.java b/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInAppTest.java
deleted file mode 100644
index beb198c..0000000
--- a/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInAppTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testing.testinstallin;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.testing.testinstallin.TestInstallInModules.GlobalBarModule;
-import dagger.hilt.android.testing.testinstallin.TestInstallInModules.GlobalFooModule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-// Test that Foo and Bar use the global @InstallIn module
-@RunWith(AndroidJUnit4.class)
-@Config(application = TestInstallInApp.class)
-public final class TestInstallInAppTest {
-
-  @Test
-  public void testFoo() {
-    assertThat(getMyApplication().foo.moduleClass).isEqualTo(GlobalFooModule.class);
-  }
-
-  @Test
-  public void testBar() {
-    assertThat(getMyApplication().bar.moduleClass).isEqualTo(GlobalBarModule.class);
-  }
-
-  private static TestInstallInApp getMyApplication() {
-    return (TestInstallInApp) getApplicationContext();
-  }
-}
diff --git a/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInBarTest.java b/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInBarTest.java
deleted file mode 100644
index 8cf9de7..0000000
--- a/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInBarTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testing.testinstallin;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import dagger.hilt.android.testing.UninstallModules;
-import dagger.hilt.android.testing.testinstallin.TestInstallInModules.Bar;
-import dagger.hilt.android.testing.testinstallin.TestInstallInModules.Foo;
-import dagger.hilt.android.testing.testinstallin.TestInstallInModules.GlobalBarModule;
-import dagger.hilt.android.testing.testinstallin.TestInstallInModules.GlobalFooTestModule;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-/**
- * Tests that Foo uses the global {@linkplain TestInstallIn} module and that Bar uses the local
- * {@linkplain InstallIn} module due to {@linkplain UninstallModules}.
- */
-@UninstallModules(GlobalBarModule.class)
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-@Config(application = HiltTestApplication.class)
-public final class TestInstallInBarTest {
-
-  @Rule public HiltAndroidRule hiltRule = new HiltAndroidRule(this);
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public interface LocalBarTestModule {
-    @Provides
-    static Bar provideBar() {
-      return new Bar(LocalBarTestModule.class);
-    }
-  }
-
-  @Inject Foo foo;
-  @Inject Bar bar;
-
-  @Test
-  public void testFoo() {
-    hiltRule.inject();
-    assertThat(foo.moduleClass).isEqualTo(GlobalFooTestModule.class);
-  }
-
-  @Test
-  public void testBar() {
-    hiltRule.inject();
-    assertThat(bar.moduleClass).isEqualTo(LocalBarTestModule.class);
-  }
-}
diff --git a/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInFooTest.java b/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInFooTest.java
deleted file mode 100644
index 8a78157..0000000
--- a/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInFooTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testing.testinstallin;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import dagger.hilt.android.testing.testinstallin.TestInstallInModules.Bar;
-import dagger.hilt.android.testing.testinstallin.TestInstallInModules.Foo;
-import dagger.hilt.android.testing.testinstallin.TestInstallInModules.GlobalBarModule;
-import dagger.hilt.android.testing.testinstallin.TestInstallInModules.GlobalFooTestModule;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-// Test that Foo uses the global @TestInstallIn module and Bar uses the global @InstallIn module.
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-@Config(application = HiltTestApplication.class)
-public final class TestInstallInFooTest {
-
-  @Rule public HiltAndroidRule hiltRule = new HiltAndroidRule(this);
-
-  @Inject Foo foo;
-  @Inject Bar bar;
-
-  @Test
-  public void testFoo() {
-    hiltRule.inject();
-    assertThat(foo.moduleClass).isEqualTo(GlobalFooTestModule.class);
-  }
-
-  @Test
-  public void testBar() {
-    hiltRule.inject();
-    assertThat(bar.moduleClass).isEqualTo(GlobalBarModule.class);
-  }
-}
diff --git a/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInModules.java b/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInModules.java
deleted file mode 100644
index ab15d98..0000000
--- a/javatests/dagger/hilt/android/testing/testinstallin/TestInstallInModules.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testing.testinstallin;
-
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.InstallIn;
-import dagger.hilt.components.SingletonComponent;
-import dagger.hilt.testing.TestInstallIn;
-
-/** Modules and classes used in TestInstallInFooTest and TestInstallInBarTest. */
-final class TestInstallInModules {
-  private TestInstallInModules() {}
-
-  static class Foo {
-    Class<?> moduleClass;
-
-    Foo(Class<?> moduleClass) {
-      this.moduleClass = moduleClass;
-    }
-  }
-
-  static class Bar {
-    Class<?> moduleClass;
-
-    Bar(Class<?> moduleClass) {
-      this.moduleClass = moduleClass;
-    }
-  }
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  interface GlobalFooModule {
-    @Provides
-    static Foo provideFoo() {
-      return new Foo(GlobalFooModule.class);
-    }
-  }
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  interface GlobalBarModule {
-    @Provides
-    static Bar provideFoo() {
-      return new Bar(GlobalBarModule.class);
-    }
-  }
-
-  @Module
-  @TestInstallIn(components = SingletonComponent.class, replaces = GlobalFooModule.class)
-  interface GlobalFooTestModule {
-    @Provides
-    static Foo provideFoo() {
-      return new Foo(GlobalFooTestModule.class);
-    }
-  }
-}
diff --git a/javatests/dagger/hilt/android/testsubpackage/BUILD b/javatests/dagger/hilt/android/testsubpackage/BUILD
deleted file mode 100644
index 114c861..0000000
--- a/javatests/dagger/hilt/android/testsubpackage/BUILD
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright (C) 2021 The Dagger Authors.
-#
-# 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(default_visibility = ["//:src"])
-
-android_local_test(
-    name = "UsesLocalComponentTestBindingsTest",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//javatests/dagger/hilt/android:shared_component_test_classes",
-    ],
-)
-
-android_local_test(
-    name = "UsesSharedComponent1Test",
-    manifest_values = {
-        "minSdkVersion": "14",
-    },
-    deps = [
-        "//javatests/dagger/hilt/android:shared_component_test_classes",
-    ],
-)
-
-exports_files(srcs = [
-    "UsesLocalComponentTestBindingsTest.java",
-    "UsesSharedComponent1Test.java",
-])
diff --git a/javatests/dagger/hilt/android/testsubpackage/UsesLocalComponentTestBindingsTest.java b/javatests/dagger/hilt/android/testsubpackage/UsesLocalComponentTestBindingsTest.java
deleted file mode 100644
index 5f1ff8f..0000000
--- a/javatests/dagger/hilt/android/testsubpackage/UsesLocalComponentTestBindingsTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testsubpackage;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.os.Build;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.Module;
-import dagger.Provides;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.InstallIn;
-import dagger.hilt.android.UsesComponentHelper;
-import dagger.hilt.android.UsesComponentTestClasses.Foo;
-import dagger.hilt.android.UsesComponentTestClasses.FooEntryPoint;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentQualifier;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponent;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponentBuilderEntryPoint;
-import dagger.hilt.android.internal.testing.TestApplicationComponentManager;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import dagger.hilt.components.SingletonComponent;
-import javax.inject.Inject;
-import javax.inject.Qualifier;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-/**
- * A test that provides its own test bindings, and therefore cannot use the shared components.
- *
- * <p>Note that this test class exactly matches the simple name of {@link
- * dagger.hilt.android.UsesLocalComponentTestBindingsTest}. This is intentional and used to verify
- * generated code class names do not clash.
- */
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class UsesLocalComponentTestBindingsTest {
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Qualifier
-  @interface TestQualifier {}
-
-  @Inject @UsesComponentQualifier String injectedString;
-  @Inject @TestQualifier String localString;
-
-  @Module
-  @InstallIn(SingletonComponent.class)
-  public static final class TestModule {
-    @Provides
-    @TestQualifier
-    static String provideString() {
-      return "local_string";
-    }
-
-    private TestModule() {}
-  }
-
-  @Test
-  public void testInject() {
-    rule.inject();
-    assertThat(injectedString).isEqualTo("shared_string");
-    assertThat(localString).isEqualTo("local_string");
-  }
-
-  @Test
-  public void testSubcomponent() {
-    UsesComponentTestSubcomponent subcomponent =
-        EntryPoints.get(
-                getApplicationContext(), UsesComponentTestSubcomponentBuilderEntryPoint.class)
-            .mySubcomponentBuilder()
-            .id(123)
-            .build();
-
-    Foo foo1 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-    Foo foo2 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-
-    assertThat(foo1).isNotNull();
-    assertThat(foo2).isNotNull();
-    assertThat(foo1).isSameInstanceAs(foo2);
-  }
-
-  @Test
-  public void testUsesLocalComponent() {
-    HiltTestApplication app = (HiltTestApplication) getApplicationContext();
-    Object generatedComponent =
-        ((TestApplicationComponentManager) app.componentManager()).generatedComponent();
-    assertThat(generatedComponent.getClass().getName())
-        .isEqualTo(UsesComponentHelper.perTestComponentNameWithDedupePrefix("dhat_", this));
-  }
-}
diff --git a/javatests/dagger/hilt/android/testsubpackage/UsesSharedComponent1Test.java b/javatests/dagger/hilt/android/testsubpackage/UsesSharedComponent1Test.java
deleted file mode 100644
index e99bbe2..0000000
--- a/javatests/dagger/hilt/android/testsubpackage/UsesSharedComponent1Test.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.android.testsubpackage;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import android.os.Build;
-import androidx.fragment.app.FragmentActivity;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import dagger.hilt.EntryPoints;
-import dagger.hilt.android.AndroidEntryPoint;
-import dagger.hilt.android.UsesComponentHelper;
-import dagger.hilt.android.UsesComponentTestClasses.Foo;
-import dagger.hilt.android.UsesComponentTestClasses.FooEntryPoint;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentQualifier;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponent;
-import dagger.hilt.android.UsesComponentTestClasses.UsesComponentTestSubcomponentBuilderEntryPoint;
-import dagger.hilt.android.internal.testing.TestApplicationComponentManager;
-import dagger.hilt.android.testing.HiltAndroidRule;
-import dagger.hilt.android.testing.HiltAndroidTest;
-import dagger.hilt.android.testing.HiltTestApplication;
-import javax.inject.Inject;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-/**
- * A test that provides none of its own test bindings, and therefore uses the shared components.
- *
- * <p>Note that this test class exactly matches the simple name of {@link
- * dagger.hilt.android.UsesSharedComponent1Test}. This is intentional and used to verify generated
- * code class names do not clash.
- */
-@HiltAndroidTest
-@RunWith(AndroidJUnit4.class)
-// Robolectric requires Java9 to run API 29 and above, so use API 28 instead
-@Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class)
-public final class UsesSharedComponent1Test {
-
-  @Rule public HiltAndroidRule rule = new HiltAndroidRule(this);
-
-  @Inject @UsesComponentQualifier String injectedString;
-
-  @Test
-  public void testInject() {
-    rule.inject();
-    assertThat(injectedString).isEqualTo("shared_string");
-  }
-
-  @Test
-  public void testSubcomponent() {
-    UsesComponentTestSubcomponent subcomponent =
-        EntryPoints.get(
-                getApplicationContext(), UsesComponentTestSubcomponentBuilderEntryPoint.class)
-            .mySubcomponentBuilder()
-            .id(123)
-            .build();
-
-    Foo foo1 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-    Foo foo2 = EntryPoints.get(subcomponent, FooEntryPoint.class).foo();
-
-    assertThat(foo1).isNotNull();
-    assertThat(foo2).isNotNull();
-    assertThat(foo1).isSameInstanceAs(foo2);
-  }
-
-  @Test
-  public void testActivity() {
-    try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(TestActivity.class)) {
-      scenario.onActivity(
-          activity -> {
-            assertThat(activity.activityString).isEqualTo("shared_string");
-          });
-    }
-  }
-
-  @Test
-  public void testUsesSharedComponent() {
-    HiltTestApplication app = (HiltTestApplication) getApplicationContext();
-    Object generatedComponent =
-        ((TestApplicationComponentManager) app.componentManager()).generatedComponent();
-    assertThat(generatedComponent.getClass().getName())
-        .isEqualTo(UsesComponentHelper.defaultComponentName());
-  }
-
-  @Test
-  public void testLocalComponentNotGenerated() {
-    assertThrows(
-        ClassNotFoundException.class,
-        () -> Class.forName(UsesComponentHelper.perTestComponentName(this)));
-  }
-
-  @AndroidEntryPoint(FragmentActivity.class)
-  public static final class TestActivity extends Hilt_UsesSharedComponent1Test_TestActivity {
-    @Inject @UsesComponentQualifier String activityString;
-  }
-}
diff --git a/javatests/dagger/hilt/processor/internal/definecomponent/DefineComponentProcessorTest.java b/javatests/dagger/hilt/processor/internal/definecomponent/DefineComponentProcessorTest.java
index a8c5fbe..901c7a3 100644
--- a/javatests/dagger/hilt/processor/internal/definecomponent/DefineComponentProcessorTest.java
+++ b/javatests/dagger/hilt/processor/internal/definecomponent/DefineComponentProcessorTest.java
@@ -64,7 +64,7 @@
 
     JavaFileObject componentOutput =
         JavaFileObjects.forSourceLines(
-            "dagger.hilt.processor.internal.definecomponent.codegen._test_FooComponent",
+            "dagger.hilt.processor.internal.definecomponent.codegen.test_FooComponent",
             "package dagger.hilt.processor.internal.definecomponent.codegen;",
             "",
             "import dagger.hilt.internal.definecomponent.DefineComponentClasses;",
@@ -72,11 +72,11 @@
             "",
             "@DefineComponentClasses(component = \"test.FooComponent\")",
             "@Generated(\"" + DefineComponentProcessor.class.getName() + "\")",
-            "public class _test_FooComponent {}");
+            "interface test_FooComponent {}");
 
     JavaFileObject builderOutput =
         JavaFileObjects.forSourceLines(
-            "dagger.hilt.processor.internal.definecomponent.codegen._test_FooComponentBuilder",
+            "dagger.hilt.processor.internal.definecomponent.codegen.test_FooComponentBuilder",
             "package dagger.hilt.processor.internal.definecomponent.codegen;",
             "",
             "import dagger.hilt.internal.definecomponent.DefineComponentClasses;",
@@ -84,7 +84,7 @@
             "",
             "@DefineComponentClasses(builder = \"test.FooComponentBuilder\")",
             "@Generated(\"" + DefineComponentProcessor.class.getName() + "\")",
-            "public class _test_FooComponentBuilder {}");
+            "interface test_FooComponentBuilder {}");
 
     Compilation compilation = compiler().compile(component, builder);
     assertThat(compilation).succeeded();
diff --git a/javatests/dagger/hilt/processor/internal/originatingelement/BUILD b/javatests/dagger/hilt/processor/internal/originatingelement/BUILD
deleted file mode 100644
index 3135159..0000000
--- a/javatests/dagger/hilt/processor/internal/originatingelement/BUILD
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (C) 2020 The Dagger Authors.
-#
-# 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.
-
-# Description:
-#   Tests for internal code for implementing Hilt processors.
-
-load("//java/dagger/testing/compile:macros.bzl", "compiler_test")
-
-package(default_visibility = ["//:src"])
-
-compiler_test(
-    name = "OriginatingElementProcessorTest",
-    srcs = ["OriginatingElementProcessorTest.java"],
-    compiler_deps = [
-        "//java/dagger/hilt/codegen:originating_element",
-        "@androidsdk//:platforms/android-30/android.jar",
-        "@maven//:androidx_annotation_annotation",
-    ],
-    deps = [
-        "//javatests/dagger/hilt/android/processor:android_compilers",
-        "@google_bazel_common//third_party/java/compile_testing",
-        "@google_bazel_common//third_party/java/junit",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-filegroup(
-    name = "srcs_filegroup",
-    srcs = glob(["**/*"]),
-)
diff --git a/javatests/dagger/hilt/processor/internal/originatingelement/OriginatingElementProcessorTest.java b/javatests/dagger/hilt/processor/internal/originatingelement/OriginatingElementProcessorTest.java
deleted file mode 100644
index 444fb1d..0000000
--- a/javatests/dagger/hilt/processor/internal/originatingelement/OriginatingElementProcessorTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.originatingelement;
-
-import static com.google.testing.compile.CompilationSubject.assertThat;
-import static dagger.hilt.android.processor.AndroidCompilers.compiler;
-
-import com.google.testing.compile.Compilation;
-import com.google.testing.compile.JavaFileObjects;
-import javax.tools.JavaFileObject;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public class OriginatingElementProcessorTest {
-
-  @Test
-  public void originatingElementOnInnerClass_fails() {
-    JavaFileObject outer1 =
-        JavaFileObjects.forSourceLines(
-            "test.Outer1",
-            "package test;",
-            "",
-            "class Outer1 {}");
-    JavaFileObject outer2 =
-        JavaFileObjects.forSourceLines(
-            "test.Outer2",
-            "package test;",
-            "",
-            "import dagger.hilt.codegen.OriginatingElement;",
-            "",
-            "class Outer2 {",
-            "  @OriginatingElement(topLevelClass = Outer1.class)",
-            "  static class Inner {}",
-            "}");
-    Compilation compilation = compiler().compile(outer1, outer2);
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@OriginatingElement should only be used to annotate top-level types, but found: "
-            + "test.Outer2.Inner");
-  }
-
-  @Test
-  public void originatingElementValueWithInnerClass_fails() {
-    JavaFileObject outer1 =
-        JavaFileObjects.forSourceLines(
-            "test.Outer1",
-            "package test;",
-            "",
-            "class Outer1 {",
-            "  static class Inner {}",
-            "}");
-    JavaFileObject outer2 =
-        JavaFileObjects.forSourceLines(
-            "test.Outer2",
-            "package test;",
-            "",
-            "import dagger.hilt.codegen.OriginatingElement;",
-            "",
-            "@OriginatingElement(topLevelClass = Outer1.Inner.class)",
-            "class Outer2 {}");
-    Compilation compilation = compiler().compile(outer1, outer2);
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            "OriginatingElement.topLevelClass value should be a top-level class, but found: "
-            + "test.Outer1.Inner");
-  }
-}
diff --git a/javatests/dagger/hilt/processor/internal/root/BUILD b/javatests/dagger/hilt/processor/internal/root/BUILD
deleted file mode 100644
index 0dba875..0000000
--- a/javatests/dagger/hilt/processor/internal/root/BUILD
+++ /dev/null
@@ -1,127 +0,0 @@
-# Copyright (C) 2020 The Dagger Authors.
-#
-# 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.
-# Description:
-#   Tests for internal code for implementing Hilt processors.
-
-load("//java/dagger/testing/compile:macros.bzl", "compiler_test")
-
-package(default_visibility = ["//:src"])
-
-android_library(
-    name = "MyAppPreviousCompilation",
-    srcs = ["MyAppPreviousCompilation.java"],
-    deps = [
-        "//java/dagger/hilt/android:hilt_android_app",
-    ],
-)
-
-compiler_test(
-    name = "MyAppPreviousCompilationTest",
-    srcs = ["MyAppPreviousCompilationTest.java"],
-    compiler_deps = [
-        ":MyAppPreviousCompilation",
-        "//java/dagger/hilt/android:hilt_android_app",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@androidsdk//:platforms/android-30/android.jar",
-        "@maven//:androidx_annotation_annotation",
-        "@maven//:org_robolectric_robolectric",
-        "@maven//:androidx_test_ext_junit",
-        "@maven//:androidx_test_core",
-    ],
-    deps = [
-        "//java/dagger/internal/guava:collect",
-        "//javatests/dagger/hilt/android/processor:android_compilers",
-        "@google_bazel_common//third_party/java/compile_testing",
-        "@google_bazel_common//third_party/java/junit",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-android_library(
-    name = "MyTestPreviousCompilation",
-    srcs = ["MyTestPreviousCompilation.java"],
-    deps = [
-        "//:android_local_test_exports",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-    ],
-)
-
-compiler_test(
-    name = "MyTestPreviousCompilationTest",
-    srcs = ["MyTestPreviousCompilationTest.java"],
-    compiler_deps = [
-        ":MyTestPreviousCompilation",
-        "//java/dagger/hilt/android:hilt_android_app",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@androidsdk//:platforms/android-30/android.jar",
-        "@maven//:androidx_annotation_annotation",
-        "@maven//:org_robolectric_robolectric",
-        "@maven//:androidx_test_ext_junit",
-        "@maven//:androidx_test_core",
-    ],
-    deps = [
-        "//java/dagger/internal/guava:collect",
-        "//javatests/dagger/hilt/android/processor:android_compilers",
-        "@google_bazel_common//third_party/java/compile_testing",
-        "@google_bazel_common//third_party/java/junit",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-compiler_test(
-    name = "RootProcessorErrorsTest",
-    srcs = ["RootProcessorErrorsTest.java"],
-    compiler_deps = [
-        "//java/dagger/hilt/android:hilt_android_app",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@androidsdk//:platforms/android-30/android.jar",
-        "@maven//:androidx_annotation_annotation",
-        "@maven//:org_robolectric_robolectric",
-        "@maven//:androidx_test_ext_junit",
-        "@maven//:androidx_test_core",
-    ],
-    deps = [
-        "//java/dagger/internal/guava:collect",
-        "//javatests/dagger/hilt/android/processor:android_compilers",
-        "@google_bazel_common//third_party/java/compile_testing",
-        "@google_bazel_common//third_party/java/junit",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-compiler_test(
-    name = "RootFileFormatterTest",
-    srcs = ["RootFileFormatterTest.java"],
-    compiler_deps = [
-        "//java/dagger/hilt/android:hilt_android_app",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "@androidsdk//:platforms/android-30/android.jar",
-        "@maven//:androidx_annotation_annotation",
-        "@maven//:org_robolectric_robolectric",
-        "@maven//:androidx_test_ext_junit",
-        "@maven//:androidx_test_core",
-    ],
-    deps = [
-        "//java/dagger/internal/guava:base",
-        "//javatests/dagger/hilt/android/processor:android_compilers",
-        "@google_bazel_common//third_party/java/compile_testing",
-        "@google_bazel_common//third_party/java/junit",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-filegroup(
-    name = "srcs_filegroup",
-    srcs = glob(["*"]),
-)
diff --git a/javatests/dagger/hilt/processor/internal/root/MyAppPreviousCompilation.java b/javatests/dagger/hilt/processor/internal/root/MyAppPreviousCompilation.java
deleted file mode 100644
index 5830803..0000000
--- a/javatests/dagger/hilt/processor/internal/root/MyAppPreviousCompilation.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.root;
-
-import android.app.Application;
-import dagger.hilt.android.HiltAndroidApp;
-
-/** Defines a {@link HiltAndroidApp} for {@link MyAppPreviousCompilationTest}. */
-public final class MyAppPreviousCompilation {
-
-  @HiltAndroidApp(Application.class)
-  public static final class MyApp extends Hilt_MyAppPreviousCompilation_MyApp {}
-
-  private MyAppPreviousCompilation() {}
-}
diff --git a/javatests/dagger/hilt/processor/internal/root/MyAppPreviousCompilationTest.java b/javatests/dagger/hilt/processor/internal/root/MyAppPreviousCompilationTest.java
deleted file mode 100644
index adf6d9b..0000000
--- a/javatests/dagger/hilt/processor/internal/root/MyAppPreviousCompilationTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.root;
-
-import static com.google.testing.compile.CompilationSubject.assertThat;
-
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
-import com.google.testing.compile.Compilation;
-import com.google.testing.compile.Compiler;
-import com.google.testing.compile.JavaFileObjects;
-import dagger.hilt.android.processor.AndroidCompilers;
-import javax.tools.JavaFileObject;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public final class MyAppPreviousCompilationTest {
-
-  @Parameters(name = "{0}")
-  public static ImmutableCollection<Object[]> parameters() {
-    return ImmutableList.copyOf(new Object[][] {{true}, {false}});
-  }
-
-  private final boolean disableCrossCompilationRootValidation;
-
-  public MyAppPreviousCompilationTest(boolean disableCrossCompilationRootValidation) {
-    this.disableCrossCompilationRootValidation = disableCrossCompilationRootValidation;
-  }
-
-  private Compiler compiler() {
-    return AndroidCompilers.compiler()
-        .withOptions(
-            String.format(
-                "-Adagger.hilt.disableCrossCompilationRootValidation=%s",
-                disableCrossCompilationRootValidation));
-  }
-
-  @Test
-  public void testRootTest() {
-    JavaFileObject testRoot =
-        JavaFileObjects.forSourceLines(
-            "test.TestRoot",
-            "package test;",
-            "",
-            "import dagger.hilt.android.testing.HiltAndroidTest;",
-            "",
-            "@HiltAndroidTest",
-            "public class TestRoot {}");
-
-    // This test case should succeed independent of disableCrossCompilationRootValidation.
-    Compilation compilation = compiler().compile(testRoot);
-    assertThat(compilation).succeeded();
-  }
-
-  @Test
-  public void appRootTest() {
-    JavaFileObject appRoot =
-        JavaFileObjects.forSourceLines(
-            "test.AppRoot",
-            "package test;",
-            "",
-            "import android.app.Application;",
-            "import dagger.hilt.android.HiltAndroidApp;",
-            "",
-            "@HiltAndroidApp(Application.class)",
-            "public class AppRoot extends Hilt_AppRoot {}");
-
-    Compilation compilation = compiler().compile(appRoot);
-    if (disableCrossCompilationRootValidation) {
-      assertThat(compilation).succeeded();
-    } else {
-      assertThat(compilation).failed();
-      assertThat(compilation).hadErrorCount(1);
-      assertThat(compilation)
-          .hadErrorContaining(
-              "Cannot process app roots in this compilation unit since there are app roots in a "
-                  + "previous compilation unit:"
-                  + "\n  \tApp roots in previous compilation unit: ["
-                  + "dagger.hilt.processor.internal.root.MyAppPreviousCompilation.MyApp]"
-                  + "\n  \tApp roots in this compilation unit: [test.AppRoot]");
-    }
-  }
-}
diff --git a/javatests/dagger/hilt/processor/internal/root/MyTestPreviousCompilation.java b/javatests/dagger/hilt/processor/internal/root/MyTestPreviousCompilation.java
deleted file mode 100644
index f704df5..0000000
--- a/javatests/dagger/hilt/processor/internal/root/MyTestPreviousCompilation.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.root;
-
-import dagger.hilt.android.testing.HiltAndroidTest;
-
-/** Defines a {@link HiltAndroidTest} for {@link MyTestPreviousCompilationTest}. */
-public final class MyTestPreviousCompilation {
-
-  @HiltAndroidTest
-  public static final class MyTest {}
-
-  private MyTestPreviousCompilation() {}
-}
diff --git a/javatests/dagger/hilt/processor/internal/root/MyTestPreviousCompilationTest.java b/javatests/dagger/hilt/processor/internal/root/MyTestPreviousCompilationTest.java
deleted file mode 100644
index 9e9fae5..0000000
--- a/javatests/dagger/hilt/processor/internal/root/MyTestPreviousCompilationTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.root;
-
-import static com.google.testing.compile.CompilationSubject.assertThat;
-
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
-import com.google.testing.compile.Compilation;
-import com.google.testing.compile.Compiler;
-import com.google.testing.compile.JavaFileObjects;
-import dagger.hilt.android.processor.AndroidCompilers;
-import javax.tools.JavaFileObject;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public final class MyTestPreviousCompilationTest {
-
-  @Parameters(name = "{0}")
-  public static ImmutableCollection<Object[]> parameters() {
-    return ImmutableList.copyOf(new Object[][] {{true}, {false}});
-  }
-
-  private final boolean disableCrossCompilationRootValidation;
-
-  public MyTestPreviousCompilationTest(boolean disableCrossCompilationRootValidation) {
-    this.disableCrossCompilationRootValidation = disableCrossCompilationRootValidation;
-  }
-
-  private Compiler compiler() {
-    return AndroidCompilers.compiler()
-        .withOptions(
-            String.format(
-                "-Adagger.hilt.disableCrossCompilationRootValidation=%s",
-                disableCrossCompilationRootValidation));
-  }
-
-  @Test
-  public void testRootTest() {
-    JavaFileObject testRoot =
-        JavaFileObjects.forSourceLines(
-            "test.TestRoot",
-            "package test;",
-            "",
-            "import dagger.hilt.android.testing.HiltAndroidTest;",
-            "",
-            "@HiltAndroidTest",
-            "public class TestRoot {}");
-
-    Compilation compilation = compiler().compile(testRoot);
-    if (disableCrossCompilationRootValidation) {
-      assertThat(compilation).succeeded();
-    } else {
-      assertThat(compilation).failed();
-      assertThat(compilation).hadErrorCount(1);
-      assertThat(compilation)
-          .hadErrorContaining(
-              "Cannot process new roots when there are test roots from a previous compilation unit:"
-                  + "\n  \tTest roots from previous compilation unit: "
-                  + "[dagger.hilt.processor.internal.root.MyTestPreviousCompilation.MyTest]"
-                  + "\n  \tAll roots from this compilation unit: [test.TestRoot]");
-    }
-  }
-
-  @Test
-  public void appRootTest() {
-    JavaFileObject appRoot =
-        JavaFileObjects.forSourceLines(
-            "test.AppRoot",
-            "package test;",
-            "",
-            "import android.app.Application;",
-            "import dagger.hilt.android.HiltAndroidApp;",
-            "",
-            "@HiltAndroidApp(Application.class)",
-            "public class AppRoot extends Hilt_AppRoot {}");
-
-    Compilation compilation = compiler().compile(appRoot);
-    if (disableCrossCompilationRootValidation) {
-      assertThat(compilation).succeeded();
-    } else {
-      assertThat(compilation).failed();
-      assertThat(compilation).hadErrorCount(1);
-      assertThat(compilation)
-          .hadErrorContaining(
-              "Cannot process new roots when there are test roots from a previous compilation unit:"
-                  + "\n  \tTest roots from previous compilation unit: "
-                  + "[dagger.hilt.processor.internal.root.MyTestPreviousCompilation.MyTest]"
-                  + "\n  \tAll roots from this compilation unit: [test.AppRoot]");
-    }
-  }
-}
diff --git a/javatests/dagger/hilt/processor/internal/root/RootFileFormatterTest.java b/javatests/dagger/hilt/processor/internal/root/RootFileFormatterTest.java
deleted file mode 100644
index 6d598c8..0000000
--- a/javatests/dagger/hilt/processor/internal/root/RootFileFormatterTest.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.root;
-
-import static com.google.testing.compile.CompilationSubject.assertThat;
-import static dagger.hilt.android.processor.AndroidCompilers.compiler;
-
-import com.google.common.base.Joiner;
-import com.google.testing.compile.Compilation;
-import com.google.testing.compile.JavaFileObjects;
-import javax.tools.JavaFileObject;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-// This test makes sure we don't regress the formatting in the components file.
-@RunWith(JUnit4.class)
-public final class RootFileFormatterTest {
-  private static final Joiner JOINER = Joiner.on("\n");
-
-  @Test
-  public void testProdComponents() {
-    Compilation compilation =
-        compiler()
-            .compile(
-                JavaFileObjects.forSourceLines(
-                    "test.TestApplication",
-                    "package test;",
-                    "",
-                    "import android.app.Application;",
-                    "import dagger.hilt.android.HiltAndroidApp;",
-                    "",
-                    "@HiltAndroidApp(Application.class)",
-                    "public class TestApplication extends Hilt_TestApplication {}"),
-                entryPoint("SingletonComponent", "EntryPoint1"),
-                entryPoint("SingletonComponent", "EntryPoint2"),
-                entryPoint("ActivityComponent", "EntryPoint3"),
-                entryPoint("ActivityComponent", "EntryPoint4"));
-    assertThat(compilation).succeeded();
-    assertThat(compilation)
-        .generatedSourceFile("test/TestApplication_HiltComponents")
-        .contentsAsUtf8String()
-        .contains(
-            JOINER.join(
-                "  public abstract static class SingletonC implements"
-                + " HiltWrapper_ActivityRetainedComponentManager"
-                + "_ActivityRetainedComponentBuilderEntryPoint,",
-                "      ServiceComponentManager.ServiceComponentBuilderEntryPoint,",
-                "      SingletonComponent,",
-                "      GeneratedComponent,",
-                "      EntryPoint1,",
-                "      EntryPoint2,",
-                "      TestApplication_GeneratedInjector {"));
-
-    assertThat(compilation)
-        .generatedSourceFile("test/TestApplication_HiltComponents")
-        .contentsAsUtf8String()
-        .contains(
-            JOINER.join(
-                "  public abstract static class ActivityC implements ActivityComponent,",
-                "      FragmentComponentManager.FragmentComponentBuilderEntryPoint,",
-                "      ViewComponentManager.ViewComponentBuilderEntryPoint,",
-                "      GeneratedComponent,",
-                "      EntryPoint3,",
-                "      EntryPoint4 {"));
-  }
-
-  @Test
-  public void testTestComponents() {
-    Compilation compilation =
-        compiler()
-            .compile(
-                JavaFileObjects.forSourceLines(
-                    "test.MyTest",
-                    "package test;",
-                    "",
-                    "import dagger.hilt.android.testing.HiltAndroidTest;",
-                    "",
-                    "@HiltAndroidTest",
-                    "public class MyTest {}"),
-                entryPoint("SingletonComponent", "EntryPoint1"),
-                entryPoint("SingletonComponent", "EntryPoint2"),
-                entryPoint("ActivityComponent", "EntryPoint3"),
-                entryPoint("ActivityComponent", "EntryPoint4"));
-    assertThat(compilation).succeeded();
-    assertThat(compilation)
-        .generatedSourceFile("test/MyTest_HiltComponents")
-        .contentsAsUtf8String()
-        .contains(
-            JOINER.join(
-                "  public abstract static class SingletonC implements"
-                + " HiltWrapper_ActivityRetainedComponentManager"
-                + "_ActivityRetainedComponentBuilderEntryPoint,",
-                "      ServiceComponentManager.ServiceComponentBuilderEntryPoint,",
-                "      SingletonComponent,",
-                "      TestSingletonComponent,",
-                "      EntryPoint1,",
-                "      EntryPoint2,",
-                "      MyTest_GeneratedInjector {"));
-
-    assertThat(compilation)
-        .generatedSourceFile("test/MyTest_HiltComponents")
-        .contentsAsUtf8String()
-        .contains(
-            JOINER.join(
-                "  public abstract static class ActivityC implements ActivityComponent,",
-                "      FragmentComponentManager.FragmentComponentBuilderEntryPoint,",
-                "      ViewComponentManager.ViewComponentBuilderEntryPoint,",
-                "      GeneratedComponent,",
-                "      EntryPoint3,",
-                "      EntryPoint4 {"));
-  }
-
-  @Test
-  public void testSharedTestComponents() {
-    Compilation compilation =
-        compiler()
-            .withOptions("-Adagger.hilt.shareTestComponents=true")
-            .compile(
-                JavaFileObjects.forSourceLines(
-                    "test.MyTest",
-                    "package test;",
-                    "",
-                    "import dagger.hilt.android.testing.HiltAndroidTest;",
-                    "",
-                    "@HiltAndroidTest",
-                    "public class MyTest {}"),
-                entryPoint("SingletonComponent", "EntryPoint1"));
-    assertThat(compilation).succeeded();
-    assertThat(compilation)
-        .generatedSourceFile("dagger/hilt/android/internal/testing/root/Default_HiltComponents")
-        .contentsAsUtf8String()
-        .contains(
-            JOINER.join(
-                "  public abstract static class SingletonC implements"
-                + " HiltWrapper_ActivityRetainedComponentManager"
-                + "_ActivityRetainedComponentBuilderEntryPoint,",
-                "      ServiceComponentManager.ServiceComponentBuilderEntryPoint,",
-                "      SingletonComponent,",
-                "      TestSingletonComponent,",
-                "      EntryPoint1,",
-                "      MyTest_GeneratedInjector {"));
-  }
-
-  private static JavaFileObject entryPoint(String component, String name) {
-    return JavaFileObjects.forSourceLines(
-        "test." + name,
-        "package test;",
-        "",
-        "import dagger.hilt.EntryPoint;",
-        "import dagger.hilt.InstallIn;",
-        component.equals("SingletonComponent") ? "import dagger.hilt.components.SingletonComponent;"
-            : "import dagger.hilt.android.components." + component + ";",
-        "",
-        "@EntryPoint",
-        "@InstallIn(" + component + ".class)",
-        "public interface " + name + " {}");
-  }
-}
diff --git a/javatests/dagger/hilt/processor/internal/root/RootProcessorErrorsTest.java b/javatests/dagger/hilt/processor/internal/root/RootProcessorErrorsTest.java
deleted file mode 100644
index e9ed8c4..0000000
--- a/javatests/dagger/hilt/processor/internal/root/RootProcessorErrorsTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.root;
-
-import static com.google.testing.compile.CompilationSubject.assertThat;
-
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
-import com.google.testing.compile.Compilation;
-import com.google.testing.compile.Compiler;
-import com.google.testing.compile.JavaFileObjects;
-import dagger.hilt.android.processor.AndroidCompilers;
-import javax.tools.JavaFileObject;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public final class RootProcessorErrorsTest {
-
-  @Parameters(name = "{0}")
-  public static ImmutableCollection<Object[]> parameters() {
-    return ImmutableList.copyOf(new Object[][] {{true}, {false}});
-  }
-
-  private final boolean disableCrossCompilationRootValidation;
-
-  public RootProcessorErrorsTest(boolean disableCrossCompilationRootValidation) {
-    this.disableCrossCompilationRootValidation = disableCrossCompilationRootValidation;
-  }
-
-  private Compiler compiler() {
-    return AndroidCompilers.compiler()
-        .withOptions(
-            String.format(
-                "-Adagger.hilt.disableCrossCompilationRootValidation=%s",
-                disableCrossCompilationRootValidation));
-  }
-
-  @Test
-  public void multipleAppRootsTest() {
-    JavaFileObject appRoot1 =
-        JavaFileObjects.forSourceLines(
-            "test.AppRoot1",
-            "package test;",
-            "",
-            "import android.app.Application;",
-            "import dagger.hilt.android.HiltAndroidApp;",
-            "",
-            "@HiltAndroidApp(Application.class)",
-            "public class AppRoot1 extends Hilt_AppRoot1 {}");
-
-    JavaFileObject appRoot2 =
-        JavaFileObjects.forSourceLines(
-            "test.AppRoot2",
-            "package test;",
-            "",
-            "import android.app.Application;",
-            "import dagger.hilt.android.HiltAndroidApp;",
-            "",
-            "@HiltAndroidApp(Application.class)",
-            "public class AppRoot2 extends Hilt_AppRoot2 {}");
-
-    // This test case should fail independent of disableCrossCompilationRootValidation.
-    Compilation compilation = compiler().compile(appRoot1, appRoot2);
-    assertThat(compilation).failed();
-    assertThat(compilation).hadErrorCount(1);
-    assertThat(compilation)
-        .hadErrorContaining(
-            "Cannot process multiple app roots in the same compilation unit: "
-                + "[test.AppRoot1, test.AppRoot2]");
-  }
-
-  @Test
-  public void appRootWithTestRootTest() {
-    JavaFileObject appRoot =
-        JavaFileObjects.forSourceLines(
-            "test.AppRoot",
-            "package test;",
-            "",
-            "import android.app.Application;",
-            "import dagger.hilt.android.HiltAndroidApp;",
-            "",
-            "@HiltAndroidApp(Application.class)",
-            "public class AppRoot extends Hilt_AppRoot {}");
-
-    JavaFileObject testRoot =
-        JavaFileObjects.forSourceLines(
-            "test.TestRoot",
-            "package test;",
-            "",
-            "import dagger.hilt.android.testing.HiltAndroidTest;",
-            "",
-            "@HiltAndroidTest",
-            "public class TestRoot {}");
-
-    // This test case should fail independent of disableCrossCompilationRootValidation.
-    Compilation compilation = compiler().compile(appRoot, testRoot);
-    assertThat(compilation).failed();
-    assertThat(compilation).hadErrorCount(1);
-    assertThat(compilation)
-        .hadErrorContaining(
-            "Cannot process test roots and app roots in the same compilation unit:"
-                + "\n  \tApp root in this compilation unit: [test.AppRoot]"
-                + "\n  \tTest roots in this compilation unit: [test.TestRoot]");
-  }
-}
diff --git a/javatests/dagger/hilt/processor/internal/uninstallmodules/BUILD b/javatests/dagger/hilt/processor/internal/uninstallmodules/BUILD
deleted file mode 100644
index caceb7c..0000000
--- a/javatests/dagger/hilt/processor/internal/uninstallmodules/BUILD
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright (C) 2020 The Dagger Authors.
-#
-# 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.
-
-# Description:
-#   Tests for internal code for implementing Hilt processors.
-
-load("//java/dagger/testing/compile:macros.bzl", "compiler_test")
-
-package(default_visibility = ["//:src"])
-
-compiler_test(
-    name = "UninstallModulesProcessorTest",
-    srcs = ["UninstallModulesProcessorTest.java"],
-    compiler_deps = [
-        "//java/dagger/hilt/android:android_entry_point",
-        "//java/dagger/hilt/android/testing:hilt_android_test",
-        "//java/dagger/hilt/android/testing:uninstall_modules",
-        "//java/dagger/hilt/migration:disable_install_in_check",
-        "@androidsdk//:platforms/android-30/android.jar",
-        "@maven//:androidx_annotation_annotation",
-    ],
-    deps = [
-        "//javatests/dagger/hilt/android/processor:android_compilers",
-        "@google_bazel_common//third_party/java/compile_testing",
-        "@google_bazel_common//third_party/java/junit",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
-
-filegroup(
-    name = "srcs_filegroup",
-    srcs = glob(["*"]),
-)
diff --git a/javatests/dagger/hilt/processor/internal/uninstallmodules/UninstallModulesProcessorTest.java b/javatests/dagger/hilt/processor/internal/uninstallmodules/UninstallModulesProcessorTest.java
deleted file mode 100644
index 2be9ab6..0000000
--- a/javatests/dagger/hilt/processor/internal/uninstallmodules/UninstallModulesProcessorTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.hilt.processor.internal.uninstallmodules;
-
-import static com.google.testing.compile.CompilationSubject.assertThat;
-import static dagger.hilt.android.processor.AndroidCompilers.compiler;
-
-import com.google.testing.compile.Compilation;
-import com.google.testing.compile.JavaFileObjects;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public class UninstallModulesProcessorTest {
-
-  @Test
-  public void testInvalidModuleNoInstallIn_fails() {
-    Compilation compilation =
-        compiler()
-            .compile(
-                JavaFileObjects.forSourceLines(
-                    "test.MyTest",
-                    "package test;",
-                    "",
-                    "import dagger.hilt.android.testing.HiltAndroidTest;",
-                    "import dagger.hilt.android.testing.UninstallModules;",
-                    "",
-                    "@UninstallModules(InvalidModule.class)",
-                    "@HiltAndroidTest",
-                    "public class MyTest {}"),
-                JavaFileObjects.forSourceLines(
-                    "test.InvalidModule",
-                    "package test;",
-                    "",
-                    "import dagger.Module;",
-                    "import dagger.hilt.migration.DisableInstallInCheck;",
-                    "",
-                    "@DisableInstallInCheck",
-                    "@Module",
-                    "public class InvalidModule {}"));
-    assertThat(compilation).failed();
-    assertThat(compilation).hadErrorCount(1);
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@UninstallModules should only include modules annotated with both @Module and "
-                + "@InstallIn, but found: [test.InvalidModule].");
-  }
-
-  @Test
-  public void testInvalidModuleNoModule_fails() {
-    Compilation compilation =
-        compiler()
-            .compile(
-                JavaFileObjects.forSourceLines(
-                    "test.MyTest",
-                    "package test;",
-                    "",
-                    "import dagger.hilt.android.testing.HiltAndroidTest;",
-                    "import dagger.hilt.android.testing.UninstallModules;",
-                    "",
-                    "@UninstallModules(InvalidModule.class)",
-                    "@HiltAndroidTest",
-                    "public class MyTest {}"),
-                JavaFileObjects.forSourceLines(
-                    "test.InvalidModule",
-                    "package test;",
-                    "",
-                    "public class InvalidModule {",
-                    "}"));
-    assertThat(compilation).failed();
-    assertThat(compilation).hadErrorCount(1);
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@UninstallModules should only include modules annotated with both @Module and "
-                + "@InstallIn, but found: [test.InvalidModule].");
-  }
-
-  @Test
-  public void testInvalidTest_fails() {
-    Compilation compilation =
-        compiler()
-            .compile(
-                JavaFileObjects.forSourceLines(
-                    "test.InvalidTest",
-                    "package test;",
-                    "",
-                    "import dagger.hilt.android.testing.UninstallModules;",
-                    "",
-                    "@UninstallModules(ValidModule.class)",
-                    "public class InvalidTest {}"),
-                JavaFileObjects.forSourceLines(
-                    "test.ValidModule",
-                    "package test;",
-                    "",
-                    "import dagger.Module;",
-                    "import dagger.hilt.InstallIn;",
-                    "import dagger.hilt.components.SingletonComponent;",
-                    "",
-                    "@Module",
-                    "@InstallIn(SingletonComponent.class)",
-                    "public class ValidModule {}"));
-    assertThat(compilation).failed();
-    assertThat(compilation).hadErrorCount(1);
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@UninstallModules should only be used on test classes annotated with @HiltAndroidTest,"
-                + " but found: test.InvalidTest");
-  }
-
-  @Test
-  public void testInvalidTestModule_fails() {
-    Compilation compilation =
-        compiler()
-            .compile(
-                JavaFileObjects.forSourceLines(
-                    "test.MyTest",
-                    "package test;",
-                    "",
-                    "import dagger.Module;",
-                    "import dagger.hilt.InstallIn;",
-                    "import dagger.hilt.components.SingletonComponent;",
-                    "import dagger.hilt.android.testing.HiltAndroidTest;",
-                    "import dagger.hilt.android.testing.UninstallModules;",
-                    "",
-                    "@UninstallModules({",
-                    "    MyTest.PkgPrivateInvalidModule.class,",
-                    "    MyTest.PublicInvalidModule.class,",
-                    "})",
-                    "@HiltAndroidTest",
-                    "public class MyTest {",
-                    "  @Module",
-                    "  @InstallIn(SingletonComponent.class)",
-                    "  interface PkgPrivateInvalidModule {}",
-                    "",
-                    "  @Module",
-                    "  @InstallIn(SingletonComponent.class)",
-                    "  public interface PublicInvalidModule {}",
-                    "}"));
-    assertThat(compilation).failed();
-    assertThat(compilation).hadErrorCount(1);
-    // TODO(bcorso): Consider unwrapping pkg-private modules before reporting the error.
-    assertThat(compilation)
-        .hadErrorContaining(
-            "@UninstallModules should not contain test modules, but found: "
-                + "[test.MyTest.PkgPrivateInvalidModule, test.MyTest.PublicInvalidModule]");
-  }
-}
diff --git a/javatests/dagger/hilt/testmodules/BUILD b/javatests/dagger/hilt/testmodules/BUILD
deleted file mode 100644
index 7acd3d1..0000000
--- a/javatests/dagger/hilt/testmodules/BUILD
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (C) 2021 The Dagger Authors.
-#
-# 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.
-#
-# Description:
-#  Builds and run tests related to AggregatedDepsProcessor.
-
-load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library")
-
-package(default_visibility = ["//:src"])
-
-kt_android_library(
-    name = "testmodules",
-    testonly = True,
-    srcs = glob(["*.kt"]),
-    deps = [
-        "//:dagger_with_compiler",
-        "//java/dagger/hilt:install_in",
-        "//java/dagger/hilt/components",
-        "@google_bazel_common//third_party/java/jsr330_inject",
-    ],
-)
-
-filegroup(
-    name = "srcs_filegroup",
-    srcs = glob(["*"]),
-)
diff --git a/javatests/dagger/hilt/testmodules/InternalKtTestModule.kt b/javatests/dagger/hilt/testmodules/InternalKtTestModule.kt
deleted file mode 100644
index 0a71e44..0000000
--- a/javatests/dagger/hilt/testmodules/InternalKtTestModule.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2021 The Dagger Authors.
- *
- * 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 dagger.hilt.testmodules
-
-import dagger.Module
-import dagger.Provides
-import dagger.hilt.InstallIn
-import dagger.hilt.components.SingletonComponent
-import javax.inject.Singleton
-
-/** Module for [dagger.hilt.android.InternalKtModuleTest]. */
-@Module
-@InstallIn(SingletonComponent::class)
-internal abstract class InternalKtTestModule private constructor() {
-  companion object {
-    @Provides
-    @Singleton
-    fun provideString(): String = "expected_string_value"
-  }
-}
-
-@Module
-@InstallIn(SingletonComponent::class)
-internal object InternalKtObjectModule {
-  @Provides
-  fun provideString(): Int = 9
-}
diff --git a/javatests/dagger/internal/codegen/AssistedFactoryErrorsTest.java b/javatests/dagger/internal/codegen/AssistedFactoryErrorsTest.java
index 42b8f8a..2bcfedc 100644
--- a/javatests/dagger/internal/codegen/AssistedFactoryErrorsTest.java
+++ b/javatests/dagger/internal/codegen/AssistedFactoryErrorsTest.java
@@ -570,56 +570,6 @@
   }
 
   @Test
-  public void testProvidesAssistedBindingsAsOptional() {
-    JavaFileObject foo =
-        JavaFileObjects.forSourceLines(
-            "test.Foo",
-            "package test;",
-            "",
-            "import dagger.assisted.Assisted;",
-            "import dagger.assisted.AssistedInject;",
-            "import dagger.assisted.AssistedFactory;",
-            "",
-            "class Foo {",
-            "  @AssistedInject Foo() {}",
-            "",
-            "  @AssistedFactory",
-            "  interface Factory {",
-            "    Foo create();",
-            "  }",
-            "}");
-
-    JavaFileObject module =
-        JavaFileObjects.forSourceLines(
-            "test.FooModule",
-            "package test;",
-            "",
-            "import dagger.BindsOptionalOf;",
-            "import dagger.Module;",
-            "import dagger.Provides;",
-            "",
-            "@Module",
-            "interface FooModule {",
-            "  @BindsOptionalOf Foo optionalFoo();",
-            "",
-            "  @BindsOptionalOf Foo.Factory optionalFooFactory();",
-            "}");
-
-    Compilation compilation = compilerWithOptions(compilerMode.javacopts()).compile(foo, module);
-    assertThat(compilation).failed();
-    assertThat(compilation).hadErrorCount(2);
-    assertThat(compilation)
-        .hadErrorContaining("[test.Foo] Dagger does not support providing @AssistedInject types.")
-        .inFile(module)
-        .onLine(9);
-    assertThat(compilation)
-        .hadErrorContaining(
-            "[test.Foo.Factory] Dagger does not support providing @AssistedFactory types.")
-        .inFile(module)
-        .onLine(11);
-  }
-
-  @Test
   public void testInjectsProviderOfAssistedFactory() {
     JavaFileObject foo =
         JavaFileObjects.forSourceLines(
diff --git a/javatests/dagger/internal/codegen/AssistedFactoryTest.java b/javatests/dagger/internal/codegen/AssistedFactoryTest.java
index cffd42e..d752321 100644
--- a/javatests/dagger/internal/codegen/AssistedFactoryTest.java
+++ b/javatests/dagger/internal/codegen/AssistedFactoryTest.java
@@ -20,6 +20,7 @@
 import static dagger.internal.codegen.CompilerMode.DEFAULT_MODE;
 import static dagger.internal.codegen.CompilerMode.FAST_INIT_MODE;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
 
 import com.google.common.collect.ImmutableCollection;
 import com.google.testing.compile.Compilation;
@@ -95,7 +96,7 @@
     JavaFileObject generatedComponent =
         compilerMode
             .javaFileBuilder("test.DaggerTestComponent")
-            .addLines("package test;", "", GeneratedLines.generatedAnnotations())
+            .addLines("package test;", "", GENERATED_CODE_ANNOTATIONS)
             .addLinesIn(
                 FAST_INIT_MODE,
                 "final class DaggerTestComponent implements TestComponent {",
@@ -191,7 +192,7 @@
     JavaFileObject generatedComponent =
         compilerMode
             .javaFileBuilder("test.DaggerTestComponent")
-            .addLines("package test;", "", GeneratedLines.generatedAnnotations())
+            .addLines("package test;", "", GENERATED_CODE_ANNOTATIONS)
             .addLinesIn(
                 FAST_INIT_MODE,
                 "final class DaggerTestComponent implements TestComponent {",
diff --git a/javatests/dagger/internal/codegen/ComponentBuilderTest.java b/javatests/dagger/internal/codegen/ComponentBuilderTest.java
index c4e0e07..acf5437 100644
--- a/javatests/dagger/internal/codegen/ComponentBuilderTest.java
+++ b/javatests/dagger/internal/codegen/ComponentBuilderTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.testing.compile.CompilationSubject.assertThat;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
 import static dagger.internal.codegen.binding.ComponentCreatorAnnotation.COMPONENT_BUILDER;
 import static dagger.internal.codegen.binding.ErrorMessages.creatorMessagesFor;
 
@@ -87,7 +88,7 @@
             "",
             "import dagger.internal.Preconditions;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  private static final class Builder implements TestComponent.Builder {",
             "    private TestModule testModule;",
diff --git a/javatests/dagger/internal/codegen/ComponentCreatorTest.java b/javatests/dagger/internal/codegen/ComponentCreatorTest.java
index 3cf05ac..0a7e40e 100644
--- a/javatests/dagger/internal/codegen/ComponentCreatorTest.java
+++ b/javatests/dagger/internal/codegen/ComponentCreatorTest.java
@@ -23,6 +23,8 @@
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
 import static dagger.internal.codegen.Compilers.daggerCompiler;
 import static dagger.internal.codegen.ComponentCreatorTest.CompilerType.JAVAC;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
+import static dagger.internal.codegen.GeneratedLines.IMPORT_GENERATED_ANNOTATION;
 import static dagger.internal.codegen.binding.ComponentCreatorAnnotation.COMPONENT_BUILDER;
 import static dagger.internal.codegen.binding.ComponentCreatorAnnotation.COMPONENT_FACTORY;
 import static dagger.internal.codegen.binding.ComponentCreatorKind.BUILDER;
@@ -104,7 +106,7 @@
             "test.DaggerSimpleComponent",
             "package test;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerSimpleComponent implements SimpleComponent {",
             "  private static final class Builder implements SimpleComponent.Builder {",
             "    @Override",
@@ -157,9 +159,9 @@
             "test.DaggerTestComponent",
             "package test;",
             "",
-            GeneratedLines.generatedImports(),
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  private final TestModule testModule;",
             "",
@@ -355,9 +357,10 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedImports("import dagger.internal.Preconditions;"),
+                "import dagger.internal.Preconditions;",
+                IMPORT_GENERATED_ANNOTATION,
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerSimpleComponent implements SimpleComponent {",
                 "  private final Object object;",
                 "",
@@ -456,9 +459,10 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedImports("import dagger.internal.Preconditions;"),
+                "import dagger.internal.Preconditions;",
+                IMPORT_GENERATED_ANNOTATION,
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerSimpleComponent implements SimpleComponent {",
                 "  private final Integer i;",
                 "",
diff --git a/javatests/dagger/internal/codegen/ComponentFactoryTest.java b/javatests/dagger/internal/codegen/ComponentFactoryTest.java
index 35cbb6a..0f155b9 100644
--- a/javatests/dagger/internal/codegen/ComponentFactoryTest.java
+++ b/javatests/dagger/internal/codegen/ComponentFactoryTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.testing.compile.CompilationSubject.assertThat;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
 import static dagger.internal.codegen.binding.ComponentCreatorAnnotation.COMPONENT_FACTORY;
 import static dagger.internal.codegen.binding.ErrorMessages.creatorMessagesFor;
 
@@ -86,7 +87,7 @@
             "",
             "import dagger.internal.Preconditions;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  private static final class Factory implements TestComponent.Factory {",
             "    @Override",
diff --git a/javatests/dagger/internal/codegen/ComponentProcessorTest.java b/javatests/dagger/internal/codegen/ComponentProcessorTest.java
index 3e514c8..eee6a0c 100644
--- a/javatests/dagger/internal/codegen/ComponentProcessorTest.java
+++ b/javatests/dagger/internal/codegen/ComponentProcessorTest.java
@@ -22,6 +22,8 @@
 import static dagger.internal.codegen.CompilerMode.FAST_INIT_MODE;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
 import static dagger.internal.codegen.Compilers.daggerCompiler;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
+import static dagger.internal.codegen.GeneratedLines.IMPORT_GENERATED_ANNOTATION;
 
 import com.google.auto.common.MoreElements;
 import com.google.common.base.Predicate;
@@ -175,12 +177,12 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedImports(
-                    "import dagger.Lazy;",
-                    "import dagger.internal.DoubleCheck;",
-                    "import javax.inject.Provider;"),
+                "import dagger.Lazy;",
+                "import dagger.internal.DoubleCheck;",
+                IMPORT_GENERATED_ANNOTATION,
+                "import javax.inject.Provider;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerSimpleComponent implements SimpleComponent {")
             .addLinesIn(
                 FAST_INIT_MODE,
@@ -296,7 +298,7 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerSimpleComponent implements SimpleComponent {")
             .addLinesIn(
                 FAST_INIT_MODE,
@@ -415,7 +417,7 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerOuterType_SimpleComponent",
                 "    implements OuterType.SimpleComponent {",
                 "  private DaggerOuterType_SimpleComponent() {}",
@@ -496,9 +498,10 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedImports("import dagger.internal.Preconditions;"),
+                "import dagger.internal.Preconditions;",
+                IMPORT_GENERATED_ANNOTATION,
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private final TestModule testModule;",
                 "",
@@ -601,7 +604,7 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private B b() {",
                 "    return TestModule_BFactory.b(new C());",
@@ -695,9 +698,10 @@
         "test.DaggerTestComponent",
         "package test;",
         "",
-        GeneratedLines.generatedImports("import dagger.internal.Preconditions;"),
+        "import dagger.internal.Preconditions;",
+        IMPORT_GENERATED_ANNOTATION,
         "",
-        GeneratedLines.generatedAnnotations(),
+        GENERATED_CODE_ANNOTATIONS,
         "final class DaggerTestComponent implements TestComponent {",
         "  static final class Builder {",
         "",
@@ -878,9 +882,10 @@
             "test.DaggerParent",
             "package test;",
             "",
-            GeneratedLines.generatedImports("import dagger.internal.Preconditions;"),
+            "import dagger.internal.Preconditions;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerParent implements Parent {",
             "",
             "  private DaggerParent() {}",
@@ -992,7 +997,7 @@
                 "",
                 "import com.google.errorprone.annotations.CanIgnoreReturnValue;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerSimpleComponent implements SimpleComponent {",
                 "  @Override",
                 "  public void inject(SomeInjectedType instance) {",
@@ -1048,7 +1053,7 @@
             "test.DaggerSimpleComponent",
             "package test;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerSimpleComponent implements SimpleComponent {",
             "  private Provider<SimpleComponent> simpleComponentProvider;",
             "",
@@ -1112,7 +1117,7 @@
                 "",
                 "import com.google.errorprone.annotations.CanIgnoreReturnValue;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerSimpleComponent implements SimpleComponent {",
                 "  @Override",
                 "  public SomeInjectedType createAndInject() {",
@@ -1180,7 +1185,7 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerBComponent implements BComponent {")
             .addLinesIn(DEFAULT_MODE, "  private Provider<A> aProvider;")
             .addLinesIn(
@@ -1227,7 +1232,7 @@
                 "  }")
             .addLinesIn(
                 DEFAULT_MODE,
-                "  private static final class test_AComponent_a implements Provider<A> {",
+                "  private static class test_AComponent_a implements Provider<A> {",
                 "    private final AComponent aComponent;",
                 "    ",
                 "    test_AComponent_a(AComponent aComponent) {",
@@ -1313,7 +1318,7 @@
             "test.DaggerTestComponent",
             "package test;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  private final TestModule testModule;",
             "  private final other.test.TestModule testModule2;",
@@ -1435,9 +1440,10 @@
             "test.DaggerBComponent",
             "package test;",
             "",
-            GeneratedLines.generatedImports("import dagger.internal.Preconditions;"),
+            "import dagger.internal.Preconditions;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerBComponent implements BComponent {",
             "  private final AComponent aComponent;",
             "",
@@ -1519,7 +1525,9 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                IMPORT_GENERATED_ANNOTATION,
+                "",
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private B b() {",
                 "    return new B(new C());",
@@ -1597,9 +1605,9 @@
             "test.DaggerSimpleComponent",
             "package test;",
             "",
-            GeneratedLines.generatedImports(),
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerSimpleComponent implements SimpleComponent {",
             "  private DaggerSimpleComponent() {}",
             "",
@@ -1668,7 +1676,7 @@
             "test.DaggerSimpleComponent",
             "package test;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerSimpleComponent implements SimpleComponent {",
             "  @Override",
             "  public SomeInjectableType someInjectableType() {",
@@ -2038,9 +2046,10 @@
             "test.DaggerParent",
             "package test;",
             "",
-            GeneratedLines.generatedImports("import dagger.internal.Preconditions;"),
+            "import dagger.internal.Preconditions;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerParent implements Parent {",
             "  private DaggerParent() {",
             "  }",
@@ -2181,7 +2190,7 @@
                 "test.TestModule_NonNullableStringFactory",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "public final class TestModule_NonNullableStringFactory",
                 "    implements Factory<String> {",
                 "  @Override",
@@ -2201,7 +2210,7 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  @Override",
                 "  public String nonNullableString() {",
@@ -2271,7 +2280,7 @@
                 "test.TestModule_PrimitiveIntegerFactory",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "public final class TestModule_PrimitiveIntegerFactory",
                 "    implements Factory<Integer> {",
                 "",
@@ -2291,7 +2300,7 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  @Override",
                 "  public Integer nonNullableInteger() {",
@@ -2367,7 +2376,7 @@
         JavaFileObjects.forSourceLines(
             "test.DaggerParent",
             "package test;",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerParent implements Parent {",
             "  private String string() {",
             "    return TestModule_StringFactory.string(numberProvider.get());",
@@ -2437,7 +2446,7 @@
         JavaFileObjects.forSourceLines(
             "test.DaggerParent",
             "package test;",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerParent implements Parent {",
             "  private final class ChildImpl implements Child {",
             "    @Override",
@@ -2504,7 +2513,7 @@
             "test.DaggerTestComponent",
             "package test;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  @Override",
             "  public Injected injected() {",
@@ -2577,7 +2586,7 @@
             "test.DaggerTestComponent",
             "package test;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  @Override",
             "  public String unqualified() {",
@@ -2629,9 +2638,9 @@
                 "test.DaggerPublicComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedImports(),
+                IMPORT_GENERATED_ANNOTATION,
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "public final class DaggerPublicComponent implements PublicComponent {",
                 "  private DaggerPublicComponent() {}",
                 "",
diff --git a/javatests/dagger/internal/codegen/ComponentRequirementFieldTest.java b/javatests/dagger/internal/codegen/ComponentRequirementFieldTest.java
index 05164a6..049ff85 100644
--- a/javatests/dagger/internal/codegen/ComponentRequirementFieldTest.java
+++ b/javatests/dagger/internal/codegen/ComponentRequirementFieldTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.testing.compile.CompilationSubject.assertThat;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
 
 import com.google.testing.compile.Compilation;
 import com.google.testing.compile.JavaFileObjects;
@@ -74,7 +75,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private final Integer i;",
                 "  private final List<String> list;",
@@ -171,7 +172,7 @@
             "import other.OtherPackageModule;",
             "import other.OtherPackageModule_LFactory;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  private final ParentModule parentModule;",
             "  private final OtherPackageModule otherPackageModule;",
@@ -243,7 +244,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private final Dep dep;",
                 "",
@@ -356,7 +357,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private final ParentModule parentModule;",
                 "",
@@ -384,7 +385,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private final ParentModule parentModule;",
                 "",
diff --git a/javatests/dagger/internal/codegen/ComponentShardTest.java b/javatests/dagger/internal/codegen/ComponentShardTest.java
index ec7f499..fc59c92 100644
--- a/javatests/dagger/internal/codegen/ComponentShardTest.java
+++ b/javatests/dagger/internal/codegen/ComponentShardTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.testing.compile.CompilationSubject.assertThat;
 import static com.google.testing.compile.Compiler.javac;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
 import static java.util.stream.Collectors.joining;
 
 import com.google.common.collect.ImmutableList;
@@ -88,7 +89,7 @@
         JavaFileObjects.forSourceLines(
             "dagger.internal.codegen.DaggerTestComponent",
                 "package dagger.internal.codegen;",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private final Shard1 shard1 = new Shard1();",
                 "",
diff --git a/javatests/dagger/internal/codegen/DelegateBindingExpressionTest.java b/javatests/dagger/internal/codegen/DelegateBindingExpressionTest.java
index dc8b758..bc729fc 100644
--- a/javatests/dagger/internal/codegen/DelegateBindingExpressionTest.java
+++ b/javatests/dagger/internal/codegen/DelegateBindingExpressionTest.java
@@ -20,6 +20,7 @@
 import static dagger.internal.codegen.CompilerMode.DEFAULT_MODE;
 import static dagger.internal.codegen.CompilerMode.FAST_INIT_MODE;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
 
 import com.google.testing.compile.Compilation;
 import com.google.testing.compile.CompilationSubject;
@@ -143,7 +144,7 @@
                 .addLines(
                     "package test;",
                     "",
-                    GeneratedLines.generatedAnnotations(),
+                    GENERATED_CODE_ANNOTATIONS,
                     "final class DaggerTestComponent implements TestComponent {")
                 .addLinesIn(
                     FAST_INIT_MODE,
@@ -222,7 +223,7 @@
                 .addLines(
                     "package test;",
                     "",
-                    GeneratedLines.generatedAnnotations(),
+                    GENERATED_CODE_ANNOTATIONS,
                     "final class DaggerTestComponent implements TestComponent {")
                 .addLinesIn(
                     FAST_INIT_MODE,
@@ -298,7 +299,7 @@
                 .addLines(
                     "package test;",
                     "",
-                    GeneratedLines.generatedAnnotations(),
+                    GENERATED_CODE_ANNOTATIONS,
                     "final class DaggerTestComponent implements TestComponent {")
                 .addLinesIn(
                     FAST_INIT_MODE,
@@ -400,7 +401,7 @@
                 .addLines(
                     "package test;",
                     "",
-                    GeneratedLines.generatedAnnotations(),
+                    GENERATED_CODE_ANNOTATIONS,
                     "final class DaggerTestComponent implements TestComponent {")
                 .addLinesIn(
                     DEFAULT_MODE,
@@ -508,7 +509,7 @@
                 .addLines(
                     "package test;",
                     "",
-                    GeneratedLines.generatedAnnotations(),
+                    GENERATED_CODE_ANNOTATIONS,
                     "final class DaggerTestComponent implements TestComponent {")
                 .addLinesIn(
                     DEFAULT_MODE,
@@ -598,7 +599,7 @@
                 .addLines(
                     "package test;",
                     "",
-                    GeneratedLines.generatedAnnotations(),
+                    GENERATED_CODE_ANNOTATIONS,
                     "final class DaggerTestComponent implements TestComponent {")
                 .addLinesIn(
                     DEFAULT_MODE,
@@ -699,7 +700,7 @@
                 .addLines(
                     "package test;",
                     "",
-                    GeneratedLines.generatedAnnotations(),
+                    GENERATED_CODE_ANNOTATIONS,
                     "final class DaggerTestComponent implements TestComponent {")
                 .addLinesIn(
                     DEFAULT_MODE,
@@ -804,7 +805,7 @@
                 .addLines(
                     "package test;",
                     "",
-                    GeneratedLines.generatedAnnotations(),
+                    GENERATED_CODE_ANNOTATIONS,
                     "final class DaggerRequestsSubtypeAsProvider",
                     "    implements RequestsSubtypeAsProvider {")
                 .addLinesIn(
@@ -896,7 +897,7 @@
                 .addLines(
                     "package test;",
                     "",
-                    GeneratedLines.generatedAnnotations(),
+                    GENERATED_CODE_ANNOTATIONS,
                     "final class DaggerTestComponent implements TestComponent {")
                 .addLinesIn(
                     DEFAULT_MODE,
diff --git a/javatests/dagger/internal/codegen/ElidedFactoriesTest.java b/javatests/dagger/internal/codegen/ElidedFactoriesTest.java
index 0c557c0..6857039 100644
--- a/javatests/dagger/internal/codegen/ElidedFactoriesTest.java
+++ b/javatests/dagger/internal/codegen/ElidedFactoriesTest.java
@@ -18,6 +18,8 @@
 
 import static com.google.testing.compile.CompilationSubject.assertThat;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
+import static dagger.internal.codegen.GeneratedLines.IMPORT_GENERATED_ANNOTATION;
 
 import com.google.testing.compile.Compilation;
 import com.google.testing.compile.JavaFileObjects;
@@ -80,9 +82,9 @@
             "test.DaggerSimpleComponent",
             "package test;",
             "",
-            GeneratedLines.generatedImports(),
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerSimpleComponent implements SimpleComponent {",
             "  private DaggerSimpleComponent() {}",
             "",
@@ -177,12 +179,12 @@
                 "test.DaggerSimpleComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedImports(
-                    "import dagger.internal.DoubleCheck;",
-                    "import dagger.internal.MemoizedSentinel;",
-                    "import javax.inject.Provider;"),
+                "import dagger.internal.DoubleCheck;",
+                "import dagger.internal.MemoizedSentinel;",
+                IMPORT_GENERATED_ANNOTATION,
+                "import javax.inject.Provider;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerSimpleComponent implements SimpleComponent {",
                 "  private volatile Object scopedType = new MemoizedSentinel();",
                 "  private volatile Provider<DependsOnScoped> dependsOnScopedProvider;",
@@ -260,11 +262,11 @@
                 "test.DaggerSimpleComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedImports(
-                    "import dagger.internal.DoubleCheck;",
-                    "import javax.inject.Provider;"),
+                "import dagger.internal.DoubleCheck;",
+                IMPORT_GENERATED_ANNOTATION,
+                "import javax.inject.Provider;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerSimpleComponent implements SimpleComponent {",
                 "  private Provider<ScopedType> scopedTypeProvider;",
                 "  private Provider<DependsOnScoped> dependsOnScopedProvider;",
@@ -371,11 +373,11 @@
                 "test.DaggerSimpleComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedImports(
-                    "import dagger.internal.DoubleCheck;",
-                    "import dagger.internal.MemoizedSentinel;"),
+                "import dagger.internal.DoubleCheck;",
+                "import dagger.internal.MemoizedSentinel;",
+                IMPORT_GENERATED_ANNOTATION,
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerSimpleComponent implements SimpleComponent {",
                 "  private volatile Object scopedType = new MemoizedSentinel();",
                 "",
@@ -432,11 +434,11 @@
                 "test.DaggerSimpleComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedImports(
-                    "import dagger.internal.DoubleCheck;",
-                    "import javax.inject.Provider;"),
+                "import dagger.internal.DoubleCheck;",
+                IMPORT_GENERATED_ANNOTATION,
+                "import javax.inject.Provider;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerSimpleComponent implements SimpleComponent {",
                 "  private Provider<ScopedType> scopedTypeProvider;",
                 "",
diff --git a/javatests/dagger/internal/codegen/GeneratedLines.java b/javatests/dagger/internal/codegen/GeneratedLines.java
index 09b6188..f9a1b70 100644
--- a/javatests/dagger/internal/codegen/GeneratedLines.java
+++ b/javatests/dagger/internal/codegen/GeneratedLines.java
@@ -17,16 +17,12 @@
 package dagger.internal.codegen;
 
 import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableSet;
-import java.util.stream.Collectors;
 
 /**
  * Common lines outputted during code generation.
  */
 public final class GeneratedLines {
-  private static final String DAGGER_GENERATED_ANNOTATION = "@DaggerGenerated";
-
-  private static final String GENERATED_ANNOTATION =
+  public static final String GENERATED_ANNOTATION =
      "@Generated("
         + "value = \"dagger.internal.codegen.ComponentProcessor\", "
         + "comments = \"https://dagger.dev\")";
@@ -34,36 +30,14 @@
   private static final String SUPPRESS_WARNINGS_ANNOTATION =
       "@SuppressWarnings({\"unchecked\", \"rawtypes\"})";
 
-  private static final String IMPORT_DAGGER_GENERATED = "import dagger.internal.DaggerGenerated;";
+  public static final String GENERATED_CODE_ANNOTATIONS =
+      Joiner.on('\n').join(GENERATED_ANNOTATION, SUPPRESS_WARNINGS_ANNOTATION);
 
-  private static final String IMPORT_GENERATED_ANNOTATION =
+  public static final String IMPORT_GENERATED_ANNOTATION =
       isBeforeJava9()
           ? "import javax.annotation.Generated;"
           : "import javax.annotation.processing.Generated;";
 
-  /** Returns a {@code String} of sorted imports. Includes generated imports automatically. */
-  public static String generatedImports(String... extraImports) {
-    return ImmutableSet.<String>builder()
-        .add(IMPORT_DAGGER_GENERATED)
-        .add(IMPORT_GENERATED_ANNOTATION)
-        .add(extraImports)
-        .build()
-        .stream()
-        .sorted()
-        .collect(Collectors.joining("\n"));
-  }
-
-  /** Returns the annotations for a generated class. */
-  public static String generatedAnnotations() {
-    return Joiner.on('\n')
-        .join(DAGGER_GENERATED_ANNOTATION, GENERATED_ANNOTATION, SUPPRESS_WARNINGS_ANNOTATION);
-  }
-
-  /** Returns the annotations for a generated class without {@code SuppressWarnings}. */
-  public static String generatedAnnotationsWithoutSuppressWarnings() {
-    return Joiner.on('\n').join(DAGGER_GENERATED_ANNOTATION, GENERATED_ANNOTATION);
-  }
-
   static final String GENERATION_OPTIONS_ANNOTATION = "@GenerationOptions(fastInit = false)";
 
   private static boolean isBeforeJava9() {
diff --git a/javatests/dagger/internal/codegen/InjectConstructorFactoryGeneratorTest.java b/javatests/dagger/internal/codegen/InjectConstructorFactoryGeneratorTest.java
index 3e78d6b..579e87a 100644
--- a/javatests/dagger/internal/codegen/InjectConstructorFactoryGeneratorTest.java
+++ b/javatests/dagger/internal/codegen/InjectConstructorFactoryGeneratorTest.java
@@ -22,6 +22,8 @@
 import static com.google.testing.compile.JavaSourcesSubjectFactory.javaSources;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
 import static dagger.internal.codegen.Compilers.daggerCompiler;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
+import static dagger.internal.codegen.GeneratedLines.IMPORT_GENERATED_ANNOTATION;
 
 import com.google.common.collect.ImmutableList;
 import com.google.testing.compile.Compilation;
@@ -132,11 +134,11 @@
             "test.GenericClass_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class GenericClass_Factory<T> implements Factory<GenericClass<T>> {",
             "  private final Provider<T> tProvider;",
             "",
@@ -181,11 +183,11 @@
             "test.GenericClass_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class GenericClass_Factory<A, B> implements",
             "    Factory<GenericClass<A, B>> {",
             "  private final Provider<A> aProvider;",
@@ -234,9 +236,10 @@
             "test.GenericClass_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports("import dagger.internal.Factory;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class GenericClass_Factory<T> implements Factory<GenericClass<T>> {",
             "  @Override",
             "  public GenericClass<T> get() {",
@@ -277,11 +280,11 @@
             "test.GenericClass_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class GenericClass_Factory<A, B>",
             "    implements Factory<GenericClass<A, B>> {",
             "  private final Provider<A> aProvider;",
@@ -329,12 +332,12 @@
             "test.GenericClass_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import java.util.List;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            "import java.util.List;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class GenericClass_Factory<A extends Number & Comparable<A>,",
             "        B extends List<? extends String>,",
             "        C extends List<? super String>>",
@@ -396,13 +399,13 @@
             "test.GenericClass_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.Lazy;",
-                "import dagger.internal.DoubleCheck;",
-                "import dagger.internal.Factory;",
-                "import javax.inject.Provider;"),
+            "import dagger.Lazy;",
+            "import dagger.internal.DoubleCheck;",
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class GenericClass_Factory<A, B>",
             "    implements Factory<GenericClass<A, B>> {",
             "  private final Provider<A> aProvider;",
@@ -1065,11 +1068,11 @@
             "test.InjectConstructor_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class InjectConstructor_Factory ",
             "    implements Factory<InjectConstructor> {",
             "",
@@ -1112,11 +1115,11 @@
             "test.AllInjections_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class AllInjections_Factory implements Factory<AllInjections> {",
             "  private final Provider<String> sProvider;",
             "  private final Provider<String> sProvider2;",
@@ -1172,12 +1175,12 @@
             "test.InjectConstructor_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import java.util.List;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            "import java.util.List;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class InjectConstructor_Factory ",
             "    implements Factory<InjectConstructor> {",
             "",
@@ -1225,11 +1228,11 @@
             "test.InjectConstructor_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class InjectConstructor_Factory ",
             "    implements Factory<InjectConstructor> {",
             "",
@@ -1281,12 +1284,12 @@
             "test.InjectConstructor_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import javax.inject.Provider;",
-                "import other.pkg.Outer;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
+            "import other.pkg.Outer;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class InjectConstructor_Factory ",
             "    implements Factory<InjectConstructor> {",
             "",
@@ -1340,11 +1343,11 @@
             "test.InjectConstructor_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class InjectConstructor_Factory ",
             "    implements Factory<InjectConstructor> {",
             "",
@@ -1395,9 +1398,10 @@
             "test.SimpleType_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports("import dagger.internal.Factory;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class SimpleType_Factory implements Factory<SimpleType> {",
             "  @Override public SimpleType get() {",
             "    return newInstance();",
@@ -1442,9 +1446,10 @@
             "test.OuterType_A_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports("import dagger.internal.Factory;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class OuterType_A_Factory implements Factory<OuterType.A> {",
             "  @Override public OuterType.A get() {",
             "    return newInstance();",
diff --git a/javatests/dagger/internal/codegen/MapBindingComponentProcessorTest.java b/javatests/dagger/internal/codegen/MapBindingComponentProcessorTest.java
index aa2a0ff..ed9dd65 100644
--- a/javatests/dagger/internal/codegen/MapBindingComponentProcessorTest.java
+++ b/javatests/dagger/internal/codegen/MapBindingComponentProcessorTest.java
@@ -19,6 +19,7 @@
 import static com.google.testing.compile.CompilationSubject.assertThat;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
 import static dagger.internal.codegen.Compilers.daggerCompiler;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
 
 import com.google.testing.compile.Compilation;
 import com.google.testing.compile.JavaFileObjects;
@@ -128,7 +129,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private final MapModuleOne mapModuleOne;",
                 "  private final MapModuleTwo mapModuleTwo;",
@@ -205,7 +206,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private Provider<Handler> provideAdminHandlerProvider;",
                 "  private Provider<Handler> provideLoginHandlerProvider;",
@@ -356,7 +357,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private Provider<Map<Class<?>, Integer>> mapOfClassOfAndIntegerProvider;",
                 "",
@@ -442,7 +443,7 @@
                 "mapkeys.MapModule_ComplexKeyWithInaccessibleAnnotationValueMapKey",
                 "package mapkeys;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "public final class MapModule_ComplexKeyWithInaccessibleAnnotationValueMapKey {",
                 "  public static MapKeys.ComplexKey create() {",
                 "    return MapKeys_ComplexKeyCreator.createComplexKey(",
@@ -458,7 +459,7 @@
                 "mapkeys.MapModule_ClassKeyMapKey",
                 "package mapkeys;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "public final class MapModule_ClassKeyMapKey {",
                 "  public static Class<?> create() {",
                 "    return MapKeys.Inaccessible.class;",
@@ -535,7 +536,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private final MapModuleOne mapModuleOne;",
                 "  private final MapModuleTwo mapModuleTwo;",
@@ -612,7 +613,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private Provider<Handler> provideAdminHandlerProvider;",
                 "  private Provider<Handler> provideLoginHandlerProvider;",
@@ -735,7 +736,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private final MapModuleOne mapModuleOne;",
                 "  private final MapModuleTwo mapModuleTwo;",
@@ -821,7 +822,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private Provider<Handler> provideAdminHandlerProvider;",
                 "  private Provider<Handler> provideLoginHandlerProvider;",
@@ -948,7 +949,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private final MapModuleOne mapModuleOne;",
                 "  private final MapModuleTwo mapModuleTwo;",
@@ -999,7 +1000,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private Provider<Handler> provideAdminHandlerProvider;",
                 "  private Provider<Handler> provideLoginHandlerProvider;",
@@ -1076,7 +1077,7 @@
             "test.DaggerTestComponent",
             "package test;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  private final MapModule mapModule;",
             "",
diff --git a/javatests/dagger/internal/codegen/MapBindingExpressionTest.java b/javatests/dagger/internal/codegen/MapBindingExpressionTest.java
index 9acc20d..3f33bd5 100644
--- a/javatests/dagger/internal/codegen/MapBindingExpressionTest.java
+++ b/javatests/dagger/internal/codegen/MapBindingExpressionTest.java
@@ -21,6 +21,7 @@
 import static dagger.internal.codegen.CompilerMode.FAST_INIT_MODE;
 import static dagger.internal.codegen.Compilers.CLASS_PATH_WITHOUT_GUAVA_OPTION;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
 
 import com.google.testing.compile.Compilation;
 import com.google.testing.compile.Compiler;
@@ -91,7 +92,7 @@
                 "",
                 "import dagger.internal.MapBuilder;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {")
             .addLinesIn(
                 FAST_INIT_MODE,
@@ -273,7 +274,7 @@
             "import other.UsesInaccessible;",
             "import other.UsesInaccessible_Factory;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  @Override",
             "  public UsesInaccessible usesInaccessible() {",
@@ -336,7 +337,7 @@
             "test.DaggerParent",
             "package test;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerParent implements Parent {",
             "  private final ParentModule parentModule;",
             "",
diff --git a/javatests/dagger/internal/codegen/MapBindingExpressionWithGuavaTest.java b/javatests/dagger/internal/codegen/MapBindingExpressionWithGuavaTest.java
index 30b0519..69ab5a7 100644
--- a/javatests/dagger/internal/codegen/MapBindingExpressionWithGuavaTest.java
+++ b/javatests/dagger/internal/codegen/MapBindingExpressionWithGuavaTest.java
@@ -20,6 +20,7 @@
 import static dagger.internal.codegen.CompilerMode.DEFAULT_MODE;
 import static dagger.internal.codegen.CompilerMode.FAST_INIT_MODE;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
 
 import com.google.testing.compile.Compilation;
 import com.google.testing.compile.JavaFileObjects;
@@ -126,7 +127,7 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {")
             .addLinesIn(
                 FAST_INIT_MODE,
@@ -400,7 +401,7 @@
             "import other.UsesInaccessible;",
             "import other.UsesInaccessible_Factory;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  @Override",
             "  public UsesInaccessible usesInaccessible() {",
@@ -462,7 +463,7 @@
             "test.DaggerParent",
             "package test;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerParent implements Parent {",
             "  private final ParentModule parentModule;",
             "",
@@ -518,7 +519,7 @@
             "",
             "import dagger.producers.internal.CancellationListener;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent, "
                 + "CancellationListener {",
             "  @Override",
diff --git a/javatests/dagger/internal/codegen/MapKeyProcessorTest.java b/javatests/dagger/internal/codegen/MapKeyProcessorTest.java
index 85f5a5c..ffdb2bc 100644
--- a/javatests/dagger/internal/codegen/MapKeyProcessorTest.java
+++ b/javatests/dagger/internal/codegen/MapKeyProcessorTest.java
@@ -18,6 +18,8 @@
 
 import static com.google.common.truth.Truth.assertAbout;
 import static com.google.testing.compile.JavaSourcesSubjectFactory.javaSources;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
+import static dagger.internal.codegen.GeneratedLines.IMPORT_GENERATED_ANNOTATION;
 
 import com.google.auto.value.processor.AutoAnnotationProcessor;
 import com.google.common.collect.ImmutableList;
@@ -68,9 +70,10 @@
             "test.PathKeyCreator",
             "package test;",
             "",
-            GeneratedLines.generatedImports("import com.google.auto.value.AutoAnnotation;"),
+            "import com.google.auto.value.AutoAnnotation;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class PathKeyCreator {",
             "  private PathKeyCreator() {}",
             "",
@@ -116,9 +119,10 @@
             "test.Container_PathKeyCreator",
             "package test;",
             "",
-            GeneratedLines.generatedImports("import com.google.auto.value.AutoAnnotation;"),
+            "import com.google.auto.value.AutoAnnotation;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class Container_PathKeyCreator {",
             "  private Container_PathKeyCreator() {}",
             "",
diff --git a/javatests/dagger/internal/codegen/MembersInjectionTest.java b/javatests/dagger/internal/codegen/MembersInjectionTest.java
index c442779..ef69c71 100644
--- a/javatests/dagger/internal/codegen/MembersInjectionTest.java
+++ b/javatests/dagger/internal/codegen/MembersInjectionTest.java
@@ -23,6 +23,8 @@
 import static dagger.internal.codegen.CompilerMode.DEFAULT_MODE;
 import static dagger.internal.codegen.CompilerMode.FAST_INIT_MODE;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
+import static dagger.internal.codegen.GeneratedLines.IMPORT_GENERATED_ANNOTATION;
 import static javax.tools.StandardLocation.CLASS_OUTPUT;
 
 import com.google.common.base.Joiner;
@@ -85,7 +87,7 @@
             "test.DaggerTestComponent",
             "package test;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  @Override",
             "  public Child child() {",
@@ -142,10 +144,9 @@
             "test.DaggerTestComponent",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import com.google.errorprone.annotations.CanIgnoreReturnValue;"),
+            "import com.google.errorprone.annotations.CanIgnoreReturnValue;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  @Override",
             "  public Child child() {",
@@ -186,12 +187,12 @@
             "test.GenericClass_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class GenericClass_MembersInjector<A, B>",
             "    implements MembersInjector<GenericClass<A, B>> {",
             "  private final Provider<A> aProvider;",
@@ -276,12 +277,12 @@
             "test.Child_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class Child_MembersInjector<T>",
             "    implements MembersInjector<Child<T>> {",
             "  private final Provider<T> xProvider;",
@@ -359,14 +360,14 @@
             "test.FieldInjection_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.Lazy;",
-                "import dagger.MembersInjector;",
-                "import dagger.internal.DoubleCheck;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Provider;"),
+            "import dagger.Lazy;",
+            "import dagger.MembersInjector;",
+            "import dagger.internal.DoubleCheck;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class FieldInjection_MembersInjector",
             "    implements MembersInjector<FieldInjection> {",
             "  private final Provider<String> stringProvider;",
@@ -441,13 +442,13 @@
             "test.FieldInjectionWithQualifier_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Named;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Named;",
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class FieldInjectionWithQualifier_MembersInjector",
             "    implements MembersInjector<FieldInjectionWithQualifier> {",
             "  private final Provider<String> aProvider;",
@@ -510,13 +511,13 @@
             "test.MethodInjection_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.Lazy;",
-                "import dagger.MembersInjector;",
-                "import dagger.internal.DoubleCheck;",
-                "import javax.inject.Provider;"),
+            "import dagger.Lazy;",
+            "import dagger.MembersInjector;",
+            "import dagger.internal.DoubleCheck;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class MethodInjection_MembersInjector",
             "     implements MembersInjector<MethodInjection> {",
             "  private final Provider<String> stringProvider;",
@@ -600,12 +601,12 @@
             "test.MixedMemberInjection_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class MixedMemberInjection_MembersInjector",
             "    implements MembersInjector<MixedMemberInjection> {",
             "  private final Provider<String> stringProvider;",
@@ -683,12 +684,12 @@
             "test.AllInjections_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class AllInjections_MembersInjector ",
             "    implements MembersInjector<AllInjections> {",
             "  private final Provider<String> sProvider;",
@@ -750,12 +751,12 @@
             "test.AllInjections_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class B_MembersInjector implements MembersInjector<B> {",
             "  private final Provider<String> sProvider;",
             "",
@@ -812,12 +813,12 @@
             "test.OuterType_B_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class OuterType_B_MembersInjector",
             "    implements MembersInjector<OuterType.B> {",
             "  private final Provider<OuterType.A> aProvider;",
@@ -878,12 +879,12 @@
             "test.OuterType_B_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class OuterType_B_MembersInjector",
             "    implements MembersInjector<OuterType.B> {",
             "  private final Provider<OuterType.A> aProvider;",
@@ -1054,12 +1055,12 @@
             "test.Child_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class Child_MembersInjector implements MembersInjector<Child> {",
             "  private final Provider<Foo> objectProvider;",
             "  private final Provider<Bar> objectProvider2;",
@@ -1252,12 +1253,12 @@
             "test.InjectedType_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class InjectedType_MembersInjector ",
             "    implements MembersInjector<InjectedType> {",
             "  private final Provider<Integer> primitiveIntProvider;",
@@ -1294,11 +1295,11 @@
             "test.InjectedType_Factory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class InjectedType_Factory implements Factory<InjectedType> {",
             "  private final Provider<Integer> primitiveIntProvider;",
             "",
@@ -1397,12 +1398,12 @@
                 "other.Inaccessible_MembersInjector",
                 "package other;",
                 "",
-                GeneratedLines.generatedImports(
-                    "import dagger.MembersInjector;",
-                    "import dagger.internal.InjectedFieldSignature;",
-                    "import javax.inject.Provider;"),
+                "import dagger.MembersInjector;",
+                "import dagger.internal.InjectedFieldSignature;",
+                IMPORT_GENERATED_ANNOTATION,
+                "import javax.inject.Provider;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "public final class Inaccessible_MembersInjector",
                 "    implements MembersInjector<Inaccessible> {",
                 "  private final Provider<Foo> fooProvider;",
@@ -1438,15 +1439,15 @@
             "test.DaggerTestComponent",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import com.google.errorprone.annotations.CanIgnoreReturnValue;",
-                "import other.Foo_Factory;",
-                "import other.Inaccessible_Factory;",
-                "import other.Inaccessible_MembersInjector;",
-                "import other.UsesInaccessible;",
-                "import other.UsesInaccessible_Factory;"),
+            "import com.google.errorprone.annotations.CanIgnoreReturnValue;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import other.Foo_Factory;",
+            "import other.Inaccessible_Factory;",
+            "import other.Inaccessible_MembersInjector;",
+            "import other.UsesInaccessible;",
+            "import other.UsesInaccessible_Factory;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  private Object inaccessible() {",
             "    return injectInaccessible(Inaccessible_Factory.newInstance());",
@@ -1537,15 +1538,14 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedImports(
-                    "import com.google.errorprone.annotations.CanIgnoreReturnValue;",
-                    "import other.InaccessiblesModule;",
-                    "import other.InaccessiblesModule_InaccessiblesFactory;",
-                    "import other.UsesInaccessibles;",
-                    "import other.UsesInaccessibles_Factory;",
-                    "import other.UsesInaccessibles_MembersInjector;"),
+                "import com.google.errorprone.annotations.CanIgnoreReturnValue;",
+                "import other.InaccessiblesModule;",
+                "import other.InaccessiblesModule_InaccessiblesFactory;",
+                "import other.UsesInaccessibles;",
+                "import other.UsesInaccessibles_Factory;",
+                "import other.UsesInaccessibles_MembersInjector;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {")
             .addLinesIn(
                 FAST_INIT_MODE,
@@ -1666,16 +1666,15 @@
             "test.DaggerTestComponent",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import com.google.errorprone.annotations.CanIgnoreReturnValue;",
-                "import other.Foo_Factory;",
-                "import other.InjectsSubtype;",
-                "import other.InjectsSubtype_Factory;",
-                "import other.Subtype_Factory;",
-                "import other.Supertype;",
-                "import other.Supertype_MembersInjector;"),
+            "import com.google.errorprone.annotations.CanIgnoreReturnValue;",
+            "import other.Foo_Factory;",
+            "import other.InjectsSubtype;",
+            "import other.InjectsSubtype_Factory;",
+            "import other.Subtype_Factory;",
+            "import other.Supertype;",
+            "import other.Supertype_MembersInjector;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  private Object subtype() {",
             "    return injectSubtype(Subtype_Factory.newInstance());",
@@ -1735,12 +1734,12 @@
             "test.A_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class A_MembersInjector implements MembersInjector<A> {",
             "  private final Provider<String> valueCProvider;",
             "  private final Provider<String> valueAProvider;",
@@ -1773,12 +1772,12 @@
             "test.C_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class C_MembersInjector implements MembersInjector<C> {",
             "  private final Provider<String> valueCProvider;",
             "",
@@ -1853,11 +1852,11 @@
             "test.A_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class A_MembersInjector implements MembersInjector<A> {",
             "  private final Provider<String> valueBProvider;",
             "",
@@ -1880,12 +1879,12 @@
             "test.B_MembersInjector",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.InjectedFieldSignature;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.InjectedFieldSignature;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class B_MembersInjector implements MembersInjector<B> {",
             "  private final Provider<String> valueBProvider;",
             "",
diff --git a/javatests/dagger/internal/codegen/ModuleFactoryGeneratorTest.java b/javatests/dagger/internal/codegen/ModuleFactoryGeneratorTest.java
index 84c7be4..cbda1b8 100644
--- a/javatests/dagger/internal/codegen/ModuleFactoryGeneratorTest.java
+++ b/javatests/dagger/internal/codegen/ModuleFactoryGeneratorTest.java
@@ -24,6 +24,8 @@
 import static dagger.internal.codegen.Compilers.daggerCompiler;
 import static dagger.internal.codegen.DaggerModuleMethodSubject.Factory.assertThatMethodInUnannotatedClass;
 import static dagger.internal.codegen.DaggerModuleMethodSubject.Factory.assertThatModuleMethod;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
+import static dagger.internal.codegen.GeneratedLines.IMPORT_GENERATED_ANNOTATION;
 
 import com.google.common.collect.ImmutableList;
 import com.google.testing.compile.Compilation;
@@ -222,11 +224,11 @@
             "TestModule_ProvideStringFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import dagger.internal.Preconditions;"),
+            "import dagger.internal.Factory;",
+            "import dagger.internal.Preconditions;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class TestModule_ProvideStringFactory implements Factory<String> {",
             "  private final TestModule module;",
             "",
@@ -270,9 +272,10 @@
             "TestModule_ProvideStringFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports("import dagger.internal.Factory;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class TestModule_ProvideStringFactory implements Factory<String> {",
             "  private final TestModule module;",
             "",
@@ -315,9 +318,10 @@
             "TestModule_ProvideStringFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports("import dagger.internal.Factory;"),
+            "import dagger.internal.Factory;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class TestModule_ProvideStringFactory implements Factory<String> {",
             "  private final TestModule module;",
             "",
@@ -384,14 +388,14 @@
             "TestModule_ProvideObjectsFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.MembersInjector;",
-                "import dagger.internal.Factory;",
-                "import dagger.internal.Preconditions;",
-                "import java.util.List;",
-                "import javax.inject.Provider;"),
+            "import dagger.MembersInjector;",
+            "import dagger.internal.Factory;",
+            "import dagger.internal.Preconditions;",
+            "import java.util.List;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class TestModule_ProvideObjectsFactory",
             "    implements Factory<List<Object>> {",
             "  private final TestModule module;",
@@ -457,11 +461,11 @@
             "TestModule_ProvideStringFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import dagger.internal.Preconditions;"),
+            "import dagger.internal.Factory;",
+            "import dagger.internal.Preconditions;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class TestModule_ProvideStringFactory implements Factory<String> {",
             "  private final TestModule module;",
             "",
@@ -509,12 +513,12 @@
             "TestModule_ProvideWildcardListFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import dagger.internal.Preconditions;",
-                "import java.util.List;"),
+            "import dagger.internal.Factory;",
+            "import dagger.internal.Preconditions;",
+            "import java.util.List;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class TestModule_ProvideWildcardListFactory implements "
                 + "Factory<List<List<?>>> {",
             "  private final TestModule module;",
@@ -562,12 +566,12 @@
             "TestModule_ProvideStringsFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import dagger.internal.Preconditions;",
-                "import java.util.Set;"),
+            "import dagger.internal.Factory;",
+            "import dagger.internal.Preconditions;",
+            "import java.util.Set;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class TestModule_ProvideStringsFactory implements Factory<Set<String>> {",
             "  private final TestModule module;",
             "",
@@ -873,13 +877,13 @@
             "test.ParentModule_ProvideListBFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import dagger.internal.Preconditions;",
-                "import java.util.List;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            "import dagger.internal.Preconditions;",
+            "import java.util.List;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class ParentModule_ProvideListBFactory<A extends CharSequence,",
             "    B, C extends Number & Comparable<C>> implements Factory<List<B>> {",
             "  private final ParentModule<A, B, C> module;",
@@ -912,12 +916,12 @@
             "test.ParentModule_ProvideBElementFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import dagger.internal.Preconditions;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            "import dagger.internal.Preconditions;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class ParentModule_ProvideBElementFactory<A extends CharSequence,",
             "    B, C extends Number & Comparable<C>> implements Factory<B> {",
             "  private final ParentModule<A, B, C> module;",
@@ -951,12 +955,12 @@
             "test.ParentModule_ProvideBEntryFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import dagger.internal.Preconditions;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            "import dagger.internal.Preconditions;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class ParentModule_ProvideBEntryFactory<A extends CharSequence,",
             "    B, C extends Number & Comparable<C>> implements Factory<B>> {",
             "  private final ParentModule<A, B, C> module;",
@@ -990,11 +994,11 @@
             "test.ChildNumberModule_ProvideNumberFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import dagger.internal.Preconditions;"),
+            "import dagger.internal.Factory;",
+            "import dagger.internal.Preconditions;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class ChildNumberModule_ProvideNumberFactory",
             "    implements Factory<Number> {",
             "  private final ChildNumberModule module;",
@@ -1022,11 +1026,11 @@
             "test.ChildIntegerModule_ProvideIntegerFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import dagger.internal.Preconditions;"),
+            "import dagger.internal.Factory;",
+            "import dagger.internal.Preconditions;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class ChildIntegerModule_ProvideIntegerFactory",
             "    implements Factory<Integer> {",
             "  private final ChildIntegerModule module;",
@@ -1095,12 +1099,12 @@
             "test.ParameterizedModule_ProvideMapStringNumberFactory;",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import dagger.internal.Preconditions;",
-                "import java.util.Map;"),
+            "import dagger.internal.Factory;",
+            "import dagger.internal.Preconditions;",
+            "import java.util.Map;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class ParameterizedModule_ProvideMapStringNumberFactory",
             "    implements Factory<Map<String, Number>> {",
             "  @Override",
@@ -1128,11 +1132,11 @@
             "test.ParameterizedModule_ProvideNonGenericTypeFactory;",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import dagger.internal.Preconditions;"),
+            "import dagger.internal.Factory;",
+            "import dagger.internal.Preconditions;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class ParameterizedModule_ProvideNonGenericTypeFactory",
             "    implements Factory<Object> {",
             "  @Override",
@@ -1160,12 +1164,12 @@
             "test.ParameterizedModule_ProvideNonGenericTypeWithDepsFactory;",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Factory;",
-                "import dagger.internal.Preconditions;",
-                "import javax.inject.Provider;"),
+            "import dagger.internal.Factory;",
+            "import dagger.internal.Preconditions;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "public final class ParameterizedModule_ProvideNonGenericTypeWithDepsFactory",
             "    implements Factory<String> {",
             "  private final Provider<Object> oProvider;",
@@ -1402,7 +1406,7 @@
                 "test.TestModule_GetFactory",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "public final class TestModule_GetFactory implements Factory<Integer> {",
                 "  @Override",
                 "  public Integer get() {",
@@ -1425,7 +1429,7 @@
                 "test.TestModule_CreateFactory",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "public final class TestModule_CreateFactory implements Factory<Boolean> {",
                 "  @Override",
                 "  public Boolean get() {",
diff --git a/javatests/dagger/internal/codegen/OptionalBindingRequestFulfillmentTest.java b/javatests/dagger/internal/codegen/OptionalBindingRequestFulfillmentTest.java
index 9b43530..60b6898 100644
--- a/javatests/dagger/internal/codegen/OptionalBindingRequestFulfillmentTest.java
+++ b/javatests/dagger/internal/codegen/OptionalBindingRequestFulfillmentTest.java
@@ -20,6 +20,7 @@
 import static dagger.internal.codegen.CompilerMode.DEFAULT_MODE;
 import static dagger.internal.codegen.CompilerMode.FAST_INIT_MODE;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
 
 import com.google.testing.compile.Compilation;
 import com.google.testing.compile.JavaFileObjects;
@@ -109,7 +110,7 @@
                 "",
                 "import com.google.common.base.Optional;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {")
             .addLinesIn(
                 FAST_INIT_MODE,
@@ -249,7 +250,7 @@
             "import com.google.common.base.Optional;",
             "import dagger.producers.internal.CancellationListener;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent, CancellationListener {",
             "  @Override",
             "  public ListenableFuture<Optional<Maybe>> maybe() {",
diff --git a/javatests/dagger/internal/codegen/ProducerModuleFactoryGeneratorTest.java b/javatests/dagger/internal/codegen/ProducerModuleFactoryGeneratorTest.java
index 8e9bb8a..d41bc2d 100644
--- a/javatests/dagger/internal/codegen/ProducerModuleFactoryGeneratorTest.java
+++ b/javatests/dagger/internal/codegen/ProducerModuleFactoryGeneratorTest.java
@@ -23,6 +23,8 @@
 import static dagger.internal.codegen.Compilers.daggerCompiler;
 import static dagger.internal.codegen.DaggerModuleMethodSubject.Factory.assertThatMethodInUnannotatedClass;
 import static dagger.internal.codegen.DaggerModuleMethodSubject.Factory.assertThatProductionModuleMethod;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_ANNOTATION;
+import static dagger.internal.codegen.GeneratedLines.IMPORT_GENERATED_ANNOTATION;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -359,16 +361,16 @@
             "TestModule_ProduceStringFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import com.google.common.util.concurrent.Futures;",
-                "import com.google.common.util.concurrent.ListenableFuture;",
-                "import dagger.producers.internal.AbstractProducesMethodProducer;",
-                "import dagger.producers.monitoring.ProducerToken;",
-                "import dagger.producers.monitoring.ProductionComponentMonitor;",
-                "import java.util.concurrent.Executor;",
-                "import javax.inject.Provider;"),
+            "import com.google.common.util.concurrent.Futures;",
+            "import com.google.common.util.concurrent.ListenableFuture;",
+            "import dagger.producers.internal.AbstractProducesMethodProducer;",
+            "import dagger.producers.monitoring.ProducerToken;",
+            "import dagger.producers.monitoring.ProductionComponentMonitor;",
+            "import java.util.concurrent.Executor;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotationsWithoutSuppressWarnings(),
+            GENERATED_ANNOTATION,
             "@SuppressWarnings({\"FutureReturnValueIgnored\", \"unchecked\", \"rawtypes\"})",
             "public final class TestModule_ProduceStringFactory",
             "    extends AbstractProducesMethodProducer<Void, String> {",
@@ -432,16 +434,16 @@
             "TestModule_ProduceStringFactory",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import com.google.common.util.concurrent.Futures;",
-                "import com.google.common.util.concurrent.ListenableFuture;",
-                "import dagger.producers.internal.AbstractProducesMethodProducer;",
-                "import dagger.producers.monitoring.ProducerToken;",
-                "import dagger.producers.monitoring.ProductionComponentMonitor;",
-                "import java.util.concurrent.Executor;",
-                "import javax.inject.Provider;"),
+            "import com.google.common.util.concurrent.Futures;",
+            "import com.google.common.util.concurrent.ListenableFuture;",
+            "import dagger.producers.internal.AbstractProducesMethodProducer;",
+            "import dagger.producers.monitoring.ProducerToken;",
+            "import dagger.producers.monitoring.ProductionComponentMonitor;",
+            "import java.util.concurrent.Executor;",
+            IMPORT_GENERATED_ANNOTATION,
+            "import javax.inject.Provider;",
             "",
-            GeneratedLines.generatedAnnotationsWithoutSuppressWarnings(),
+            GENERATED_ANNOTATION,
             "@SuppressWarnings({\"FutureReturnValueIgnored\", \"unchecked\", \"rawtypes\"})",
             "public final class TestModule_ProduceStringFactory",
             "    extends AbstractProducesMethodProducer<Void, String> {",
diff --git a/javatests/dagger/internal/codegen/ProductionComponentProcessorTest.java b/javatests/dagger/internal/codegen/ProductionComponentProcessorTest.java
index 4043e76..797fe2e 100644
--- a/javatests/dagger/internal/codegen/ProductionComponentProcessorTest.java
+++ b/javatests/dagger/internal/codegen/ProductionComponentProcessorTest.java
@@ -21,6 +21,8 @@
 import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
 import static dagger.internal.codegen.Compilers.daggerCompiler;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
+import static dagger.internal.codegen.GeneratedLines.IMPORT_GENERATED_ANNOTATION;
 
 import com.google.testing.compile.Compilation;
 import com.google.testing.compile.JavaFileObjects;
@@ -232,21 +234,21 @@
                 "test.DaggerTestClass_SimpleComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedImports(
-                    "import com.google.common.util.concurrent.ListenableFuture;",
-                    "import dagger.internal.DoubleCheck;",
-                    "import dagger.internal.InstanceFactory;",
-                    "import dagger.internal.MemoizedSentinel;",
-                    "import dagger.internal.Preconditions;",
-                    "import dagger.internal.SetFactory;",
-                    "import dagger.producers.Producer;",
-                    "import dagger.producers.internal.CancellationListener;",
-                    "import dagger.producers.internal.Producers;",
-                    "import dagger.producers.monitoring.ProductionComponentMonitor;",
-                    "import java.util.concurrent.Executor;",
-                    "import javax.inject.Provider;"),
+                "import com.google.common.util.concurrent.ListenableFuture;",
+                "import dagger.internal.DoubleCheck;",
+                "import dagger.internal.InstanceFactory;",
+                "import dagger.internal.MemoizedSentinel;",
+                "import dagger.internal.Preconditions;",
+                "import dagger.internal.SetFactory;",
+                "import dagger.producers.Producer;",
+                "import dagger.producers.internal.CancellationListener;",
+                "import dagger.producers.internal.Producers;",
+                "import dagger.producers.monitoring.ProductionComponentMonitor;",
+                "import java.util.concurrent.Executor;",
+                IMPORT_GENERATED_ANNOTATION,
+                "import javax.inject.Provider;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestClass_SimpleComponent",
                 "    implements TestClass.SimpleComponent, CancellationListener {",
                 "  private final TestClass.BModule bModule;",
@@ -428,20 +430,20 @@
                 "test.DaggerTestClass_SimpleComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedImports(
-                    "import com.google.common.util.concurrent.ListenableFuture;",
-                    "import dagger.internal.DoubleCheck;",
-                    "import dagger.internal.InstanceFactory;",
-                    "import dagger.internal.Preconditions;",
-                    "import dagger.internal.SetFactory;",
-                    "import dagger.producers.Producer;",
-                    "import dagger.producers.internal.CancellationListener;",
-                    "import dagger.producers.internal.Producers;",
-                    "import dagger.producers.monitoring.ProductionComponentMonitor;",
-                    "import java.util.concurrent.Executor;",
-                    "import javax.inject.Provider;"),
+                "import com.google.common.util.concurrent.ListenableFuture;",
+                "import dagger.internal.DoubleCheck;",
+                "import dagger.internal.InstanceFactory;",
+                "import dagger.internal.Preconditions;",
+                "import dagger.internal.SetFactory;",
+                "import dagger.producers.Producer;",
+                "import dagger.producers.internal.CancellationListener;",
+                "import dagger.producers.internal.Producers;",
+                "import dagger.producers.monitoring.ProductionComponentMonitor;",
+                "import java.util.concurrent.Executor;",
+                IMPORT_GENERATED_ANNOTATION,
+                "import javax.inject.Provider;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestClass_SimpleComponent",
                 "    implements TestClass.SimpleComponent, CancellationListener {",
                 "  private Producer<TestClass.A> aEntryPoint;",
@@ -648,7 +650,7 @@
             new JavaFileBuilder(compilerMode, "test.DaggerRoot")
                 .addLines(
                     "package test;",
-                    GeneratedLines.generatedAnnotations(),
+                    GENERATED_CODE_ANNOTATIONS,
                     "final class DaggerParent implements Parent, CancellationListener {",
                     "  private final class ChildImpl implements Child, CancellationListener {",
                     "    @Override",
diff --git a/javatests/dagger/internal/codegen/SetBindingRequestFulfillmentTest.java b/javatests/dagger/internal/codegen/SetBindingRequestFulfillmentTest.java
index a343a60..e143370 100644
--- a/javatests/dagger/internal/codegen/SetBindingRequestFulfillmentTest.java
+++ b/javatests/dagger/internal/codegen/SetBindingRequestFulfillmentTest.java
@@ -19,6 +19,8 @@
 import static com.google.testing.compile.CompilationSubject.assertThat;
 import static dagger.internal.codegen.Compilers.CLASS_PATH_WITHOUT_GUAVA_OPTION;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
+import static dagger.internal.codegen.GeneratedLines.IMPORT_GENERATED_ANNOTATION;
 
 import com.google.testing.compile.Compilation;
 import com.google.testing.compile.Compiler;
@@ -94,7 +96,7 @@
             "",
             "import dagger.internal.SetBuilder;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  @Override",
             "  public Set<String> strings() {",
@@ -189,7 +191,7 @@
             "import other.UsesInaccessible;",
             "import other.UsesInaccessible_Factory;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  private Set setOfInaccessible2() {",
             "    return SetBuilder.newSetBuilder(1)",
@@ -259,12 +261,12 @@
             "test.DaggerParent",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import dagger.internal.Preconditions;",
-                "import java.util.Collections;",
-                "import java.util.Set;"),
+            "import dagger.internal.Preconditions;",
+            "import java.util.Collections;",
+            "import java.util.Set;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerParent implements Parent {",
             "  private DaggerParent() {}",
             "",
diff --git a/javatests/dagger/internal/codegen/SetBindingRequestFulfillmentWithGuavaTest.java b/javatests/dagger/internal/codegen/SetBindingRequestFulfillmentWithGuavaTest.java
index a081130..2e3686f 100644
--- a/javatests/dagger/internal/codegen/SetBindingRequestFulfillmentWithGuavaTest.java
+++ b/javatests/dagger/internal/codegen/SetBindingRequestFulfillmentWithGuavaTest.java
@@ -18,6 +18,8 @@
 
 import static com.google.testing.compile.CompilationSubject.assertThat;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
+import static dagger.internal.codegen.GeneratedLines.IMPORT_GENERATED_ANNOTATION;
 
 import com.google.testing.compile.Compilation;
 import com.google.testing.compile.JavaFileObjects;
@@ -97,7 +99,7 @@
             "",
             "import com.google.common.collect.ImmutableSet;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  @Override",
             "  public Set<String> strings() {",
@@ -200,7 +202,7 @@
             "import other.UsesInaccessible;",
             "import other.UsesInaccessible_Factory;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent {",
             "  private Set setOfInaccessible2() {",
             "    return ImmutableSet.copyOf(TestModule_EmptySetFactory.emptySet());",
@@ -270,7 +272,7 @@
             "",
             "import com.google.common.collect.ImmutableSet;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerParent implements Parent {",
             "  private final class ChildImpl implements Child {",
             "    @Override",
@@ -322,14 +324,14 @@
             "test.DaggerTestComponent",
             "package test;",
             "",
-            GeneratedLines.generatedImports(
-                "import com.google.common.collect.ImmutableSet;",
-                "import com.google.common.util.concurrent.Futures;",
-                "import com.google.common.util.concurrent.ListenableFuture;",
-                "import dagger.producers.internal.CancellationListener;",
-                "import java.util.Set;"),
+            "import com.google.common.collect.ImmutableSet;",
+            "import com.google.common.util.concurrent.Futures;",
+            "import com.google.common.util.concurrent.ListenableFuture;",
+            "import dagger.producers.internal.CancellationListener;",
+            "import java.util.Set;",
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerTestComponent implements TestComponent, "
                 + "CancellationListener {",
             "  private DaggerTestComponent() {}",
diff --git a/javatests/dagger/internal/codegen/SubcomponentCreatorRequestFulfillmentTest.java b/javatests/dagger/internal/codegen/SubcomponentCreatorRequestFulfillmentTest.java
index 32ae245..ea0b4cc 100644
--- a/javatests/dagger/internal/codegen/SubcomponentCreatorRequestFulfillmentTest.java
+++ b/javatests/dagger/internal/codegen/SubcomponentCreatorRequestFulfillmentTest.java
@@ -21,6 +21,8 @@
 import static com.google.testing.compile.CompilationSubject.assertThat;
 import static dagger.internal.codegen.CompilerMode.DEFAULT_MODE;
 import static dagger.internal.codegen.CompilerMode.FAST_INIT_MODE;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
+import static dagger.internal.codegen.GeneratedLines.IMPORT_GENERATED_ANNOTATION;
 import static dagger.internal.codegen.binding.ComponentCreatorAnnotation.SUBCOMPONENT_BUILDER;
 import static dagger.internal.codegen.binding.ComponentCreatorAnnotation.SUBCOMPONENT_FACTORY;
 
@@ -97,9 +99,9 @@
             "test.DaggerC",
             "package test;",
             "",
-            GeneratedLines.generatedImports(),
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerC implements C {",
             "  @Override",
             "  public Sub.Builder sBuilder() {",
diff --git a/javatests/dagger/internal/codegen/SubcomponentValidationTest.java b/javatests/dagger/internal/codegen/SubcomponentValidationTest.java
index c63522e..19a27ff 100644
--- a/javatests/dagger/internal/codegen/SubcomponentValidationTest.java
+++ b/javatests/dagger/internal/codegen/SubcomponentValidationTest.java
@@ -21,6 +21,8 @@
 import static dagger.internal.codegen.CompilerMode.FAST_INIT_MODE;
 import static dagger.internal.codegen.Compilers.compilerWithOptions;
 import static dagger.internal.codegen.Compilers.daggerCompiler;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
+import static dagger.internal.codegen.GeneratedLines.IMPORT_GENERATED_ANNOTATION;
 
 import com.google.testing.compile.Compilation;
 import com.google.testing.compile.JavaFileObjects;
@@ -455,7 +457,7 @@
             .addLines(
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerParentComponent implements ParentComponent {")
             .addLinesIn(
                 DEFAULT_MODE,
@@ -654,7 +656,7 @@
             "",
             "import test.subpackage.Sub;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerParentComponent implements ParentComponent {",
             "  @Override",
             "  public Foo.Sub newInstanceSubcomponent() {",
@@ -681,10 +683,10 @@
             "    private final class B_SubImpl implements Bar.Sub {",
             "      @Override",
             "      public Sub newSubcomponentInSubpackage() {",
-            "        return new ts_SubI();",
+            "        return new ts_SubImpl();",
             "      }",
             "",
-            "      private final class ts_SubI implements Sub {}",
+            "      private final class ts_SubImpl implements Sub {}",
             "    }",
             "  }",
             "",
@@ -736,7 +738,7 @@
             "test.DaggerParentComponent",
             "package test;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerParentComponent implements ParentComponent {",
             "  @Override",
             "  public Sub newSubcomponent() {",
@@ -801,7 +803,7 @@
         JavaFileObjects.forSourceLines(
             "DaggerParentComponent",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerParentComponent implements ParentComponent {",
             "  @Override",
             "  public Sub newSubcomponent() {",
@@ -878,7 +880,7 @@
             "",
             "import top1.a.b.c.d.E;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerParentComponent implements ParentComponent {",
             "  @Override",
             "  public E.F.Sub top1() {",
@@ -935,7 +937,7 @@
             "test.DaggerC",
             "package test;",
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerC implements C {",
             "  @Override",
             "  public Foo.C newInstanceC() {",
@@ -994,9 +996,9 @@
             "test.DaggerC",
             "package test;",
             "",
-            GeneratedLines.generatedImports(),
+            IMPORT_GENERATED_ANNOTATION,
             "",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
             "final class DaggerC implements C {",
             "  @Override",
             "  public C.Foo.Sub.Builder fooBuilder() {",
diff --git a/javatests/dagger/internal/codegen/SwitchingProviderTest.java b/javatests/dagger/internal/codegen/SwitchingProviderTest.java
index 615b09d..593ad49 100644
--- a/javatests/dagger/internal/codegen/SwitchingProviderTest.java
+++ b/javatests/dagger/internal/codegen/SwitchingProviderTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.testing.compile.CompilationSubject.assertThat;
 import static com.google.testing.compile.Compiler.javac;
+import static dagger.internal.codegen.GeneratedLines.GENERATED_CODE_ANNOTATIONS;
 
 import com.google.common.collect.ImmutableList;
 import com.google.testing.compile.Compilation;
@@ -67,7 +68,7 @@
         JavaFileObjects.forSourceLines(
             "test.DaggerTestComponent",
                 "package test;",
-            GeneratedLines.generatedAnnotations(),
+            GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private final class SwitchingProvider<T> implements Provider<T> {",
                 "    @SuppressWarnings(\"unchecked\")",
@@ -247,7 +248,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private volatile Provider<String> sProvider;",
                 "",
@@ -332,7 +333,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private volatile Object charSequence = new MemoizedSentinel();",
                 "  private volatile Provider<CharSequence> cProvider;",
@@ -423,7 +424,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  @Override",
                 "  public Provider<Set<String>> setProvider() {",
@@ -468,7 +469,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  private Provider<MembersInjector<Foo>> fooMembersInjectorProvider;",
                 "",
@@ -539,7 +540,7 @@
                 "test.DaggerTestComponent",
                 "package test;",
                 "",
-                GeneratedLines.generatedAnnotations(),
+                GENERATED_CODE_ANNOTATIONS,
                 "final class DaggerTestComponent implements TestComponent {",
                 "  @SuppressWarnings(\"rawtypes\")",
                 "  private static final Provider ABSENT_JDK_OPTIONAL_PROVIDER =",
diff --git a/javatests/dagger/internal/codegen/bindinggraphvalidation/BUILD b/javatests/dagger/internal/codegen/bindinggraphvalidation/BUILD
deleted file mode 100644
index 551e091..0000000
--- a/javatests/dagger/internal/codegen/bindinggraphvalidation/BUILD
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (C) 2020 The Dagger Authors.
-#
-# 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.
-
-# Description:
-#   Tests for dagger.internal.codegen.bindinggraphvalidation
-
-load("//:build_defs.bzl", "DOCLINT_HTML_AND_SYNTAX")
-load("//:test_defs.bzl", "GenJavaTests")
-
-package(default_visibility = ["//:src"])
-
-GenJavaTests(
-    name = "bindinggraphvalidation_tests",
-    srcs = glob(["*.java"]),
-    functional = False,
-    javacopts = DOCLINT_HTML_AND_SYNTAX,
-    deps = [
-        "//java/dagger/internal/codegen/bindinggraphvalidation",
-        "//javatests/dagger/internal/codegen:compilers",
-        "@google_bazel_common//third_party/java/compile_testing",
-        "@google_bazel_common//third_party/java/javapoet",
-        "@google_bazel_common//third_party/java/junit",
-        "@google_bazel_common//third_party/java/truth",
-        "@maven//:com_google_auto_auto_common",
-    ],
-)
diff --git a/javatests/dagger/internal/codegen/bindinggraphvalidation/NullableBindingValidationTest.java b/javatests/dagger/internal/codegen/bindinggraphvalidation/NullableBindingValidationTest.java
deleted file mode 100644
index 50a65ac..0000000
--- a/javatests/dagger/internal/codegen/bindinggraphvalidation/NullableBindingValidationTest.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * Copyright (C) 2018 The Dagger Authors.
- *
- * 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 dagger.internal.codegen.bindinggraphvalidation;
-
-import static com.google.testing.compile.CompilationSubject.assertThat;
-import static dagger.internal.codegen.Compilers.compilerWithOptions;
-import static dagger.internal.codegen.Compilers.daggerCompiler;
-import static dagger.internal.codegen.bindinggraphvalidation.NullableBindingValidator.nullableToNonNullable;
-
-import com.google.testing.compile.Compilation;
-import com.google.testing.compile.JavaFileObjects;
-import javax.tools.JavaFileObject;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public class NullableBindingValidationTest {
-  private static final JavaFileObject NULLABLE =
-      JavaFileObjects.forSourceLines(
-          "test.Nullable", // force one-string-per-line format
-          "package test;",
-          "",
-          "public @interface Nullable {}");
-
-  @Test public void nullCheckForConstructorParameters() {
-    JavaFileObject a = JavaFileObjects.forSourceLines("test.A",
-        "package test;",
-        "",
-        "import javax.inject.Inject;",
-        "",
-        "final class A {",
-        "  @Inject A(String string) {}",
-        "}");
-    JavaFileObject module = JavaFileObjects.forSourceLines("test.TestModule",
-        "package test;",
-        "",
-        "import dagger.Provides;",
-        "import javax.inject.Inject;",
-        "",
-        "@dagger.Module",
-        "final class TestModule {",
-        "  @Nullable @Provides String provideString() { return null; }",
-        "}");
-    JavaFileObject component = JavaFileObjects.forSourceLines("test.TestComponent",
-        "package test;",
-        "",
-        "import dagger.Component;",
-        "",
-        "@Component(modules = TestModule.class)",
-        "interface TestComponent {",
-        "  A a();",
-        "}");
-    Compilation compilation = daggerCompiler().compile(NULLABLE, a, module, component);
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            nullableToNonNullable(
-                "String",
-                "@Nullable @Provides String TestModule.provideString()"));
-
-    // but if we disable the validation, then it compiles fine.
-    Compilation compilation2 =
-        compilerWithOptions("-Adagger.nullableValidation=WARNING")
-            .compile(NULLABLE, a, module, component);
-    assertThat(compilation2).succeeded();
-  }
-
-  @Test public void nullCheckForMembersInjectParam() {
-    JavaFileObject a = JavaFileObjects.forSourceLines("test.A",
-        "package test;",
-        "",
-        "import javax.inject.Inject;",
-        "",
-        "final class A {",
-        "  @Inject A() {}",
-        "  @Inject void register(String string) {}",
-        "}");
-    JavaFileObject module = JavaFileObjects.forSourceLines("test.TestModule",
-        "package test;",
-        "",
-        "import dagger.Provides;",
-        "import javax.inject.Inject;",
-        "",
-        "@dagger.Module",
-        "final class TestModule {",
-        "  @Nullable @Provides String provideString() { return null; }",
-        "}");
-    JavaFileObject component = JavaFileObjects.forSourceLines("test.TestComponent",
-        "package test;",
-        "",
-        "import dagger.Component;",
-        "",
-        "@Component(modules = TestModule.class)",
-        "interface TestComponent {",
-        "  A a();",
-        "}");
-    Compilation compilation = daggerCompiler().compile(NULLABLE, a, module, component);
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            nullableToNonNullable(
-                "String",
-                "@Nullable @Provides String TestModule.provideString()"));
-
-    // but if we disable the validation, then it compiles fine.
-    Compilation compilation2 =
-        compilerWithOptions("-Adagger.nullableValidation=WARNING")
-            .compile(NULLABLE, a, module, component);
-    assertThat(compilation2).succeeded();
-  }
-
-  @Test public void nullCheckForVariable() {
-    JavaFileObject a = JavaFileObjects.forSourceLines("test.A",
-        "package test;",
-        "",
-        "import javax.inject.Inject;",
-        "",
-        "final class A {",
-        "  @Inject String string;",
-        "  @Inject A() {}",
-        "}");
-    JavaFileObject module = JavaFileObjects.forSourceLines("test.TestModule",
-        "package test;",
-        "",
-        "import dagger.Provides;",
-        "import javax.inject.Inject;",
-        "",
-        "@dagger.Module",
-        "final class TestModule {",
-        "  @Nullable @Provides String provideString() { return null; }",
-        "}");
-    JavaFileObject component = JavaFileObjects.forSourceLines("test.TestComponent",
-        "package test;",
-        "",
-        "import dagger.Component;",
-        "",
-        "@Component(modules = TestModule.class)",
-        "interface TestComponent {",
-        "  A a();",
-        "}");
-    Compilation compilation = daggerCompiler().compile(NULLABLE, a, module, component);
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            nullableToNonNullable(
-                "String",
-                "@Nullable @Provides String TestModule.provideString()"));
-
-    // but if we disable the validation, then it compiles fine.
-    Compilation compilation2 =
-        compilerWithOptions("-Adagger.nullableValidation=WARNING")
-            .compile(NULLABLE, a, module, component);
-    assertThat(compilation2).succeeded();
-  }
-
-  @Test public void nullCheckForComponentReturn() {
-    JavaFileObject module = JavaFileObjects.forSourceLines("test.TestModule",
-        "package test;",
-        "",
-        "import dagger.Provides;",
-        "import javax.inject.Inject;",
-        "",
-        "@dagger.Module",
-        "final class TestModule {",
-        "  @Nullable @Provides String provideString() { return null; }",
-        "}");
-    JavaFileObject component = JavaFileObjects.forSourceLines("test.TestComponent",
-        "package test;",
-        "",
-        "import dagger.Component;",
-        "",
-        "@Component(modules = TestModule.class)",
-        "interface TestComponent {",
-        "  String string();",
-        "}");
-    Compilation compilation = daggerCompiler().compile(NULLABLE, module, component);
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            nullableToNonNullable(
-                "String",
-                "@Nullable @Provides String TestModule.provideString()"));
-
-    // but if we disable the validation, then it compiles fine.
-    Compilation compilation2 =
-        compilerWithOptions("-Adagger.nullableValidation=WARNING")
-            .compile(NULLABLE, module, component);
-    assertThat(compilation2).succeeded();
-  }
-
-  @Test
-  public void nullCheckForOptionalInstance() {
-    JavaFileObject a =
-        JavaFileObjects.forSourceLines(
-            "test.A",
-            "package test;",
-            "",
-            "import com.google.common.base.Optional;",
-            "import javax.inject.Inject;",
-            "",
-            "final class A {",
-            "  @Inject A(Optional<String> optional) {}",
-            "}");
-    JavaFileObject module =
-        JavaFileObjects.forSourceLines(
-            "test.TestModule",
-            "package test;",
-            "",
-            "import dagger.BindsOptionalOf;",
-            "import dagger.Provides;",
-            "import javax.inject.Inject;",
-            "",
-            "@dagger.Module",
-            "abstract class TestModule {",
-            "  @Nullable @Provides static String provideString() { return null; }",
-            "  @BindsOptionalOf abstract String optionalString();",
-            "}");
-    JavaFileObject component =
-        JavaFileObjects.forSourceLines(
-            "test.TestComponent",
-            "package test;",
-            "",
-            "import dagger.Component;",
-            "",
-            "@Component(modules = TestModule.class)",
-            "interface TestComponent {",
-            "  A a();",
-            "}");
-    Compilation compilation = daggerCompiler().compile(NULLABLE, a, module, component);
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            nullableToNonNullable(
-                "String",
-                "@Nullable @Provides String TestModule.provideString()"));
-  }
-
-  @Test
-  public void nullCheckForOptionalProvider() {
-    JavaFileObject a =
-        JavaFileObjects.forSourceLines(
-            "test.A",
-            "package test;",
-            "",
-            "import com.google.common.base.Optional;",
-            "import javax.inject.Inject;",
-            "import javax.inject.Provider;",
-            "",
-            "final class A {",
-            "  @Inject A(Optional<Provider<String>> optional) {}",
-            "}");
-    JavaFileObject module =
-        JavaFileObjects.forSourceLines(
-            "test.TestModule",
-            "package test;",
-            "",
-            "import dagger.BindsOptionalOf;",
-            "import dagger.Provides;",
-            "import javax.inject.Inject;",
-            "",
-            "@dagger.Module",
-            "abstract class TestModule {",
-            "  @Nullable @Provides static String provideString() { return null; }",
-            "  @BindsOptionalOf abstract String optionalString();",
-            "}");
-    JavaFileObject component =
-        JavaFileObjects.forSourceLines(
-            "test.TestComponent",
-            "package test;",
-            "",
-            "import dagger.Component;",
-            "",
-            "@Component(modules = TestModule.class)",
-            "interface TestComponent {",
-            "  A a();",
-            "}");
-    Compilation compilation = daggerCompiler().compile(NULLABLE, a, module, component);
-    assertThat(compilation).succeeded();
-  }
-
-  @Test
-  public void nullCheckForOptionalLazy() {
-    JavaFileObject a =
-        JavaFileObjects.forSourceLines(
-            "test.A",
-            "package test;",
-            "",
-            "import com.google.common.base.Optional;",
-            "import dagger.Lazy;",
-            "import javax.inject.Inject;",
-            "",
-            "final class A {",
-            "  @Inject A(Optional<Lazy<String>> optional) {}",
-            "}");
-    JavaFileObject module =
-        JavaFileObjects.forSourceLines(
-            "test.TestModule",
-            "package test;",
-            "",
-            "import dagger.BindsOptionalOf;",
-            "import dagger.Provides;",
-            "import javax.inject.Inject;",
-            "",
-            "@dagger.Module",
-            "abstract class TestModule {",
-            "  @Nullable @Provides static String provideString() { return null; }",
-            "  @BindsOptionalOf abstract String optionalString();",
-            "}");
-    JavaFileObject component =
-        JavaFileObjects.forSourceLines(
-            "test.TestComponent",
-            "package test;",
-            "",
-            "import dagger.Component;",
-            "",
-            "@Component(modules = TestModule.class)",
-            "interface TestComponent {",
-            "  A a();",
-            "}");
-    Compilation compilation = daggerCompiler().compile(NULLABLE, a, module, component);
-    assertThat(compilation).succeeded();
-  }
-
-  @Test
-  public void nullCheckForOptionalProviderOfLazy() {
-    JavaFileObject a =
-        JavaFileObjects.forSourceLines(
-            "test.A",
-            "package test;",
-            "",
-            "import com.google.common.base.Optional;",
-            "import dagger.Lazy;",
-            "import javax.inject.Inject;",
-            "import javax.inject.Provider;",
-            "",
-            "final class A {",
-            "  @Inject A(Optional<Provider<Lazy<String>>> optional) {}",
-            "}");
-    JavaFileObject module =
-        JavaFileObjects.forSourceLines(
-            "test.TestModule",
-            "package test;",
-            "",
-            "import dagger.BindsOptionalOf;",
-            "import dagger.Provides;",
-            "import javax.inject.Inject;",
-            "",
-            "@dagger.Module",
-            "abstract class TestModule {",
-            "  @Nullable @Provides static String provideString() { return null; }",
-            "  @BindsOptionalOf abstract String optionalString();",
-            "}");
-    JavaFileObject component =
-        JavaFileObjects.forSourceLines(
-            "test.TestComponent",
-            "package test;",
-            "",
-            "import dagger.Component;",
-            "",
-            "@Component(modules = TestModule.class)",
-            "interface TestComponent {",
-            "  A a();",
-            "}");
-    Compilation compilation = daggerCompiler().compile(NULLABLE, a, module, component);
-    assertThat(compilation).succeeded();
-  }
-
-  @Test
-  public void moduleValidation() {
-    JavaFileObject module =
-        JavaFileObjects.forSourceLines(
-            "test.TestModule",
-            "package test;",
-            "",
-            "import dagger.Binds;",
-            "import dagger.Module;",
-            "import dagger.Provides;",
-            "",
-            "@Module",
-            "abstract class TestModule {",
-            "  @Provides @Nullable static String nullableString() { return null; }",
-            "  @Binds abstract Object object(String string);",
-            "}");
-
-    Compilation compilation =
-        compilerWithOptions("-Adagger.fullBindingGraphValidation=ERROR")
-            .compile(module, NULLABLE);
-    assertThat(compilation).failed();
-    assertThat(compilation)
-        .hadErrorContaining(
-            nullableToNonNullable(
-                "String",
-                "@Provides @Nullable String TestModule.nullableString()"));
-  }
-}
diff --git a/javatests/dagger/internal/codegen/langmodel/AccessibilityTest.java b/javatests/dagger/internal/codegen/langmodel/AccessibilityTest.java
deleted file mode 100644
index e9b81f3..0000000
--- a/javatests/dagger/internal/codegen/langmodel/AccessibilityTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2015 The Dagger Authors.
- *
- * 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 dagger.internal.codegen.langmodel;
-
-import static com.google.common.truth.Truth.assertThat;
-import static dagger.internal.codegen.langmodel.Accessibility.isElementAccessibleFrom;
-
-import com.google.testing.compile.CompilationRule;
-import javax.lang.model.element.Element;
-import javax.lang.model.element.TypeElement;
-import javax.lang.model.util.Elements;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-@SuppressWarnings("unused") // contains a variety things used by the compilation rule for testing
-public class AccessibilityTest {
-  /* test data */
-  public AccessibilityTest() {}
-  protected AccessibilityTest(Object o) {}
-  AccessibilityTest(Object o1, Object o2) {}
-  private AccessibilityTest(Object o1, Object o2, Object o3) {}
-
-  public String publicField;
-  protected String protectedField;
-  String packagePrivateField;
-  private String privateField;
-
-  public void publicMethod() {}
-  protected void protectedMethod() {}
-  void packagePrivateMethod() {}
-  private void privateMethod() {}
-
-  public static final class PublicNestedClass {}
-  protected static final class ProtectedNestedClass {}
-  static final class PackagePrivateNestedClass {}
-  private static final class PrivateNestedClass {}
-
-  @Rule
-  public final CompilationRule compilationRule = new CompilationRule();
-
-  private TypeElement testElement;
-
-  @Before
-  public void setUp() {
-    Elements elements = compilationRule.getElements();
-    testElement = elements.getTypeElement(AccessibilityTest.class.getCanonicalName());
-  }
-
-  @Test
-  public void isElementAccessibleFrom_publicType() {
-    assertThat(isElementAccessibleFrom(testElement, "literally.anything")).isTrue();
-  }
-
-  @Test
-  public void isElementAccessibleFrom_publicMethod() {
-    Element member = getMemberNamed("publicMethod");
-    assertThat(isElementAccessibleFrom(member, "literally.anything")).isTrue();
-  }
-
-  @Test
-  public void isElementAccessibleFrom_protectedMethod() {
-    Element member = getMemberNamed("protectedMethod");
-    assertThat(isElementAccessibleFrom(member, "dagger.internal.codegen")).isTrue();
-    assertThat(isElementAccessibleFrom(member, "not.dagger.internal.codegen")).isFalse();
-  }
-
-  @Test
-  public void isElementAccessibleFrom_packagePrivateMethod() {
-    Element member = getMemberNamed("packagePrivateMethod");
-    assertThat(isElementAccessibleFrom(member, "dagger.internal.codegen")).isTrue();
-    assertThat(isElementAccessibleFrom(member, "not.dagger.internal.codegen")).isFalse();
-  }
-
-  @Test
-  public void isElementAccessibleFrom_privateMethod() {
-    Element member = getMemberNamed( "privateMethod");
-    assertThat(isElementAccessibleFrom(member, "dagger.internal.codegen")).isFalse();
-    assertThat(isElementAccessibleFrom(member, "not.dagger.internal.codegen")).isFalse();
-  }
-
-  @Test
-  public void isElementAccessibleFrom_publicField() {
-    Element member = getMemberNamed("publicField");
-    assertThat(isElementAccessibleFrom(member, "literally.anything")).isTrue();
-  }
-
-  @Test
-  public void isElementAccessibleFrom_protectedField() {
-    Element member = getMemberNamed("protectedField");
-    assertThat(isElementAccessibleFrom(member, "dagger.internal.codegen")).isTrue();
-    assertThat(isElementAccessibleFrom(member, "not.dagger.internal.codegen")).isFalse();
-  }
-
-  @Test
-  public void isElementAccessibleFrom_packagePrivateField() {
-    Element member = getMemberNamed("packagePrivateField");
-    assertThat(isElementAccessibleFrom(member, "dagger.internal.codegen")).isTrue();
-    assertThat(isElementAccessibleFrom(member, "not.dagger.internal.codegen")).isFalse();
-  }
-
-  @Test
-  public void isElementAccessibleFrom_privateField() {
-    Element member = getMemberNamed("privateField");
-    assertThat(isElementAccessibleFrom(member, "dagger.internal.codegen")).isFalse();
-    assertThat(isElementAccessibleFrom(member, "not.dagger.internal.codegen")).isFalse();
-  }
-
-  private Element getMemberNamed(String memberName) {
-    for (Element enclosedElement : testElement.getEnclosedElements()) {
-      if (enclosedElement.getSimpleName().contentEquals(memberName)) {
-        return enclosedElement;
-      }
-    }
-    throw new IllegalArgumentException();
-  }
-}
-
diff --git a/javatests/dagger/internal/codegen/validation/BUILD b/javatests/dagger/internal/codegen/validation/BUILD
deleted file mode 100644
index 03fd684..0000000
--- a/javatests/dagger/internal/codegen/validation/BUILD
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright (C) 2020 The Dagger Authors.
-#
-# 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.
-
-# Description:
-#   Tests for dagger.internal.codegen.validation
-
-load("//:build_defs.bzl", "DOCLINT_HTML_AND_SYNTAX")
-load("//:test_defs.bzl", "GenJavaTests")
-
-package(default_visibility = ["//:src"])
-
-GenJavaTests(
-    name = "validation_tests",
-    srcs = glob(["*.java"]),
-    functional = False,
-    javacopts = DOCLINT_HTML_AND_SYNTAX,
-    deps = [
-        "//java/dagger/internal/codegen/validation",
-        "@google_bazel_common//third_party/java/junit",
-        "@google_bazel_common//third_party/java/truth",
-    ],
-)
diff --git a/javatests/dagger/internal/codegen/validation/PackageNameCompressorTest.java b/javatests/dagger/internal/codegen/validation/PackageNameCompressorTest.java
deleted file mode 100644
index f6a1b79..0000000
--- a/javatests/dagger/internal/codegen/validation/PackageNameCompressorTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2020 The Dagger Authors.
- *
- * 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 dagger.internal.codegen.validation;
-
-import static com.google.common.truth.Truth.assertThat;
-import static dagger.internal.codegen.validation.PackageNameCompressor.LEGEND_FOOTER;
-import static dagger.internal.codegen.validation.PackageNameCompressor.LEGEND_HEADER;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for {@link PackageNameCompressor}. */
-@RunWith(JUnit4.class)
-public class PackageNameCompressorTest {
-  @Test
-  public void testSimple() {
-    String input = "Something is wrong with foo.bar.baz.Foo class!";
-    String expectedOutput = "Something is wrong with Foo class!"
-        + LEGEND_HEADER
-        + "Foo: foo.bar.baz.Foo\n"
-        + LEGEND_FOOTER;
-    assertThat(PackageNameCompressor.compressPackagesInMessage(input)).isEqualTo(expectedOutput);
-  }
-
-  @Test
-  public void testSameSimpleNames() {
-    String input = "Something is wrong with foo.bar.baz.Foo and foo.bar.qux.Foo class!";
-    String expectedOutput = "Something is wrong with baz.Foo and qux.Foo class!"
-        + LEGEND_HEADER
-        + "baz.Foo: foo.bar.baz.Foo\n"
-        + "qux.Foo: foo.bar.qux.Foo\n"
-        + LEGEND_FOOTER;
-    assertThat(PackageNameCompressor.compressPackagesInMessage(input)).isEqualTo(expectedOutput);
-  }
-
-  @Test
-  public void testMethodNames() {
-    String input = "Something is wrong with foo.bar.baz.Foo.provideFoo()!";
-    String expectedOutput = "Something is wrong with Foo.provideFoo()!"
-        + LEGEND_HEADER
-        + "Foo: foo.bar.baz.Foo\n"
-        + LEGEND_FOOTER;
-    assertThat(PackageNameCompressor.compressPackagesInMessage(input)).isEqualTo(expectedOutput);
-  }
-
-  @Test
-  public void testMultipleLevelsOfConflicts() {
-    String input = "Something is wrong with z.a.b.c.Foo, z.b.b.c.Foo, z.a.b.d.Foo class!";
-    String expectedOutput = "Something is wrong with a.b.c.Foo, b.b.c.Foo, d.Foo class!"
-        + LEGEND_HEADER
-        + "a.b.c.Foo: z.a.b.c.Foo\n"
-        + "b.b.c.Foo: z.b.b.c.Foo\n"
-        + "d.Foo:     z.a.b.d.Foo\n"
-        + LEGEND_FOOTER;
-    assertThat(PackageNameCompressor.compressPackagesInMessage(input)).isEqualTo(expectedOutput);
-  }
-
-  // In some sense, we're really just compressing the outer class since the legend is going to
-  // only refer to the outer class.
-  @Test
-  public void testInnerClassesKeepOuterClassNameToo() {
-    String input = "Something is wrong with foo.bar.baz.Foo.Bar.Baz class!";
-    String expectedOutput = "Something is wrong with Foo.Bar.Baz class!"
-        + LEGEND_HEADER
-        + "Foo: foo.bar.baz.Foo\n"
-        + LEGEND_FOOTER;
-    assertThat(PackageNameCompressor.compressPackagesInMessage(input)).isEqualTo(expectedOutput);
-  }
-
-  // If relying on conflicts by inserting into the map, an extra conflict on c.Foo may result in
-  // uneven renaming because when the first two conflict on c.Foo they may make room for the next
-  // conflict to just take over what had previously been a conflict. Make sure that this unevenness
-  // doesn't happen.
-  @Test
-  public void testThreeMultiLevelConflicts() {
-    String input = "Something is wrong with z.a.c.Foo, z.b.c.Foo, and z.c.c.Foo class!";
-    String expectedOutput = "Something is wrong with a.c.Foo, b.c.Foo, and c.c.Foo class!"
-        + LEGEND_HEADER
-        + "a.c.Foo: z.a.c.Foo\n"
-        + "b.c.Foo: z.b.c.Foo\n"
-        + "c.c.Foo: z.c.c.Foo\n"
-        + LEGEND_FOOTER;
-    assertThat(PackageNameCompressor.compressPackagesInMessage(input)).isEqualTo(expectedOutput);
-  }
-
-  @Test
-  public void testDoesNotCompressSubstringsOfClasses() {
-    // This shouldn't try to compress the "ar.Foo" in "Bar.Foo"
-    String input = "Something is wrong with Bar.Foo class!";
-    assertThat(PackageNameCompressor.compressPackagesInMessage(input)).isEqualTo(input);
-  }
-
-  @Test
-  public void testNoClassNamesDoNotPutInLegend() {
-    String input = "Something is wrong with something!";
-    assertThat(PackageNameCompressor.compressPackagesInMessage(input)).isEqualTo(input);
-  }
-
-  @Test
-  public void testFullConflictsDoNotPutInLegend() {
-    String input = "Something is wrong with foo.Foo and bar.Foo class!";
-    // No shortening can be done without loss of clarity so do not modify this and add no legend.
-    assertThat(PackageNameCompressor.compressPackagesInMessage(input)).isEqualTo(input);
-  }
-
-  @Test
-  public void testLegendDoesNotIncludeJavaLang() {
-    String input = "Something is wrong with java.lang.Set, java.lang.a.Foo,"
-        + " and java.lang.b.Foo class!";
-    String expectedOutput = "Something is wrong with Set, a.Foo, and b.Foo class!"
-        + LEGEND_HEADER
-        + "a.Foo: java.lang.a.Foo\n"
-        + "b.Foo: java.lang.b.Foo\n"
-        + LEGEND_FOOTER;
-    assertThat(PackageNameCompressor.compressPackagesInMessage(input)).isEqualTo(expectedOutput);
-  }
-
-  @Test
-  public void testOnlyExcludedPrefixesDoesNotPutInLegend() {
-    String input = "Something is wrong with java.lang.Set class!";
-    String expectedOutput = "Something is wrong with Set class!";
-    assertThat(PackageNameCompressor.compressPackagesInMessage(input)).isEqualTo(expectedOutput);
-  }
-}
diff --git a/test_defs.bzl b/test_defs.bzl
index 6f23088..d16ad36 100644
--- a/test_defs.bzl
+++ b/test_defs.bzl
@@ -59,21 +59,11 @@
         test_javacopts = None,
         functional = True,
         manifest_values = None):
-    deps = (deps or []) + ["//:android_local_test_exports"]
-    _GenTests(
-        native.android_library,
-        native.android_local_test,
-        name,
-        srcs,
-        deps,
-        test_only_deps,
-        plugins,
-        javacopts,
-        lib_javacopts,
-        test_javacopts,
-        functional,
-        test_kwargs = {"manifest_values": manifest_values},
-    )
+    # TODO(ronshapiro): enable these with these instructions:
+    # https://docs.bazel.build/versions/master/be/android.html#android_local_test_examples
+    # We probably want to import all of Robolectric's dependencies into bazel-common because there
+    # are some differences (i.e. we both provide Guava).
+    pass
 
 def _GenTests(
         library_rule_type,
diff --git a/util/deploy-to-maven-central.sh b/util/deploy-to-maven-central.sh
index 1a71f5f..de2b49c 100755
--- a/util/deploy-to-maven-central.sh
+++ b/util/deploy-to-maven-central.sh
@@ -22,6 +22,21 @@
 
 bash $(dirname $0)/run-local-tests.sh
 
+# Note: we detach from head before making any sed changes to avoid commiting
+# a particular version to master. This sed change used to be done at the very
+# end of the script, but with the introduction of "-alpha" to the Hilt
+# artifacts, we need to do the sed replacement before deploying the artifacts to
+# maven. Note, that this sed replacement is only done for versioned releases.
+# HEAD-SNAPSHOT and LOCAL_SNAPSHOT versions of Hilt artifacts do not contain
+# "-alpha".
+git checkout --detach
+
+# Set the version string that is used as a tag in all of our libraries. If
+# another repo depends on a versioned tag of Dagger, their java_library.tags
+# should match the versioned release.
+sed -i s/'#ALPHA_POSTFIX'/'+ "-alpha"'/g build_defs.bzl
+sed -i s/'${project.version}'/"${VERSION_NAME}"/g build_defs.bzl
+
 bash $(dirname $0)/deploy-dagger.sh \
   "gpg:sign-and-deploy-file" \
   "$VERSION_NAME" \
@@ -31,20 +46,11 @@
 
 bash $(dirname $0)/deploy-hilt.sh \
   "gpg:sign-and-deploy-file" \
-  "$VERSION_NAME" \
+  "${VERSION_NAME}-alpha" \
   "-DrepositoryId=sonatype-nexus-staging" \
   "-Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/" \
   "-Dgpg.keyname=${KEY}"
 
-# Note: we detach from head before making any sed changes to avoid commiting
-# a particular version to master.
-git checkout --detach
-
-# Set the version string that is used as a tag in all of our libraries. If
-# another repo depends on a versioned tag of Dagger, their java_library.tags
-# should match the versioned release.
-sed -i s/'${project.version}'/"${VERSION_NAME}"/g build_defs.bzl
-
 # Note: We avoid commiting until after deploying in case deploying fails and
 # we need to run the script again.
 git commit -m "${VERSION_NAME} release" build_defs.bzl
diff --git a/util/run-local-emulator-tests.sh b/util/run-local-emulator-tests.sh
index 347a632..7fc7762 100755
--- a/util/run-local-emulator-tests.sh
+++ b/util/run-local-emulator-tests.sh
@@ -2,23 +2,17 @@
 
 set -ex
 
-# Instrumentation tests log results to logcat, so enable it during test runs.
-adb logcat *:S TestRunner:V & LOGCAT_PID=$!
-
 readonly GRADLE_PROJECTS=(
     "javatests/artifacts/hilt-android/simple"
     "javatests/artifacts/hilt-android/simpleKotlin"
 )
 for project in "${GRADLE_PROJECTS[@]}"; do
     echo "Running gradle Android emulator tests for $project"
-    ./$project/gradlew -p $project connectedAndroidTest --continue --no-daemon --stacktrace
+    ./$project/gradlew -p $project connectedAndroidTest --no-daemon --stacktrace
 done
 
 # Run emulator tests in a project with configuration cache enabled
 # TODO(danysantiago): Once AGP 4.2.0 is stable, remove these project and enable
 # config cache in the other test projects.
 readonly CONFIG_CACHE_PROJECT="javatests/artifacts/hilt-android/gradleConfigCache"
-./$CONFIG_CACHE_PROJECT/gradlew -p $CONFIG_CACHE_PROJECT connectedAndroidTest --continue --no-daemon --stacktrace --configuration-cache
-
-# Close logcat
-if [ -n "$LOGCAT_PID" ] ; then kill $LOGCAT_PID; fi
+./$CONFIG_CACHE_PROJECT/gradlew -p $CONFIG_CACHE_PROJECT connectedAndroidTest --no-daemon --stacktrace --configuration-cache
diff --git a/util/run-local-gradle-android-tests.sh b/util/run-local-gradle-android-tests.sh
index a9418a5..ba51078 100755
--- a/util/run-local-gradle-android-tests.sh
+++ b/util/run-local-gradle-android-tests.sh
@@ -12,7 +12,7 @@
 for project in "${ANDROID_GRADLE_PROJECTS[@]}"; do
     echo "Running gradle tests for $project with AGP $AGP_VERSION_INPUT"
     AGP_VERSION=$AGP_VERSION_INPUT ./$project/gradlew -p $project buildDebug --no-daemon --stacktrace
-    AGP_VERSION=$AGP_VERSION_INPUT ./$project/gradlew -p $project testDebug  --continue --no-daemon --stacktrace
+    AGP_VERSION=$AGP_VERSION_INPUT ./$project/gradlew -p $project testDebug --no-daemon --stacktrace
 done
 
 # Run gradle tests in a project with configuration cache enabled
diff --git a/util/run-local-gradle-tests.sh b/util/run-local-gradle-tests.sh
index 479158d..b88ccab 100755
--- a/util/run-local-gradle-tests.sh
+++ b/util/run-local-gradle-tests.sh
@@ -10,5 +10,5 @@
 for project in "${GRADLE_PROJECTS[@]}"; do
     echo "Running gradle tests for $project"
     ./$project/gradlew -p $project build --no-daemon --stacktrace
-    ./$project/gradlew -p $project test  --continue --no-daemon --stacktrace
+    ./$project/gradlew -p $project test --no-daemon --stacktrace
 done
diff --git a/workspace_defs.bzl b/workspace_defs.bzl
index 2a63e43..c017b76 100644
--- a/workspace_defs.bzl
+++ b/workspace_defs.bzl
@@ -14,10 +14,10 @@
 
 """A macro to configure Dagger deps within a workspace"""
 
-load("//:build_defs.bzl", "POM_VERSION")
+load("//:build_defs.bzl", "POM_VERSION", "POM_VERSION_ALPHA")
 
 _DAGGER_VERSION = POM_VERSION
-_HILT_VERSION = POM_VERSION
+_HILT_VERSION = POM_VERSION_ALPHA
 
 DAGGER_ARTIFACTS = [
     "com.google.dagger:dagger:" + _DAGGER_VERSION,
