diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisResult.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisResult.java
index 3c63b34..bd6d48e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisResult.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisResult.java
@@ -20,6 +20,7 @@
 import com.google.common.collect.ImmutableSortedSet;
 import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.actions.ActionGraph;
+import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.PackageRoots;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
@@ -37,7 +38,7 @@
   private final ImmutableSet<ConfiguredTarget> targetsToSkip;
   @Nullable private final FailureDetail failureDetail;
   private final ActionGraph actionGraph;
-  private final ArtifactsToOwnerLabels topLevelArtifactsToOwnerLabels;
+  private final ImmutableSet<Artifact> artifactsToBuild;
   private final ImmutableSet<ConfiguredTarget> parallelTests;
   private final ImmutableSet<ConfiguredTarget> exclusiveTests;
   @Nullable private final TopLevelArtifactContext topLevelContext;
@@ -55,7 +56,7 @@
       ImmutableSet<ConfiguredTarget> targetsToSkip,
       @Nullable FailureDetail failureDetail,
       ActionGraph actionGraph,
-      ArtifactsToOwnerLabels topLevelArtifactsToOwnerLabels,
+      ImmutableSet<Artifact> artifactsToBuild,
       ImmutableSet<ConfiguredTarget> parallelTests,
       ImmutableSet<ConfiguredTarget> exclusiveTests,
       TopLevelArtifactContext topLevelContext,
@@ -70,7 +71,7 @@
     this.targetsToSkip = targetsToSkip;
     this.failureDetail = failureDetail;
     this.actionGraph = actionGraph;
-    this.topLevelArtifactsToOwnerLabels = topLevelArtifactsToOwnerLabels;
+    this.artifactsToBuild = artifactsToBuild;
     this.parallelTests = parallelTests;
     this.exclusiveTests = exclusiveTests;
     this.topLevelContext = topLevelContext;
@@ -120,8 +121,8 @@
     return targetsToSkip;
   }
 
-  public ArtifactsToOwnerLabels getTopLevelArtifactsToOwnerLabels() {
-    return topLevelArtifactsToOwnerLabels;
+  public ImmutableSet<Artifact> getArtifactsToBuild() {
+    return artifactsToBuild;
   }
 
   public ImmutableSet<ConfiguredTarget> getExclusiveTests() {
@@ -178,7 +179,7 @@
         targetsToSkip,
         failureDetail,
         actionGraph,
-        topLevelArtifactsToOwnerLabels,
+        artifactsToBuild,
         Sets.union(parallelTests, exclusiveTests).immutableCopy(),
         /*exclusiveTests=*/ ImmutableSet.of(),
         topLevelContext,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ArtifactsToOwnerLabels.java b/src/main/java/com/google/devtools/build/lib/analysis/ArtifactsToOwnerLabels.java
deleted file mode 100644
index 12fbb16..0000000
--- a/src/main/java/com/google/devtools/build/lib/analysis/ArtifactsToOwnerLabels.java
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2018 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;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.SetMultimap;
-import com.google.common.collect.Sets;
-import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.cmdline.Label;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.function.Predicate;
-
-/**
- * Morally a {@link SetMultimap} from artifacts to the labels that own them, which may not be just
- * {@link Artifact#getOwnerLabel} depending on the build. Optimizes for artifacts that are owned by
- * their {@link Artifact#getOwnerLabel} by storing them separately.
- */
-public class ArtifactsToOwnerLabels {
-  private final SetMultimap<Artifact, Label> artifactToMultipleOrDifferentOwnerLabels;
-  private final Set<Artifact> artifactsOwnedOnlyByTheirLabels;
-
-  private ArtifactsToOwnerLabels(
-      SetMultimap<Artifact, Label> artifactToMultipleOrDifferentOwnerLabels,
-      Set<Artifact> artifactsOwnedOnlyByTheirLabels) {
-    this.artifactToMultipleOrDifferentOwnerLabels = artifactToMultipleOrDifferentOwnerLabels;
-    this.artifactsOwnedOnlyByTheirLabels = artifactsOwnedOnlyByTheirLabels;
-  }
-
-  public Set<Label> getOwners(Artifact artifact) {
-    if (artifactsOwnedOnlyByTheirLabels.contains(artifact)) {
-      Preconditions.checkState(
-          !artifactToMultipleOrDifferentOwnerLabels.containsKey(artifact),
-          "Artifact %s incorrectly in multiple categories",
-          artifact);
-      Label ownerLabel = artifact.getOwnerLabel();
-      if (ownerLabel == null) {
-        return ImmutableSet.of();
-      }
-      return ImmutableSet.of(ownerLabel);
-    }
-    return Preconditions.checkNotNull(
-        artifactToMultipleOrDifferentOwnerLabels.get(artifact), artifact);
-  }
-
-  public Set<Artifact> getArtifacts() {
-    return Sets.union(
-        artifactsOwnedOnlyByTheirLabels, artifactToMultipleOrDifferentOwnerLabels.keySet());
-  }
-
-  public Builder toBuilder() {
-    return new Builder(
-        HashMultimap.create(artifactToMultipleOrDifferentOwnerLabels),
-        new HashSet<>(artifactsOwnedOnlyByTheirLabels));
-  }
-
-  /** Builder for {@link ArtifactsToOwnerLabels}. */
-  public static class Builder {
-    private final SetMultimap<Artifact, Label> artifactToMultipleOrDifferentOwnerLabels;
-    private final Set<Artifact> artifactsOwnedOnlyByTheirLabels;
-
-    public Builder() {
-      this(HashMultimap.create(), new HashSet<>());
-    }
-
-    private Builder(
-        SetMultimap<Artifact, Label> artifactToMultipleOrDifferentOwnerLabels,
-        Set<Artifact> artifactsOwnedOnlyByTheirLabels) {
-      this.artifactToMultipleOrDifferentOwnerLabels = artifactToMultipleOrDifferentOwnerLabels;
-      this.artifactsOwnedOnlyByTheirLabels = artifactsOwnedOnlyByTheirLabels;
-    }
-
-    public Builder addArtifact(Artifact artifact) {
-      if (artifactToMultipleOrDifferentOwnerLabels.containsKey(artifact)) {
-        Label ownerLabel = artifact.getOwnerLabel();
-        if (ownerLabel != null) {
-          artifactToMultipleOrDifferentOwnerLabels.put(artifact, artifact.getOwnerLabel());
-        }
-      } else {
-        artifactsOwnedOnlyByTheirLabels.add(artifact);
-      }
-      return this;
-    }
-
-    public Builder addArtifact(Artifact artifact, Label label) {
-      Preconditions.checkNotNull(label, artifact);
-      if (label.equals(artifact.getOwnerLabel())) {
-        addArtifact(artifact);
-      } else {
-        artifactToMultipleOrDifferentOwnerLabels.put(artifact, label);
-        if (artifactsOwnedOnlyByTheirLabels.remove(artifact)) {
-          // Redoing this call now that we have a mismatched label will force addition into the
-          // multimap.
-          addArtifact(artifact);
-        }
-      }
-      return this;
-    }
-
-    public Builder filterArtifacts(Predicate<Artifact> artifactsToKeep) {
-      Predicate<Artifact> artifactsToRemove = artifactsToKeep.negate();
-      artifactToMultipleOrDifferentOwnerLabels.keySet().removeIf(artifactsToRemove);
-      artifactsOwnedOnlyByTheirLabels.removeIf(artifactsToRemove);
-      return this;
-    }
-
-    ArtifactsToOwnerLabels build() {
-      return new ArtifactsToOwnerLabels(
-          artifactToMultipleOrDifferentOwnerLabels, artifactsOwnedOnlyByTheirLabels);
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
index 407ea48..30dc53d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
@@ -38,7 +38,6 @@
         ":analysis_options",
         ":analysis_phase_complete_event",
         ":analysis_phase_started_event",
-        ":artifacts_to_owner_labels",
         ":aspect_aware_attribute_mapper",
         ":aspect_collection",
         ":aspect_configured_event",
@@ -282,7 +281,6 @@
         ":actions/symlink_action",
         ":actions/template_expansion_action",
         ":actions_provider",
-        ":artifacts_to_owner_labels",
         ":aspect_aware_attribute_mapper",
         ":aspect_collection",
         ":build_setting_provider",
@@ -498,16 +496,6 @@
 )
 
 java_library(
-    name = "artifacts_to_owner_labels",
-    srcs = ["ArtifactsToOwnerLabels.java"],
-    deps = [
-        "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
-        "//src/main/java/com/google/devtools/build/lib/cmdline",
-        "//third_party:guava",
-    ],
-)
-
-java_library(
     name = "aspect_aware_attribute_mapper",
     srcs = ["AspectAwareAttributeMapper.java"],
     deps = [
@@ -599,7 +587,6 @@
         ":analysis_cluster",
         ":analysis_options",
         ":analysis_phase_started_event",
-        ":artifacts_to_owner_labels",
         ":aspect_configured_event",
         ":blaze_directories",
         ":config/build_configuration",
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index ee61f22..bec43a1 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -470,8 +470,7 @@
       allTargetsToTest = filterTestsByTargets(configuredTargets, testsToRun);
     }
 
-    ArtifactsToOwnerLabels.Builder artifactsToOwnerLabelsBuilder =
-        new ArtifactsToOwnerLabels.Builder();
+    ImmutableSet.Builder<Artifact> artifactsToBuild = ImmutableSet.builder();
 
     // build-info and build-changelist.
     Collection<Artifact> buildInfoArtifacts =
@@ -480,11 +479,11 @@
 
     // Extra actions
     addExtraActionsIfRequested(
-        viewOptions, configuredTargets, aspects, artifactsToOwnerLabelsBuilder, eventHandler);
+        viewOptions, configuredTargets, aspects, artifactsToBuild, eventHandler);
 
     // Coverage
     NestedSet<Artifact> baselineCoverageArtifacts =
-        getBaselineCoverageArtifacts(configuredTargets, artifactsToOwnerLabelsBuilder);
+        getBaselineCoverageArtifacts(configuredTargets, artifactsToBuild);
     if (coverageReportActionFactory != null) {
       CoverageReportActionsWrapper actionsWrapper;
       actionsWrapper =
@@ -501,23 +500,24 @@
       if (actionsWrapper != null) {
         Actions.GeneratingActions actions = actionsWrapper.getActions();
         skyframeExecutor.injectCoverageReportData(actions);
-        actionsWrapper.getCoverageOutputs().forEach(artifactsToOwnerLabelsBuilder::addArtifact);
+        actionsWrapper.getCoverageOutputs().forEach(artifactsToBuild::add);
       }
     }
     // TODO(cparsons): If extra actions are ever removed, this filtering step can probably be
     //  removed as well: the only concern would be action conflicts involving coverage artifacts,
     //  which seems far-fetched.
     if (skyframeAnalysisResult.hasActionConflicts()) {
-      ArtifactsToOwnerLabels tempOwners = artifactsToOwnerLabelsBuilder.build();
       // We don't remove the (hopefully unnecessary) guard in SkyframeBuildView that enables/
       // disables analysis, since no new targets should actually be analyzed.
-      Set<Artifact> artifacts = tempOwners.getArtifacts();
+      ImmutableSet<Artifact> artifacts = artifactsToBuild.build();
       Predicate<Artifact> errorFreeArtifacts =
           skyframeExecutor.filterActionConflictsForTopLevelArtifacts(eventHandler, artifacts);
-      artifactsToOwnerLabelsBuilder = tempOwners.toBuilder().filterArtifacts(errorFreeArtifacts);
+
+      artifactsToBuild = ImmutableSet.builder();
+      artifacts.stream().filter(errorFreeArtifacts).forEach(artifactsToBuild::add);
     }
     // Build-info artifacts are always conflict-free, and can't be checked easily.
-    buildInfoArtifacts.forEach(artifactsToOwnerLabelsBuilder::addArtifact);
+    buildInfoArtifacts.forEach(artifactsToBuild::add);
 
     // Tests.
     Pair<ImmutableSet<ConfiguredTarget>, ImmutableSet<ConfiguredTarget>> testsPair =
@@ -529,8 +529,8 @@
     FailureDetail failureDetail =
         createFailureDetail(loadingResult, skyframeAnalysisResult, topLevelTargetsWithConfigs);
 
-    final WalkableGraph graph = skyframeAnalysisResult.getWalkableGraph();
-    final ActionGraph actionGraph =
+    WalkableGraph graph = skyframeAnalysisResult.getWalkableGraph();
+    ActionGraph actionGraph =
         new ActionGraph() {
           @Nullable
           @Override
@@ -563,7 +563,7 @@
         ImmutableSet.copyOf(targetsToSkip),
         failureDetail,
         actionGraph,
-        artifactsToOwnerLabelsBuilder.build(),
+        artifactsToBuild.build(),
         parallelTests,
         exclusiveTests,
         topLevelOptions,
@@ -623,16 +623,12 @@
 
   private static NestedSet<Artifact> getBaselineCoverageArtifacts(
       Collection<ConfiguredTarget> configuredTargets,
-      ArtifactsToOwnerLabels.Builder topLevelArtifactsToOwnerLabels) {
+      ImmutableSet.Builder<Artifact> artifactsToBuild) {
     NestedSetBuilder<Artifact> baselineCoverageArtifacts = NestedSetBuilder.stableOrder();
     for (ConfiguredTarget target : configuredTargets) {
       InstrumentedFilesInfo provider = target.get(InstrumentedFilesInfo.STARLARK_CONSTRUCTOR);
       if (provider != null) {
-        TopLevelArtifactHelper.addArtifactsWithOwnerLabel(
-            provider.getBaselineCoverageArtifacts(),
-            null,
-            target.getLabel(),
-            topLevelArtifactsToOwnerLabels);
+        artifactsToBuild.addAll(provider.getBaselineCoverageArtifacts().toList());
         baselineCoverageArtifacts.addTransitive(provider.getBaselineCoverageArtifacts());
       }
     }
@@ -643,7 +639,7 @@
       AnalysisOptions viewOptions,
       Collection<ConfiguredTarget> configuredTargets,
       ImmutableMap<AspectKey, ConfiguredAspect> aspects,
-      ArtifactsToOwnerLabels.Builder artifactsToTopLevelLabelsMap,
+      ImmutableSet.Builder<Artifact> artifactsToBuild,
       ExtendedEventHandler eventHandler) {
     RegexFilter filter = viewOptions.extraActionFilter;
     for (ConfiguredTarget target : configuredTargets) {
@@ -663,24 +659,15 @@
           for (Attribute attr : actualTarget.getAssociatedRule().getAttributes()) {
             aspectClasses.addAll(attr.getAspectClasses());
           }
-          TopLevelArtifactHelper.addArtifactsWithOwnerLabel(
-              provider.getExtraActionArtifacts(),
-              filter,
-              target.getLabel(),
-              artifactsToTopLevelLabelsMap);
+          addArtifactsToBuilder(
+              provider.getExtraActionArtifacts().toList(), artifactsToBuild, filter);
           if (!aspectClasses.isEmpty()) {
-            TopLevelArtifactHelper.addArtifactsWithOwnerLabel(
-                filterTransitiveExtraActions(provider, aspectClasses),
-                filter,
-                target.getLabel(),
-                artifactsToTopLevelLabelsMap);
+            addArtifactsToBuilder(
+                filterTransitiveExtraActions(provider, aspectClasses), artifactsToBuild, filter);
           }
         } else {
-          TopLevelArtifactHelper.addArtifactsWithOwnerLabel(
-              provider.getTransitiveExtraActionArtifacts(),
-              filter,
-              target.getLabel(),
-              artifactsToTopLevelLabelsMap);
+          addArtifactsToBuilder(
+              provider.getTransitiveExtraActionArtifacts().toList(), artifactsToBuild, filter);
         }
       }
     }
@@ -689,22 +676,27 @@
           aspectEntry.getValue().getProvider(ExtraActionArtifactsProvider.class);
       if (provider != null) {
         if (viewOptions.extraActionTopLevelOnly) {
-          TopLevelArtifactHelper.addArtifactsWithOwnerLabel(
-              provider.getExtraActionArtifacts(),
-              filter,
-              aspectEntry.getKey().getLabel(),
-              artifactsToTopLevelLabelsMap);
+          addArtifactsToBuilder(
+              provider.getExtraActionArtifacts().toList(), artifactsToBuild, filter);
         } else {
-          TopLevelArtifactHelper.addArtifactsWithOwnerLabel(
-              provider.getTransitiveExtraActionArtifacts(),
-              filter,
-              aspectEntry.getKey().getLabel(),
-              artifactsToTopLevelLabelsMap);
+          addArtifactsToBuilder(
+              provider.getTransitiveExtraActionArtifacts().toList(), artifactsToBuild, filter);
         }
       }
     }
   }
 
+  private static void addArtifactsToBuilder(
+      List<? extends Artifact> artifacts,
+      ImmutableSet.Builder<Artifact> builder,
+      RegexFilter filter) {
+    for (Artifact artifact : artifacts) {
+      if (filter.isIncluded(artifact.getOwnerLabel().toString())) {
+        builder.add(artifact);
+      }
+    }
+  }
+
   /**
    * Returns a list of artifacts from 'provider' that were registered by an aspect from
    * 'aspectClasses'. All artifacts in 'provider' are considered - both direct and transitive.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java
index 1c1fc4c..9f39590 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java
@@ -151,7 +151,7 @@
      * Validation outputs built by {@code ValidateTarget} aspect "promoting" {@link #VALIDATION}
      * output group Blaze core collects to {@link #VALIDATION_TOP_LEVEL} and requesting the latter.
      */
-    ASPECT;
+    ASPECT
   }
 
   private final ImmutableMap<String, NestedSet<Artifact>> outputGroups;
@@ -182,9 +182,8 @@
    *     If the specified output group is not present, the empty set is returned.
    */
   public NestedSet<Artifact> getOutputGroup(String outputGroupName) {
-    return outputGroups.containsKey(outputGroupName)
-        ? outputGroups.get(outputGroupName)
-        : NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER);
+    return outputGroups.getOrDefault(
+        outputGroupName, NestedSetBuilder.emptySet(Order.STABLE_ORDER));
   }
 
   /**
@@ -195,7 +194,7 @@
   @Nullable
   public static OutputGroupInfo merge(List<OutputGroupInfo> providers)
       throws DuplicateException {
-    if (providers.size() == 0) {
+    if (providers.isEmpty()) {
       return null;
     }
     if (providers.size() == 1) {
@@ -293,7 +292,7 @@
   }
 
   @Override
-  public boolean containsKey(StarlarkSemantics semantics, Object key) throws EvalException {
+  public boolean containsKey(StarlarkSemantics semantics, Object key) {
     return outputGroups.containsKey(key);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TopLevelArtifactHelper.java b/src/main/java/com/google/devtools/build/lib/analysis/TopLevelArtifactHelper.java
index 060d5e9..6c02cf3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TopLevelArtifactHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TopLevelArtifactHelper.java
@@ -14,26 +14,22 @@
 
 package com.google.devtools.build.lib.analysis;
 
+import static com.google.common.base.MoreObjects.firstNonNull;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.test.TestProvider;
-import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet.Node;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.profiler.AutoProfiler;
 import com.google.devtools.build.lib.profiler.GoogleAutoProfilerUtils;
-import com.google.devtools.build.lib.skyframe.AspectValueKey.AspectKey;
-import com.google.devtools.build.lib.util.RegexFilter;
 import java.time.Duration;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -127,61 +123,48 @@
 
   private static final Duration MIN_LOGGING = Duration.ofMillis(10);
 
-  @VisibleForTesting
-  public static ArtifactsToOwnerLabels makeTopLevelArtifactsToOwnerLabels(
-      AnalysisResult analysisResult) {
+  /**
+   * Returns the set of all top-level output artifacts.
+   *
+   * <p>In contrast with {@link AnalysisResult#getArtifactsToBuild}, which only returns artifacts to
+   * request from the build tool, this method returns <em>all</em> artifacts produced by top-level
+   * targets (including tests) and aspects.
+   */
+  public static ImmutableSet<Artifact> findAllTopLevelArtifacts(AnalysisResult analysisResult) {
     try (AutoProfiler ignored =
-        GoogleAutoProfilerUtils.logged("assigning owner labels", MIN_LOGGING)) {
-      ArtifactsToOwnerLabels.Builder artifactsToOwnerLabelsBuilder =
-          analysisResult.getTopLevelArtifactsToOwnerLabels().toBuilder();
-      TopLevelArtifactContext artifactContext = analysisResult.getTopLevelContext();
-      for (ConfiguredTarget target : analysisResult.getTargetsToBuild()) {
-        addArtifactsWithOwnerLabel(
-            getAllArtifactsToBuild(target, artifactContext).getAllArtifacts(),
-            null,
-            target.getLabel(),
-            artifactsToOwnerLabelsBuilder);
-      }
-      for (Map.Entry<AspectKey, ConfiguredAspect> aspectEntry :
-          analysisResult.getAspectsMap().entrySet()) {
-        addArtifactsWithOwnerLabel(
-            getAllArtifactsToBuild(aspectEntry.getValue(), artifactContext).getAllArtifacts(),
-            null,
-            aspectEntry.getKey().getLabel(),
-            artifactsToOwnerLabelsBuilder);
-      }
-      if (analysisResult.getTargetsToTest() != null) {
-        for (ConfiguredTarget target : analysisResult.getTargetsToTest()) {
-          addArtifactsWithOwnerLabel(
-              TestProvider.getTestStatusArtifacts(target),
-              null,
-              target.getLabel(),
-              artifactsToOwnerLabelsBuilder);
+        GoogleAutoProfilerUtils.logged("finding top level artifacts", MIN_LOGGING)) {
+
+      ImmutableSet.Builder<Artifact> artifacts = ImmutableSet.builder();
+      artifacts.addAll(analysisResult.getArtifactsToBuild());
+
+      Iterable<ProviderCollection> providers =
+          Iterables.concat(
+              analysisResult.getTargetsToBuild(),
+              analysisResult.getAspectsMap().values(),
+              firstNonNull(analysisResult.getTargetsToTest(), ImmutableList.of()));
+      TopLevelArtifactContext ctx = analysisResult.getTopLevelContext();
+      Set<NestedSet.Node> visited = new HashSet<>();
+
+      for (ProviderCollection provider : providers) {
+        for (ArtifactsInOutputGroup group :
+            getAllArtifactsToBuild(provider, ctx).getAllArtifactsByOutputGroup().values()) {
+          memoizedAddAll(group.getArtifacts(), artifacts, visited);
         }
       }
-      // TODO(dslomov): Artifacts to test from aspects?
-      return artifactsToOwnerLabelsBuilder.build();
+      return artifacts.build();
     }
   }
 
-  public static void addArtifactsWithOwnerLabel(
-      NestedSet<? extends Artifact> artifacts,
-      @Nullable RegexFilter filter,
-      Label ownerLabel,
-      ArtifactsToOwnerLabels.Builder artifactsToOwnerLabelsBuilder) {
-    addArtifactsWithOwnerLabel(
-        artifacts.toList(), filter, ownerLabel, artifactsToOwnerLabelsBuilder);
-  }
-
-  public static void addArtifactsWithOwnerLabel(
-      Collection<? extends Artifact> artifacts,
-      @Nullable RegexFilter filter,
-      Label ownerLabel,
-      ArtifactsToOwnerLabels.Builder artifactsToOwnerLabelsBuilder) {
-    for (Artifact artifact : artifacts) {
-      if (filter == null || filter.isIncluded(artifact.getOwnerLabel().toString())) {
-        artifactsToOwnerLabelsBuilder.addArtifact(artifact, ownerLabel);
-      }
+  private static void memoizedAddAll(
+      NestedSet<Artifact> current,
+      ImmutableSet.Builder<Artifact> artifacts,
+      Set<NestedSet.Node> visited) {
+    if (!visited.add(current.toNode())) {
+      return;
+    }
+    artifacts.addAll(current.getLeaves());
+    for (NestedSet<Artifact> child : current.getNonLeaves()) {
+      memoizedAddAll(child, artifacts, visited);
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index 50a6d96..a7bf2aa 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -103,6 +103,7 @@
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
@@ -192,9 +193,7 @@
     actionContextRegistryBuilder.register(DynamicStrategyRegistry.class, spawnStrategyRegistry);
     actionContextRegistryBuilder.register(RemoteLocalFallbackRegistry.class, spawnStrategyRegistry);
 
-    ModuleActionContextRegistry moduleActionContextRegistry = actionContextRegistryBuilder.build();
-
-    this.actionContextRegistry = moduleActionContextRegistry;
+    this.actionContextRegistry = actionContextRegistryBuilder.build();
     this.spawnStrategyRegistry = spawnStrategyRegistry;
   }
 
@@ -336,7 +335,7 @@
               actionGraph,
               // If this supplier is ever consumed by more than one ActionContextProvider, it can be
               // pulled out of the loop and made a memoizing supplier.
-              () -> TopLevelArtifactHelper.makeTopLevelArtifactsToOwnerLabels(analysisResult));
+              () -> TopLevelArtifactHelper.findAllTopLevelArtifacts(analysisResult));
         }
       }
       skyframeExecutor.drainChangedFiles();
@@ -347,12 +346,10 @@
 
       Profiler.instance().markPhase(ProfilePhase.EXECUTE);
       boolean shouldTrustRemoteArtifacts =
-          env.getOutputService() == null
-              ? false
-              : env.getOutputService().shouldTrustRemoteArtifacts();
+          env.getOutputService() != null && env.getOutputService().shouldTrustRemoteArtifacts();
       builder.buildArtifacts(
           env.getReporter(),
-          analysisResult.getTopLevelArtifactsToOwnerLabels().getArtifacts(),
+          analysisResult.getArtifactsToBuild(),
           analysisResult.getParallelTests(),
           analysisResult.getExclusiveTests(),
           analysisResult.getTargetsToBuild(),
@@ -598,7 +595,7 @@
         buildRequestOptions.useTopLevelTargetsForSymlinks()
             ? analysisResult.getTargetsToBuild().stream()
                 .map(ConfiguredTarget::getConfigurationKey)
-                .filter(configuration -> configuration != null)
+                .filter(Objects::nonNull)
                 .distinct()
                 .map((key) -> executor.getConfiguration(reporter, key))
                 .collect(toImmutableSet())
@@ -713,7 +710,7 @@
    *
    * @param configuredTargets The configured targets whose artifacts are to be built.
    */
-  private Collection<ConfiguredTarget> determineSuccessfulTargets(
+  private static Collection<ConfiguredTarget> determineSuccessfulTargets(
       Collection<ConfiguredTarget> configuredTargets, Set<ConfiguredTargetKey> builtTargets) {
     // Maintain the ordering by copying builtTargets into a LinkedHashSet in the same iteration
     // order as configuredTargets.
diff --git a/src/main/java/com/google/devtools/build/lib/exec/BUILD b/src/main/java/com/google/devtools/build/lib/exec/BUILD
index 0a85847..6156860 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/exec/BUILD
@@ -123,7 +123,7 @@
     srcs = ["ExecutorLifecycleListener.java"],
     deps = [
         "//src/main/java/com/google/devtools/build/lib/actions",
-        "//src/main/java/com/google/devtools/build/lib/analysis:artifacts_to_owner_labels",
+        "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
         "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
         "//third_party:guava",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/exec/ExecutorLifecycleListener.java b/src/main/java/com/google/devtools/build/lib/exec/ExecutorLifecycleListener.java
index 14dc308..0e50691 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/ExecutorLifecycleListener.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/ExecutorLifecycleListener.java
@@ -13,10 +13,11 @@
 // limitations under the License.
 package com.google.devtools.build.lib.exec;
 
-import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.actions.ActionGraph;
-import com.google.devtools.build.lib.analysis.ArtifactsToOwnerLabels;
+import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.util.AbruptExitException;
+import java.util.function.Supplier;
 
 /**
  * Type that can get informed about executor lifecycle events.
@@ -38,11 +39,10 @@
    * Handles the start of the execution phase.
    *
    * @param actionGraph actions as calcuated in the analysis phase
-   * @param topLevelArtifactsToOwnerLabels supplier of all output artifacts from top-level targets
-   *     and aspects, mapped to their owners
+   * @param topLevelArtifacts supplies all output artifacts from top-level targets and aspects
    */
   void executionPhaseStarting(
-      ActionGraph actionGraph, Supplier<ArtifactsToOwnerLabels> topLevelArtifactsToOwnerLabels)
+      ActionGraph actionGraph, Supplier<ImmutableSet<Artifact>> topLevelArtifacts)
       throws AbruptExitException, InterruptedException;
 
   /** Handles the end of the execution phase. */
diff --git a/src/main/java/com/google/devtools/build/lib/includescanning/BUILD b/src/main/java/com/google/devtools/build/lib/includescanning/BUILD
index 2bf6673..f5dce07 100644
--- a/src/main/java/com/google/devtools/build/lib/includescanning/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/includescanning/BUILD
@@ -21,7 +21,6 @@
         "//src/main/java/com/google/devtools/build/lib/actions:file_metadata",
         "//src/main/java/com/google/devtools/build/lib/actions:localhost_capacity",
         "//src/main/java/com/google/devtools/build/lib/actions:middleman_type",
-        "//src/main/java/com/google/devtools/build/lib/analysis:artifacts_to_owner_labels",
         "//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
         "//src/main/java/com/google/devtools/build/lib/analysis/platform",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
@@ -43,7 +42,6 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
         "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
-        "//src/main/java/com/google/devtools/build/lib/util:exit_code",
         "//src/main/java/com/google/devtools/build/lib/util:resource_converter",
         "//src/main/java/com/google/devtools/build/lib/util/io",
         "//src/main/java/com/google/devtools/build/lib/vfs",
diff --git a/src/main/java/com/google/devtools/build/lib/includescanning/IncludeScannerSupplier.java b/src/main/java/com/google/devtools/build/lib/includescanning/IncludeScannerSupplier.java
index dd56ff4..729825b 100644
--- a/src/main/java/com/google/devtools/build/lib/includescanning/IncludeScannerSupplier.java
+++ b/src/main/java/com/google/devtools/build/lib/includescanning/IncludeScannerSupplier.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.includescanning;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Supplier;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
@@ -32,6 +31,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutorService;
+import java.util.function.Supplier;
 
 /**
  * Creates include scanner instances.
diff --git a/src/main/java/com/google/devtools/build/lib/includescanning/IncludeScanningModule.java b/src/main/java/com/google/devtools/build/lib/includescanning/IncludeScanningModule.java
index f0e5ec3..7b25140 100644
--- a/src/main/java/com/google/devtools/build/lib/includescanning/IncludeScanningModule.java
+++ b/src/main/java/com/google/devtools/build/lib/includescanning/IncludeScanningModule.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.includescanning;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -29,7 +28,6 @@
 import com.google.devtools.build.lib.actions.ArtifactFactory;
 import com.google.devtools.build.lib.actions.ArtifactResolver;
 import com.google.devtools.build.lib.actions.ExecException;
-import com.google.devtools.build.lib.analysis.ArtifactsToOwnerLabels;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.buildtool.BuildRequest;
 import com.google.devtools.build.lib.concurrent.ExecutorUtil;
@@ -63,6 +61,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutorService;
+import java.util.function.Supplier;
 
 /**
  * Module that provides implementations of {@link CppIncludeExtractionContext},
@@ -111,7 +110,7 @@
   public Iterable<Class<? extends OptionsBase>> getCommandOptions(Command command) {
     return "build".equals(command.name())
         ? ImmutableList.of(IncludeScanningOptions.class)
-        : ImmutableList.<Class<? extends OptionsBase>>of();
+        : ImmutableList.of();
   }
 
   @Override
@@ -219,7 +218,7 @@
    * supplier} which can be used to access the (potentially shared) scanners and exposes {@linkplain
    * #getSwigActionContext() action} {@linkplain #getCppActionContext() contexts} based on them.
    */
-  private static class IncludeScannerLifecycleManager implements ExecutorLifecycleListener {
+  private static final class IncludeScannerLifecycleManager implements ExecutorLifecycleListener {
     private final CommandEnvironment env;
     private final BuildRequest buildRequest;
 
@@ -227,7 +226,7 @@
     private IncludeScannerSupplier includeScannerSupplier;
     private ExecutorService includePool;
 
-    public IncludeScannerLifecycleManager(
+    IncludeScannerLifecycleManager(
         CommandEnvironment env,
         BuildRequest buildRequest,
         MutableSupplier<SpawnIncludeScanner> spawnScannerSupplier) {
@@ -254,8 +253,7 @@
 
     @Override
     public void executionPhaseStarting(
-        ActionGraph actionGraph,
-        Supplier<ArtifactsToOwnerLabels> topLevelArtifactsToAccountingGroups)
+        ActionGraph actionGraph, Supplier<ImmutableSet<Artifact>> topLevelArtifacts)
         throws AbruptExitException, InterruptedException {
       try {
         includeScannerSupplier.init(
diff --git a/src/main/java/com/google/devtools/build/lib/includescanning/LegacyIncludeScanner.java b/src/main/java/com/google/devtools/build/lib/includescanning/LegacyIncludeScanner.java
index 51d7740..1aeb9c6 100644
--- a/src/main/java/com/google/devtools/build/lib/includescanning/LegacyIncludeScanner.java
+++ b/src/main/java/com/google/devtools/build/lib/includescanning/LegacyIncludeScanner.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.includescanning;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
@@ -55,6 +54,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
+import java.util.function.Supplier;
 
 /**
  * C include scanner. Quickly scans C/C++ source files to determine the bounding set of transitively
@@ -254,7 +254,7 @@
         }
 
         // Look for header in path/to/foo.framework/Headers/
-        PathFragment foundHeaderPath = null;
+        PathFragment foundHeaderPath;
         PathFragment fullHeaderPath =
             fullFrameworkPath.getRelative("Headers").getRelative(relHeaderPath);
 
@@ -938,10 +938,10 @@
     }
   }
 
-  private static class ExecRuntimeException extends RuntimeException {
+  private static final class ExecRuntimeException extends RuntimeException {
     private final ExecException cause;
 
-    public ExecRuntimeException(ExecException e) {
+    ExecRuntimeException(ExecException e) {
       super(e);
       this.cause = e;
     }
@@ -951,10 +951,10 @@
     }
   }
 
-  private static class InterruptedRuntimeException extends RuntimeException {
+  private static final class InterruptedRuntimeException extends RuntimeException {
     private final InterruptedException cause;
 
-    public InterruptedRuntimeException(InterruptedException e) {
+    InterruptedRuntimeException(InterruptedException e) {
       super(e);
       this.cause = e;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/remote/BUILD b/src/main/java/com/google/devtools/build/lib/remote/BUILD
index ad5159d..56bbf5d 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/remote/BUILD
@@ -48,7 +48,6 @@
         "//src/main/java/com/google/devtools/build/lib/actions:file_metadata",
         "//src/main/java/com/google/devtools/build/lib/actions:fileset_output_symlink",
         "//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
-        "//src/main/java/com/google/devtools/build/lib/analysis:artifacts_to_owner_labels",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/build_options",
         "//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
         "//src/main/java/com/google/devtools/build/lib/analysis:top_level_artifact_context",
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java
index c1f8462..be7de3c 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java
@@ -16,12 +16,11 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.util.concurrent.ListeningScheduledExecutorService;
 import com.google.devtools.build.lib.actions.ActionGraph;
 import com.google.devtools.build.lib.actions.ActionInput;
-import com.google.devtools.build.lib.analysis.ArtifactsToOwnerLabels;
+import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.exec.ExecutionOptions;
 import com.google.devtools.build.lib.exec.ExecutorLifecycleListener;
 import com.google.devtools.build.lib.exec.ModuleActionContextRegistry;
@@ -36,9 +35,10 @@
 import com.google.devtools.build.lib.remote.util.DigestUtil;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.vfs.Path;
+import java.util.function.Supplier;
 import javax.annotation.Nullable;
 
-/** Provide a remote execution context. */
+/** Provides a remote execution context. */
 final class RemoteActionContextProvider implements ExecutorLifecycleListener {
 
   private final CommandEnvironment env;
@@ -85,7 +85,7 @@
         env, cache, executor, retryScheduler, digestUtil, logDir);
   }
 
-  RemotePathResolver createRemotePathResolver() {
+  private RemotePathResolver createRemotePathResolver() {
     Path execRoot = env.getExecRoot();
     BuildLanguageOptions buildLanguageOptions =
         env.getOptions().getOptions(BuildLanguageOptions.class);
@@ -101,7 +101,7 @@
     return remotePathResolver;
   }
 
-  RemoteExecutionService getRemoteExecutionService() {
+  private RemoteExecutionService getRemoteExecutionService() {
     if (remoteExecutionService == null) {
       remoteExecutionService =
           new RemoteExecutionService(
@@ -177,7 +177,7 @@
 
   @Override
   public void executionPhaseStarting(
-      ActionGraph actionGraph, Supplier<ArtifactsToOwnerLabels> topLevelArtifactsToOwnerLabels) {}
+      ActionGraph actionGraph, Supplier<ImmutableSet<Artifact>> topLevelArtifacts) {}
 
   @Override
   public void executionPhaseEnding() {
