Add BUILD files for all of src/[main/test]/.../build/lib/bazel.

Fixing Bazel required also splitting up the main dir. This required a single
Java change to break a dependency cycle between pipline and parse in the ninja
code.  I split NinjaPipeline and NinjaParser into impl/interface allowing the
cycle to be broken.

RELNOTES: None.
PiperOrigin-RevId: 305073498
diff --git a/src/BUILD b/src/BUILD
index 92dd6f4..5758d38 100644
--- a/src/BUILD
+++ b/src/BUILD
@@ -11,7 +11,7 @@
 [genrule(
     name = "install_base_key-file" + suffix,
     srcs = [
-        "//src/main/java/com/google/devtools/build/lib:bazel/BazelServer_deploy.jar",
+        "//src/main/java/com/google/devtools/build/lib/bazel:BazelServer_deploy.jar",
         "//src/main/cpp:client",
         "//src/main/tools:build-runfiles",
         "//src/main/tools:process-wrapper",
@@ -324,7 +324,7 @@
         # The script assumes that the embedded tools zip (if exists) is the
         # first item here, the deploy jar the second, install base key is the
         # third, and platforms archive is the fourth.
-        "//src/main/java/com/google/devtools/build/lib:bazel/BazelServer_deploy.jar",
+        "//src/main/java/com/google/devtools/build/lib/bazel:BazelServer_deploy.jar",
         "install_base_key" + suffix,
         ":platforms_archive",
         "//src/main/native:target-os-unix-native-lib",
diff --git a/src/main/java/com/google/devtools/build/docgen/BUILD b/src/main/java/com/google/devtools/build/docgen/BUILD
index f8941fb..cf08d89 100644
--- a/src/main/java/com/google/devtools/build/docgen/BUILD
+++ b/src/main/java/com/google/devtools/build/docgen/BUILD
@@ -60,7 +60,7 @@
     srcs = ["BuildEncyclopediaGenerator.java"],
     main_class = "com.google.devtools.build.docgen.BuildEncyclopediaGenerator",
     runtime_deps = [
-        "//src/main/java/com/google/devtools/build/lib:bazel-rules",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules",
     ],
     deps = [
         ":docgen_javalib",
@@ -74,7 +74,7 @@
     srcs = ["SkylarkDocumentationGenerator.java"],
     main_class = "com.google.devtools.build.docgen.SkylarkDocumentationGenerator",
     runtime_deps = [
-        "//src/main/java/com/google/devtools/build/lib:bazel-repository",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository",
     ],
     deps = [":docgen_javalib"],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 9882c3f..fb9d374 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -1,4 +1,4 @@
-load("@rules_java//java:defs.bzl", "java_binary", "java_library")
+load("@rules_java//java:defs.bzl", "java_library")
 load(":merge_licenses.bzl", "merge_licenses")
 
 ########################################################################
@@ -39,15 +39,12 @@
         "//src/main/java/com/google/devtools/build/lib/analysis/skylark/annotations/processor:srcs",
         "//src/main/java/com/google/devtools/build/lib/analysis/skylark/annotations:srcs",
         "//src/main/java/com/google/devtools/build/lib/authandtls:srcs",
-        "//src/main/java/com/google/devtools/build/lib/bazel/debug:srcs",
-        "//src/main/java/com/google/devtools/build/lib/bazel/execlog:srcs",
-        "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache:srcs",
-        "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel:srcs",
         "//src/main/java/com/google/devtools/build/lib/buildeventservice/client:srcs",
         "//src/main/java/com/google/devtools/build/lib/buildeventservice:srcs",
         "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:srcs",
-        "//src/main/java/com/google/devtools/build/lib/buildeventstream:srcs",
         "//src/main/java/com/google/devtools/build/lib/buildeventstream/transports:srcs",
+        "//src/main/java/com/google/devtools/build/lib/buildeventstream:srcs",
         "//src/main/java/com/google/devtools/build/lib/causes:srcs",
         "//src/main/java/com/google/devtools/build/lib/clock:srcs",
         "//src/main/java/com/google/devtools/build/lib/cmdline:srcs",
@@ -77,8 +74,8 @@
         "//src/main/java/com/google/devtools/build/lib/remote:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/android:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/apple/cpp:srcs",
-        "//src/main/java/com/google/devtools/build/lib/rules/apple:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/apple/swift:srcs",
+        "//src/main/java/com/google/devtools/build/lib/rules/apple:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/config:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/cpp/proto:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/cpp:srcs",
@@ -366,310 +363,6 @@
     ],
 )
 
-java_library(
-    name = "bazel-ninja",
-    srcs = glob(["bazel/rules/ninja/**/*.java"]),
-    deps = [
-        ":transitive-info-provider",
-        "//src/main/java/com/google/devtools/build/lib:build-base",
-        "//src/main/java/com/google/devtools/build/lib:runtime",
-        "//src/main/java/com/google/devtools/build/lib/actions",
-        "//src/main/java/com/google/devtools/build/lib/cmdline",
-        "//src/main/java/com/google/devtools/build/lib/collect",
-        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
-        "//src/main/java/com/google/devtools/build/lib/concurrent",
-        "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
-        "//src/main/java/com/google/devtools/build/lib/packages:starlark_semantics_options",
-        "//src/main/java/com/google/devtools/build/lib/packages:type",
-        # TODO(cparsons): Refactor input discovery to a common directory so as not to depend
-        # on cpp rules.
-        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
-        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
-        "//src/main/java/com/google/devtools/build/lib/util",
-        "//src/main/java/com/google/devtools/build/lib/util:filetype",
-        "//src/main/java/com/google/devtools/build/lib/vfs",
-        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
-        "//src/main/java/com/google/devtools/build/skyframe",
-        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
-        "//third_party:guava",
-        "//third_party:jsr305",
-    ],
-)
-
-java_library(
-    name = "bazel-rules",
-    srcs = glob(
-        [
-            "bazel/rules/**/*.java",
-            "bazel/rules/ninja/**/*.java",
-        ],
-        exclude = [
-            "bazel/rules/workspace/*.java",
-        ],
-    ),
-    resources = glob(
-        [
-            "bazel/rules/**/*.txt",
-            "bazel/rules/**/*.WORKSPACE",
-        ],
-    ),
-    deps = [
-        ":bazel",
-        ":bazel-repository",
-        ":build-base",
-        ":build-info",
-        ":core-rules",
-        ":core-workspace-rules",
-        ":testing-support-rules",
-        "//src/main/java/com/google/devtools/build/lib/actions",
-        "//src/main/java/com/google/devtools/build/lib/analysis/platform",
-        "//src/main/java/com/google/devtools/build/lib/cmdline",
-        "//src/main/java/com/google/devtools/build/lib/collect",
-        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
-        "//src/main/java/com/google/devtools/build/lib/concurrent",
-        "//src/main/java/com/google/devtools/build/lib/events",
-        "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
-        "//src/main/java/com/google/devtools/build/lib/packages:starlark_semantics_options",
-        "//src/main/java/com/google/devtools/build/lib/packages:type",
-        "//src/main/java/com/google/devtools/build/lib/remote",
-        "//src/main/java/com/google/devtools/build/lib/remote/options",
-        "//src/main/java/com/google/devtools/build/lib/rules/android",
-        "//src/main/java/com/google/devtools/build/lib/rules/config",
-        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
-        "//src/main/java/com/google/devtools/build/lib/rules/cpp/proto:CcProtoLibrary",
-        "//src/main/java/com/google/devtools/build/lib/rules/genquery",
-        "//src/main/java/com/google/devtools/build/lib/rules/genrule",
-        "//src/main/java/com/google/devtools/build/lib/rules/java:RpcSupport",
-        "//src/main/java/com/google/devtools/build/lib/rules/java:java-compilation",
-        "//src/main/java/com/google/devtools/build/lib/rules/java:java-rules",
-        "//src/main/java/com/google/devtools/build/lib/rules/objc",
-        "//src/main/java/com/google/devtools/build/lib/rules/platform",
-        "//src/main/java/com/google/devtools/build/lib/rules/proto",
-        "//src/main/java/com/google/devtools/build/lib/rules/python",
-        "//src/main/java/com/google/devtools/build/lib/shell",
-        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
-        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android",
-        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp",
-        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java",
-        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto",
-        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python",
-        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
-        "//src/main/java/com/google/devtools/build/lib/util",
-        "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
-        "//src/main/java/com/google/devtools/build/lib/util:exit_code",
-        "//src/main/java/com/google/devtools/build/lib/util:filetype",
-        "//src/main/java/com/google/devtools/build/lib/util:os",
-        "//src/main/java/com/google/devtools/build/lib/util:shell_escaper",
-        "//src/main/java/com/google/devtools/build/lib/vfs",
-        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
-        "//src/main/java/com/google/devtools/build/skyframe",
-        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
-        "//src/main/java/com/google/devtools/common/options",
-        "//src/main/protobuf:crosstool_config_java_proto",
-        "//third_party:android_common_25_0_0_lite",
-        "//third_party:auto_value",
-        "//third_party:guava",
-        "//third_party:jsr305",
-    ],
-)
-
-java_library(
-    name = "bazel/BazelRepositoryModule",
-    srcs = ["bazel/BazelRepositoryModule.java"],
-    deps = [
-        ":bazel-commands",
-        ":bazel-repository",
-        ":bazel-rules",
-        ":build-base",
-        ":runtime",
-        "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache",
-        "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
-        "//src/main/java/com/google/devtools/build/lib/cmdline",
-        "//src/main/java/com/google/devtools/build/lib/events",
-        "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/pkgcache",
-        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository",
-        "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
-        "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
-        "//src/main/java/com/google/devtools/build/lib/vfs",
-        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
-        "//src/main/java/com/google/devtools/common/options:options_internal",
-        "//src/main/protobuf:failure_details_java_proto",
-        "//third_party:guava",
-    ],
-)
-
-java_library(
-    name = "bazel-main",
-    srcs = ["bazel/Bazel.java"],
-    resources = [
-        "bazel/rules/java/java_stub_template.txt",
-        "bazel/rules/python/python_stub_template.txt",
-    ],
-    deps = [
-        ":bazel",
-        ":bazel-coverage",
-        ":bazel-modules",
-        ":bazel-repository",
-        ":bazel-rules",
-        ":bazel/BazelRepositoryModule",
-        ":build-base",
-        "//src/main/java/com/google/devtools/build/lib/bazel/debug:workspace-rule-module",
-        "//src/main/java/com/google/devtools/build/lib/buildeventservice",
-        "//src/main/java/com/google/devtools/build/lib/collect/nestedset:options",
-        "//src/main/java/com/google/devtools/build/lib/dynamic",
-        "//src/main/java/com/google/devtools/build/lib/metrics:metrics_module",
-        "//src/main/java/com/google/devtools/build/lib/network:noop_connectivity",
-        "//src/main/java/com/google/devtools/build/lib/outputfilter",
-        "//src/main/java/com/google/devtools/build/lib/platform:sleep_prevention_module",
-        "//src/main/java/com/google/devtools/build/lib/profiler/callcounts:callcounts_module",
-        "//src/main/java/com/google/devtools/build/lib/profiler/memory:allocationtracker_module",
-        "//src/main/java/com/google/devtools/build/lib/remote",
-        "//src/main/java/com/google/devtools/build/lib/sandbox",
-        "//src/main/java/com/google/devtools/build/lib/skylarkdebug/module",
-        "//src/main/java/com/google/devtools/build/lib/ssd",
-        "//src/main/java/com/google/devtools/build/lib/standalone",
-        "//src/main/java/com/google/devtools/build/lib/worker",
-        "//third_party:guava",
-    ],
-)
-
-java_library(
-    name = "bazel-modules",
-    srcs = glob(
-        ["bazel/*.java"],
-        exclude = [
-            "bazel/Bazel.java",
-            "bazel/BazelRepositoryModule.java",
-        ],
-    ),
-    deps = [
-        ":build-base",
-        ":build-info",
-        ":runtime",
-        "//src/main/java/com/google/devtools/build/lib/actions",
-        "//src/main/java/com/google/devtools/build/lib/bazel/execlog:stable_sort",
-        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
-        "//src/main/java/com/google/devtools/build/lib/events",
-        "//src/main/java/com/google/devtools/build/lib/remote/options",
-        "//src/main/java/com/google/devtools/build/lib/shell",
-        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
-        "//src/main/java/com/google/devtools/build/lib/util",
-        "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
-        "//src/main/java/com/google/devtools/build/lib/util:command",
-        "//src/main/java/com/google/devtools/build/lib/util:exit_code",
-        "//src/main/java/com/google/devtools/build/lib/util/io",
-        "//src/main/java/com/google/devtools/build/lib/vfs",
-        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
-        "//src/main/java/com/google/devtools/common/options",
-        "//third_party:guava",
-    ],
-)
-
-java_library(
-    name = "bazel-commands",
-    srcs = glob(["bazel/commands/*.java"]),
-    resources = [
-        "bazel/commands/fetch.txt",
-        "bazel/commands/sync.txt",
-    ],
-    deps = [
-        ":bazel-repository",
-        ":build-base",
-        ":keep-going-option",
-        ":loading-phase-threads-option",
-        ":runtime",
-        "//src/main/java/com/google/devtools/build/lib/cmdline",
-        "//src/main/java/com/google/devtools/build/lib/events",
-        "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/pkgcache",
-        "//src/main/java/com/google/devtools/build/lib/query2/common:abstract-blaze-query-env",
-        "//src/main/java/com/google/devtools/build/lib/query2/engine",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
-        "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
-        "//src/main/java/com/google/devtools/build/lib/util:exit_code",
-        "//src/main/java/com/google/devtools/build/lib/vfs",
-        "//src/main/java/com/google/devtools/build/skyframe",
-        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
-        "//src/main/java/com/google/devtools/common/options",
-        "//third_party:guava",
-    ],
-)
-
-java_library(
-    name = "bazel-coverage",
-    srcs = glob(["bazel/coverage/*.java"]),
-    deps = [
-        ":build-base",
-        ":runtime",
-        "//src/main/java/com/google/devtools/build/lib/actions",
-        "//src/main/java/com/google/devtools/build/lib/actions:localhost_capacity",
-        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
-        "//src/main/java/com/google/devtools/build/lib/concurrent",
-        "//src/main/java/com/google/devtools/build/lib/events",
-        "//src/main/java/com/google/devtools/build/lib/util",
-        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
-        "//src/main/java/com/google/devtools/common/options",
-        "//third_party:auto_value",
-        "//third_party:guava",
-        "//third_party:jsr305",
-    ],
-)
-
-java_library(
-    name = "bazel-repository",
-    srcs = glob(
-        [
-            "bazel/repository/**/*.java",
-            "bazel/rules/workspace/*.java",
-        ],
-    ),
-    resources = [
-        "bazel/repository/local_config_platform.WORKSPACE",
-    ],
-    deps = [
-        ":build-base",
-        ":runtime",
-        "//src/java_tools/singlejar/java/com/google/devtools/build/zip",
-        "//src/main/java/com/google/devtools/build/lib/actions",
-        "//src/main/java/com/google/devtools/build/lib/bazel/debug:workspace-rule-event",
-        "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache",
-        "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache:events",
-        "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
-        "//src/main/java/com/google/devtools/build/lib/cmdline",
-        "//src/main/java/com/google/devtools/build/lib/concurrent",
-        "//src/main/java/com/google/devtools/build/lib/events",
-        "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/packages:type",
-        "//src/main/java/com/google/devtools/build/lib/pkgcache",
-        "//src/main/java/com/google/devtools/build/lib/profiler",
-        "//src/main/java/com/google/devtools/build/lib/shell",
-        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
-        "//src/main/java/com/google/devtools/build/lib/util",
-        "//src/main/java/com/google/devtools/build/lib/util:os",
-        "//src/main/java/com/google/devtools/build/lib/util:string",
-        "//src/main/java/com/google/devtools/build/lib/util/io",
-        "//src/main/java/com/google/devtools/build/lib/util/io:out-err",
-        "//src/main/java/com/google/devtools/build/lib/vfs",
-        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
-        "//src/main/java/com/google/devtools/build/skyframe",
-        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
-        "//src/main/java/com/google/devtools/common/options",
-        "//third_party:apache_commons_compress",
-        "//third_party:auto_value",
-        "//third_party:diffutils",
-        "//third_party:guava",
-        "//third_party:jsr305",
-        "//third_party:xz",
-    ],
-)
-
 # Rules
 java_library(
     name = "nativedeps-rules",
@@ -965,21 +658,12 @@
 )
 
 java_library(
-    name = "bazel",
-    resources = [
-        ":runtime/commands/LICENSE",
-    ],
-    exports = [":runtime"],
-)
-
-java_library(
     name = "all-build-rules",
     exports = [
         ":build-base",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/graph",
-        "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/rules/objc",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/vfs",
@@ -996,6 +680,7 @@
         ":foundation",
         ":query2",
         "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/packages",
     ],
 )
 
@@ -1021,36 +706,22 @@
     ],
 )
 
-java_binary(
-    name = "bazel/BazelServer",
-    javacopts = [
-        "-Xlint:all",
-        "-Xlint:-path",
-    ],
-    main_class = "com.google.devtools.build.lib.bazel.Bazel",
-    runtime_deps = [
-        ":bazel-main",
-        ":server",
-        "//src/main/java/com/google/devtools/build/lib/util:simple_log_handler",  # See startup_options.cc
-        "//src/main/java/com/google/devtools/build/lib/util:single_line_formatter",  # See startup_options.cc
-    ],
-)
-
 filegroup(
     name = "docs_embedded_in_sources",
     srcs = glob(["**/*.java"]) + [
-        "//src/main/java/com/google/devtools/build/lib/rules/apple:srcs",
+        "//src/main/java/com/google/devtools/build/lib/analysis/platform:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/apple/cpp:srcs",
+        "//src/main/java/com/google/devtools/build/lib/rules/apple:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/config:srcs",
-        "//src/main/java/com/google/devtools/build/lib/rules/cpp:srcs",
-        "//src/main/java/com/google/devtools/build/lib/rules/java:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/cpp/proto:srcs",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/genquery:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/genrule:srcs",
+        "//src/main/java/com/google/devtools/build/lib/rules/java:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/objc:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/platform:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/proto:srcs",
-        "//src/main/java/com/google/devtools/build/lib/analysis/platform:srcs",
     ],
 )
 
@@ -1087,14 +758,14 @@
     cmd = (
         "cat $(location //site:command-line-reference-prefix.html) > $@ && " +
         "TMP=`mktemp -d /tmp/tmp.XXXXXXXXXX` && " +
-        "$(location :bazel/BazelServer) " +
+        "$(location //src/main/java/com/google/devtools/build/lib/bazel:BazelServer) " +
         "--jvm_flag=-Dio.bazel.EnableJni=0 --batch " +
         "--install_base=$${TMP} --output_base=$${TMP}/output/ --output_user_root=$${TMP} " +
         "help everything-as-html >> $@ 2>/dev/null && " +
         "cat $(location //site:command-line-reference-suffix.html) >> $@"
     ),
     tools = [
-        ":bazel/BazelServer",
+        "//src/main/java/com/google/devtools/build/lib/bazel:BazelServer",
     ],
     visibility = [
         "//site:__pkg__",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/BUILD
new file mode 100644
index 0000000..9059749
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/BUILD
@@ -0,0 +1,133 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]) + [
+        "//src/main/java/com/google/devtools/build/lib/bazel/commands:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/coverage:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/debug:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/execlog:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules:srcs",
+    ],
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "repository_module",
+    srcs = ["BazelRepositoryModule.java"],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib/bazel/commands",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/skylark",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/pkgcache",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository",
+        "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
+        "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/com/google/devtools/common/options",
+        "//src/main/protobuf:failure_details_java_proto",
+        "//third_party:guava",
+    ],
+)
+
+java_library(
+    name = "builtin_command_module",
+    srcs = ["BazelBuiltinCommandModule.java"],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:runtime",
+    ],
+)
+
+java_library(
+    name = "modules",
+    srcs = [
+        "BazelDiffAwarenessModule.java",
+        "BazelStartupOptionsModule.java",
+        "BazelWorkspaceStatusModule.java",
+        "SpawnLogModule.java",
+    ],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:build-info",
+        "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/execlog:stable_sort",
+        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/remote/options",
+        "//src/main/java/com/google/devtools/build/lib/shell",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
+        "//src/main/java/com/google/devtools/build/lib/util:command",
+        "//src/main/java/com/google/devtools/build/lib/util:exit_code",
+        "//src/main/java/com/google/devtools/build/lib/util/io",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/com/google/devtools/common/options",
+        "//third_party:guava",
+    ],
+)
+
+java_library(
+    name = "main",
+    srcs = ["Bazel.java"],
+    deps = [
+        ":builtin_command_module",
+        ":modules",
+        ":repository_module",
+        "//src/main/java/com/google/devtools/build/lib:blaze-version-info",
+        "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib/bazel/coverage",
+        "//src/main/java/com/google/devtools/build/lib/bazel/debug:workspace-rule-module",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/skylark",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions",
+        "//src/main/java/com/google/devtools/build/lib/buildeventservice",
+        "//src/main/java/com/google/devtools/build/lib/collect/nestedset:options",
+        "//src/main/java/com/google/devtools/build/lib/dynamic",
+        "//src/main/java/com/google/devtools/build/lib/metrics:metrics_module",
+        "//src/main/java/com/google/devtools/build/lib/network:noop_connectivity",
+        "//src/main/java/com/google/devtools/build/lib/outputfilter",
+        "//src/main/java/com/google/devtools/build/lib/platform:sleep_prevention_module",
+        "//src/main/java/com/google/devtools/build/lib/profiler/callcounts:callcounts_module",
+        "//src/main/java/com/google/devtools/build/lib/profiler/memory:allocationtracker_module",
+        "//src/main/java/com/google/devtools/build/lib/remote",
+        "//src/main/java/com/google/devtools/build/lib/sandbox",
+        "//src/main/java/com/google/devtools/build/lib/skylarkdebug/module",
+        "//src/main/java/com/google/devtools/build/lib/ssd",
+        "//src/main/java/com/google/devtools/build/lib/standalone",
+        "//src/main/java/com/google/devtools/build/lib/worker",
+        "//third_party:guava",
+    ],
+)
+
+java_binary(
+    name = "BazelServer",
+    javacopts = [
+        "-Xlint:all",
+        "-Xlint:-path",
+    ],
+    main_class = "com.google.devtools.build.lib.bazel.Bazel",
+    runtime_deps = [
+        ":main",
+        "//src/main/java/com/google/devtools/build/lib:server",
+        "//src/main/java/com/google/devtools/build/lib/util:simple_log_handler",  # See startup_options.cc
+        "//src/main/java/com/google/devtools/build/lib/util:single_line_formatter",  # See startup_options.cc
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/commands/BUILD
new file mode 100644
index 0000000..dd8f6df
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/BUILD
@@ -0,0 +1,43 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "commands",
+    srcs = glob(["*.java"]),
+    resources = [
+        "fetch.txt",
+        "sync.txt",
+        "//src/main/java/com/google/devtools/build/lib:merge_licenses",  # license
+    ],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:keep-going-option",
+        "//src/main/java/com/google/devtools/build/lib:loading-phase-threads-option",
+        "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib:syntax",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/skylark",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/pkgcache",
+        "//src/main/java/com/google/devtools/build/lib/query2/common:abstract-blaze-query-env",
+        "//src/main/java/com/google/devtools/build/lib/query2/engine",
+        "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
+        "//src/main/java/com/google/devtools/build/lib/util:exit_code",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/com/google/devtools/build/skyframe",
+        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//src/main/java/com/google/devtools/common/options",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/coverage/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/coverage/BUILD
new file mode 100644
index 0000000..6621223
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/coverage/BUILD
@@ -0,0 +1,31 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "coverage",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/actions:localhost_capacity",
+        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
+        "//src/main/java/com/google/devtools/build/lib/concurrent",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/com/google/devtools/common/options",
+        "//third_party:auto_value",
+        "//third_party:guava",
+        "//third_party:jsr305",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/debug/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/debug/BUILD
index e194eb3..0e97a1a 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/debug/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/debug/BUILD
@@ -5,17 +5,14 @@
 # Description:
 #   Debugging helpers and modules
 package(
-    default_visibility = ["//src:__subpackages__"],
+    default_visibility =
+        ["//src:__subpackages__"],
 )
 
 filegroup(
     name = "srcs",
     srcs = glob(["**"]),
-    visibility = [
-        "//src:__pkg__",
-        "//src/main/java/com/google/devtools/build/lib:__pkg__",
-        "//src/test/shell/bazel:__pkg__",
-    ],
+    visibility = ["//src:__subpackages__"],
 )
 
 proto_library(
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/execlog/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/execlog/BUILD
index 350bde3..8f39159 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/execlog/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/execlog/BUILD
@@ -4,7 +4,7 @@
 
 filegroup(
     name = "srcs",
-    srcs = glob(["**"]),
+    srcs = glob(["*"]),
     visibility = ["//src:__subpackages__"],
 )
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD
new file mode 100644
index 0000000..44e4fdc
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD
@@ -0,0 +1,47 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]) + [
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/skylark:srcs",
+    ],
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "repository",
+    srcs = glob(["*.java"]),
+    resources = [
+        "local_config_platform.WORKSPACE",
+    ],
+    deps = [
+        "//src/java_tools/singlejar/java/com/google/devtools/build/zip",
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib:syntax",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache:events",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/concurrent",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/java/com/google/devtools/build/lib/util:os",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/com/google/devtools/build/skyframe",
+        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//src/main/java/com/google/devtools/common/options",
+        "//third_party:apache_commons_compress",
+        "//third_party:auto_value",
+        "//third_party:diffutils",
+        "//third_party:guava",
+        "//third_party:jsr305",
+        "//third_party:xz",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/BUILD
index 9560d84..34bc630 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/BUILD
@@ -8,8 +8,6 @@
     visibility = ["//src:__subpackages__"],
 )
 
-# Description:
-#   Main Java code for Bazel
 java_library(
     name = "downloader",
     srcs = glob(["*.java"]),
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/BUILD
new file mode 100644
index 0000000..e6b0b44
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/BUILD
@@ -0,0 +1,46 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(default_visibility = ["//src:__subpackages__"])
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "skylark",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/debug:workspace-rule-event",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/concurrent",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/packages:type",
+        "//src/main/java/com/google/devtools/build/lib/pkgcache",
+        "//src/main/java/com/google/devtools/build/lib/profiler",
+        "//src/main/java/com/google/devtools/build/lib/shell",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository",
+        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/java/com/google/devtools/build/lib/util:os",
+        "//src/main/java/com/google/devtools/build/lib/util:string",
+        "//src/main/java/com/google/devtools/build/lib/util/io",
+        "//src/main/java/com/google/devtools/build/lib/util/io:out-err",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/com/google/devtools/build/skyframe",
+        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//third_party:diffutils",
+        "//third_party:guava",
+        "//third_party:jsr305",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/BUILD
new file mode 100644
index 0000000..b4017c8
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BUILD
@@ -0,0 +1,79 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]) + [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/common:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/cpp:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/genrule:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/java:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/python:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/sh:srcs",
+    ],
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "rules",
+    srcs = glob(["*.java"]),
+    resources = glob([
+        "*.txt",
+        "*.WORKSPACE",
+    ]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:core-rules",
+        "//src/main/java/com/google/devtools/build/lib:core-workspace-rules",
+        "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib:testing-support-rules",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/common",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/cpp:bazel_cpp_semantics",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/proto",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/genrule",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/java",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/java:bazel_java_semantics",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/python",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/sh",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/remote",
+        "//src/main/java/com/google/devtools/build/lib/remote/options",
+        "//src/main/java/com/google/devtools/build/lib/rules/android",
+        "//src/main/java/com/google/devtools/build/lib/rules/config",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp/proto:CcProtoLibrary",
+        "//src/main/java/com/google/devtools/build/lib/rules/genquery",
+        "//src/main/java/com/google/devtools/build/lib/rules/genrule",
+        "//src/main/java/com/google/devtools/build/lib/rules/java:java-compilation",
+        "//src/main/java/com/google/devtools/build/lib/rules/java:java-rules",
+        "//src/main/java/com/google/devtools/build/lib/rules/objc",
+        "//src/main/java/com/google/devtools/build/lib/rules/platform",
+        "//src/main/java/com/google/devtools/build/lib/rules/proto",
+        "//src/main/java/com/google/devtools/build/lib/rules/python",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
+        "//src/main/java/com/google/devtools/build/lib/util:exit_code",
+        "//src/main/java/com/google/devtools/build/lib/util:os",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/com/google/devtools/common/options",
+        "//third_party:guava",
+        "//third_party:jsr305",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BUILD
new file mode 100644
index 0000000..ee382e6
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BUILD
@@ -0,0 +1,55 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]) + [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools:srcs",
+    ],
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "android",
+    srcs = glob(["*.java"]),
+    resources = glob(
+        [
+            "*.txt",
+            "*.WORKSPACE",
+        ],
+    ),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:syntax",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools:android_ndk_crosstools",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/cpp:bazel_cpp_semantics",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/java",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/java:bazel_java_semantics",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
+        "//src/main/java/com/google/devtools/build/lib/packages:type",
+        "//src/main/java/com/google/devtools/build/lib/rules/android",
+        "//src/main/java/com/google/devtools/build/lib/rules/config",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/rules/java:java-compilation",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/java/com/google/devtools/build/lib/util:shell_escaper",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/com/google/devtools/build/skyframe",
+        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//src/main/protobuf:crosstool_config_java_proto",
+        "//third_party:android_common_25_0_0_lite",
+        "//third_party:auto_value",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/BUILD
new file mode 100644
index 0000000..ad27b68
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/BUILD
@@ -0,0 +1,59 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]) + [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r15:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r18:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r19:srcs",
+    ],
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "android_ndk_crosstools",
+    srcs = [
+        "AndroidNdkCrosstools.java",
+        "NdkRelease.java",
+    ],
+    deps = [
+        ":ndkcrosstools",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r15",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r18",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r19",
+        "//src/main/java/com/google/devtools/build/lib/util:os",
+        "//third_party:guava",
+    ],
+)
+
+java_library(
+    name = "ndkcrosstools",
+    srcs = glob(
+        ["*.java"],
+        exclude = [
+            "AndroidNdkCrosstools.java",
+            "NdkRelease.java",
+        ],
+    ),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/protobuf:crosstool_config_java_proto",
+        "//third_party:guava",
+        "//third_party:jsr305",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/BUILD
new file mode 100644
index 0000000..861b137
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/BUILD
@@ -0,0 +1,23 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "r10e",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/protobuf:crosstool_config_java_proto",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/BUILD
new file mode 100644
index 0000000..531ab0d
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/BUILD
@@ -0,0 +1,23 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "r11",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/protobuf:crosstool_config_java_proto",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/BUILD
new file mode 100644
index 0000000..8dbb6d7
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/BUILD
@@ -0,0 +1,23 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "r12",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/protobuf:crosstool_config_java_proto",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/BUILD
new file mode 100644
index 0000000..c45c7ba
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/BUILD
@@ -0,0 +1,23 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "r13",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/protobuf:crosstool_config_java_proto",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r15/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r15/BUILD
new file mode 100644
index 0000000..98ed42a
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r15/BUILD
@@ -0,0 +1,23 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "r15",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/protobuf:crosstool_config_java_proto",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/BUILD
new file mode 100644
index 0000000..eea4ea0
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/BUILD
@@ -0,0 +1,22 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "r17",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/protobuf:crosstool_config_java_proto",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r18/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r18/BUILD
new file mode 100644
index 0000000..61a2604
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r18/BUILD
@@ -0,0 +1,22 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "r18",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/protobuf:crosstool_config_java_proto",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r19/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r19/BUILD
new file mode 100644
index 0000000..8ad59d4
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r19/BUILD
@@ -0,0 +1,22 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "r19",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/protobuf:crosstool_config_java_proto",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/common/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/common/BUILD
new file mode 100644
index 0000000..507a6b0
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/common/BUILD
@@ -0,0 +1,23 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "common",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
+        "//src/main/java/com/google/devtools/build/lib/packages:type",
+        "//src/main/java/com/google/devtools/build/lib/util:filetype",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BUILD
new file mode 100644
index 0000000..5545163
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BUILD
@@ -0,0 +1,55 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]) + [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/proto:srcs",
+    ],
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "cpp",
+    srcs = glob(
+        ["*.java"],
+        exclude = ["BazelCppSemantics.java"],
+    ),
+    resources = glob(
+        [
+            "*.txt",
+            "*.WORKSPACE",
+        ],
+    ),
+    deps = [
+        ":bazel_cpp_semantics",
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:syntax",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/analysis/platform",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
+        "//src/main/java/com/google/devtools/build/lib/packages:type",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp",
+        "//src/main/java/com/google/devtools/build/lib/util:filetype",
+        "//src/main/java/com/google/devtools/build/lib/util:os",
+        "//third_party:guava",
+    ],
+)
+
+java_library(
+    name = "bazel_cpp_semantics",
+    srcs = ["BazelCppSemantics.java"],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/proto/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/proto/BUILD
new file mode 100644
index 0000000..d87f946
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/proto/BUILD
@@ -0,0 +1,21 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "proto",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp/proto:CcProtoLibrary",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/genrule/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/genrule/BUILD
new file mode 100644
index 0000000..974145f
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/genrule/BUILD
@@ -0,0 +1,23 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "genrule",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
+        "//src/main/java/com/google/devtools/build/lib/packages:type",
+        "//src/main/java/com/google/devtools/build/lib/rules/genrule",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BUILD
new file mode 100644
index 0000000..72298fc
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BUILD
@@ -0,0 +1,66 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]) + [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto:srcs",
+    ],
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "java",
+    srcs = glob(
+        ["*.java"],
+        exclude = ["BazelJavaSemantics.java"],
+    ),
+    resources = glob(
+        [
+            "*.txt",
+            "*.WORKSPACE",
+        ],
+    ),
+    deps = [
+        ":bazel_java_semantics",
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:build-info",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
+        "//src/main/java/com/google/devtools/build/lib/packages:type",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/rules/java:java-compilation",
+        "//src/main/java/com/google/devtools/build/lib/rules/java:java-rules",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
+        "//src/main/java/com/google/devtools/build/lib/util:filetype",
+        "//third_party:guava",
+    ],
+)
+
+java_library(
+    name = "bazel_java_semantics",
+    srcs = ["BazelJavaSemantics.java"],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
+        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
+        "//src/main/java/com/google/devtools/build/lib/packages:type",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/rules/java:java-compilation",
+        "//src/main/java/com/google/devtools/build/lib/rules/java:java-rules",
+        "//src/main/java/com/google/devtools/build/lib/shell",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/java/com/google/devtools/build/lib/util:os",
+        "//src/main/java/com/google/devtools/build/lib/util:shell_escaper",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//third_party:guava",
+        "//third_party:jsr305",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BUILD
new file mode 100644
index 0000000..4a47cb0
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BUILD
@@ -0,0 +1,30 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "proto",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/java:bazel_java_semantics",
+        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
+        "//src/main/java/com/google/devtools/build/lib/packages:type",
+        "//src/main/java/com/google/devtools/build/lib/rules/java:RpcSupport",
+        "//src/main/java/com/google/devtools/build/lib/rules/java:java-compilation",
+        "//src/main/java/com/google/devtools/build/lib/rules/java:java-rules",
+        "//src/main/java/com/google/devtools/build/lib/rules/proto",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/BUILD
new file mode 100644
index 0000000..c05c3a8
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/BUILD
@@ -0,0 +1,15 @@
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]) + [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/file:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/parser:srcs",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline:srcs",
+    ],
+    visibility = ["//src:__subpackages__"],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/BUILD
new file mode 100644
index 0000000..b229e9c
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/BUILD
@@ -0,0 +1,41 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "actions",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/file",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/parser:parser_impl",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline:pipeline_impl",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
+        "//src/main/java/com/google/devtools/build/lib/concurrent",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
+        "//src/main/java/com/google/devtools/build/lib/packages:starlark_semantics_options",
+        "//src/main/java/com/google/devtools/build/lib/packages:type",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/java/com/google/devtools/build/lib/util:filetype",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/com/google/devtools/build/skyframe",
+        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//third_party:guava",
+        "//third_party:jsr305",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/NinjaGraph.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/NinjaGraph.java
index 2d95d9e..0394773 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/NinjaGraph.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/NinjaGraph.java
@@ -38,7 +38,7 @@
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.bazel.rules.ninja.file.GenericParsingException;
 import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaTarget;
-import com.google.devtools.build.lib.bazel.rules.ninja.pipeline.NinjaPipeline;
+import com.google.devtools.build.lib.bazel.rules.ninja.pipeline.NinjaPipelineImpl;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -118,7 +118,7 @@
               .getWorkspace();
       String ownerTargetName = ruleContext.getLabel().getName();
       List<NinjaTarget> ninjaTargets =
-          new NinjaPipeline(
+          new NinjaPipelineImpl(
                   workspace.getRelative(workingDirectory),
                   MoreExecutors.listeningDecorator(NINJA_POOL),
                   childNinjaFiles,
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/file/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/file/BUILD
new file mode 100644
index 0000000..e22e0e6
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/file/BUILD
@@ -0,0 +1,17 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "file",
+    srcs = glob(["*.java"]),
+    deps = ["//third_party:guava"],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer/BUILD
new file mode 100644
index 0000000..275555a
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer/BUILD
@@ -0,0 +1,22 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "lexer",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/file",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//third_party:guava",
+        "//third_party:jsr305",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/parser/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/parser/BUILD
new file mode 100644
index 0000000..612d602
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/parser/BUILD
@@ -0,0 +1,42 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "parser",
+    srcs = ["NinjaParser.java"],
+    deps = [
+        ":parser_impl",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/file",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline",
+        "//src/main/java/com/google/devtools/build/lib/util",
+    ],
+)
+
+java_library(
+    name = "parser_impl",
+    srcs = glob(
+        ["*.java"],
+        exclude = ["NinjaParser.java"],
+    ),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/file",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer",
+        "//src/main/java/com/google/devtools/build/lib/collect",
+        "//src/main/java/com/google/devtools/build/lib/concurrent",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//third_party:error_prone_annotations",
+        "//third_party:guava",
+        "//third_party:jsr305",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline/BUILD
new file mode 100644
index 0000000..03283a3
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline/BUILD
@@ -0,0 +1,36 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "pipeline",
+    srcs = ["NinjaPipeline.java"],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/file",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/parser:parser_impl",
+    ],
+)
+
+java_library(
+    name = "pipeline_impl",
+    srcs = ["NinjaPipelineImpl.java"],
+    deps = [
+        ":pipeline",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/file",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/parser",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/parser:parser_impl",
+        "//src/main/java/com/google/devtools/build/lib/concurrent",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline/NinjaPipeline.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline/NinjaPipeline.java
index 14397ed..48d7a5c 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline/NinjaPipeline.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline/NinjaPipeline.java
@@ -14,117 +14,22 @@
 
 package com.google.devtools.build.lib.bazel.rules.ninja.pipeline;
 
-import static com.google.devtools.build.lib.concurrent.MoreFutures.waitForFutureAndGetWithCheckedException;
 
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.devtools.build.lib.bazel.rules.ninja.file.CollectingListFuture;
-import com.google.devtools.build.lib.bazel.rules.ninja.file.FileFragment;
 import com.google.devtools.build.lib.bazel.rules.ninja.file.GenericParsingException;
-import com.google.devtools.build.lib.bazel.rules.ninja.file.ParallelFileProcessing;
-import com.google.devtools.build.lib.bazel.rules.ninja.file.ParallelFileProcessing.BlockParameters;
-import com.google.devtools.build.lib.bazel.rules.ninja.lexer.NinjaLexer;
 import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaFileParseResult;
 import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaFileParseResult.NinjaPromise;
-import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaParser;
-import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaParserStep;
 import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaScope;
 import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaTarget;
 import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaVariableValue;
-import com.google.devtools.build.lib.util.Pair;
-import com.google.devtools.build.lib.vfs.Path;
 import java.io.IOException;
-import java.nio.channels.ReadableByteChannel;
-import java.util.ArrayDeque;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
 /**
- * Responsible for parsing Ninja file, all its included and subninja files, and returning {@link
- * NinjaScope} with rules and expanded variables, and list of {@link NinjaTarget}.
+ * Interface Responsible for parsing Ninja file, all its included and subninja files, and returning
+ * {@link NinjaScope} with rules and expanded variables, and list of {@link NinjaTarget}.
  *
- * <p>Uses provided {@link ListeningExecutorService} for scheduling tasks in parallel.
+ * <p>This interface exists to break the package cycle between parser and pipeline.
  */
-public class NinjaPipeline {
-  private final Path basePath;
-  private final ListeningExecutorService service;
-  private final Collection<Path> includedOrSubninjaFiles;
-  private final String ownerTargetName;
-  private final Set<Path> childPaths;
-  private Integer readBlockSize;
-
-  /**
-   * @param basePath base path for resolving include and subninja paths.
-   * @param service service to use for scheduling tasks in parallel.
-   * @param includedOrSubninjaFiles Ninja files expected in include/subninja statements
-   * @param ownerTargetName name of the owner ninja_graph target
-   */
-  public NinjaPipeline(
-      Path basePath,
-      ListeningExecutorService service,
-      Collection<Path> includedOrSubninjaFiles,
-      String ownerTargetName) {
-    this.basePath = basePath;
-    this.service = service;
-    this.includedOrSubninjaFiles = includedOrSubninjaFiles;
-    this.ownerTargetName = ownerTargetName;
-    this.childPaths = Sets.newConcurrentHashSet();
-  }
-
-  /**
-   * Parses <code>mainFile</code> and all it's children from include and subninja statements.
-   *
-   * @return {@link Pair} of {@link NinjaScope} with rules and expanded variables (and child
-   *     scopes), and list of {@link NinjaTarget}.
-   */
-  public List<NinjaTarget> pipeline(Path mainFile)
-      throws GenericParsingException, InterruptedException, IOException {
-    NinjaFileParseResult result =
-        waitForFutureAndGetWithCheckedException(
-            scheduleParsing(mainFile), GenericParsingException.class, IOException.class);
-
-    Map<NinjaScope, List<FileFragment>> rawTargets = Maps.newHashMap();
-    NinjaScope scope = new NinjaScope();
-    // This will cause additional parsing of included/subninja scopes, and their recursive expand.
-    result.expandIntoScope(scope, rawTargets);
-    return iterateScopesScheduleTargetsParsing(scope, rawTargets);
-  }
-
-  /**
-   * Each NinjaTarget should be parsed in the context of it's parent {@link NinjaScope}. (All the
-   * variables in targets are immediately expanded.) We are iterating main and all transitively
-   * included scopes, and parsing corresponding targets.
-   */
-  private List<NinjaTarget> iterateScopesScheduleTargetsParsing(
-      NinjaScope scope, Map<NinjaScope, List<FileFragment>> rawTargets)
-      throws GenericParsingException, InterruptedException {
-    ArrayDeque<NinjaScope> queue = new ArrayDeque<>();
-    queue.add(scope);
-    CollectingListFuture<NinjaTarget, GenericParsingException> future =
-        new CollectingListFuture<>(GenericParsingException.class);
-    while (!queue.isEmpty()) {
-      NinjaScope currentScope = queue.removeFirst();
-      List<FileFragment> targetFragments = rawTargets.get(currentScope);
-      Preconditions.checkNotNull(targetFragments);
-      for (FileFragment fragment : targetFragments) {
-        future.add(
-            service.submit(
-                () ->
-                    new NinjaParserStep(new NinjaLexer(fragment))
-                        .parseNinjaTarget(currentScope, fragment.getFragmentOffset())));
-      }
-      queue.addAll(currentScope.getIncludedScopes());
-      queue.addAll(currentScope.getSubNinjaScopes());
-    }
-    return future.getResult();
-  }
+public interface NinjaPipeline {
 
   /**
    * Synchronously or asynchronously schedules parsing of the included Ninja file, and returns
@@ -139,84 +44,7 @@
    * <p>That is why we use {@link NinjaPromise<NinjaFileParseResult>} to save the future file
    * parsing result in the parent file {@link NinjaFileParseResult} structure.
    */
-  public NinjaPromise<NinjaFileParseResult> createChildFileParsingPromise(
+  NinjaPromise<NinjaFileParseResult> createChildFileParsingPromise(
       NinjaVariableValue value, long offset, String parentNinjaFileName)
-      throws GenericParsingException, IOException {
-    if (value.isPlainText()) {
-      // If the value of the path is already known, we can immediately schedule parsing
-      // of the child Ninja file.
-      Path path = getChildNinjaPath(value.getRawText(), parentNinjaFileName);
-      ListenableFuture<NinjaFileParseResult> parsingFuture = scheduleParsing(path);
-      return (scope) ->
-          waitForFutureAndGetWithCheckedException(
-              parsingFuture, GenericParsingException.class, IOException.class);
-    } else {
-      // If the value of the child path refers some variables in the parent scope, resolve it,
-      // when the lambda is called, schedule the parsing and wait for it's completion.
-      return (scope) -> {
-        String expandedValue = scope.getExpandedValue(offset, value);
-        if (expandedValue.isEmpty()) {
-          throw new GenericParsingException("Expected non-empty path.");
-        }
-        Path path = getChildNinjaPath(expandedValue, parentNinjaFileName);
-        return waitForFutureAndGetWithCheckedException(
-            scheduleParsing(path), GenericParsingException.class, IOException.class);
-      };
-    }
-  }
-
-  /**
-   * Set the size of the block read by {@link ParallelFileProcessing}. Method is mainly intended to
-   * be used in tests.
-   */
-  @VisibleForTesting
-  public void setReadBlockSize(Integer readBlockSize) {
-    this.readBlockSize = readBlockSize;
-  }
-
-  private Path getChildNinjaPath(String rawText, String parentNinjaFileName)
-      throws GenericParsingException {
-    Path childPath = basePath.getRelative(rawText);
-    if (!this.includedOrSubninjaFiles.contains(childPath)) {
-      throw new GenericParsingException(
-          String.format(
-              "Ninja file requested from '%s' " + "not declared in 'srcs' attribute of '%s'.",
-              parentNinjaFileName, this.ownerTargetName));
-    }
-    return childPath;
-  }
-
-  /**
-   * Actually schedules the parsing of the Ninja file and returns {@link
-   * ListenableFuture<NinjaFileParseResult>} for obtaining the result.
-   */
-  private ListenableFuture<NinjaFileParseResult> scheduleParsing(Path path)
-      throws IOException, GenericParsingException {
-    if (!this.childPaths.add(path)) {
-      throw new GenericParsingException(
-          String.format(
-              "Detected cycle or duplicate inclusion in Ninja files dependencies, including '%s'.",
-              path.getBaseName()));
-    }
-    BlockParameters parameters = new BlockParameters(path.getFileSize());
-    if (readBlockSize != null) {
-      parameters.setReadBlockSize(readBlockSize);
-    }
-    return service.submit(
-        () -> {
-          try (ReadableByteChannel channel = path.createReadableByteChannel()) {
-            List<NinjaFileParseResult> pieces = Lists.newArrayList();
-            ParallelFileProcessing.processFile(
-                channel,
-                parameters,
-                () -> {
-                  NinjaFileParseResult parseResult = new NinjaFileParseResult();
-                  pieces.add(parseResult);
-                  return new NinjaParser(NinjaPipeline.this, parseResult, path.getBaseName());
-                },
-                service);
-            return NinjaFileParseResult.merge(pieces);
-          }
-        });
-  }
+      throws GenericParsingException, IOException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline/NinjaPipelineImpl.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline/NinjaPipelineImpl.java
new file mode 100644
index 0000000..bce133f
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline/NinjaPipelineImpl.java
@@ -0,0 +1,210 @@
+// Copyright 2019 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.bazel.rules.ninja.pipeline;
+
+import static com.google.devtools.build.lib.concurrent.MoreFutures.waitForFutureAndGetWithCheckedException;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.devtools.build.lib.bazel.rules.ninja.file.CollectingListFuture;
+import com.google.devtools.build.lib.bazel.rules.ninja.file.FileFragment;
+import com.google.devtools.build.lib.bazel.rules.ninja.file.GenericParsingException;
+import com.google.devtools.build.lib.bazel.rules.ninja.file.ParallelFileProcessing;
+import com.google.devtools.build.lib.bazel.rules.ninja.file.ParallelFileProcessing.BlockParameters;
+import com.google.devtools.build.lib.bazel.rules.ninja.lexer.NinjaLexer;
+import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaFileParseResult;
+import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaFileParseResult.NinjaPromise;
+import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaParser;
+import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaParserStep;
+import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaScope;
+import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaTarget;
+import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaVariableValue;
+import com.google.devtools.build.lib.util.Pair;
+import com.google.devtools.build.lib.vfs.Path;
+import java.io.IOException;
+import java.nio.channels.ReadableByteChannel;
+import java.util.ArrayDeque;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Responsible for parsing Ninja file, all its included and subninja files, and returning {@link
+ * NinjaScope} with rules and expanded variables, and list of {@link NinjaTarget}.
+ *
+ * <p>Uses provided {@link ListeningExecutorService} for scheduling tasks in parallel.
+ */
+public class NinjaPipelineImpl implements NinjaPipeline {
+  private final Path basePath;
+  private final ListeningExecutorService service;
+  private final Collection<Path> includedOrSubninjaFiles;
+  private final String ownerTargetName;
+  private final Set<Path> childPaths;
+  private Integer readBlockSize;
+
+  /**
+   * @param basePath base path for resolving include and subninja paths.
+   * @param service service to use for scheduling tasks in parallel.
+   * @param includedOrSubninjaFiles Ninja files expected in include/subninja statements
+   * @param ownerTargetName name of the owner ninja_graph target
+   */
+  public NinjaPipelineImpl(
+      Path basePath,
+      ListeningExecutorService service,
+      Collection<Path> includedOrSubninjaFiles,
+      String ownerTargetName) {
+    this.basePath = basePath;
+    this.service = service;
+    this.includedOrSubninjaFiles = includedOrSubninjaFiles;
+    this.ownerTargetName = ownerTargetName;
+    this.childPaths = Sets.newConcurrentHashSet();
+  }
+
+  /**
+   * Parses <code>mainFile</code> and all it's children from include and subninja statements.
+   *
+   * @return {@link Pair} of {@link NinjaScope} with rules and expanded variables (and child
+   *     scopes), and list of {@link NinjaTarget}.
+   */
+  public List<NinjaTarget> pipeline(Path mainFile)
+      throws GenericParsingException, InterruptedException, IOException {
+    NinjaFileParseResult result =
+        waitForFutureAndGetWithCheckedException(
+            scheduleParsing(mainFile), GenericParsingException.class, IOException.class);
+
+    Map<NinjaScope, List<FileFragment>> rawTargets = Maps.newHashMap();
+    NinjaScope scope = new NinjaScope();
+    // This will cause additional parsing of included/subninja scopes, and their recursive expand.
+    result.expandIntoScope(scope, rawTargets);
+    return iterateScopesScheduleTargetsParsing(scope, rawTargets);
+  }
+
+  /**
+   * Each NinjaTarget should be parsed in the context of it's parent {@link NinjaScope}. (All the
+   * variables in targets are immediately expanded.) We are iterating main and all transitively
+   * included scopes, and parsing corresponding targets.
+   */
+  private List<NinjaTarget> iterateScopesScheduleTargetsParsing(
+      NinjaScope scope, Map<NinjaScope, List<FileFragment>> rawTargets)
+      throws GenericParsingException, InterruptedException {
+    ArrayDeque<NinjaScope> queue = new ArrayDeque<>();
+    queue.add(scope);
+    CollectingListFuture<NinjaTarget, GenericParsingException> future =
+        new CollectingListFuture<>(GenericParsingException.class);
+    while (!queue.isEmpty()) {
+      NinjaScope currentScope = queue.removeFirst();
+      List<FileFragment> targetFragments = rawTargets.get(currentScope);
+      Preconditions.checkNotNull(targetFragments);
+      for (FileFragment fragment : targetFragments) {
+        future.add(
+            service.submit(
+                () ->
+                    new NinjaParserStep(new NinjaLexer(fragment))
+                        .parseNinjaTarget(currentScope, fragment.getFragmentOffset())));
+      }
+      queue.addAll(currentScope.getIncludedScopes());
+      queue.addAll(currentScope.getSubNinjaScopes());
+    }
+    return future.getResult();
+  }
+
+  @Override
+  public NinjaPromise<NinjaFileParseResult> createChildFileParsingPromise(
+      NinjaVariableValue value, long offset, String parentNinjaFileName)
+      throws GenericParsingException, IOException {
+    if (value.isPlainText()) {
+      // If the value of the path is already known, we can immediately schedule parsing
+      // of the child Ninja file.
+      Path path = getChildNinjaPath(value.getRawText(), parentNinjaFileName);
+      ListenableFuture<NinjaFileParseResult> parsingFuture = scheduleParsing(path);
+      return (scope) ->
+          waitForFutureAndGetWithCheckedException(
+              parsingFuture, GenericParsingException.class, IOException.class);
+    } else {
+      // If the value of the child path refers some variables in the parent scope, resolve it,
+      // when the lambda is called, schedule the parsing and wait for it's completion.
+      return (scope) -> {
+        String expandedValue = scope.getExpandedValue(offset, value);
+        if (expandedValue.isEmpty()) {
+          throw new GenericParsingException("Expected non-empty path.");
+        }
+        Path path = getChildNinjaPath(expandedValue, parentNinjaFileName);
+        return waitForFutureAndGetWithCheckedException(
+            scheduleParsing(path), GenericParsingException.class, IOException.class);
+      };
+    }
+  }
+
+  /**
+   * Set the size of the block read by {@link ParallelFileProcessing}. Method is mainly intended to
+   * be used in tests.
+   */
+  @VisibleForTesting
+  public void setReadBlockSize(Integer readBlockSize) {
+    this.readBlockSize = readBlockSize;
+  }
+
+  private Path getChildNinjaPath(String rawText, String parentNinjaFileName)
+      throws GenericParsingException {
+    Path childPath = basePath.getRelative(rawText);
+    if (!this.includedOrSubninjaFiles.contains(childPath)) {
+      throw new GenericParsingException(
+          String.format(
+              "Ninja file requested from '%s' " + "not declared in 'srcs' attribute of '%s'.",
+              parentNinjaFileName, this.ownerTargetName));
+    }
+    return childPath;
+  }
+
+  /**
+   * Actually schedules the parsing of the Ninja file and returns {@link
+   * ListenableFuture<NinjaFileParseResult>} for obtaining the result.
+   */
+  private ListenableFuture<NinjaFileParseResult> scheduleParsing(Path path)
+      throws IOException, GenericParsingException {
+    if (!this.childPaths.add(path)) {
+      throw new GenericParsingException(
+          String.format(
+              "Detected cycle or duplicate inclusion in Ninja files dependencies, including '%s'.",
+              path.getBaseName()));
+    }
+    BlockParameters parameters = new BlockParameters(path.getFileSize());
+    if (readBlockSize != null) {
+      parameters.setReadBlockSize(readBlockSize);
+    }
+    return service.submit(
+        () -> {
+          try (ReadableByteChannel channel = path.createReadableByteChannel()) {
+            List<NinjaFileParseResult> pieces = Lists.newArrayList();
+            ParallelFileProcessing.processFile(
+                channel,
+                parameters,
+                () -> {
+                  NinjaFileParseResult parseResult = new NinjaFileParseResult();
+                  pieces.add(parseResult);
+                  return new NinjaParser(this, parseResult, path.getBaseName());
+                },
+                service);
+            return NinjaFileParseResult.merge(pieces);
+          }
+        });
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BUILD
new file mode 100644
index 0000000..2b99da3
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BUILD
@@ -0,0 +1,42 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "python",
+    srcs = glob(["*.java"]),
+    resources = glob(
+        [
+            "*.txt",
+            "*.WORKSPACE",
+        ],
+    ),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
+        "//src/main/java/com/google/devtools/build/lib/concurrent",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
+        "//src/main/java/com/google/devtools/build/lib/packages:type",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/rules/python",
+        "//src/main/java/com/google/devtools/build/lib/util:filetype",
+        "//src/main/java/com/google/devtools/build/lib/util:os",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/com/google/devtools/common/options",
+        "//third_party:guava",
+        "//third_party:jsr305",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/BUILD
new file mode 100644
index 0000000..642db99
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/BUILD
@@ -0,0 +1,34 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "sh",
+    srcs = glob(["*.java"]),
+    resources = glob(
+        [
+            "*.txt",
+            "*.WORKSPACE",
+        ],
+    ),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
+        "//src/main/java/com/google/devtools/build/lib/util:filetype",
+        "//src/main/java/com/google/devtools/build/lib/util:os",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//third_party:guava",
+        "//third_party:jsr305",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD
index 2427851..8ffa21d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD
@@ -50,12 +50,12 @@
     srcs = ["BazelPackageLoader.java"],
     deps = [
         ":AbstractPackageLoader",
-        "//src/main/java/com/google/devtools/build/lib:bazel-repository",
-        "//src/main/java/com/google/devtools/build/lib:bazel-rules",
-        "//src/main/java/com/google/devtools/build/lib:bazel/BazelRepositoryModule",
         "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/bazel:repository_module",
         "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache",
         "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/skylark",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/skyframe",
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index b0dc3bc..5b2389c 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -246,9 +246,9 @@
     test_class = "com.google.devtools.build.lib.AllTests",
     deps = [
         ":AllTests",
-        "//src/main/java/com/google/devtools/build/lib:bazel-rules",
         "//src/main/java/com/google/devtools/build/lib:build-base",
         "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules",
         "//src/main/java/com/google/devtools/build/lib/clock",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/events",
@@ -293,9 +293,9 @@
     test_class = "com.google.devtools.build.lib.AllTests",
     deps = [
         ":AllTests",
-        "//src/main/java/com/google/devtools/build/lib:bazel-main",
         "//src/main/java/com/google/devtools/build/lib:runtime",
         "//src/main/java/com/google/devtools/build/lib:server",
+        "//src/main/java/com/google/devtools/build/lib/bazel:main",
         "//src/main/java/com/google/devtools/build/lib/clock",
         "//src/main/java/com/google/devtools/build/lib/collect",
         "//src/main/java/com/google/devtools/build/lib/unix",
@@ -340,15 +340,15 @@
     test_class = "com.google.devtools.build.lib.AllTests",
     deps = [
         ":AllTests",
-        "//src/main/java/com/google/devtools/build/lib:bazel-modules",
-        "//src/main/java/com/google/devtools/build/lib:bazel-rules",
         "//src/main/java/com/google/devtools/build/lib:build-base",
         "//src/main/java/com/google/devtools/build/lib:build-request-options",
         "//src/main/java/com/google/devtools/build/lib:loading-phase-threads-option",
         "//src/main/java/com/google/devtools/build/lib:runtime",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:localhost_capacity",
+        "//src/main/java/com/google/devtools/build/lib/bazel:modules",
         "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules",
         "//src/main/java/com/google/devtools/build/lib/buildeventstream",
         "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto",
         "//src/main/java/com/google/devtools/build/lib/buildeventstream/transports",
@@ -411,10 +411,10 @@
     test_class = "com.google.devtools.build.lib.AllTests",
     deps = [
         ":AllTests",
-        "//src/main/java/com/google/devtools/build/lib:bazel-rules",
         "//src/main/java/com/google/devtools/build/lib:build-base",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:localhost_capacity",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules",
         "//src/main/java/com/google/devtools/build/lib/clock",
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/events",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/mock/BUILD
index 4093f07..bf4ec42 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BUILD
@@ -26,9 +26,10 @@
         "//tools/cpp:cc_toolchain_config_lib.bzl",
     ],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:bazel-repository",
-        "//src/main/java/com/google/devtools/build/lib:bazel-rules",
         "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/python",
         "//src/main/java/com/google/devtools/build/lib/rules/android",
         "//src/main/java/com/google/devtools/build/lib/rules/apple",
         "//src/main/java/com/google/devtools/build/lib/rules/apple/swift",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
index 4511d67..40432fc 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
@@ -33,13 +33,13 @@
     ),
     deps = [
         ":test-build-options",
-        "//src/main/java/com/google/devtools/build/lib:bazel-rules",
         "//src/main/java/com/google/devtools/build/lib:build-base",
         "//src/main/java/com/google/devtools/build/lib:build-request-options",
         "//src/main/java/com/google/devtools/build/lib:keep-going-option",
         "//src/main/java/com/google/devtools/build/lib:loading-phase-threads-option",
         "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android",
         "//src/main/java/com/google/devtools/build/lib/causes",
         "//src/main/java/com/google/devtools/build/lib/clock",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/BUILD
index 8b39a0d..2a1f6c1 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/bazel/BUILD
@@ -1,19 +1,37 @@
-load("@rules_java//java:defs.bzl", "java_test")
-
 package(
-    default_testonly = True,
+    default_testonly = 1,
     default_visibility = ["//src:__subpackages__"],
 )
 
 filegroup(
     name = "srcs",
     testonly = 0,
-    srcs = glob(["**"]) + [
+    srcs = glob(["*"]) + [
         "//src/test/java/com/google/devtools/build/lib/bazel/debug:srcs",
-        "//src/test/java/com/google/devtools/build/lib/bazel/repository:srcs",
         "//src/test/java/com/google/devtools/build/lib/bazel/execlog:srcs",
+        "//src/test/java/com/google/devtools/build/lib/bazel/repository:srcs",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules:srcs",
     ],
-    visibility = ["//src/test/java/com/google/devtools/build/lib:__pkg__"],
+    visibility = ["//src:__subpackages__"],
+)
+
+# List of all java_library rules containing tests that are platform agnostic.
+java_library(
+    name = "BazelTests_lib",
+    exports = [
+        "//src/test/java/com/google/devtools/build/lib/bazel/debug:WorkspaceRuleEventTest_lib",
+        "//src/test/java/com/google/devtools/build/lib/bazel/execlog:StableSortTest_lib",
+        "//src/test/java/com/google/devtools/build/lib/bazel/repository:RepositoryTests_lib",
+        "//src/test/java/com/google/devtools/build/lib/bazel/repository/cache:RepositoryCacheTests_lib",
+        "//src/test/java/com/google/devtools/build/lib/bazel/repository/downloader:DownloaderTestSuite_lib",
+        "//src/test/java/com/google/devtools/build/lib/bazel/repository/skylark:SkylarkTests_lib",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules:BazelRuleTests_lib",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/android:AndroidTests_lib",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools:NdkCrosstoolsTest_lib",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/genrule:GenruleTests_lib",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/java:JavaTests_lib",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/ninja:NinjaTests_lib",
+    ],
 )
 
 test_suite(
@@ -22,105 +40,15 @@
         "-no_windows",
         "-slow",
     ],
-    visibility = ["//visibility:private"],
 )
 
 test_suite(
     name = "all_windows_tests",
     tests = [
         ":windows_tests",
+        "//src/test/java/com/google/devtools/build/lib/bazel/debug:all_windows_tests",
+        "//src/test/java/com/google/devtools/build/lib/bazel/execlog:all_windows_tests",
         "//src/test/java/com/google/devtools/build/lib/bazel/repository:all_windows_tests",
-    ],
-    visibility = ["//src/test/java/com/google/devtools/build/lib:__pkg__"],
-)
-
-java_test(
-    name = "bazel-ninja-tests",
-    srcs = glob(["rules/ninja/**/*.java"]),
-    test_class = "com.google.devtools.build.lib.AllTests",
-    deps = [
-        "//src/main/java/com/google/devtools/build/lib:bazel-ninja",
-        "//src/main/java/com/google/devtools/build/lib:build-base",
-        "//src/main/java/com/google/devtools/build/lib/actions",
-        "//src/main/java/com/google/devtools/build/lib/cmdline",
-        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
-        "//src/main/java/com/google/devtools/build/lib/concurrent",
-        "//src/main/java/com/google/devtools/build/lib/events",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
-        "//src/main/java/com/google/devtools/build/lib/util",
-        "//src/main/java/com/google/devtools/build/lib/vfs",
-        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
-        "//src/main/java/com/google/devtools/build/skyframe",
-        "//src/test/java/com/google/devtools/build/lib:test_runner",
-        "//src/test/java/com/google/devtools/build/lib/actions/util",
-        "//src/test/java/com/google/devtools/build/lib/analysis/util",
-        "//src/test/java/com/google/devtools/build/lib/testutil",
-        "//src/test/java/com/google/devtools/build/lib/testutil:JunitUtils",
-        "//third_party:guava",
-        "//third_party:guava-testlib",
-        "//third_party:jsr305",
-        "//third_party:junit4",
-        "//third_party:truth",
-        "//third_party/allocation_instrumenter",
-    ],
-)
-
-java_test(
-    name = "bazel-rules-tests",
-    srcs = glob(
-        ["rules/**/*.java"],
-        exclude = [
-            "rules/genrule/GenRuleWindowsConfiguredTargetTest.java",
-            "rules/ninja/**/*.java",
-        ],
-    ) + select({
-        "//src:windows": ["rules/genrule/GenRuleWindowsConfiguredTargetTest.java"],
-        "//conditions:default": [],
-    }),
-    resources = [
-        "//tools/android:android_sdk_repository_template.bzl",
-        "//tools/build_defs/cc:action_names.bzl",
-        "//tools/cpp:cc_toolchain_config_lib.bzl",
-    ] + glob(["rules/**/*.txt"]),
-    tags = ["rules"],
-    test_class = "com.google.devtools.build.lib.AllTests",
-    deps = [
-        "//src/main/java/com/google/devtools/build/lib:bazel-main",
-        "//src/main/java/com/google/devtools/build/lib:bazel-rules",
-        "//src/main/java/com/google/devtools/build/lib:build-base",
-        "//src/main/java/com/google/devtools/build/lib:core-rules",
-        "//src/main/java/com/google/devtools/build/lib:core-workspace-rules",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
-        "//src/main/java/com/google/devtools/build/lib/actions",
-        "//src/main/java/com/google/devtools/build/lib/cmdline",
-        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
-        "//src/main/java/com/google/devtools/build/lib/events",
-        "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
-        "//src/main/java/com/google/devtools/build/lib/packages:type",
-        "//src/main/java/com/google/devtools/build/lib/rules/android",
-        "//src/main/java/com/google/devtools/build/lib/rules/config",
-        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
-        "//src/main/java/com/google/devtools/build/lib/rules/java:java-compilation",
-        "//src/main/java/com/google/devtools/build/lib/util",
-        "//src/main/java/com/google/devtools/build/lib/util:os",
-        "//src/main/java/com/google/devtools/build/lib/vfs",
-        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
-        "//src/main/java/com/google/devtools/common/options",
-        "//src/main/protobuf:crosstool_config_java_proto",
-        "//src/test/java/com/google/devtools/build/lib:test_runner",
-        "//src/test/java/com/google/devtools/build/lib/actions/util",
-        "//src/test/java/com/google/devtools/build/lib/analysis/util",
-        "//src/test/java/com/google/devtools/build/lib/events:testutil",
-        "//src/test/java/com/google/devtools/build/lib/packages:testutil",
-        "//src/test/java/com/google/devtools/build/lib/rules/android:AndroidLocalTestTest",
-        "//src/test/java/com/google/devtools/build/lib/testutil",
-        "//src/test/java/com/google/devtools/build/lib/testutil:JunitUtils",
-        "//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
-        "//src/test/java/com/google/devtools/build/lib/vfs/util",
-        "//third_party:guava",
-        "//third_party:guava-testlib",
-        "//third_party:junit4",
-        "//third_party:truth",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules:all_windows_tests",
     ],
 )
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/debug/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/debug/BUILD
index 38f8495..6f17138 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/debug/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/bazel/debug/BUILD
@@ -8,13 +8,12 @@
 filegroup(
     name = "srcs",
     testonly = 0,
-    srcs = glob(["**"]),
-    visibility = ["//src/test/java/com/google/devtools/build/lib/bazel:__pkg__"],
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
 )
 
-java_test(
-    name = "WorkspaceRuleEventTest",
-    size = "small",
+java_library(
+    name = "WorkspaceRuleEventTest_lib",
     srcs = ["WorkspaceRuleEventTest.java"],
     deps = [
         "//src/main/java/com/google/devtools/build/lib/bazel/debug:workspace-rule-event",
@@ -22,7 +21,29 @@
         "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
         "//third_party:guava",
         "//third_party:junit4",
-        "//third_party:mockito",
         "//third_party:truth",
     ],
 )
+
+java_test(
+    name = "WorkspaceRuleEventTest",
+    size = "small",
+    runtime_deps = [
+        ":WorkspaceRuleEventTest_lib",
+    ],
+)
+
+test_suite(
+    name = "windows_tests",
+    tags = [
+        "-no_windows",
+        "-slow",
+    ],
+)
+
+test_suite(
+    name = "all_windows_tests",
+    tests = [
+        ":windows_tests",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/execlog/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/execlog/BUILD
index 283e76e..5116e84 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/execlog/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/bazel/execlog/BUILD
@@ -9,21 +9,44 @@
     name = "srcs",
     testonly = 0,
     srcs = glob(["**"]),
+    visibility = ["//src:__subpackages__"],
 )
 
-java_test(
-    name = "StableSortTest",
-    size = "small",
+java_library(
+    name = "StableSortTest_lib",
     srcs = ["StableSortTest.java"],
-    test_class = "com.google.devtools.build.lib.bazel.execlog.StableSortTest",
     deps = [
         "//src/main/java/com/google/devtools/build/lib/bazel/execlog:stable_sort",
         "//src/main/java/com/google/devtools/build/lib/util/io",
         "//src/main/protobuf:spawn_java_proto",
         "//third_party:guava",
-        "//third_party:guava-testlib",
         "//third_party:junit4",
         "//third_party:truth",
         "//third_party/protobuf:protobuf_java",
     ],
 )
+
+java_test(
+    name = "StableSortTest",
+    size = "small",
+    test_class = "com.google.devtools.build.lib.bazel.execlog.StableSortTest",
+    runtime_deps = [
+        ":StableSortTest_lib",
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+)
+
+test_suite(
+    name = "windows_tests",
+    tags = [
+        "-no_windows",
+        "-slow",
+    ],
+)
+
+test_suite(
+    name = "all_windows_tests",
+    tests = [
+        ":windows_tests",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/repository/BUILD
index 3166477..d68eff6 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/BUILD
@@ -8,67 +8,43 @@
 filegroup(
     name = "srcs",
     testonly = 0,
-    srcs = glob(["**"]) + [
+    srcs = glob(["*"]) + [
         "//src/test/java/com/google/devtools/build/lib/bazel/repository/cache:srcs",
         "//src/test/java/com/google/devtools/build/lib/bazel/repository/downloader:srcs",
+        "//src/test/java/com/google/devtools/build/lib/bazel/repository/skylark:srcs",
     ],
-    visibility = ["//src/test/java/com/google/devtools/build/lib/bazel:__pkg__"],
+    visibility = ["//src:__subpackages__"],
 )
 
-java_test(
-    name = "RepositoryTests",
-    srcs = glob([
-        "*.java",
-        "skylark/*.java",
-    ]),
+java_library(
+    name = "RepositoryTests_lib",
+    srcs = glob(
+        ["*.java"],
+        exclude = [
+            "LocalConfigPlatformFunctionTest.java",
+        ],
+    ),
     data = [
         "test_decompress_archive.tar.gz",
         "test_decompress_archive.zip",
     ],
-    tags = [
-        "rules",
-    ],
-    test_class = "com.google.devtools.build.lib.AllTests",
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:bazel-main",
-        "//src/main/java/com/google/devtools/build/lib:bazel-repository",
         "//src/main/java/com/google/devtools/build/lib:build-base",
-        "//src/main/java/com/google/devtools/build/lib:runtime",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
-        "//src/main/java/com/google/devtools/build/lib/analysis/platform",
-        "//src/main/java/com/google/devtools/build/lib/analysis/platform:utils",
-        "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache",
-        "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository",
         "//src/main/java/com/google/devtools/build/lib/clock",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
-        "//src/main/java/com/google/devtools/build/lib/collect",
-        "//src/main/java/com/google/devtools/build/lib/events",
-        "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/packages:type",
-        "//src/main/java/com/google/devtools/build/lib/pkgcache",
-        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
-        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository",
         "//src/main/java/com/google/devtools/build/lib/unix",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:os",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
-        "//src/main/java/com/google/devtools/build/skyframe",
-        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//src/main/java/com/google/devtools/common/options",
-        "//src/test/java/com/google/devtools/build/lib:test_runner",
-        "//src/test/java/com/google/devtools/build/lib/analysis/util",
-        "//src/test/java/com/google/devtools/build/lib/events:testutil",
-        "//src/test/java/com/google/devtools/build/lib/packages:testutil",
         "//src/test/java/com/google/devtools/build/lib/testutil",
         "//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
         "//src/test/java/com/google/devtools/build/lib/testutil:TestUtils",
-        "//src/test/java/com/google/devtools/build/lib/vfs/util",
         "//third_party:diffutils",
         "//third_party:guava",
-        "//third_party:guava-testlib",
-        "//third_party:jsr305",
         "//third_party:junit4",
         "//third_party:mockito",
         "//third_party:truth",
@@ -76,13 +52,57 @@
     ],
 )
 
+java_test(
+    name = "RepositoryTests",
+    tags = [
+        "rules",
+    ],
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = [
+        ":RepositoryTests_lib",
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+)
+
+java_library(
+    name = "BazelRepositoryTests_lib",
+    srcs = [
+        "LocalConfigPlatformFunctionTest.java",
+    ],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/analysis/platform",
+        "//src/main/java/com/google/devtools/build/lib/analysis/platform:utils",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/java/com/google/devtools/build/lib/util:os",
+        "//src/test/java/com/google/devtools/build/lib/analysis/util",
+        "//third_party:guava",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
+)
+
+java_test(
+    name = "BazelRepositoryTests",
+    tags = [
+        "manual",
+        "rules",
+    ],
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = [
+        ":BazelRepositoryTests_lib",
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+)
+
 test_suite(
     name = "windows_tests",
     tags = [
         "-no_windows",
         "-slow",
     ],
-    visibility = ["//visibility:private"],
 )
 
 test_suite(
@@ -91,6 +111,6 @@
         ":windows_tests",
         "//src/test/java/com/google/devtools/build/lib/bazel/repository/cache:all_windows_tests",
         "//src/test/java/com/google/devtools/build/lib/bazel/repository/downloader:all_windows_tests",
+        "//src/test/java/com/google/devtools/build/lib/bazel/repository/skylark:all_windows_tests",
     ],
-    visibility = ["//src/test/java/com/google/devtools/build/lib/bazel:__pkg__"],
 )
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/LocalConfigPlatformFunctionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/LocalConfigPlatformFunctionTest.java
index 9c6c2bd..76cdd88 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/LocalConfigPlatformFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/LocalConfigPlatformFunctionTest.java
@@ -42,7 +42,7 @@
   @RunWith(Parameterized.class)
   public static class CpuConstraintTest {
     @Parameters
-    public static Collection createInputValues() {
+    public static Collection<Object[]> createInputValues() {
       return ImmutableList.of(
           // CPU value tests.
           new Object[] {CPU.X86_64, "@platforms//cpu:x86_64"},
@@ -78,7 +78,7 @@
   @RunWith(Parameterized.class)
   public static class OsConstraintTest {
     @Parameters
-    public static Collection createInputValues() {
+    public static Collection<Object[]> createInputValues() {
       return ImmutableList.of(
           // OS value tests.
           new Object[] {OS.LINUX, "@platforms//os:linux"},
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/cache/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/repository/cache/BUILD
index 4eb4476..ba4347a 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/cache/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/cache/BUILD
@@ -1,4 +1,4 @@
-load("@rules_java//java:defs.bzl", "java_test")
+load("@rules_java//java:defs.bzl", "java_library", "java_test")
 
 package(
     default_testonly = 1,
@@ -9,25 +9,29 @@
     name = "srcs",
     testonly = 0,
     srcs = glob(["**"]),
-    visibility = ["//src/test/java/com/google/devtools/build/lib/bazel/repository:__pkg__"],
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "RepositoryCacheTests_lib",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/test/java/com/google/devtools/build/lib/testutil",
+        "//third_party:guava",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
 )
 
 java_test(
     name = "RepositoryCacheTests",
-    srcs = glob(["*.java"]),
     tags = ["rules"],
     test_class = "com.google.devtools.build.lib.AllTests",
-    deps = [
-        "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache",
-        "//src/main/java/com/google/devtools/build/lib/vfs",
+    runtime_deps = [
+        ":RepositoryCacheTests_lib",
         "//src/test/java/com/google/devtools/build/lib:test_runner",
-        "//src/test/java/com/google/devtools/build/lib/events:testutil",
-        "//src/test/java/com/google/devtools/build/lib/testutil",
-        "//src/test/java/com/google/devtools/build/lib/vfs/util",
-        "//third_party:guava",
-        "//third_party:junit4",
-        "//third_party:mockito",
-        "//third_party:truth",
     ],
 )
 
@@ -37,7 +41,6 @@
         "-no_windows",
         "-slow",
     ],
-    visibility = ["//visibility:private"],
 )
 
 test_suite(
@@ -45,5 +48,4 @@
     tests = [
         ":windows_tests",
     ],
-    visibility = ["//src/test/java/com/google/devtools/build/lib/bazel/repository:__pkg__"],
 )
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/BUILD
index 15a7108..03ab04f 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/BUILD
@@ -1,4 +1,4 @@
-load("@rules_java//java:defs.bzl", "java_test")
+load("@rules_java//java:defs.bzl", "java_library", "java_test")
 
 package(
     default_testonly = 1,
@@ -9,40 +9,47 @@
     name = "srcs",
     testonly = 0,
     srcs = glob(["**"]),
-    visibility = ["//src/test/java/com/google/devtools/build/lib/bazel/repository:__pkg__"],
+    visibility = ["//src:__subpackages__"],
 )
 
-java_test(
-    name = "DownloaderTestSuite",
+java_library(
+    name = "DownloaderTestSuite_lib",
     srcs = glob(["*.java"]),
-    tags = [
-        "requires-network",
-        "rules",
-    ],
     deps = [
         "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache",
         "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
         "//src/main/java/com/google/devtools/build/lib/events",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/vfs",
-        "//src/test/java/com/google/devtools/build/lib:test_runner",
-        "//src/test/java/com/google/devtools/build/lib/events:testutil",
         "//src/test/java/com/google/devtools/build/lib/testutil",
-        "//src/test/java/com/google/devtools/build/lib/vfs/util",
         "//third_party:guava",
+        "//third_party:jsr305",
         "//third_party:junit4",
         "//third_party:mockito",
         "//third_party:truth",
     ],
 )
 
+java_test(
+    name = "DownloaderTestSuite",
+    size = "medium",
+    tags = [
+        "requires-network",
+        "rules",
+    ],
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = [
+        ":DownloaderTestSuite_lib",
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+)
+
 test_suite(
     name = "windows_tests",
     tags = [
         "-no_windows",
         "-slow",
     ],
-    visibility = ["//visibility:private"],
 )
 
 test_suite(
@@ -50,5 +57,4 @@
     tests = [
         ":windows_tests",
     ],
-    visibility = ["//src/test/java/com/google/devtools/build/lib/bazel/repository:__pkg__"],
 )
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/BUILD
new file mode 100644
index 0000000..d8b855c
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/BUILD
@@ -0,0 +1,95 @@
+load("@rules_java//java:defs.bzl", "java_library", "java_test")
+
+package(
+    default_testonly = 1,
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    testonly = 0,
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "SkylarkTests_lib",
+    testonly = 1,
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib:syntax",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/skylark",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/packages:type",
+        "//src/main/java/com/google/devtools/build/lib/pkgcache",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/com/google/devtools/build/skyframe",
+        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//src/test/java/com/google/devtools/build/lib/analysis/util",
+        "//src/test/java/com/google/devtools/build/lib/testutil",
+        "//third_party:guava",
+        "//third_party:jsr305",
+        "//third_party:junit4",
+        "//third_party:mockito",
+        "//third_party:truth",
+    ],
+)
+
+java_test(
+    name = "SkylarkTests",
+    testonly = 1,
+    srcs = glob(["*.java"]),
+    tags = [
+        "rules",
+    ],
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = [
+        ":SkylarkTests_lib",
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/skylark",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/packages:type",
+        "//src/main/java/com/google/devtools/build/lib/pkgcache",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository",
+        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/com/google/devtools/build/skyframe",
+        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//src/test/java/com/google/devtools/build/lib/analysis/util",
+        "//src/test/java/com/google/devtools/build/lib/testutil",
+        "//third_party:guava",
+        "//third_party:jsr305",
+        "//third_party:junit4",
+        "//third_party:mockito",
+        "//third_party:truth",
+    ],
+)
+
+test_suite(
+    name = "windows_tests",
+    tags = [
+        "-no_windows",
+        "-slow",
+    ],
+)
+
+test_suite(
+    name = "all_windows_tests",
+    tests = [
+        ":windows_tests",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/rules/BUILD
new file mode 100644
index 0000000..e6c6f2f
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/BUILD
@@ -0,0 +1,70 @@
+load("@rules_java//java:defs.bzl", "java_test")
+
+package(
+    default_testonly = 1,
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    testonly = 0,
+    srcs = glob(["*"]) + [
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/android:srcs",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/genrule:srcs",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/java:srcs",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/ninja:srcs",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/python:srcs",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/sh:srcs",
+    ],
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "BazelRuleTests_lib",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:core-rules",
+        "//src/main/java/com/google/devtools/build/lib:core-workspace-rules",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/rules/config",
+        "//src/main/java/com/google/devtools/build/lib/util:os",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/com/google/devtools/common/options",
+        "//third_party:guava",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
+)
+
+java_test(
+    name = "BazelRuleTests",
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = [
+        ":BazelRuleTests_lib",
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+)
+
+test_suite(
+    name = "windows_tests",
+    tags = [
+        "-no_windows",
+        "-slow",
+    ],
+)
+
+test_suite(
+    name = "all_windows_tests",
+    tests = [
+        ":windows_tests",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/android:all_windows_tests",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/genrule:all_windows_tests",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/java:all_windows_tests",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/ninja:all_windows_tests",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/python:all_windows_tests",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/sh:all_windows_tests",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/BUILD
new file mode 100644
index 0000000..e107386
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/BUILD
@@ -0,0 +1,94 @@
+load("@rules_java//java:defs.bzl", "java_test")
+
+package(
+    default_testonly = 1,
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    testonly = 0,
+    srcs = glob(["*"]) + [
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools:srcs",
+    ],
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "AndroidTests_lib",
+    srcs = [
+        "AndroidNdkRepositoryTest.java",
+    ],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android",
+        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/test/java/com/google/devtools/build/lib/analysis/util",
+        "//src/test/java/com/google/devtools/build/lib/packages:testutil",
+        "//src/test/java/com/google/devtools/build/lib/testutil",
+        "//src/test/java/com/google/devtools/build/lib/testutil:JunitUtils",
+        "//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
+)
+
+java_test(
+    name = "AndroidTests",
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = [
+        ":AndroidTests_lib",
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+)
+
+java_test(
+    name = "BazelAndroidTests",
+    srcs = [
+        "AndroidSdkRepositoryTest.java",
+        "BazelAndroidLocalTestTest.java",
+        "SdkMavenRepositoryTest.java",
+    ],
+    resources = [
+        "//tools/android:android_sdk_repository_template.bzl",
+    ],
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = [
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
+        "//src/main/java/com/google/devtools/build/lib/packages:type",
+        "//src/main/java/com/google/devtools/build/lib/rules/android",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/test/java/com/google/devtools/build/lib/analysis/util",
+        "//src/test/java/com/google/devtools/build/lib/packages:testutil",
+        "//src/test/java/com/google/devtools/build/lib/rules/android:AndroidLocalTestTest",
+        "//third_party:guava",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
+)
+
+test_suite(
+    name = "windows_tests",
+    tags = [
+        "-no_windows",
+        "-slow",
+    ],
+)
+
+test_suite(
+    name = "all_windows_tests",
+    tests = [
+        ":windows_tests",
+        "//src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools:all_windows_tests",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/BUILD
new file mode 100644
index 0000000..ed9a4cb
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/BUILD
@@ -0,0 +1,55 @@
+load("@rules_java//java:defs.bzl", "java_library", "java_test")
+
+package(
+    default_testonly = 1,
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    testonly = 0,
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "NdkCrosstoolsTest_lib",
+    srcs = glob(["*.java"]),
+    resources = glob(["*.txt"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools:android_ndk_crosstools",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12",
+        "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/protobuf:crosstool_config_java_proto",
+        "//third_party:guava",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
+)
+
+java_test(
+    name = "NdkCrosstoolsTest",
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = [
+        ":NdkCrosstoolsTest_lib",
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+)
+
+test_suite(
+    name = "windows_tests",
+    tags = [
+        "-no_windows",
+        "-slow",
+    ],
+)
+
+test_suite(
+    name = "all_windows_tests",
+    tests = [
+        ":windows_tests",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/genrule/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/rules/genrule/BUILD
new file mode 100644
index 0000000..4729d48
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/genrule/BUILD
@@ -0,0 +1,63 @@
+load("@rules_java//java:defs.bzl", "java_library", "java_test")
+
+package(
+    default_testonly = 1,
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    testonly = 0,
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "GenruleTests_lib",
+    srcs = glob(
+               ["*.java"],
+               exclude = ["GenRuleWindowsConfiguredTargetTest.java"],
+           ) +
+           # If we are on windows add back the test
+           select({
+               "//conditions:default": [],
+               "//src/conditions:windows": ["GenRuleWindowsConfiguredTargetTest.java"],
+           }),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/util:os",  
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/test/java/com/google/devtools/build/lib/actions/util",
+        "//src/test/java/com/google/devtools/build/lib/analysis/util",
+        "//src/test/java/com/google/devtools/build/lib/testutil",
+        "//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
+        "//third_party:guava",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
+)
+
+java_test(
+    name = "GenruleTests",
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = [
+        ":GenruleTests_lib",
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+)
+
+test_suite(
+    name = "windows_tests",
+    tags = [
+        "-no_windows",
+        "-slow",
+    ],
+)
+
+test_suite(
+    name = "all_windows_tests",
+    tests = [
+        ":windows_tests",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/java/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/rules/java/BUILD
new file mode 100644
index 0000000..ed9eea2
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/java/BUILD
@@ -0,0 +1,50 @@
+load("@rules_java//java:defs.bzl", "java_library", "java_test")
+
+package(
+    default_testonly = 1,
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    testonly = 0,
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "JavaTests_lib",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/java:bazel_java_semantics",
+        "//src/main/java/com/google/devtools/build/lib/packages:build_type",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/test/java/com/google/devtools/build/lib/analysis/util",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
+)
+
+java_test(
+    name = "JavaTests",
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = [
+        ":JavaTests_lib",
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+)
+
+test_suite(
+    name = "windows_tests",
+    tags = [
+        "-no_windows",
+        "-slow",
+    ],
+)
+
+test_suite(
+    name = "all_windows_tests",
+    tests = [
+        ":windows_tests",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/BUILD
new file mode 100644
index 0000000..45b5d2d
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/BUILD
@@ -0,0 +1,62 @@
+load("@rules_java//java:defs.bzl", "java_library", "java_test")
+
+package(
+    default_testonly = 1,
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    testonly = 0,
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "NinjaTests_lib",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/file",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/parser:parser_impl",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/pipeline:pipeline_impl",
+        "//src/main/java/com/google/devtools/build/lib/concurrent",
+        "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/test/java/com/google/devtools/build/lib/actions/util",
+        "//src/test/java/com/google/devtools/build/lib/analysis/util",
+        "//src/test/java/com/google/devtools/build/lib/testutil",
+        "//third_party:guava",
+        "//third_party:jsr305",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
+)
+
+java_test(
+    name = "NinjaTests",
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = [
+        ":NinjaTests_lib",
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+)
+
+test_suite(
+    name = "windows_tests",
+    tags = [
+        "-no_windows",
+        "-slow",
+    ],
+)
+
+test_suite(
+    name = "all_windows_tests",
+    tests = [
+        ":windows_tests",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaPipelineTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaPipelineTest.java
index 338509f..fd804e5 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaPipelineTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaPipelineTest.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaRuleVariable;
 import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaTarget;
 import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaVariableValue;
-import com.google.devtools.build.lib.bazel.rules.ninja.pipeline.NinjaPipeline;
+import com.google.devtools.build.lib.bazel.rules.ninja.pipeline.NinjaPipelineImpl;
 import com.google.devtools.build.lib.concurrent.ExecutorUtil;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.DigestHashFunction;
@@ -49,7 +49,7 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-/** Tests for {@link com.google.devtools.build.lib.bazel.rules.ninja.pipeline.NinjaPipeline}. */
+/** Tests for {@link com.google.devtools.build.lib.bazel.rules.ninja.pipeline.NinjaPipelineImpl}. */
 @RunWith(JUnit4.class)
 public class NinjaPipelineTest {
   private static class Tester {
@@ -115,8 +115,8 @@
             "  command = c $in $out",
             "build t1: r1 in1 in2",
             "build t2: r1 in3");
-    NinjaPipeline pipeline =
-        new NinjaPipeline(
+    NinjaPipelineImpl pipeline =
+        new NinjaPipelineImpl(
             vfsPath.getParentDirectory(), tester.getService(), ImmutableList.of(), "ninja_target");
     List<NinjaTarget> targets = pipeline.pipeline(vfsPath);
     checkTargets(targets);
@@ -142,8 +142,8 @@
             "",
             "build t2: r1 in3",
             "");
-    NinjaPipeline pipeline =
-        new NinjaPipeline(
+    NinjaPipelineImpl pipeline =
+        new NinjaPipelineImpl(
             vfsPath.getParentDirectory(), tester.getService(), ImmutableList.of(), "ninja_target");
     List<NinjaTarget> targets = pipeline.pipeline(vfsPath);
     checkTargets(targets);
@@ -155,8 +155,8 @@
         tester.writeTmpFile(
             "test.ninja", "rule r1", "  command = c $in $out", "include child.ninja");
     Path childFile = tester.writeTmpFile("child.ninja", "build t1: r1 in1 in2", "build t2: r1 in3");
-    NinjaPipeline pipeline =
-        new NinjaPipeline(
+    NinjaPipelineImpl pipeline =
+        new NinjaPipelineImpl(
             vfsPath.getParentDirectory(),
             tester.getService(),
             ImmutableList.of(childFile),
@@ -175,8 +175,8 @@
             "  command = c $in $out",
             "include ${subfile}.ninja");
     Path childFile = tester.writeTmpFile("child.ninja", "build t1: r1 in1 in2", "build t2: r1 in3");
-    NinjaPipeline pipeline =
-        new NinjaPipeline(
+    NinjaPipelineImpl pipeline =
+        new NinjaPipelineImpl(
             vfsPath.getParentDirectory(),
             tester.getService(),
             ImmutableList.of(childFile),
@@ -203,8 +203,8 @@
             "var_for_sub=in3",
             "subninja ${subninja_file}.ninja");
     Path subFile = tester.writeTmpFile("sub.ninja", "build t2: r1 ${var_for_sub}");
-    NinjaPipeline pipeline =
-        new NinjaPipeline(
+    NinjaPipelineImpl pipeline =
+        new NinjaPipelineImpl(
             vfsPath.getParentDirectory(),
             tester.getService(),
             ImmutableList.of(childFile, subFile),
@@ -216,8 +216,8 @@
   @Test
   public void testEmptyFile() throws Exception {
     Path vfsPath = tester.writeTmpFile("test.ninja");
-    NinjaPipeline pipeline =
-        new NinjaPipeline(
+    NinjaPipelineImpl pipeline =
+        new NinjaPipelineImpl(
             vfsPath.getParentDirectory(), tester.getService(), ImmutableList.of(), "ninja_target");
     List<NinjaTarget> targets = pipeline.pipeline(vfsPath);
     assertThat(targets).isEmpty();
@@ -230,7 +230,7 @@
         assertThrows(
             GenericParsingException.class,
             () ->
-                new NinjaPipeline(
+                new NinjaPipelineImpl(
                         vfsPath.getParentDirectory(),
                         tester.getService(),
                         ImmutableList.of(),
@@ -248,8 +248,8 @@
     Path vfsPath = tester.writeTmpFile("test.ninja", "include one.ninja");
     Path oneFile = tester.writeTmpFile("one.ninja", "include two.ninja");
     Path twoFile = tester.writeTmpFile("two.ninja", "include one.ninja");
-    NinjaPipeline pipeline =
-        new NinjaPipeline(
+    NinjaPipelineImpl pipeline =
+        new NinjaPipelineImpl(
             vfsPath.getParentDirectory(),
             tester.getService(),
             ImmutableList.of(oneFile, twoFile),
@@ -283,8 +283,8 @@
             "   ",
             "build t1: r1 in1 in2");
     Path childFile = tester.writeTmpFile("child.ninja");
-    NinjaPipeline pipeline =
-        new NinjaPipeline(
+    NinjaPipelineImpl pipeline =
+        new NinjaPipelineImpl(
             vfsPath.getParentDirectory(),
             tester.getService(),
             ImmutableList.of(childFile),
@@ -302,8 +302,8 @@
     lines[998] = "build out: rule1";
     lines[999] = "pool link_pool\n  depth = 4";
     Path path = tester.writeTmpFile("big_file.ninja", lines);
-    NinjaPipeline pipeline =
-        new NinjaPipeline(
+    NinjaPipelineImpl pipeline =
+        new NinjaPipelineImpl(
             path.getParentDirectory(), tester.getService(), ImmutableList.of(), "ninja_target");
     // Test specifically that all manipulations with connecting buffers are working fine:
     // for that, have relatively long file and small buffer size.
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/python/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/rules/python/BUILD
new file mode 100644
index 0000000..1a288b9
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/python/BUILD
@@ -0,0 +1,54 @@
+load("@rules_java//java:defs.bzl", "java_library", "java_test")
+
+package(
+    default_testonly = 1,
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    testonly = 0,
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "PythonTests_lib",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/python",
+        "//src/main/java/com/google/devtools/build/lib/util:os",
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/com/google/devtools/common/options",
+        "//src/test/java/com/google/devtools/build/lib/analysis/util",
+        "//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
+)
+
+java_test(
+    name = "PythonTests",
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = [
+        ":PythonTests_lib",
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+)
+
+test_suite(
+    name = "windows_tests",
+    tags = [
+        "-no_windows",
+        "-slow",
+    ],
+)
+
+test_suite(
+    name = "all_windows_tests",
+    tests = [
+        ":windows_tests",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/sh/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/rules/sh/BUILD
new file mode 100644
index 0000000..370ebdf
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/sh/BUILD
@@ -0,0 +1,50 @@
+load("@rules_java//java:defs.bzl", "java_library", "java_test")
+
+package(
+    default_testonly = 1,
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    testonly = 0,
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "ShTests_lib",
+    srcs = glob(
+        ["*.java"],
+    ),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/test/java/com/google/devtools/build/lib/analysis/util",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
+)
+
+java_test(
+    name = "ShTests",
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = [
+        ":ShTests_lib",
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
+)
+
+test_suite(
+    name = "windows_tests",
+    tags = [
+        "-no_windows",
+        "-slow",
+    ],
+)
+
+test_suite(
+    name = "all_windows_tests",
+    tests = [
+        ":windows_tests",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/blackbox/tests/BUILD b/src/test/java/com/google/devtools/build/lib/blackbox/tests/BUILD
index 9385201..bea2a57 100644
--- a/src/test/java/com/google/devtools/build/lib/blackbox/tests/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/blackbox/tests/BUILD
@@ -58,8 +58,6 @@
     tags = ["black_box_test"],
     deps = [
         ":common_deps",
-        "//src/main/java/com/google/devtools/build/lib:bazel-ninja",
-        "//src/test/java/com/google/devtools/build/lib/testutil:JunitUtils",
     ],
 )
 
diff --git a/src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BUILD b/src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BUILD
index e871ced..4551e3a 100644
--- a/src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BUILD
@@ -47,7 +47,7 @@
     tags = ["black_box_test"],
     deps = common_deps + [
         "//src/main/java/com/google/devtools/build/lib:build-base",
-        "//src/main/java/com/google/devtools/build/lib:bazel-repository",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/test/java/com/google/devtools/build/lib/vfs/util",
         "//src/test/java/com/google/devtools/build/lib/events:testutil",
@@ -66,7 +66,7 @@
     tags = ["black_box_test"],
     deps = common_deps + [
         "//src/main/java/com/google/devtools/build/lib:build-base",
-        "//src/main/java/com/google/devtools/build/lib:bazel-repository",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/test/java/com/google/devtools/build/lib/vfs/util",
         "//src/test/java/com/google/devtools/build/lib/events:testutil",
@@ -83,7 +83,7 @@
     tags = ["black_box_test"],
     deps = common_deps + [
         "//src/main/java/com/google/devtools/build/lib:build-base",
-        "//src/main/java/com/google/devtools/build/lib:bazel-repository",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/test/java/com/google/devtools/build/lib/vfs/util",
         "//src/test/java/com/google/devtools/build/lib/events:testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/buildtool/util/BUILD b/src/test/java/com/google/devtools/build/lib/buildtool/util/BUILD
index eca0e2c..232cf9b 100644
--- a/src/test/java/com/google/devtools/build/lib/buildtool/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/buildtool/util/BUILD
@@ -21,21 +21,21 @@
         ":util_internal",
     ],
     runtime_deps = [
-        "//src/main/java/com/google/devtools/build/lib:bazel-modules",
-        "//src/main/java/com/google/devtools/build/lib:bazel-rules",
+        "//src/main/java/com/google/devtools/build/lib/bazel:modules",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules",
     ],
 )
 java_library(
     name = "util_internal",
     srcs = glob(["*.java"]),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:bazel-main",
-        "//src/main/java/com/google/devtools/build/lib:bazel/BazelRepositoryModule",
         "//src/main/java/com/google/devtools/build/lib:build",
         "//src/main/java/com/google/devtools/build/lib:build-request-options",
         "//src/main/java/com/google/devtools/build/lib:keep-going-option",
         "//src/main/java/com/google/devtools/build/lib:loading-phase-threads-option",
         "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib/bazel:main",
+        "//src/main/java/com/google/devtools/build/lib/bazel:repository_module",
         "//src/main/java/com/google/devtools/build/lib/buildeventstream",
         "//src/main/java/com/google/devtools/build/lib/clock",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
diff --git a/src/test/java/com/google/devtools/build/lib/packages/BUILD b/src/test/java/com/google/devtools/build/lib/packages/BUILD
index b7e010a..a8245bc 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/packages/BUILD
@@ -89,9 +89,8 @@
     test_class = "com.google.devtools.build.lib.packages.BazelDocumentationTest",
     deps = [
         ":testutil",
-        "//src/main/java/com/google/devtools/build/lib:bazel-main",
-        "//src/main/java/com/google/devtools/build/lib:bazel-rules",
-        "//src/main/java/com/google/devtools/build/lib/util:os",
+        "//src/main/java/com/google/devtools/build/lib/bazel:main",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules",
         "//third_party:guava",
         "//third_party:junit4",
         "@bazel_tools//tools/java/runfiles",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/BUILD b/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/BUILD
index 4603115..20977bf 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/BUILD
@@ -20,9 +20,9 @@
     ],
     tags = ["manual"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:bazel-rules-without-workspaces",
         "//src/main/java/com/google/devtools/build/lib:build-base",
         "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/proto",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/rules/cpp",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD b/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD
index 151ca6e..b998425 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD
@@ -16,11 +16,11 @@
     name = "RepositoryTests_lib",
     srcs = glob(["*.java"]),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:bazel-repository",
         "//src/main/java/com/google/devtools/build/lib:build-base",
         "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
+        "//src/main/java/com/google/devtools/build/lib/bazel/repository/skylark",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/events",
         "//src/main/java/com/google/devtools/build/lib/packages",
diff --git a/src/test/java/com/google/devtools/build/lib/shell/BUILD b/src/test/java/com/google/devtools/build/lib/shell/BUILD
index fd2564b..ed9f8ee 100644
--- a/src/test/java/com/google/devtools/build/lib/shell/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/shell/BUILD
@@ -33,8 +33,8 @@
     ],
     javacopts = ["-Xlint:-deprecation"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:bazel-main",
         "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib/bazel:main",
         "//src/main/java/com/google/devtools/build/lib/collect",
         "//src/main/java/com/google/devtools/build/lib/shell",
         "//src/main/java/com/google/devtools/build/lib/unix",
@@ -255,8 +255,8 @@
         "shell",
     ],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:bazel-main",
         "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib/bazel:main",
         "//src/main/java/com/google/devtools/build/lib/collect",
         "//src/main/java/com/google/devtools/build/lib/sandbox",
         "//src/main/java/com/google/devtools/build/lib/shell",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
index 1774876..78be2e8 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -26,10 +26,10 @@
     tags = ["skyframe"],
     visibility = ["//src/test/java/com/google/devtools/build/lib:__subpackages__"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:bazel-main",
-        "//src/main/java/com/google/devtools/build/lib:bazel-rules",
         "//src/main/java/com/google/devtools/build/lib:build-base",
         "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/bazel:main",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules",
         "//src/main/java/com/google/devtools/build/lib/clock",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/collect",
@@ -84,8 +84,6 @@
     ],
     deps = [
         ":testutil",
-        "//src/main/java/com/google/devtools/build/lib:bazel-main",
-        "//src/main/java/com/google/devtools/build/lib:bazel-rules",
         "//src/main/java/com/google/devtools/build/lib:build-base",
         "//src/main/java/com/google/devtools/build/lib:build-request-options",
         "//src/main/java/com/google/devtools/build/lib:keep-going-option",
@@ -95,6 +93,8 @@
         "//src/main/java/com/google/devtools/build/lib/actions:localhost_capacity",
         "//src/main/java/com/google/devtools/build/lib/actionsketch:action_sketch",
         "//src/main/java/com/google/devtools/build/lib/analysis/platform",
+        "//src/main/java/com/google/devtools/build/lib/bazel:main",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules",
         "//src/main/java/com/google/devtools/build/lib/causes",
         "//src/main/java/com/google/devtools/build/lib/clock",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
diff --git a/src/test/shell/bazel/BUILD b/src/test/shell/bazel/BUILD
index fa58d30..c0f0772 100644
--- a/src/test/shell/bazel/BUILD
+++ b/src/test/shell/bazel/BUILD
@@ -1120,7 +1120,7 @@
         ":test-deps",
         "//src:embedded_jdk_allmodules",
         "//src:jdeps_modules.golden",
-        "//src/main/java/com/google/devtools/build/lib:bazel/BazelServer_deploy.jar",
+        "//src/main/java/com/google/devtools/build/lib/bazel:BazelServer_deploy.jar",
         "@bazel_tools//tools/bash/runfiles",
     ],
     tags = ["no_windows"],