diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index aa77f34..438a480 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -77,10 +77,14 @@
 java_library(
     name = "testutil",
     testonly = 1,
-    srcs = glob(["testutil/*.java"]),
+    srcs = glob(
+        ["testutil/*.java"],
+        exclude = ["testutil/BazelPackageBuilderHelperForTesting.java"],
+    ),
     visibility = ["//visibility:public"],
     deps = [
         ":guava_junit_truth",
+        ":testutil/BazelPackageBuilderHelperForTesting",
         "//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",
@@ -88,6 +92,7 @@
         "//src/main/java/com/google/devtools/build/lib:io",
         "//src/main/java/com/google/devtools/build/lib:os_util",
         "//src/main/java/com/google/devtools/build/lib:packages",
+        "//src/main/java/com/google/devtools/build/lib:packages/BuilderFactoryForTesting",
         "//src/main/java/com/google/devtools/build/lib:util",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/clock",
@@ -102,6 +107,19 @@
 )
 
 java_library(
+    name = "testutil/BazelPackageBuilderHelperForTesting",
+    testonly = 0,
+    srcs = ["testutil/BazelPackageBuilderHelperForTesting.java"],
+    visibility = ["//visibility:public"],
+    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/skyframe/packages",
+        "//third_party:guava",
+    ],
+)
+
+java_library(
     name = "foundations_testutil",
     testonly = 1,
     srcs = glob([
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
index eb6605a..a9960b0 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
@@ -271,8 +271,8 @@
 
   @Override
   public void setupMockWorkspaceFiles(Path embeddedBinariesRoot) throws IOException {
+    embeddedBinariesRoot.createDirectoryAndParents();
     Path jdkWorkspacePath = embeddedBinariesRoot.getRelative("jdk.WORKSPACE");
-    FileSystemUtils.createDirectoryAndParents(jdkWorkspacePath.getParentDirectory());
     FileSystemUtils.writeContentAsLatin1(jdkWorkspacePath, "");
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index a60b3ec..7084281 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -205,6 +205,10 @@
 
   @Before
   public final void initializeSkyframeExecutor() throws Exception {
+    initializeSkyframeExecutor(/*doPackageLoadingChecks=*/ true);
+  }
+
+  public void initializeSkyframeExecutor(boolean doPackageLoadingChecks) throws Exception {
     analysisMock = getAnalysisMock();
     directories =
         new BlazeDirectories(
@@ -227,13 +231,16 @@
         PrecomputedValue.injected(
             RepositoryDelegatorFunction.REPOSITORY_OVERRIDES,
             ImmutableMap.<RepositoryName, PathFragment>of()));
-    pkgFactory =
+    PackageFactory.BuilderForTesting pkgFactoryBuilder =
         analysisMock
             .getPackageFactoryBuilderForTesting(directories)
             .setExtraPrecomputeValues(extraPrecomputedValues)
             .setEnvironmentExtensions(getEnvironmentExtensions())
-            .setPlatformSetRegexps(getPlatformSetRegexps())
-            .build(ruleClassProvider, scratch.getFileSystem());
+            .setPlatformSetRegexps(getPlatformSetRegexps());
+    if (!doPackageLoadingChecks) {
+      pkgFactoryBuilder.disableChecks();
+    }
+    pkgFactory = pkgFactoryBuilder.build(ruleClassProvider, scratch.getFileSystem());
     tsgm = new TimestampGranularityMonitor(BlazeClock.instance());
     skyframeExecutor =
         SequencedSkyframeExecutor.create(
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/LoadingMock.java b/src/test/java/com/google/devtools/build/lib/packages/util/LoadingMock.java
index 0c924aa..d50b43d 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/LoadingMock.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/LoadingMock.java
@@ -33,7 +33,7 @@
   public PackageFactoryBuilderWithSkyframeForTesting getPackageFactoryBuilderForTesting(
       BlazeDirectories directories) {
     return (PackageFactoryBuilderWithSkyframeForTesting)
-        TestConstants.PACKAGE_FACTORY_BUILDER_FACTORY_FOR_TESTING.builder();
+        TestConstants.PACKAGE_FACTORY_BUILDER_FACTORY_FOR_TESTING.builder(directories);
   }
 
   public ConfiguredRuleClassProvider createRuleClassProvider() {
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
index b934efe..4863530 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
@@ -60,9 +60,7 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-/**
- * Tests for package loading.
- */
+/** Tests for package loading. */
 @RunWith(JUnit4.class)
 public class PackageCacheTest extends FoundationTestCase {
 
@@ -76,6 +74,10 @@
     initializeSkyframeExecutor(/*doPackageLoadingChecks=*/ true);
   }
 
+  /**
+   * @param doPackageLoadingChecks when true, a PackageLoader will be called after each package load
+   *     this test performs, and the results compared to SkyFrame's result.
+   */
   private void initializeSkyframeExecutor(boolean doPackageLoadingChecks) throws Exception {
     analysisMock = AnalysisMock.get();
     ruleClassProvider = analysisMock.createRuleClassProvider();
@@ -110,8 +112,7 @@
   }
 
   private void setUpSkyframe(
-      PackageCacheOptions packageCacheOptions,
-      SkylarkSemanticsOptions skylarkSemanticsOptions) {
+      PackageCacheOptions packageCacheOptions, SkylarkSemanticsOptions skylarkSemanticsOptions) {
     PathPackageLocator pkgLocator =
         PathPackageLocator.create(
             null,
@@ -136,8 +137,8 @@
   }
 
   private OptionsParser parse(String... options) throws Exception {
-    OptionsParser parser = OptionsParser.newOptionsParser(
-        PackageCacheOptions.class, SkylarkSemanticsOptions.class);
+    OptionsParser parser =
+        OptionsParser.newOptionsParser(PackageCacheOptions.class, SkylarkSemanticsOptions.class);
     parser.parse("--default_visibility=public");
     parser.parse(options);
 
@@ -160,9 +161,7 @@
   }
 
   protected void setOptions(String... options) throws Exception {
-    setUpSkyframe(
-        parsePackageCacheOptions(options),
-        parseSkylarkSemanticsOptions(options));
+    setUpSkyframe(parsePackageCacheOptions(options), parseSkylarkSemanticsOptions(options));
   }
 
   private PackageManager getPackageManager() {
@@ -176,8 +175,8 @@
 
   private Package getPackage(String packageName)
       throws NoSuchPackageException, InterruptedException {
-    return getPackageManager().getPackage(reporter,
-        PackageIdentifier.createInMainRepo(packageName));
+    return getPackageManager()
+        .getPackage(reporter, PackageIdentifier.createInMainRepo(packageName));
   }
 
   private Target getTarget(Label label)
@@ -222,9 +221,8 @@
 
   @Test
   public void testGetNonexistentPackage() throws Exception {
-    checkGetPackageFails("not-there",
-                         "no such package 'not-there': "
-                         + "BUILD file not found on package path");
+    checkGetPackageFails(
+        "not-there", "no such package 'not-there': " + "BUILD file not found on package path");
   }
 
   @Test
@@ -250,34 +248,32 @@
       getTarget("//pkg1:not-there");
       fail();
     } catch (NoSuchTargetException e) {
-      assertThat(e).hasMessage("no such target '//pkg1:not-there': target 'not-there' "
-          + "not declared in package 'pkg1' defined by /workspace/pkg1/BUILD");
+      assertThat(e)
+          .hasMessage(
+              "no such target '//pkg1:not-there': target 'not-there' "
+                  + "not declared in package 'pkg1' defined by /workspace/pkg1/BUILD");
     }
   }
 
   /**
-   * A missing package is one for which no BUILD file can be found.  The
-   * PackageCache caches failures of this kind until the next sync.
+   * A missing package is one for which no BUILD file can be found. The PackageCache caches failures
+   * of this kind until the next sync.
    */
   @Test
   public void testRepeatedAttemptsToParseMissingPackage() throws Exception {
-    checkGetPackageFails("missing",
-                         "no such package 'missing': "
-                         + "BUILD file not found on package path");
+    checkGetPackageFails(
+        "missing", "no such package 'missing': " + "BUILD file not found on package path");
 
     // Still missing:
-    checkGetPackageFails("missing",
-                         "no such package 'missing': "
-                         + "BUILD file not found on package path");
+    checkGetPackageFails(
+        "missing", "no such package 'missing': " + "BUILD file not found on package path");
 
     // Update the BUILD file on disk so "missing" is no longer missing:
-    scratch.file("missing/BUILD",
-                 "# an ok build file");
+    scratch.file("missing/BUILD", "# an ok build file");
 
     // Still missing:
-    checkGetPackageFails("missing",
-                         "no such package 'missing': "
-                         + "BUILD file not found on package path");
+    checkGetPackageFails(
+        "missing", "no such package 'missing': " + "BUILD file not found on package path");
 
     invalidatePackages();
 
@@ -297,7 +293,7 @@
    *
    * <p>Note: since the PackageCache.setStrictPackageCreation method was deleted (since it wasn't
    * used by any significant clients) creating a "broken" build file got trickier--syntax errors are
-   * not enough.  For now, we create an unreadable BUILD file, which will cause an IOException to be
+   * not enough. For now, we create an unreadable BUILD file, which will cause an IOException to be
    * thrown. This test seems less valuable than it once did.
    */
   @Test
@@ -316,8 +312,7 @@
     eventCollector.clear();
 
     // Update the BUILD file on disk so "broken" is no longer broken:
-    scratch.overwriteFile("broken/BUILD",
-                 "# an ok build file");
+    scratch.overwriteFile("broken/BUILD", "# an ok build file");
 
     invalidatePackages(); //  resets cache of failures
 
@@ -328,10 +323,11 @@
 
   @Test
   public void testMovedBuildFileCausesReloadAfterSync() throws Exception {
-    Path buildFile1 = scratch.file("pkg/BUILD",
-                                  "cc_library(name = 'foo')");
-    Path buildFile2 = scratch.file("/otherroot/pkg/BUILD",
-                                  "cc_library(name = 'bar')");
+    // PackageLoader doesn't support --package_path.
+    initializeSkyframeExecutor(/*doPackageLoadingChecks=*/ false);
+
+    Path buildFile1 = scratch.file("pkg/BUILD", "cc_library(name = 'foo')");
+    Path buildFile2 = scratch.file("/otherroot/pkg/BUILD", "cc_library(name = 'bar')");
     setOptions("--package_path=/workspace:/otherroot");
 
     Package oldPkg = getPackage("pkg");
@@ -386,8 +382,8 @@
     setOptions("--package_path=/workspace:/otherroot");
   }
 
-  protected Path createBuildFile(Path workspace, String packageName,
-      String... targets) throws IOException {
+  protected Path createBuildFile(Path workspace, String packageName, String... targets)
+      throws IOException {
     String[] lines = new String[targets.length];
 
     for (int i = 0; i < targets.length; i++) {
@@ -397,8 +393,7 @@
     return scratch.file(workspace + "/" + packageName + "/BUILD", lines);
   }
 
-  private void assertLabelValidity(boolean expected, String labelString)
-      throws Exception {
+  private void assertLabelValidity(boolean expected, String labelString) throws Exception {
     Label label = Label.parseAbsolute(labelString);
 
     boolean actual = false;
@@ -410,9 +405,16 @@
       error = e.getMessage();
     }
     if (actual != expected) {
-      fail("assertLabelValidity(" + label + ") "
-           + actual + ", not equal to expected value " + expected
-           + " (error=" + error + ")");
+      fail(
+          "assertLabelValidity("
+              + label
+              + ") "
+              + actual
+              + ", not equal to expected value "
+              + expected
+              + " (error="
+              + error
+              + ")");
     }
   }
 
@@ -425,9 +427,7 @@
   @Test
   public void testLocationForLabelCrossingSubpackage() throws Exception {
     scratch.file("e/f/BUILD");
-    scratch.file("e/BUILD",
-        "# Whatever",
-        "filegroup(name='fg', srcs=['f/g'])");
+    scratch.file("e/BUILD", "# Whatever", "filegroup(name='fg', srcs=['f/g'])");
     reporter.removeHandler(failFastHandler);
     List<Event> events = getPackage("e").getEvents();
     assertThat(events).hasSize(1);
@@ -437,6 +437,9 @@
   /** Static tests (i.e. no changes to filesystem, nor calls to sync). */
   @Test
   public void testLabelValidity() throws Exception {
+    // PackageLoader doesn't support --package_path.
+    initializeSkyframeExecutor(/*doPackageLoadingChecks=*/ false);
+
     reporter.removeHandler(failFastHandler);
     setUpCacheWithTwoRootLocator();
 
@@ -476,9 +479,8 @@
   @Test
   public void testAddedBuildFileCausesLabelToBecomeInvalid() throws Exception {
     reporter.removeHandler(failFastHandler);
-    scratch.file("pkg/BUILD",
-                 "           cc_library(name = 'foo', ",
-                 "           srcs = ['x/y.cc'])");
+    scratch.file(
+        "pkg/BUILD", "           cc_library(name = 'foo', ", "           srcs = ['x/y.cc'])");
 
     assertLabelValidity(true, "//pkg:x/y.cc");
 
@@ -491,9 +493,10 @@
     invalidatePackages();
 
     // now:
-    assertPackageLoadingFails("pkg",
+    assertPackageLoadingFails(
+        "pkg",
         "Label '//pkg:x/y.cc' crosses boundary of subpackage 'pkg/x' "
-        + "(perhaps you meant to put the colon here: '//pkg/x:y.cc'?)");
+            + "(perhaps you meant to put the colon here: '//pkg/x:y.cc'?)");
   }
 
   @Test
@@ -513,9 +516,10 @@
     assertLabelValidity(true, "//c/d:foo.txt");
     // ...and this crosses package boundaries:
     assertLabelValidity(false, "//c:d/x");
-    assertPackageLoadingFails("c",
+    assertPackageLoadingFails(
+        "c",
         "Label '//c:d/x' crosses boundary of subpackage 'c/d' (have you deleted c/d/BUILD? "
-        + "If so, use the --deleted_packages=c/d option)");
+            + "If so, use the --deleted_packages=c/d option)");
 
     assertThat(getPackageManager().isPackage(reporter, PackageIdentifier.createInMainRepo("c/d")))
         .isTrue();
@@ -532,8 +536,9 @@
       getPackage("c/d");
       fail();
     } catch (NoSuchPackageException e) {
-      assertThat(e).hasMessage(
-          "no such package 'c/d': Package is considered deleted due to --deleted_packages");
+      assertThat(e)
+          .hasMessage(
+              "no such package 'c/d': Package is considered deleted due to --deleted_packages");
     }
 
     // Labels in the subpackage are no longer valid...
@@ -544,7 +549,8 @@
 
   @Test
   public void testPackageFeatures() throws Exception {
-    scratch.file("peach/BUILD",
+    scratch.file(
+        "peach/BUILD",
         "package(features = ['crosstool_default_false'])",
         "cc_library(name = 'cc', srcs = ['cc.cc'])");
     Rule cc = (Rule) getTarget("//peach:cc");
@@ -556,11 +562,7 @@
     reporter.removeHandler(failFastHandler);
     setOptions("--package_path=.:.");
     scratch.file("x/y/BUILD");
-    scratch.file("x/BUILD",
-        "genrule(name = 'x',",
-        "srcs = [],",
-        "outs = ['y/z.h'],",
-        "cmd  = '')");
+    scratch.file("x/BUILD", "genrule(name = 'x',", "srcs = [],", "outs = ['y/z.h'],", "cmd  = '')");
     Package p = getPackage("x");
     assertThat(p.containsErrors()).isTrue();
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
index d685a46..4781496 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
@@ -73,6 +73,17 @@
 public class AndroidBinaryTest extends AndroidBuildViewTestCase {
 
   @Before
+  public final void turnOffPackageLoadingChecks() throws Exception {
+    // By default, PackageLoader loads every package the test harness loads, in order to verify
+    // the PackageLoader works correctly. In this test, however, PackageLoader sometimes fails to
+    // load packages and causes the test to become flaky.
+    // Since PackageLoader gets generally good coverage from the rest of Bazel's tests, and because
+    // we believe there's nothing special from the point of view of package loading in this test,
+    // we disable this verification here.
+    initializeSkyframeExecutor(/*doPackageLoadingChecks=*/ false);
+  }
+
+  @Before
   public void createFiles() throws Exception {
     scratch.file("java/android/BUILD",
         "android_binary(name = 'app',",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
index cc23c7c..2c832dd 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
@@ -44,6 +44,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -51,6 +52,17 @@
 /** Test case for apple_binary. */
 @RunWith(JUnit4.class)
 public class AppleBinaryTest extends ObjcRuleTestCase {
+  @Before
+  public final void turnOffPackageLoadingChecks() throws Exception {
+    // By default, PackageLoader loads every package the test harness loads, in order to verify
+    // the PackageLoader works correctly. In this test, however, PackageLoader sometimes fails to
+    // load packages and causes the test to become flaky.
+    // Since PackageLoader gets generally good coverage from the rest of Bazel's tests, and because
+    // we believe there's nothing special from the point of view of package loading in this test,
+    // we disable this verification here.
+    initializeSkyframeExecutor(/*doPackageLoadingChecks=*/ false);
+  }
+
   static final RuleType RULE_TYPE = new RuleType("apple_binary") {
     @Override
     Iterable<String> requiredAttributes(Scratch scratch, String packageDir,
diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
index f3ab343..0c9357d 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
@@ -117,7 +117,7 @@
                     new WorkspaceFileFunction(
                         TestRuleClassProvider.getRuleClassProvider(),
                         TestConstants.PACKAGE_FACTORY_BUILDER_FACTORY_FOR_TESTING
-                            .builder()
+                            .builder(directories)
                             .build(
                                 TestRuleClassProvider.getRuleClassProvider(), root.getFileSystem()),
                         directories))
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
index 3b83fa8..681e4aa 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
@@ -111,7 +111,7 @@
                     new WorkspaceFileFunction(
                         TestRuleClassProvider.getRuleClassProvider(),
                         TestConstants.PACKAGE_FACTORY_BUILDER_FACTORY_FOR_TESTING
-                            .builder()
+                            .builder(directories)
                             .build(
                                 TestRuleClassProvider.getRuleClassProvider(), root.getFileSystem()),
                         directories))
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
index 6a8543f..2c0c772 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
@@ -166,7 +166,7 @@
                     new WorkspaceFileFunction(
                         TestRuleClassProvider.getRuleClassProvider(),
                         TestConstants.PACKAGE_FACTORY_BUILDER_FACTORY_FOR_TESTING
-                            .builder()
+                            .builder(directories)
                             .build(TestRuleClassProvider.getRuleClassProvider(), fs),
                         directories))
                 .put(SkyFunctions.EXTERNAL_PACKAGE, new ExternalPackageFunction())
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
index 0edfea3..a0c16e4 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
@@ -132,10 +132,13 @@
             BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY));
     skyFunctions.put(SkyFunctions.WORKSPACE_AST,
         new WorkspaceASTFunction(TestRuleClassProvider.getRuleClassProvider()));
-    skyFunctions.put(SkyFunctions.WORKSPACE_FILE,
-        new WorkspaceFileFunction(TestRuleClassProvider.getRuleClassProvider(),
-            TestConstants.PACKAGE_FACTORY_BUILDER_FACTORY_FOR_TESTING.builder().build(
-                TestRuleClassProvider.getRuleClassProvider(), fs),
+    skyFunctions.put(
+        SkyFunctions.WORKSPACE_FILE,
+        new WorkspaceFileFunction(
+            TestRuleClassProvider.getRuleClassProvider(),
+            TestConstants.PACKAGE_FACTORY_BUILDER_FACTORY_FOR_TESTING
+                .builder(directories)
+                .build(TestRuleClassProvider.getRuleClassProvider(), fs),
             directories));
     skyFunctions.put(SkyFunctions.EXTERNAL_PACKAGE, new ExternalPackageFunction());
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java
index ac45a7e..679d276 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java
@@ -51,6 +51,7 @@
 
   @Before
   public final void createSkyframeExecutor() throws Exception {
+    initializeSkyframeExecutor(/*doPackageLoadingChecks=*/ false);
     skyframeExecutor = getSkyframeExecutor();
   }
 
@@ -63,7 +64,7 @@
 
   private RecursivePkgValue buildRecursivePkgValue(Path root, PathFragment rootRelativePath)
       throws Exception {
-    return buildRecursivePkgValue(root, rootRelativePath, ImmutableSet.<PathFragment>of());
+    return buildRecursivePkgValue(root, rootRelativePath, ImmutableSet.of());
   }
 
   private RecursivePkgValue buildRecursivePkgValue(
@@ -139,8 +140,7 @@
     WalkableGraph graph = Preconditions.checkNotNull(evaluationResult.getWalkableGraph());
     assertThat(
             exists(
-                buildRecursivePkgKey(
-                    rootDirectory, excludedPathFragment, ImmutableSet.<PathFragment>of()),
+                buildRecursivePkgKey(rootDirectory, excludedPathFragment, ImmutableSet.of()),
                 graph))
         .isFalse();
 
@@ -148,8 +148,7 @@
     // because that key was evaluated.
     assertThat(
             exists(
-                buildRecursivePkgKey(
-                    rootDirectory, PathFragment.create("a/c"), ImmutableSet.<PathFragment>of()),
+                buildRecursivePkgKey(rootDirectory, PathFragment.create("a/c"), ImmutableSet.of()),
                 graph))
         .isTrue();
   }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
index 3348527..8554b25 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
@@ -220,7 +220,7 @@
                     new WorkspaceFileFunction(
                         TestRuleClassProvider.getRuleClassProvider(),
                         TestConstants.PACKAGE_FACTORY_BUILDER_FACTORY_FOR_TESTING
-                            .builder()
+                            .builder(directories)
                             .build(
                                 TestRuleClassProvider.getRuleClassProvider(),
                                 scratch.getFileSystem()),
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoaderTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoaderTest.java
index 1ac5266..31c25f5 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoaderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoaderTest.java
@@ -37,28 +37,26 @@
 
 /** Abstract base class of a unit test for a {@link AbstractPackageLoader} implementation. */
 public abstract class AbstractPackageLoaderTest {
-  private Path pkgRoot;
+  private Path workspaceDir;
   protected StoredEventHandler handler;
-  protected PackageLoader pkgLoader;
+  protected FileSystem fs;
+  private Reporter reporter;
 
   @Before
   public final void init() throws Exception {
-    FileSystem fs = new InMemoryFileSystem();
-    pkgRoot = fs.getPath("/").getRelative("pkgRoot");
-    FileSystemUtils.createDirectoryAndParents(pkgRoot);
-    Reporter reporter = new Reporter(new EventBus());
+    fs = new InMemoryFileSystem();
+    workspaceDir = fs.getPath("/workspace/");
+    workspaceDir.createDirectoryAndParents();
+    reporter = new Reporter(new EventBus());
     handler = new StoredEventHandler();
     reporter.addHandler(handler);
-    pkgLoader = makeFreshBuilder(pkgRoot)
-        .useDefaultSkylarkSemantics()
-        .setReporter(reporter)
-        .build();
   }
 
-  protected abstract AbstractPackageLoader.Builder makeFreshBuilder(Path pkgRoot);
+  protected abstract AbstractPackageLoader.Builder newPackageLoaderBuilder(Path workspaceDir);
 
   @Test
   public void simpleNoPackage() throws Exception {
+    PackageLoader pkgLoader = newPackageLoader();
     PackageIdentifier pkgId = PackageIdentifier.createInMainRepo(PathFragment.create("nope"));
     try {
       pkgLoader.loadPackage(pkgId);
@@ -73,6 +71,7 @@
 
   @Test
   public void simpleBadPackage() throws Exception {
+    PackageLoader pkgLoader = newPackageLoader();
     file("bad/BUILD", "invalidBUILDsyntax");
     PackageIdentifier pkgId = PackageIdentifier.createInMainRepo(PathFragment.create("bad"));
     Package badPkg = pkgLoader.loadPackage(pkgId);
@@ -83,18 +82,20 @@
 
   @Test
   public void simpleGoodPackage() throws Exception {
+    PackageLoader pkgLoader = newPackageLoader();
     file("good/BUILD", "sh_library(name = 'good')");
     PackageIdentifier pkgId = PackageIdentifier.createInMainRepo(PathFragment.create("good"));
     Package goodPkg = pkgLoader.loadPackage(pkgId);
     assertThat(goodPkg.containsErrors()).isFalse();
-    assertThat(
-        goodPkg.getTarget("good").getAssociatedRule().getRuleClass()).isEqualTo("sh_library");
+    assertThat(goodPkg.getTarget("good").getAssociatedRule().getRuleClass())
+        .isEqualTo("sh_library");
     assertNoEvents(goodPkg.getEvents());
     assertNoEvents(handler.getEvents());
   }
 
   @Test
   public void simpleMultipleGoodPackage() throws Exception {
+    PackageLoader pkgLoader = newPackageLoader();
     file("good1/BUILD", "sh_library(name = 'good1')");
     file("good2/BUILD", "sh_library(name = 'good2')");
     PackageIdentifier pkgId1 = PackageIdentifier.createInMainRepo(PathFragment.create("good1"));
@@ -114,6 +115,7 @@
 
   @Test
   public void loadPackagesToleratesDuplicates() throws Exception {
+    PackageLoader pkgLoader = newPackageLoader();
     file("good1/BUILD", "sh_library(name = 'good1')");
     PackageIdentifier pkgId = PackageIdentifier.createInMainRepo(PathFragment.create("good1"));
     ImmutableMap<PackageIdentifier, PackageLoader.PackageOrException> pkgs =
@@ -127,29 +129,33 @@
 
   @Test
   public void simpleGoodPackage_Skylark() throws Exception {
-    file("good/good.bzl",
-        "def f(x):",
-        "  native.sh_library(name = x)");
-    file("good/BUILD",
-        "load('//good:good.bzl', 'f')",
-        "f('good')");
+    PackageLoader pkgLoader = newPackageLoader();
+    file("good/good.bzl", "def f(x):", "  native.sh_library(name = x)");
+    file("good/BUILD", "load('//good:good.bzl', 'f')", "f('good')");
     PackageIdentifier pkgId = PackageIdentifier.createInMainRepo(PathFragment.create("good"));
     Package goodPkg = pkgLoader.loadPackage(pkgId);
     assertThat(goodPkg.containsErrors()).isFalse();
-    assertThat(
-        goodPkg.getTarget("good").getAssociatedRule().getRuleClass()).isEqualTo("sh_library");
+    assertThat(goodPkg.getTarget("good").getAssociatedRule().getRuleClass())
+        .isEqualTo("sh_library");
     assertNoEvents(goodPkg.getEvents());
     assertNoEvents(handler.getEvents());
   }
 
   protected Path path(String rootRelativePath) {
-    return pkgRoot.getRelative(PathFragment.create(rootRelativePath));
+    return workspaceDir.getRelative(PathFragment.create(rootRelativePath));
   }
 
   protected Path file(String fileName, String... contents) throws Exception {
     Path path = path(fileName);
-    FileSystemUtils.createDirectoryAndParents(path.getParentDirectory());
+    path.getParentDirectory().createDirectoryAndParents();
     FileSystemUtils.writeContentAsLatin1(path, Joiner.on("\n").join(contents));
     return path;
   }
+
+  protected PackageLoader newPackageLoader() {
+    return newPackageLoaderBuilder(workspaceDir)
+        .useDefaultSkylarkSemantics()
+        .setReporter(reporter)
+        .build();
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/packages/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/packages/BUILD
index 105843b..137ae9d 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/packages/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/packages/BUILD
@@ -17,11 +17,14 @@
         "BazelPackageLoaderTest.java",
     ],
     deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
         "//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/skyframe/packages",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
+        "//src/test/java/com/google/devtools/build/lib:analysis_testutil",
+        "//src/test/java/com/google/devtools/build/lib:packages_testutil",
         "//src/test/java/com/google/devtools/build/lib:testutil",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoaderTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoaderTest.java
index fb53082..a676586 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoaderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoaderTest.java
@@ -16,11 +16,15 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.testutil.MoreAsserts.assertNoEvents;
 
+import com.google.devtools.build.lib.analysis.ServerDirectories;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.Package;
+import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
+import java.io.IOException;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -33,13 +37,47 @@
  */
 @RunWith(JUnit4.class)
 public final class BazelPackageLoaderTest extends AbstractPackageLoaderTest {
+
+  private Path installBase;
+  private Path outputBase;
+
+  @Before
+  public void setUp() throws Exception {
+    installBase = fs.getPath("/installBase/");
+    installBase.createDirectoryAndParents();
+    outputBase = fs.getPath("/outputBase/");
+    outputBase.createDirectoryAndParents();
+    Path embeddedBinaries = ServerDirectories.getEmbeddedBinariesRoot(installBase);
+    embeddedBinaries.createDirectoryAndParents();
+
+    mockEmbeddedTools(embeddedBinaries);
+  }
+
+  private void mockEmbeddedTools(Path embeddedBinaries) throws IOException {
+    Path tools = embeddedBinaries.getRelative("embedded_tools");
+    tools.getRelative("tools/cpp").createDirectoryAndParents();
+    tools.getRelative("tools/osx").createDirectoryAndParents();
+    FileSystemUtils.writeIsoLatin1(tools.getRelative("WORKSPACE"), "");
+    FileSystemUtils.writeIsoLatin1(tools.getRelative("tools/cpp/BUILD"), "");
+    FileSystemUtils.writeIsoLatin1(
+        tools.getRelative("tools/cpp/cc_configure.bzl"),
+        "def cc_configure(*args, **kwargs):",
+        "    pass");
+    FileSystemUtils.writeIsoLatin1(tools.getRelative("tools/osx/BUILD"), "");
+    FileSystemUtils.writeIsoLatin1(
+        tools.getRelative("tools/osx/xcode_configure.bzl"),
+        "def xcode_configure(*args, **kwargs):",
+        "    pass");
+  }
+
   @Override
-  protected BazelPackageLoader.Builder makeFreshBuilder(Path pkgRoot) {
-    return BazelPackageLoader.builder(pkgRoot);
+  protected AbstractPackageLoader.Builder newPackageLoaderBuilder(Path workspaceDir) {
+    return BazelPackageLoader.builder(workspaceDir, installBase, outputBase);
   }
 
   @Test
   public void simpleLocalRepositoryPackage() throws Exception {
+    PackageLoader pkgLoader = newPackageLoader();
     file("WORKSPACE", "local_repository(name = 'r', path='r')");
     file("r/WORKSPACE", "workspace(name = 'r')");
     file("r/good/BUILD", "sh_library(name = 'good')");
@@ -52,4 +90,22 @@
     assertNoEvents(goodPkg.getEvents());
     assertNoEvents(handler.getEvents());
   }
+
+  @Test
+  public void newLocalRepository() throws Exception {
+    PackageLoader pkgLoader = newPackageLoader();
+    file(
+        "WORKSPACE",
+        "new_local_repository(name = 'r', path = '/r', "
+            + "build_file_content = 'sh_library(name = \"good\")')");
+    fs.getPath("/r").createDirectoryAndParents();
+    PackageIdentifier pkgId =
+        PackageIdentifier.create(RepositoryName.create("@r"), PathFragment.create(""));
+    Package goodPkg = pkgLoader.loadPackage(pkgId);
+    assertThat(goodPkg.containsErrors()).isFalse();
+    assertThat(goodPkg.getTarget("good").getAssociatedRule().getRuleClass())
+        .isEqualTo("sh_library");
+    assertNoEvents(goodPkg.getEvents());
+    assertNoEvents(handler.getEvents());
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java b/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java
index 2bd6cf6..6f9cd61 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java
@@ -17,18 +17,16 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
+import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.packages.RuleClassProvider;
 import com.google.devtools.build.lib.packages.Target;
-import com.google.devtools.build.lib.skyframe.PackageFunction;
 import com.google.devtools.build.lib.skyframe.packages.BazelPackageLoader;
 import com.google.devtools.build.lib.skyframe.packages.PackageLoader;
 import com.google.devtools.build.lib.syntax.SkylarkSemantics;
-import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.PathFragment;
 
 /**
  * A Package.Builder.Helper for use in tests that a sanity check with {@link BazelPackageLoader} for
@@ -36,9 +34,12 @@
  */
 public class BazelPackageBuilderHelperForTesting implements Package.Builder.Helper {
   private final RuleClassProvider ruleClassProvider;
+  private final BlazeDirectories directories;
 
-  public BazelPackageBuilderHelperForTesting(RuleClassProvider ruleClassProvider) {
+  public BazelPackageBuilderHelperForTesting(
+      RuleClassProvider ruleClassProvider, BlazeDirectories directories) {
     this.ruleClassProvider = ruleClassProvider;
+    this.directories = directories;
   }
 
   @Override
@@ -66,23 +67,14 @@
       RuleClassProvider ruleClassProvider,
       SkylarkSemantics skylarkSemantics) {
     PackageIdentifier pkgId = pkg.getPackageIdentifier();
-    if (pkgId.equals(Label.EXTERNAL_PACKAGE_IDENTIFIER)
-        || !pkg.getPackageIdentifier().getRepository().isMain()
-        || PackageFunction.isDefaultsPackage(pkg.getPackageIdentifier())) {
-      // TODO(nharmata): Support these packages.
-      return;
-    }
-    int numNameSegments = pkg.getNameFragment().segmentCount();
-    PathFragment fullFilenameFragment = pkg.getFilename().asFragment();
-    int numFullFilenameFragmentSegments = fullFilenameFragment.segmentCount();
-    Path workspaceRoot = pkg.getFilename().getFileSystem().getPath(
-        fullFilenameFragment.subFragment(
-            0,
-            numFullFilenameFragmentSegments - (numNameSegments + 1)));
-    PackageLoader packageLoader = BazelPackageLoader.builder(workspaceRoot)
-        .setSkylarkSemantics(skylarkSemantics)
-        .setRuleClassProvider(ruleClassProvider)
-        .build();
+    PackageLoader packageLoader =
+        BazelPackageLoader.builder(
+                directories.getWorkspace(),
+                directories.getInstallBase(),
+                directories.getOutputBase())
+            .setSkylarkSemantics(skylarkSemantics)
+            .setRuleClassProvider(ruleClassProvider)
+            .build();
     Package newlyLoadedPkg;
     try {
       newlyLoadedPkg = packageLoader.loadPackage(pkg.getPackageIdentifier());
@@ -97,17 +89,31 @@
         ImmutableSet.copyOf(
             Iterables.transform(newlyLoadedPkg.getTargets().values(), TARGET_TO_LABEL));
     if (!targetsInPkg.equals(targetsInNewlyLoadedPkg)) {
-      throw new IllegalStateException(String.format(
-          "The Package for %s had a different set of targets (<targetsInPkg> - "
-          + "<targetsInNewlyLoadedPkg> = %s, <targetsInNewlyLoadedPkg> - <targetsInPkg> = %s) when "
-          + "loaded normally during execution of the current test than it did when loaded via "
-          + "BazelPackageLoader (done automatically by the BazelPackageBuilderHelperForTesting "
-          + "hook). This either means: (i) Skyframe package loading semantics have diverged from "
-          + "BazelPackageLoader semantics (ii) The test in question is doing something that "
-          + "confuses BazelPackageBuilderHelperForTesting.",
-          pkgId,
-          Sets.difference(targetsInPkg, targetsInNewlyLoadedPkg),
-          Sets.difference(targetsInNewlyLoadedPkg, targetsInPkg)));
+      Sets.SetView<Label> unsatisfied = Sets.difference(targetsInPkg, targetsInNewlyLoadedPkg);
+      if (pkgId.compareTo(PackageIdentifier.createInMainRepo("tools/defaults")) == 0
+          && unsatisfied.isEmpty()) {
+        // The tools/defaults package is populated from command-line options
+        // (=configuration fragments) which the user specifies in tests using
+        // BuildViewTestCase.useConfiguration().
+        // We'd like PackageLoader to work as much as possible without duplicating the entire
+        // configuration of Bazel, so we prefer not to pass these flags to PackageLoader.
+        // As a result, the contents of tools/defaults might differ.
+        // As long as PackageLoader returns a superset of what Bazel returns, everything should load
+        // fine.
+        return;
+      }
+      Sets.SetView<Label> unexpected = Sets.difference(targetsInNewlyLoadedPkg, targetsInPkg);
+      throw new IllegalStateException(
+          String.format(
+              "The Package for %s had a different set of targets (<targetsInPkg> - "
+                  + "<targetsInNewlyLoadedPkg> = %s, <targetsInNewlyLoadedPkg> - <targetsInPkg> = "
+                  + "%s) when loaded normally during execution of the current test than it did "
+                  + "when loaded via BazelPackageLoader (done automatically by the "
+                  + "BazelPackageBuilderHelperForTesting hook). This either means: (i) Skyframe "
+                  + "package loading semantics have diverged from "
+                  + "BazelPackageLoader semantics (ii) The test in question is doing something "
+                  + "that confuses BazelPackageBuilderHelperForTesting.",
+              pkgId, unsatisfied, unexpected));
     }
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/PackageFactoryBuilderFactoryForBazelUnitTests.java b/src/test/java/com/google/devtools/build/lib/testutil/PackageFactoryBuilderFactoryForBazelUnitTests.java
index 04e8e03..5cb3772 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/PackageFactoryBuilderFactoryForBazelUnitTests.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/PackageFactoryBuilderFactoryForBazelUnitTests.java
@@ -13,6 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.lib.testutil;
 
+import com.google.devtools.build.lib.analysis.BlazeDirectories;
+import com.google.devtools.build.lib.packages.BuilderFactoryForTesting;
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.packages.RuleClassProvider;
@@ -20,11 +22,10 @@
 import com.google.devtools.build.lib.vfs.FileSystem;
 
 /**
- * A {@link PackageFactory.BuilderFactoryForTesting} implementation that injects a
- * {@link BazelPackageBuilderHelperForTesting}.
+ * A {@link BuilderFactoryForTesting} implementation that injects a {@link
+ * BazelPackageBuilderHelperForTesting}.
  */
-class PackageFactoryBuilderFactoryForBazelUnitTests
-    extends PackageFactory.BuilderFactoryForTesting {
+class PackageFactoryBuilderFactoryForBazelUnitTests implements BuilderFactoryForTesting {
   static final PackageFactoryBuilderFactoryForBazelUnitTests INSTANCE =
       new PackageFactoryBuilderFactoryForBazelUnitTests();
 
@@ -32,17 +33,25 @@
   }
 
   @Override
-  public PackageFactoryBuilderWithSkyframeForTesting builder() {
-    return new PackageFactoryBuilderForBazelUnitTests();
+  public PackageFactoryBuilderWithSkyframeForTesting builder(BlazeDirectories directories) {
+    return new PackageFactoryBuilderForBazelUnitTests(directories);
   }
 
   private static class PackageFactoryBuilderForBazelUnitTests
       extends PackageFactoryBuilderWithSkyframeForTesting {
+
+    private final BlazeDirectories directories;
+
+    public PackageFactoryBuilderForBazelUnitTests(BlazeDirectories directories) {
+      this.directories = directories;
+    }
+
     @Override
     public PackageFactory build(RuleClassProvider ruleClassProvider, FileSystem fs) {
-      Package.Builder.Helper packageBuilderHelperForTesting = doChecksForTesting
-          ? new BazelPackageBuilderHelperForTesting(ruleClassProvider)
-          : Package.Builder.DefaultHelper.INSTANCE;
+      Package.Builder.Helper packageBuilderHelperForTesting =
+          doChecksForTesting
+              ? new BazelPackageBuilderHelperForTesting(ruleClassProvider, directories)
+              : Package.Builder.DefaultHelper.INSTANCE;
       return new PackageFactory(
           ruleClassProvider,
           platformSetRegexps,
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java b/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
index d7abdf6..7a59246 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.testutil;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.packages.PackageFactory.BuilderFactoryForTesting;
+import com.google.devtools.build.lib.packages.BuilderFactoryForTesting;
 import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 
