diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index 92f5d63..127acdd 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -31,7 +31,6 @@
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.ComposingRuleTransitionFactory;
 import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
-import com.google.devtools.build.lib.analysis.config.DefaultsPackage;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.analysis.constraints.ConstraintSemantics;
 import com.google.devtools.build.lib.analysis.skylark.BazelStarlarkContext;
@@ -54,7 +53,6 @@
 import com.google.devtools.build.lib.packages.RuleErrorConsumer;
 import com.google.devtools.build.lib.packages.RuleTransitionFactory;
 import com.google.devtools.build.lib.packages.Target;
-import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
 import com.google.devtools.build.lib.skylarkbuildapi.Bootstrap;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkInterfaceUtils;
@@ -743,21 +741,6 @@
   }
 
   /**
-   * Returns the defaults package for the default settings.
-   */
-  public String getDefaultsPackageContent(InvocationPolicy invocationPolicy) {
-    return DefaultsPackage.getDefaultsPackageContent(configurationOptions, invocationPolicy);
-  }
-
-  /**
-   * Returns the defaults package for the given options taken from an optionsProvider.
-   */
-  public String getDefaultsPackageContent(OptionsProvider optionsProvider) {
-    return DefaultsPackage.getDefaultsPackageContent(
-        BuildOptions.of(configurationOptions, optionsProvider));
-  }
-
-  /**
    * Creates a BuildOptions class for the given options taken from an optionsProvider.
    */
   public BuildOptions createBuildOptions(OptionsProvider optionsProvider) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/DefaultsPackage.java b/src/main/java/com/google/devtools/build/lib/analysis/config/DefaultsPackage.java
deleted file mode 100644
index 90e74b3..0000000
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/DefaultsPackage.java
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2014 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.analysis.config;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
-import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A helper class to compute and inject a defaults package into the package cache.
- *
- * <p>The <code>//tools/defaults</code> package provides a mechanism let tool locations be specified
- * over the commandline, without requiring any special support in the rule code. As such, it can be
- * used in genrule <code>$(location)</code> substitutions.
- *
- * <p>It works as follows:
- *
- * <ul>
- *   <li>SomeLanguage.createCompileAction will refer to a host-configured target for the compiler by
- *       looking for <code>env.getHostPrerequisiteArtifact("$somelanguage_compiler")</code>.
- *   <li>the attribute <code>$somelanguage_compiler</code> is defined in the {@link RuleDefinition}
- *       subclass for that language.
- *   <li>if the attribute cannot be set on the command-line, its value may be a normal label.
- *   <li>if the attribute can be set on the command-line, its value will be <code>
- *       //tools/defaults:somelanguage_compiler</code>.
- *   <li>in the latter case, the {@link BuildConfiguration.Fragment} subclass will define the option
- *       (with an existing target, eg. <code>//third_party/somelanguage:compiler</code>), and return
- *       the name in its implementation of {@link FragmentOptions#getDefaultsLabels}.
- *   <li>On startup, the rule is wired up with <code>//tools/defaults:somelanguage_compiler</code>.
- *   <li>On starting a build, the <code>//tools/defaults</code> package is synthesized, using the
- *       values as specified on the command-line. The contents of <code>tools/defaults/BUILD</code>
- *       is ignored.
- *   <li>Hence, changes in the command line values for tools are now handled exactly as if they were
- *       changes in a BUILD file.
- *   <li>The file <code>tools/defaults/BUILD</code> must exist, so we create a package in that
- *       location.
- *   <li>The code in {@link DefaultsPackage} can dump the synthesized package as a BUILD file, so
- *       external tooling does not need to understand the intricacies of handling command-line
- *       options.
- * </ul>
- *
- * <p>For built-in rules (as opposed to genrules), late-bound labels provide an alternative method
- * of depending on command-line values. These work by declaring attribute default values to be
- * {@link LateBoundDefault} instances, whose <code>resolve(Rule rule, AttributeMap attributes,
- * FragmentT configuration)</code> method will have access to a {@link BuildConfiguration.Fragment},
- * which in turn may depend on command line flag values.
- */
-public final class DefaultsPackage {
-
-  // The template contents are broken into lines such that the resulting file has no more than 80
-  // characters per line.
-  private static final String HEADER = ""
-      + "# DO NOT EDIT THIS FILE!\n"
-      + "#\n"
-      + "# Bazel does not read this file. Instead, it internally replaces the targets in\n"
-      + "# this package with the correct packages as given on the command line.\n"
-      + "#\n"
-      + "# If these options are not given on the command line, Bazel will use the exact\n"
-      + "# same targets as given here."
-      + "\n"
-      + "package(default_visibility = ['//visibility:public'])\n";
-
-  /**
-   * The map from entries to their values.
-   */
-  private ImmutableMap<String, ImmutableSet<Label>> values;
-
-  private DefaultsPackage(BuildOptions buildOptions) {
-    values = buildOptions.getDefaultsLabels();
-  }
-
-  private String labelsToString(Set<Label> labels) {
-    StringBuilder result = new StringBuilder();
-    for (Label label : labels) {
-      if (result.length() != 0) {
-        result.append(", ");
-      }
-      result.append("'").append(label).append("'");
-    }
-    return result.toString();
-  }
-
-  /**
-   * Returns a string of the defaults package with the given settings.
-   */
-  private String getContent() {
-    Preconditions.checkState(!values.isEmpty());
-    StringBuilder result = new StringBuilder(HEADER);
-    for (Map.Entry<String, ImmutableSet<Label>> entry : values.entrySet()) {
-      result
-          .append("filegroup(name = '")
-          .append(entry.getKey().toLowerCase(Locale.US)).append("',\n")
-          .append("          srcs = [")
-          .append(labelsToString(entry.getValue())).append("])\n");
-    }
-
-    return result.toString();
-  }
-
-  /**
-   * Returns the defaults package for the default settings.
-   */
-  public static String getDefaultsPackageContent(
-      Iterable<Class<? extends FragmentOptions>> options, InvocationPolicy invocationPolicy) {
-    return getDefaultsPackageContent(BuildOptions.createDefaults(options, invocationPolicy));
-  }
-
-  /**
-   * Returns the defaults package for the given options.
-   */
-  public static String getDefaultsPackageContent(BuildOptions buildOptions) {
-    return new DefaultsPackage(buildOptions).getContent();
-  }
-
-  public static void parseAndAdd(Set<Label> labels, String optionalLabel) {
-    if (optionalLabel != null) {
-      Label label = parseOptionalLabel(optionalLabel);
-      if (label != null) {
-        labels.add(label);
-      }
-    }
-  }
-
-  public static Label parseOptionalLabel(String value) {
-    try {
-      return Label.parseAbsolute(value, ImmutableMap.of());
-    } catch (LabelSyntaxException e) {
-      // We ignore this exception here - it will cause an error message at a later time.
-      return null;
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
index 62e5ba0..ffc42cf 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
@@ -29,7 +29,6 @@
 import com.google.devtools.build.lib.query2.engine.ThreadSafeOutputFormatterCallback;
 import com.google.devtools.build.lib.runtime.BlazeCommand;
 import com.google.devtools.build.lib.runtime.BlazeCommandResult;
-import com.google.devtools.build.lib.runtime.BlazeRuntime;
 import com.google.devtools.build.lib.runtime.Command;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.KeepGoingOption;
@@ -62,7 +61,6 @@
 
   @Override
   public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
-    BlazeRuntime runtime = env.getRuntime();
     if (options.getResidue().isEmpty()) {
       env.getReporter().handle(Event.error(String.format(
           "missing fetch expression. Type '%s help fetch' for syntax and help",
@@ -71,7 +69,7 @@
     }
 
     try {
-      env.setupPackageCache(options, runtime.getDefaultsPackageContent());
+      env.setupPackageCache(options);
     } catch (InterruptedException e) {
       env.getReporter().handle(Event.error("fetch interrupted"));
       return BlazeCommandResult.exitCode(ExitCode.INTERRUPTED);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
index 4123952..6cd9b12 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
@@ -89,7 +89,7 @@
                   true,
                   true,
                   env.getCommandId().toString()));
-      env.setupPackageCache(options, env.getRuntime().getDefaultsPackageContent());
+      env.setupPackageCache(options);
       SkyframeExecutor skyframeExecutor = env.getSkyframeExecutor();
       skyframeExecutor.injectExtraPrecomputedValues(
           ImmutableList.of(
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
index d354ca3..74c85c0 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
@@ -25,7 +25,6 @@
 import com.google.devtools.build.lib.analysis.ViewCreationFailedException;
 import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.DummyEnvironment;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.DefaultsPackage;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.buildeventstream.BuildEventId;
 import com.google.devtools.build.lib.buildtool.PostAnalysisQueryBuildTool.PostAnalysisQueryCommandLineException;
@@ -113,7 +112,7 @@
     }
     // Sync the package manager before sending the BuildStartingEvent in runLoadingPhase()
     try (SilentCloseable c = Profiler.instance().profile("setupPackageCache")) {
-      env.setupPackageCache(request, DefaultsPackage.getDefaultsPackageContent(buildOptions));
+      env.setupPackageCache(request);
     }
 
     ExecutionTool executionTool = null;
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
index 3d109d2..0cd3dc9 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
@@ -69,8 +69,6 @@
       ImmutableSet.of(
           // Used for select
           PathFragment.create("conditions"),
-          // dependencies that are a function of the configuration
-          PathFragment.create("tools/defaults"),
           // Visibility is labels aren't actually targets
           PathFragment.create("visibility"),
           // There is only one //external package
@@ -245,7 +243,7 @@
    *
    * <p>It would be cleaner to use the TargetPatternEvaluator for this resolution, but that is not
    * possible, because it is sometimes necessary to resolve a relative label before the package path
-   * is setup; in particular, before the tools/defaults package is created.
+   * is setup (maybe not anymore...)
    *
    * @throws LabelSyntaxException if the resulting label is not valid
    */
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index 5990bac..72c3cd8 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -156,7 +156,6 @@
   private final ProjectFile.Provider projectFileProvider;
   private final QueryRuntimeHelper.Factory queryRuntimeHelperFactory;
   @Nullable private final InvocationPolicy moduleInvocationPolicy;
-  private final String defaultsPackageContent;
   private final SubscriberExceptionHandler eventBusExceptionHandler;
   private final String productName;
   private final BuildEventArtifactUploaderFactoryMap buildEventArtifactUploaderFactoryMap;
@@ -210,8 +209,6 @@
     this.queryOutputFormatters = queryOutputFormatters;
     this.eventBusExceptionHandler = eventBusExceptionHandler;
 
-    this.defaultsPackageContent =
-        ruleClassProvider.getDefaultsPackageContent(getModuleInvocationPolicy());
     CommandNameCache.CommandNameCacheInstance.INSTANCE.setCommandNameCache(
         new CommandNameCacheImpl(getCommandMap()));
     this.productName = productName;
@@ -650,22 +647,6 @@
   }
 
   /**
-   * Returns the defaults package for the default settings. Should only be called by commands that
-   * do <i>not</i> process {@link BuildOptions}, since build options can alter the contents of the
-   * defaults package, which will not be reflected here.
-   */
-  public String getDefaultsPackageContent() {
-    return defaultsPackageContent;
-  }
-
-  /**
-   * Returns the defaults package for the given options taken from an optionsProvider.
-   */
-  public String getDefaultsPackageContent(OptionsProvider optionsProvider) {
-    return ruleClassProvider.getDefaultsPackageContent(optionsProvider);
-  }
-
-  /**
    * Creates a BuildOptions class for the given options taken from an optionsProvider.
    */
   public BuildOptions createBuildOptions(OptionsProvider optionsProvider) {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
index c41f8d5..87daa27 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
@@ -23,7 +23,6 @@
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.SkyframePackageRootResolver;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.DefaultsPackage;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.packages.SkylarkSemanticsOptions;
@@ -567,20 +566,16 @@
 
   /**
    * Initializes the package cache using the given options, and syncs the package cache. Also
-   * injects a defaults package and the skylark semantics using the options for the {@link
-   * BuildConfiguration}.
-   *
-   * @see DefaultsPackage
+   * injects the skylark semantics using the options for the {@link BuildConfiguration}.
    */
-  public void setupPackageCache(OptionsProvider options,
-      String defaultsPackageContents) throws InterruptedException, AbruptExitException {
+  public void setupPackageCache(OptionsProvider options)
+      throws InterruptedException, AbruptExitException {
     getSkyframeExecutor()
         .sync(
             reporter,
             options.getOptions(PackageCacheOptions.class),
             packageLocator,
             options.getOptions(SkylarkSemanticsOptions.class),
-            defaultsPackageContents,
             getCommandId(),
             clientEnv,
             timestampGranularityMonitor,
@@ -588,16 +583,13 @@
   }
 
   public void syncPackageLoading(
-      PackageCacheOptions packageCacheOptions,
-      SkylarkSemanticsOptions skylarkSemanticsOptions,
-      String defaultsPackageContents)
+      PackageCacheOptions packageCacheOptions, SkylarkSemanticsOptions skylarkSemanticsOptions)
       throws AbruptExitException {
     getSkyframeExecutor()
         .syncPackageLoading(
             packageCacheOptions,
             packageLocator,
             skylarkSemanticsOptions,
-            defaultsPackageContents,
             getCommandId(),
             clientEnv,
             timestampGranularityMonitor);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/StarlarkOptionsParser.java b/src/main/java/com/google/devtools/build/lib/runtime/StarlarkOptionsParser.java
index fe60f39..8e68bf5 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/StarlarkOptionsParser.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/StarlarkOptionsParser.java
@@ -93,8 +93,7 @@
     try {
       env.syncPackageLoading(
           optionsParser.getOptions(PackageCacheOptions.class),
-          optionsParser.getOptions(SkylarkSemanticsOptions.class),
-          runtime.getDefaultsPackageContent());
+          optionsParser.getOptions(SkylarkSemanticsOptions.class));
     } catch (AbruptExitException e) {
       throw new OptionsParsingException(e.getMessage());
     }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CoverageCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CoverageCommand.java
index c5abba2..906c14b 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CoverageCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CoverageCommand.java
@@ -26,19 +26,18 @@
  * <p>Here follows a brief, partial and probably wrong description of how coverage collection works
  * in Bazel.
  *
- * <p>Coverage is reported by the tests in LCOV format in the files
- * {@code testlogs/PACKAGE/TARGET/coverage.dat} and
- * {@code testlogs/PACKAGE/TARGET/coverage.micro.dat}.
+ * <p>Coverage is reported by the tests in LCOV format in the files {@code
+ * testlogs/PACKAGE/TARGET/coverage.dat} and {@code testlogs/PACKAGE/TARGET/coverage.micro.dat}.
  *
- * <p>To collect coverage, each test execution is wrapped in a script called
- * {@code collect_coverage.sh}. This script sets up the environment of the test to enable coverage
- * collection and determine where the coverage files are written by the coverage runtime(s). It
- * then runs the test. A test may itself run multiple subprocesses and consist of modules written
- * in multiple different languages (with separate coverage runtimes). As such, the wrapper script
+ * <p>To collect coverage, each test execution is wrapped in a script called {@code
+ * collect_coverage.sh}. This script sets up the environment of the test to enable coverage
+ * collection and determine where the coverage files are written by the coverage runtime(s). It then
+ * runs the test. A test may itself run multiple subprocesses and consist of modules written in
+ * multiple different languages (with separate coverage runtimes). As such, the wrapper script
  * converts the resulting files to lcov format if necessary, and merges them into a single file.
  *
- * <p>The interposition itself is done by the test strategies, which requires
- * {@code collect_coverage.sh} to be on the inputs of the test. This is accomplished by an implicit
+ * <p>The interposition itself is done by the test strategies, which requires {@code
+ * collect_coverage.sh} to be on the inputs of the test. This is accomplished by an implicit
  * attribute {@code :coverage_support} which is resolved to the value of the configuration flag
  * {@code --coverage_support} (see {@link
  * com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options#coverageSupport}).
@@ -53,10 +52,9 @@
  * compute the test coverage for a binary, it is not enough to merge the coverage of all of the
  * tests, because there may be code in the binary that is not linked into any test. Therefore, what
  * we do is to emit a coverage file for every binary, which contains only the files we collect
- * coverage for with no covered lines. The baseline coverage file for a target is at
- * {@code testlogs/PACKAGE/TARGET/baseline_coverage.dat}. Note that it is also generated for
- * binaries and libraries in addition to tests if you pass the {@code --nobuild_tests_only} flag to
- * Bazel.
+ * coverage for with no covered lines. The baseline coverage file for a target is at {@code
+ * testlogs/PACKAGE/TARGET/baseline_coverage.dat}. Note that it is also generated for binaries and
+ * libraries in addition to tests if you pass the {@code --nobuild_tests_only} flag to Bazel.
  *
  * <p>Baseline coverage collection is currently broken.
  *
@@ -70,48 +68,48 @@
  * <p>The set of instrumentation metadata files is the set of extra files a test needs to generate
  * the LCOV files Bazel requires from it. In practice, this consists of runtime-specific files; for
  * example, the gcc compiler emits {@code .gcno} files during compilation. These are added to the
- * set of inputs of test actions if coverage mode is enabled (otherwise the set of metadata files
- * is empty).
+ * set of inputs of test actions if coverage mode is enabled (otherwise the set of metadata files is
+ * empty).
  *
  * <p>Whether or not coverage is being collected is stored in the {@code BuildConfiguration}. This
  * is handy because then we have an easy way to change the test action and the action graph
  * depending on this bit, but it also means that if this bit is flipped, all targets need to be
- * re-analyzed (note that some languages, e.g. C++ require different compiler options to emit
- * code that can collect coverage, which dominates the time required for analysis).
+ * re-analyzed (note that some languages, e.g. C++ require different compiler options to emit code
+ * that can collect coverage, which dominates the time required for analysis).
  *
- * <p>The coverage support files are depended on through labels in {@code //tools/defaults} and set
- * through command-line options, so that they can be overridden by the invocation policy, which
- * allows them to differ between the different versions of Bazel. Ideally, these differences will
- * be removed, and we standardize on @bazel_tools//tools/coverage.
+ * <p>The coverage support files are depended on through labels an implicit dependency so that they
+ * can be overridden by the invocation policy, which allows them to differ between the different
+ * versions of Bazel. Ideally, these differences will be removed, and we standardize on
  *
- * <p>A partial set of file types that can be encountered in the coverage world:
- * <ul>
- *   <li><b>{@code .gcno}:</b> Coverage metadata file generated by GCC/Clang.
- *   <li><b>{@code .gcda}:</b> Coverage file generated when a coverage-instrumented binary compiled
- *   by GCC/Clang is run. When combined with the matching {@code .gcno} file, there is enough data
- *   to generate an LCOV file.
- *   <li><b>{@code .instrumented_files}:</b> A text file containing the exec paths of the
- *   instrumented files in a library, binary or test, one in each line. Used to generate the
- *   baseline coverage.
- *   <li><b>{@code coverage.dat}:</b> Coverage data for a single test run.
- *   <li><b>{@code coverage.micro.dat}:</b> Microcoverage data for a single test run.
- *   <li><b>{@code _coverage_report.dat}:</b> Coverage file for a whole Bazel invocation. Generated
- *   in {@code BuildView} in combination with {@code CoverageReportActionFactory}.
- * </ul>
- *
- * <p><b>OPEN QUESTIONS:</b>
- * <ul>
- *   <li>How per-testcase microcoverage data get reported?
- *   <li>How does Jacoco work?
- * </ul>
+ * @bazel_tools//tools/coverage.
+ *     <p>A partial set of file types that can be encountered in the coverage world:
+ *     <ul>
+ *       <li><b>{@code .gcno}:</b> Coverage metadata file generated by GCC/Clang.
+ *       <li><b>{@code .gcda}:</b> Coverage file generated when a coverage-instrumented binary
+ *           compiled by GCC/Clang is run. When combined with the matching {@code .gcno} file, there
+ *           is enough data to generate an LCOV file.
+ *       <li><b>{@code .instrumented_files}:</b> A text file containing the exec paths of the
+ *           instrumented files in a library, binary or test, one in each line. Used to generate the
+ *           baseline coverage.
+ *       <li><b>{@code coverage.dat}:</b> Coverage data for a single test run.
+ *       <li><b>{@code coverage.micro.dat}:</b> Microcoverage data for a single test run.
+ *       <li><b>{@code _coverage_report.dat}:</b> Coverage file for a whole Bazel invocation.
+ *           Generated in {@code BuildView} in combination with {@code CoverageReportActionFactory}.
+ *     </ul>
+ *     <p><b>OPEN QUESTIONS:</b>
+ *     <ul>
+ *       <li>How per-testcase microcoverage data get reported?
+ *       <li>How does Jacoco work?
+ *     </ul>
  */
-@Command(name = "coverage",
-         builds = true,
-         inherits = { TestCommand.class },
-         shortDescription = "Generates code coverage report for specified test targets.",
-         completion = "label-test",
-         help = "resource:coverage.txt",
-         allowResidue = true)
+@Command(
+    name = "coverage",
+    builds = true,
+    inherits = {TestCommand.class},
+    shortDescription = "Generates code coverage report for specified test targets.",
+    completion = "label-test",
+    help = "resource:coverage.txt",
+    allowResidue = true)
 public class CoverageCommand extends TestCommand {
   @Override
   protected String commandName() {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
index 4d4c737..8f7c567 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
@@ -127,8 +127,7 @@
                 // In order to be able to answer configuration-specific queries, we need to set up
                 // the package path. Since info inherits all the build options, all the necessary
                 // information is available here.
-                env.setupPackageCache(
-                    optionsParsingResult, runtime.getDefaultsPackageContent(optionsParsingResult));
+                env.setupPackageCache(optionsParsingResult);
                 // TODO(bazel-team): What if there are multiple configurations? [multi-config]
                 return env.getSkyframeExecutor()
                     .getConfiguration(
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
index 80703e1..f0ade5c 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
@@ -593,24 +593,23 @@
   }
 
   /**
-   * Info item for the default package. It is deprecated, it still works, when
-   * explicitly requested, but are not shown by default. It prints multi-line messages and thus
-   * don't play well with grep. We don't print them unless explicitly requested.
+   * Info item for the default package. It is deprecated, it still works, when explicitly requested,
+   * but are not shown by default. It prints multi-line messages and thus don't play well with grep.
+   * We don't print them unless explicitly requested.
+   *
    * @deprecated
    */
+  // TODO(lberki): Try to remove this using an incompatible flag.
   @Deprecated
   public static final class DefaultsPackageInfoItem extends InfoItem {
     public DefaultsPackageInfoItem() {
-      super("defaults-package",
-          "Default packages used as implicit dependencies",
-          true);
+      super("defaults-package", "Obsolete. Retained for backwards compatibility.", true);
     }
 
     @Override
-    public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env)
-        throws AbruptExitException {
+    public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
       checkNotNull(env);
-      return print(env.getRuntime().getDefaultsPackageContent());
+      return print("");
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
index 8df8885..9762321 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
@@ -117,7 +117,7 @@
     QueryOptions queryOptions = options.getOptions(QueryOptions.class);
 
     try {
-      env.setupPackageCache(options, runtime.getDefaultsPackageContent());
+      env.setupPackageCache(options);
     } catch (InterruptedException e) {
       env.getReporter().handle(Event.error("query interrupted"));
       return BlazeCommandResult.exitCode(ExitCode.INTERRUPTED);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index d20d47e..d54639f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -109,8 +109,6 @@
 
   private final IncrementalityIntent incrementalityIntent;
 
-  static final PathFragment DEFAULTS_PACKAGE_NAME = PathFragment.create("tools/defaults");
-
   public PackageFunction(
       PackageFactory packageFactory,
       CachingPackageLocator pkgLocator,
@@ -393,18 +391,10 @@
 
     RootedPath buildFileRootedPath = packageLookupValue.getRootedPath(packageId);
     FileValue buildFileValue = null;
-    String replacementContents = null;
 
-    if (isDefaultsPackage(packageId) && PrecomputedValue.isInMemoryToolsDefaults(env)) {
-      replacementContents = PrecomputedValue.DEFAULTS_PACKAGE_CONTENTS.get(env);
-      if (replacementContents == null) {
-        return null;
-      }
-    } else {
-      buildFileValue = getBuildFileValue(env, buildFileRootedPath);
-      if (buildFileValue == null) {
-        return null;
-      }
+    buildFileValue = getBuildFileValue(env, buildFileRootedPath);
+    if (buildFileValue == null) {
+      return null;
     }
 
     RuleVisibility defaultVisibility = PrecomputedValue.DEFAULT_VISIBILITY.get(env);
@@ -446,7 +436,6 @@
         loadPackage(
             workspaceName,
             repositoryMapping,
-            replacementContents,
             packageId,
             buildFileRootedPath,
             buildFileValue,
@@ -1125,7 +1114,6 @@
   private LoadedPackageCacheEntry loadPackage(
       String workspaceName,
       ImmutableMap<RepositoryName, RepositoryName> repositoryMapping,
-      @Nullable String replacementContents,
       PackageIdentifier packageId,
       RootedPath buildFilePath,
       @Nullable FileValue buildFileValue,
@@ -1149,34 +1137,30 @@
             env.getListener().handle(Event.progress("Loading package: " + packageId));
           }
           ParserInputSource input;
-          if (replacementContents == null) {
-            Preconditions.checkNotNull(buildFileValue, packageId);
-            byte[] buildFileBytes = null;
-            try {
-              buildFileBytes =
-                  buildFileValue.isSpecialFile()
-                      ? FileSystemUtils.readContent(inputFile)
-                      : FileSystemUtils.readWithKnownFileSize(inputFile, buildFileValue.getSize());
-            } catch (IOException e) {
-              buildFileBytes =
-                  actionOnIOExceptionReadingBuildFile.maybeGetBuildFileContentsToUse(
-                      inputFile.asFragment(), e);
-              if (buildFileBytes == null) {
-                // Note that we did the work that led to this IOException, so we should
-                // conservatively report this error as transient.
-                throw new PackageFunctionException(new BuildFileContainsErrorsException(
-                    packageId, e.getMessage(), e), Transience.TRANSIENT);
-              }
-              // If control flow reaches here, we're in territory that is deliberately unsound.
-              // See the javadoc for ActionOnIOExceptionReadingBuildFile.
+          Preconditions.checkNotNull(buildFileValue, packageId);
+          byte[] buildFileBytes = null;
+          try {
+            buildFileBytes =
+                buildFileValue.isSpecialFile()
+                    ? FileSystemUtils.readContent(inputFile)
+                    : FileSystemUtils.readWithKnownFileSize(inputFile, buildFileValue.getSize());
+          } catch (IOException e) {
+            buildFileBytes =
+                actionOnIOExceptionReadingBuildFile.maybeGetBuildFileContentsToUse(
+                    inputFile.asFragment(), e);
+            if (buildFileBytes == null) {
+              // Note that we did the work that led to this IOException, so we should
+              // conservatively report this error as transient.
+              throw new PackageFunctionException(
+                  new BuildFileContainsErrorsException(packageId, e.getMessage(), e),
+                  Transience.TRANSIENT);
             }
-            input =
-                ParserInputSource.create(
-                    FileSystemUtils.convertFromLatin1(buildFileBytes), inputFile.asFragment());
-          } else {
-            input =
-                ParserInputSource.create(replacementContents, buildFilePath.asPath().asFragment());
+            // If control flow reaches here, we're in territory that is deliberately unsound.
+            // See the javadoc for ActionOnIOExceptionReadingBuildFile.
           }
+          input =
+              ParserInputSource.create(
+                  FileSystemUtils.convertFromLatin1(buildFileBytes), inputFile.asFragment());
           StoredEventHandler astParsingEventHandler = new StoredEventHandler();
           BuildFileAST ast =
               PackageFactory.parseBuildFile(
@@ -1289,9 +1273,4 @@
       this.fileDependencies = fileDependencies;
     }
   }
-
-  public static boolean isDefaultsPackage(PackageIdentifier packageIdentifier) {
-    return packageIdentifier.getRepository().isMain()
-        && packageIdentifier.getPackageFragment().equals(DEFAULTS_PACKAGE_NAME);
-  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
index 32e1b69..aed63e4 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
@@ -72,11 +72,6 @@
 
     PackageIdentifier packageKey = (PackageIdentifier) skyKey.argument();
 
-    if (PackageFunction.isDefaultsPackage(packageKey)
-        && PrecomputedValue.isInMemoryToolsDefaults(env)) {
-      return PackageLookupValue.success(pkgLocator.getPathEntries().get(0), BuildFileName.BUILD);
-    }
-
     if (!packageKey.getRepository().isMain()) {
       return computeExternalPackageLookupValue(skyKey, env, packageKey);
     } else if (packageKey.equals(LabelConstants.EXTERNAL_PACKAGE_IDENTIFIER)) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
index d2bc4e5..19c7341 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
@@ -80,20 +80,6 @@
     return new Injected(precomputed, Suppliers.ofInstance(value));
   }
 
-  public static final Precomputed<Boolean> ENABLE_DEFAULTS_PACKAGE =
-      new Precomputed<>(Key.create("enable_default_pkg"));
-
-  // TODO(dbabkin): better to move this code to PrecomputedValueUtils.
-  // It will gone soon after removing tools/defaults
-  public static boolean isInMemoryToolsDefaults(SkyFunction.Environment env)
-      throws InterruptedException {
-    Boolean enableDefaultsPackage = PrecomputedValue.ENABLE_DEFAULTS_PACKAGE.get(env);
-    return Preconditions.checkNotNull(enableDefaultsPackage);
-  }
-
-  public static final Precomputed<String> DEFAULTS_PACKAGE_CONTENTS =
-      new Precomputed<>(Key.create("default_pkg"));
-
   public static final Precomputed<RuleVisibility> DEFAULT_VISIBILITY =
       new Precomputed<>(Key.create("default_visibility"));
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
index 36d4b54..2c97847 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
@@ -289,7 +289,6 @@
       PackageCacheOptions packageCacheOptions,
       PathPackageLocator packageLocator,
       SkylarkSemanticsOptions skylarkSemanticsOptions,
-      String defaultsPackageContents,
       UUID commandId,
       Map<String, String> clientEnv,
       TimestampGranularityMonitor tsgm,
@@ -306,7 +305,6 @@
         packageCacheOptions,
         packageLocator,
         skylarkSemanticsOptions,
-        defaultsPackageContents,
         commandId,
         clientEnv,
         tsgm,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 171b64a..595843b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -997,14 +997,6 @@
 
   protected abstract void dropConfiguredTargetsNow(final ExtendedEventHandler eventHandler);
 
-  /**
-   * Injects the contents of the computed tools/defaults package.
-   */
-  @VisibleForTesting
-  public void setupDefaultPackage(String defaultsPackageContents) {
-    PrecomputedValue.DEFAULTS_PACKAGE_CONTENTS.set(injectable(), defaultsPackageContents);
-  }
-
   private WorkspaceStatusAction makeWorkspaceStatusAction(String workspaceName) {
     WorkspaceStatusAction.Environment env =
         new WorkspaceStatusAction.Environment() {
@@ -1319,7 +1311,6 @@
       PathPackageLocator pkgLocator,
       PackageCacheOptions packageCacheOptions,
       SkylarkSemanticsOptions skylarkSemanticsOptions,
-      String defaultsPackageContents,
       UUID commandId,
       Map<String, String> clientEnv,
       TimestampGranularityMonitor tsgm) {
@@ -1333,10 +1324,6 @@
     setShowLoadingProgress(packageCacheOptions.showLoadingProgress);
     setDefaultVisibility(packageCacheOptions.defaultVisibility);
     setSkylarkSemantics(skylarkSemanticsOptions.toSkylarkSemantics());
-
-    setupDefaultPackage("# //tools/defaults in-memory package is disabled.");
-    PrecomputedValue.ENABLE_DEFAULTS_PACKAGE.set(injectable(), false);
-
     setPackageLocator(pkgLocator);
 
     syscalls.set(getPerBuildSyscallCache(packageCacheOptions.globbingThreads));
@@ -2421,7 +2408,6 @@
       PackageCacheOptions packageCacheOptions,
       PathPackageLocator pathPackageLocator,
       SkylarkSemanticsOptions skylarkSemanticsOptions,
-      String defaultsPackageContents,
       UUID commandId,
       Map<String, String> clientEnv,
       TimestampGranularityMonitor tsgm,
@@ -2432,7 +2418,6 @@
         packageCacheOptions,
         pathPackageLocator,
         skylarkSemanticsOptions,
-        defaultsPackageContents,
         commandId,
         clientEnv,
         tsgm);
@@ -2446,7 +2431,6 @@
       PackageCacheOptions packageCacheOptions,
       PathPackageLocator pathPackageLocator,
       SkylarkSemanticsOptions skylarkSemanticsOptions,
-      String defaultsPackageContents,
       UUID commandId,
       Map<String, String> clientEnv,
       TimestampGranularityMonitor tsgm)
@@ -2456,7 +2440,6 @@
           pathPackageLocator,
           packageCacheOptions,
           skylarkSemanticsOptions,
-          defaultsPackageContents,
           commandId,
           clientEnv,
           tsgm);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
index 8e88962..df9b983 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
@@ -144,7 +144,6 @@
     protected Reporter reporter = new Reporter(new EventBus());
     protected Map<SkyFunctionName, SkyFunction> extraSkyFunctions = new HashMap<>();
     List<PrecomputedValue.Injected> extraPrecomputedValues = new ArrayList<>();
-    String defaultsPackageContents = getDefaultDefaultPackageContents();
     int legacyGlobbingThreads = 1;
     int skyframeThreads = 1;
 
@@ -239,8 +238,6 @@
     protected abstract PackageLoader buildImpl();
 
     protected abstract ConfiguredRuleClassProvider getDefaultRuleClassProvider();
-
-    protected abstract String getDefaultDefaultPackageContents();
   }
 
   AbstractPackageLoader(Builder builder) {
@@ -259,7 +256,6 @@
         makePreinjectedDiff(
             skylarkSemantics,
             builder.pkgLocator,
-            builder.defaultsPackageContents,
             ImmutableList.copyOf(builder.extraPrecomputedValues));
     pkgFactory =
         new PackageFactory(
@@ -273,7 +269,6 @@
   private static ImmutableDiff makePreinjectedDiff(
       SkylarkSemantics skylarkSemantics,
       PathPackageLocator pkgLocator,
-      String defaultsPackageContents,
       ImmutableList<PrecomputedValue.Injected> extraPrecomputedValues) {
     final Map<SkyKey, SkyValue> valuesToInject = new HashMap<>();
     Injectable injectable =
@@ -294,8 +289,6 @@
     PrecomputedValue.PATH_PACKAGE_LOCATOR.set(injectable, pkgLocator);
     PrecomputedValue.DEFAULT_VISIBILITY.set(injectable, ConstantRuleVisibility.PRIVATE);
     PrecomputedValue.SKYLARK_SEMANTICS.set(injectable, skylarkSemantics);
-    PrecomputedValue.DEFAULTS_PACKAGE_CONTENTS.set(injectable, defaultsPackageContents);
-    PrecomputedValue.ENABLE_DEFAULTS_PACKAGE.set(injectable, true);
     return new ImmutableDiff(ImmutableList.of(), valuesToInject);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java
index aa09a97..31505d8 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java
@@ -29,7 +29,6 @@
 import com.google.devtools.build.lib.packages.PackageFactory.EnvironmentExtension;
 import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction;
 import com.google.devtools.build.lib.rules.repository.RepositoryLoaderFunction;
-import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy;
 import com.google.devtools.build.lib.skyframe.ActionEnvironmentFunction;
 import com.google.devtools.build.lib.skyframe.BazelSkyframeExecutorConstants;
 import com.google.devtools.build.lib.skyframe.ClientEnvironmentFunction;
@@ -137,12 +136,6 @@
       return DEFAULT_RULE_CLASS_PROVIDER;
     }
 
-    @Override
-    protected String getDefaultDefaultPackageContents() {
-      return DEFAULT_RULE_CLASS_PROVIDER.getDefaultsPackageContent(
-          InvocationPolicy.getDefaultInstance());
-    }
-
     Builder setFetchForTesting() {
       this.isFetch.set(true);
       return this;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
index 751f3cc..c75b524 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
@@ -79,12 +79,6 @@
     return new InvocationPolicyEnforcer(TestConstants.TEST_INVOCATION_POLICY);
   }
 
-  @Override
-  public String getDefaultsPackageContent() {
-    return createRuleClassProvider()
-        .getDefaultsPackageContent(getInvocationPolicyEnforcer().getInvocationPolicy());
-  }
-
   /**
    * This is called from test setup to create the mock directory layout needed to create the
    * configuration.
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
index 802719d..cd074b3 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
@@ -233,8 +233,6 @@
         pkgLocator,
         packageCacheOptions,
         Options.getDefaults(SkylarkSemanticsOptions.class),
-        this.ruleClassProvider.getDefaultsPackageContent(
-            analysisMock.getInvocationPolicyEnforcer().getInvocationPolicy()),
         UUID.randomUUID(),
         ImmutableMap.<String, String>of(),
         new TimestampGranularityMonitor(BlazeClock.instance()));
@@ -369,8 +367,6 @@
         pathPackageLocator,
         packageCacheOptions,
         skylarkSemanticsOptions,
-        ruleClassProvider.getDefaultsPackageContent(
-            analysisMock.getInvocationPolicyEnforcer().getInvocationPolicy()),
         UUID.randomUUID(),
         ImmutableMap.<String, String>of(),
         new TimestampGranularityMonitor(BlazeClock.instance()));
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 fac4626..d0e53e8 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
@@ -298,7 +298,6 @@
             BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
         packageCacheOptions,
         skylarkSemanticsOptions,
-        "",
         UUID.randomUUID(),
         ImmutableMap.<String, String>of(),
         tsgm);
@@ -416,7 +415,6 @@
         pkgLocator,
         packageCacheOptions,
         skylarkSemanticsOptions,
-        ruleClassProvider.getDefaultsPackageContent(optionsParser),
         UUID.randomUUID(),
         ImmutableMap.<String, String>of(),
         tsgm);
@@ -552,8 +550,6 @@
         + "and does not match target configuration %s",
         getHostConfiguration(), getTargetConfiguration());
 
-    String defaultsPackageContent = ruleClassProvider.getDefaultsPackageContent(optionsParser);
-    skyframeExecutor.setupDefaultPackage(defaultsPackageContent);
     skyframeExecutor.handleAnalysisInvalidatingChange();
 
     view = new BuildViewForTesting(directories, ruleClassProvider, skyframeExecutor, null);
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
index 0eb4d57..64ada7a 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
@@ -172,8 +172,6 @@
         pkgLocator,
         packageCacheOptions,
         Options.getDefaults(SkylarkSemanticsOptions.class),
-        ruleClassProvider.getDefaultsPackageContent(
-            analysisMock.getInvocationPolicyEnforcer().getInvocationPolicy()),
         UUID.randomUUID(),
         ImmutableMap.<String, String>of(),
         new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/DefaultsPackageUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/util/DefaultsPackageUtil.java
deleted file mode 100644
index 38bb434..0000000
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/DefaultsPackageUtil.java
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2015 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.analysis.util;
-
-import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.DefaultsPackage;
-import com.google.devtools.build.lib.analysis.config.FragmentOptions;
-import com.google.devtools.common.options.InvocationPolicyEnforcer;
-import com.google.devtools.common.options.OptionsBase;
-import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsParsingException;
-
-/**
- * Helper class for testing {@link DefaultsPackage}.
- */
-public class DefaultsPackageUtil {
-
-  public static String getDefaultsPackageForOptions(Class<? extends FragmentOptions> optionsClass,
-      String... options) throws OptionsParsingException {
-    OptionsParser parser = OptionsParser.newOptionsParser(
-        ImmutableList.<Class<? extends OptionsBase>>of(
-            BuildConfiguration.Options.class, optionsClass));
-    parser.parse(options);
-
-    InvocationPolicyEnforcer enforcer = AnalysisMock.get().getInvocationPolicyEnforcer();
-    enforcer.enforce(parser);
-
-    return DefaultsPackage.getDefaultsPackageContent(BuildOptions.of(
-        ImmutableList.<Class<? extends FragmentOptions>>of(
-            BuildConfiguration.Options.class, optionsClass), parser));
-  }
-}
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 d50b43d..bba1eb1 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
@@ -43,13 +43,4 @@
   public InvocationPolicyEnforcer getInvocationPolicyEnforcer() {
     return new InvocationPolicyEnforcer(TestConstants.TEST_INVOCATION_POLICY);
   }
-
-  /**
-   * Returns the defaults package for the default settings using {@link #createRuleClassProvider}
-   * and applying {@link #getInvocationPolicyEnforcer}.
-   */
-  public String getDefaultsPackageContent() {
-    return createRuleClassProvider()
-        .getDefaultsPackageContent(getInvocationPolicyEnforcer().getInvocationPolicy());
-  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
index 24de980..caa6485 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
@@ -146,7 +146,7 @@
     return ImmutableList.<EnvironmentExtension>of();
   }
 
-  protected void setUpSkyframe(RuleVisibility defaultVisibility, String defaultsPackageContents) {
+  protected void setUpSkyframe(RuleVisibility defaultVisibility) {
     PackageCacheOptions packageCacheOptions = Options.getDefaults(PackageCacheOptions.class);
     packageCacheOptions.defaultVisibility = defaultVisibility;
     packageCacheOptions.showLoadingProgress = true;
@@ -163,7 +163,6 @@
             BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
         packageCacheOptions,
         Options.getDefaults(SkylarkSemanticsOptions.class),
-        defaultsPackageContents,
         UUID.randomUUID(),
         ImmutableMap.<String, String>of(),
         new TimestampGranularityMonitor(BlazeClock.instance()));
@@ -185,7 +184,6 @@
         pkgLocator,
         packageCacheOptions,
         skylarkSemanticsOptions,
-        loadingMock.getDefaultsPackageContent(),
         UUID.randomUUID(),
         ImmutableMap.<String, String>of(),
         new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/AbstractTargetPatternEvaluatorTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/AbstractTargetPatternEvaluatorTest.java
index 1bc7460..bf8acad 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/AbstractTargetPatternEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/AbstractTargetPatternEvaluatorTest.java
@@ -101,7 +101,7 @@
 
   @Before
   public final void initializeParser() throws Exception {
-    setUpSkyframe(ConstantRuleVisibility.PRIVATE, loadingMock.getDefaultsPackageContent());
+    setUpSkyframe(ConstantRuleVisibility.PRIVATE);
     parser = skyframeExecutor.newTargetPatternEvaluator();
     parsingListener = new RecordingParsingListener(reporter);
   }
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/BuildFileModificationTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/BuildFileModificationTest.java
index 26bd626..9e23729 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/BuildFileModificationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/BuildFileModificationTest.java
@@ -134,7 +134,6 @@
         pkgLocator,
         packageCacheOptions,
         skylarkSemanticsOptions,
-        analysisMock.getDefaultsPackageContent(),
         UUID.randomUUID(),
         ImmutableMap.<String, String>of(),
         new TimestampGranularityMonitor(clock));
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/IOExceptionsTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/IOExceptionsTest.java
index fde1286..7d327a1 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/IOExceptionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/IOExceptionsTest.java
@@ -60,7 +60,7 @@
 
   @Before
   public final void initializeVisitor() throws Exception {
-    setUpSkyframe(ConstantRuleVisibility.PRIVATE, loadingMock.getDefaultsPackageContent());
+    setUpSkyframe(ConstantRuleVisibility.PRIVATE);
   }
 
   private boolean visitTransitively(Label label) throws InterruptedException {
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
index 4380810..8df1006 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
@@ -514,7 +514,6 @@
               BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
           packageCacheOptions,
           Options.getDefaults(SkylarkSemanticsOptions.class),
-          "",
           UUID.randomUUID(),
           ImmutableMap.<String, String>of(),
           new TimestampGranularityMonitor(BlazeClock.instance()));
@@ -605,7 +604,6 @@
               BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
           packageCacheOptions,
           Options.getDefaults(SkylarkSemanticsOptions.class),
-          "",
           UUID.randomUUID(),
           ImmutableMap.<String, String>of(),
           new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
index 93e8ff2..d2eec94 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
@@ -1135,7 +1135,6 @@
           pkgLocator,
           packageCacheOptions,
           Options.getDefaults(SkylarkSemanticsOptions.class),
-          analysisMock.getDefaultsPackageContent(),
           UUID.randomUUID(),
           ImmutableMap.<String, String>of(),
           new TimestampGranularityMonitor(clock));
@@ -1216,8 +1215,6 @@
     }
 
     private void sync() throws InterruptedException {
-      String pkgContents = analysisMock.getDefaultsPackageContent();
-      skyframeExecutor.setupDefaultPackage(pkgContents);
       clock.advanceMillis(1);
       ModifiedFileSet.Builder builder = ModifiedFileSet.builder();
       for (Path path : changes) {
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 c2f78c9..d7ebec3 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
@@ -144,7 +144,6 @@
         pkgLocator,
         packageCacheOptions,
         skylarkSemanticsOptions,
-        analysisMock.getDefaultsPackageContent(),
         UUID.randomUUID(),
         ImmutableMap.<String, String>of(),
         new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppOptionsTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppOptionsTest.java
deleted file mode 100644
index 593a790..0000000
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppOptionsTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2015 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.rules.cpp;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.devtools.build.lib.analysis.util.DefaultsPackageUtil;
-import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.testutil.TestConstants;
-import com.google.devtools.common.options.OptionsParsingException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests {@link CppOptions}.
- */
-@RunWith(JUnit4.class)
-public class CppOptionsTest {
-
-  @Test
-  public void testGetDefaultsPackage() throws Exception {
-    String content = DefaultsPackageUtil.getDefaultsPackageForOptions(CppOptions.class);
-    Label toolchainLabel =
-        Label.parseAbsoluteUnchecked(TestConstants.TOOLS_REPOSITORY + "//tools/cpp:toolchain");
-    assertThat(content)
-        .contains(
-            String.format(
-                // Indentation matched literally.
-                "filegroup(name = 'crosstool',\n          srcs = ['%s'])",
-                toolchainLabel.getDefaultCanonicalForm()));
-  }
-
-  @Test
-  public void testGetDefaultsPackageHostCrosstoolTop() throws OptionsParsingException {
-    String content = DefaultsPackageUtil.getDefaultsPackageForOptions(
-        CppOptions.class, "--host_crosstool_top=//some/package:crosstool");
-    assertThat(content).contains("//some/package:crosstool");
-  }
-
-  @Test
-  public void testGetDefaultsPackageGrteTop() throws OptionsParsingException {
-    String content = DefaultsPackageUtil.getDefaultsPackageForOptions(
-        CppOptions.class, "--grte_top=//some/grte:other");
-    assertThat(content).contains("//some/grte:everything");
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/CommandInterruptionTest.java b/src/test/java/com/google/devtools/build/lib/runtime/CommandInterruptionTest.java
index de6639f..33aae9f 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/CommandInterruptionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/CommandInterruptionTest.java
@@ -368,8 +368,6 @@
                     builder.setToolsRepository(TestConstants.TOOLS_REPOSITORY);
                     // Can't create a defaults package without the base options in there!
                     builder.addConfigurationOptions(BuildConfiguration.Options.class);
-                    // Need to have some defaults values to satisfy DefaultsPackage.getContent()
-                    // TODO(dbabkin): remove when DefaultsPackage been deprecated b/79239052
                     builder.addConfigurationOptions(TestConfiguration.TestOptions.class);
                   }
                 })
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/commands/CleanCommandRecommendsAsyncTest.java b/src/test/java/com/google/devtools/build/lib/runtime/commands/CleanCommandRecommendsAsyncTest.java
index 1272619..2be3a11 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/commands/CleanCommandRecommendsAsyncTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/commands/CleanCommandRecommendsAsyncTest.java
@@ -97,8 +97,6 @@
                   public void initializeRuleClasses(ConfiguredRuleClassProvider.Builder builder) {
                     // We must add these options so that the defaults package can be created.
                     builder.addConfigurationOptions(BuildConfiguration.Options.class);
-                    // Need to have some defaults values to satisfy DefaultsPackage.getContent()
-                    // TODO(dbabkin): remove when DefaultsPackage been deprecated b/792390529
                     builder.addConfigurationOptions(TestConfiguration.TestOptions.class);
                     // The tools repository is needed for createGlobals
                     builder.setToolsRepository(TestConstants.TOOLS_REPOSITORY);
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
index 3a8827c..34fd0d5 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
@@ -92,7 +92,6 @@
                 BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
             packageCacheOptions,
             Options.getDefaults(SkylarkSemanticsOptions.class),
-            "",
             UUID.randomUUID(),
             ImmutableMap.<String, String>of(),
             new TimestampGranularityMonitor(BlazeClock.instance()));
@@ -337,7 +336,6 @@
                 BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
             packageCacheOptions,
             Options.getDefaults(SkylarkSemanticsOptions.class),
-            "",
             UUID.randomUUID(),
             ImmutableMap.<String, String>of(),
             tsgm);
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
index 03b7c51..7d3dd44 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
@@ -107,7 +107,6 @@
             BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
         Options.getDefaults(PackageCacheOptions.class),
         Options.getDefaults(SkylarkSemanticsOptions.class),
-        AnalysisMock.get().getDefaultsPackageContent(),
         UUID.randomUUID(),
         ImmutableMap.<String, String>of(),
         new TimestampGranularityMonitor(null));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
index bb30090..f892ae6 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
@@ -412,7 +412,6 @@
                 BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
             packageCacheOptions,
             Options.getDefaults(SkylarkSemanticsOptions.class),
-            loadingMock.getDefaultsPackageContent(),
             UUID.randomUUID(),
             ImmutableMap.<String, String>of(),
             new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java
index 0afd49c..345fb8d 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java
@@ -237,7 +237,7 @@
 
   @Before
   public final void initializeVisitor() throws Exception {
-    setUpSkyframe(ConstantRuleVisibility.PRIVATE, loadingMock.getDefaultsPackageContent());
+    setUpSkyframe(ConstantRuleVisibility.PRIVATE);
     this.visitor = skyframeExecutor.pkgLoader();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
index 58107d6..0d7024d 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
@@ -170,7 +170,6 @@
                 BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
             packageCacheOptions,
             Options.getDefaults(SkylarkSemanticsOptions.class),
-            "",
             UUID.randomUUID(),
             ImmutableMap.<String, String>of(),
             new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
index 1df084e..da9f33c 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
@@ -64,7 +64,6 @@
                 BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
             packageCacheOptions,
             Options.getDefaults(SkylarkSemanticsOptions.class),
-            "",
             UUID.randomUUID(),
             ImmutableMap.<String, String>of(),
             new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
index 3d611ce..1816b1b 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
@@ -125,8 +125,6 @@
         .setPrelude("//:prelude.bzl")
         // must be part of BuildOptions for various reasons e.g. dynamic configs
         .addConfigurationOptions(BuildConfiguration.Options.class)
-        // Need to have some defaults values to satisfy DefaultsPackage.getContent()
-        // TODO(dbabkin): remove when DefaultsPackage been deprecated b/79239052
         .addConfigurationFragment(new TestConfiguration.Loader())
         // needed for the other rules to build on and the default workspace
         .addRuleDefinition(new BaseRuleClasses.RootRule())
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 74edc4f..c56170a 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
@@ -90,18 +90,6 @@
             Iterables.transform(newlyLoadedPkg.getTargets().values(), TARGET_TO_LABEL));
     if (!targetsInPkg.equals(targetsInNewlyLoadedPkg)) {
       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(
