diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
index 1349c71..93a23c1 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
@@ -24,7 +24,6 @@
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Interner;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Streams;
 import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType;
@@ -34,7 +33,6 @@
 import com.google.devtools.build.lib.cmdline.LabelConstants;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.concurrent.ThreadSafety;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.SkyFunctions;
@@ -326,10 +324,7 @@
   }
 
   /** An artifact corresponding to a file in the output tree, generated by an {@link Action}. */
-  @AutoCodec
   public static class DerivedArtifact extends Artifact {
-    /** Only used for deserializing artifacts. */
-    private static final Interner<DerivedArtifact> INTERNER = BlazeInterners.newWeakInterner();
 
     /**
      * An {@link ActionLookupKey} until {@link #setGeneratingActionKey} is set, at which point it is
@@ -417,16 +412,48 @@
       }
       return this.owner.equals(that.owner);
     }
+  }
 
-    /**
-     * The {@code rootRelativePath is a few characters shorter than the {@code execPath}, so we save
-     * a few bytes by serializing it rather than the {@code execPath}, especially when the {@code
-     * root} is common to many artifacts and therefore memoized.
-     */
-    @AutoCodec.VisibleForSerialization
-    @AutoCodec.Instantiator
-    static DerivedArtifact createForSerialization(
-        ArtifactRoot root, PathFragment rootRelativePath, ActionLookupData generatingActionKey) {
+  @SuppressWarnings("unused") // Codec used by reflection.
+  private static class DerivedArtifactCodec implements ObjectCodec<DerivedArtifact> {
+    @Override
+    public Class<DerivedArtifact> getEncodedClass() {
+      return DerivedArtifact.class;
+    }
+
+    @Override
+    public void serialize(
+        SerializationContext context, DerivedArtifact obj, CodedOutputStream codedOut)
+        throws SerializationException, IOException {
+      context.serialize(obj.getRoot(), codedOut);
+      context.serialize(obj.getGeneratingActionKey(), codedOut);
+      context.serialize(obj.getRootRelativePath(), codedOut);
+    }
+
+    @Override
+    public DerivedArtifact deserialize(DeserializationContext context, CodedInputStream codedIn)
+        throws SerializationException, IOException {
+      ArtifactRoot root = context.deserialize(codedIn);
+      ActionLookupData generatingActionKey = context.deserialize(codedIn);
+      DerivedArtifact artifact =
+          new DerivedArtifact(
+              root,
+              validateAndGetRootExecPath(root, generatingActionKey, context, codedIn),
+              generatingActionKey.getActionLookupKey(),
+              /*contentBasedPath=*/ false);
+      artifact.setGeneratingActionKey(generatingActionKey);
+      return context
+          .getDependency(ArtifactResolver.ArtifactResolverSupplier.class)
+          .intern(artifact);
+    }
+
+    static PathFragment validateAndGetRootExecPath(
+        ArtifactRoot root,
+        ActionLookupData generatingActionKey,
+        DeserializationContext context,
+        CodedInputStream codedIn)
+        throws IOException, SerializationException {
+      PathFragment rootRelativePath = context.deserialize(codedIn);
       if (rootRelativePath == null
           || rootRelativePath.isAbsolute() != root.getRoot().isAbsolute()) {
         throw new IllegalArgumentException(
@@ -439,15 +466,7 @@
       }
       Preconditions.checkState(
           !root.isSourceRoot(), "Root not derived: %s %s", root, rootRelativePath);
-      PathFragment rootExecPath = root.getExecPath();
-      DerivedArtifact artifact =
-          new DerivedArtifact(
-              root,
-              rootExecPath.getRelative(rootRelativePath),
-              generatingActionKey.getActionLookupKey(),
-              /*contentBasedPath=*/ false);
-      artifact.setGeneratingActionKey(generatingActionKey);
-      return INTERNER.intern(artifact);
+      return root.getExecPath().getRelative(rootRelativePath);
     }
   }
 
@@ -729,7 +748,6 @@
    * having to keep around the attribute for the rest we save some memory.
    */
   @Immutable
-  @AutoCodec
   public static final class SpecialArtifact extends DerivedArtifact {
     private final SpecialArtifactType type;
 
@@ -740,19 +758,6 @@
       this.type = type;
     }
 
-    @AutoCodec.VisibleForSerialization
-    @AutoCodec.Instantiator
-    static SpecialArtifact create(
-        ArtifactRoot root,
-        PathFragment execPath,
-        SpecialArtifactType type,
-        ActionLookupData generatingActionKey) {
-      SpecialArtifact result =
-          new SpecialArtifact(root, execPath, generatingActionKey.getActionLookupKey(), type);
-      result.setGeneratingActionKey(generatingActionKey);
-      return result;
-    }
-
     @Override
     public final boolean isFileset() {
       return type == SpecialArtifactType.FILESET;
@@ -796,6 +801,43 @@
     }
   }
 
+  // Keep in sync with DerivedArtifactCodec.
+  @SuppressWarnings("unused") // Used by reflection
+  private static class SpecialArtifactCodec implements ObjectCodec<SpecialArtifact> {
+    @Override
+    public Class<SpecialArtifact> getEncodedClass() {
+      return SpecialArtifact.class;
+    }
+
+    @Override
+    public void serialize(
+        SerializationContext context, SpecialArtifact obj, CodedOutputStream codedOut)
+        throws SerializationException, IOException {
+      context.serialize(obj.getRoot(), codedOut);
+      context.serialize(obj.getGeneratingActionKey(), codedOut);
+      context.serialize(obj.type, codedOut);
+      context.serialize(obj.getRootRelativePath(), codedOut);
+    }
+
+    @Override
+    public SpecialArtifact deserialize(DeserializationContext context, CodedInputStream codedIn)
+        throws SerializationException, IOException {
+      ArtifactRoot root = context.deserialize(codedIn);
+      ActionLookupData generatingActionKey = context.deserialize(codedIn);
+      SpecialArtifactType type = context.deserialize(codedIn);
+      SpecialArtifact artifact =
+          new SpecialArtifact(
+              root,
+              DerivedArtifactCodec.validateAndGetRootExecPath(
+                  root, generatingActionKey, context, codedIn),
+              generatingActionKey.getActionLookupKey(),
+              type);
+      artifact.setGeneratingActionKey(generatingActionKey);
+      return (SpecialArtifact)
+          context.getDependency(ArtifactResolverSupplier.class).intern(artifact);
+    }
+  }
+
   /**
    * A special kind of artifact that represents a concrete file created at execution time under its
    * associated parent TreeArtifact.
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactResolver.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactResolver.java
index 0b02f9c..1d98fc1 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactResolver.java
@@ -82,9 +82,8 @@
 
   Path getPathFromSourceExecPath(Path execRoot, PathFragment execPath);
 
-  /**
-   * Supplies an {@link ArtifactFactory}. We define a custom interface because parameterized types
-   * are not allowed as dependencies to serialization.
-   */
-  interface ArtifactResolverSupplier extends Supplier<ArtifactResolver> {}
+  /** Supplies an {@link ArtifactFactory} and allows for interning of derived artifacts. */
+  interface ArtifactResolverSupplier extends Supplier<ArtifactResolver> {
+    Artifact.DerivedArtifact intern(Artifact.DerivedArtifact original);
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
index b097fe1..e332661 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
@@ -165,7 +165,8 @@
    * <p>Primarily needed by {@link FilesystemValueChecker}. Also called by {@link ArtifactFunction}
    * when aggregating a {@link TreeArtifactValue} out of action template expansion outputs.
    */
-  ImmutableMap<Artifact, FileArtifactValue> getAllFileValues() {
+  // Visible only for testing: should be package-private.
+  public ImmutableMap<Artifact, FileArtifactValue> getAllFileValues() {
     return artifactData;
   }
 
@@ -174,7 +175,8 @@
    *
    * <p>Should only be needed by {@link FilesystemValueChecker}.
    */
-  ImmutableMap<Artifact, TreeArtifactValue> getAllTreeArtifactValues() {
+  // Visible only for testing: should be package-private.
+  public ImmutableMap<Artifact, TreeArtifactValue> getAllTreeArtifactValues() {
     return treeArtifactData;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
index 4ed31ee..221e973 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
@@ -14,14 +14,11 @@
 package com.google.devtools.build.lib.skyframe;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.actions.ActionKeyContext;
 import com.google.devtools.build.lib.actions.Actions;
 import com.google.devtools.build.lib.actions.Actions.GeneratingActions;
-import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactFactory;
-import com.google.devtools.build.lib.actions.ArtifactRoot;
 import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoCollection;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory;
@@ -32,7 +29,6 @@
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.skyframe.BuildInfoCollectionValue.BuildInfoKeyAndConfig;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue.Precomputed;
-import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.SkyFunction;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
@@ -48,11 +44,9 @@
       new Precomputed<>("build_info_factories");
 
   private final ActionKeyContext actionKeyContext;
-  // Supplier only because the artifact factory has not yet been created at constructor time.
-  private final Supplier<ArtifactFactory> artifactFactory;
+  private final ArtifactFactory artifactFactory;
 
-  BuildInfoCollectionFunction(
-      ActionKeyContext actionKeyContext, Supplier<ArtifactFactory> artifactFactory) {
+  BuildInfoCollectionFunction(ActionKeyContext actionKeyContext, ArtifactFactory artifactFactory) {
     this.actionKeyContext = actionKeyContext;
     this.artifactFactory = artifactFactory;
   }
@@ -81,17 +75,11 @@
     BuildInfoFactory buildInfoFactory = buildInfoFactories.get(keyAndConfig.getInfoKey());
     Preconditions.checkState(buildInfoFactory.isEnabled(config));
 
-    final ArtifactFactory factory = artifactFactory.get();
     BuildInfoContext context =
-        new BuildInfoContext() {
-          @Override
-          public Artifact getBuildInfoArtifact(
-              PathFragment rootRelativePath, ArtifactRoot root, BuildInfoType type) {
-            return type == BuildInfoType.NO_REBUILD
-                ? factory.getConstantMetadataArtifact(rootRelativePath, root, keyAndConfig)
-                : factory.getDerivedArtifact(rootRelativePath, root, keyAndConfig);
-          }
-        };
+        (rootRelativePath, root, type) ->
+            type == BuildInfoType.NO_REBUILD
+                ? artifactFactory.getConstantMetadataArtifact(rootRelativePath, root, keyAndConfig)
+                : artifactFactory.getDerivedArtifact(rootRelativePath, root, keyAndConfig);
     BuildInfoCollection collection =
         buildInfoFactory.create(
             context,
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 cc42bb1..9a203cb 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
@@ -174,7 +174,6 @@
       ExternalPackageHelper externalPackageHelper,
       ActionOnIOExceptionReadingBuildFile actionOnIOExceptionReadingBuildFile,
       BuildOptions defaultBuildOptions,
-      MutableArtifactFactorySupplier mutableArtifactFactorySupplier,
       @Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge) {
     super(
         skyframeExecutorConsumerOnInit,
@@ -195,7 +194,6 @@
         GraphInconsistencyReceiver.THROWING,
         defaultBuildOptions,
         new PackageProgressReceiver(),
-        mutableArtifactFactorySupplier,
         new ConfiguredTargetProgressReceiver(),
         /*nonexistentFileReceiver=*/ null,
         managedDirectoriesKnowledge);
@@ -1072,8 +1070,6 @@
     private Factory workspaceStatusActionFactory;
     private Iterable<? extends DiffAwareness.Factory> diffAwarenessFactories = ImmutableList.of();
     private Iterable<SkyValueDirtinessChecker> customDirtinessCheckers = ImmutableList.of();
-    private MutableArtifactFactorySupplier mutableArtifactFactorySupplier =
-        new MutableArtifactFactorySupplier();
     private Consumer<SkyframeExecutor> skyframeExecutorConsumerOnInit = skyframeExecutor -> {};
     private SkyFunction blacklistedPackagePrefixesFunction;
 
@@ -1110,7 +1106,6 @@
               externalPackageHelper,
               actionOnIOExceptionReadingBuildFile,
               defaultBuildOptions,
-              mutableArtifactFactorySupplier,
               managedDirectoriesKnowledge);
       skyframeExecutor.init();
       return skyframeExecutor;
@@ -1192,11 +1187,6 @@
       return this;
     }
 
-    public Builder setMutableArtifactFactorySupplier(
-        MutableArtifactFactorySupplier mutableArtifactFactorySupplier) {
-      this.mutableArtifactFactorySupplier = mutableArtifactFactorySupplier;
-      return this;
-    }
     public Builder setSkyframeExecutorConsumerOnInit(
         Consumer<SkyframeExecutor> skyframeExecutorConsumerOnInit) {
       this.skyframeExecutorConsumerOnInit = skyframeExecutorConsumerOnInit;
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 3554a28..0a6a05a 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
@@ -51,7 +51,6 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactFactory;
 import com.google.devtools.build.lib.actions.ArtifactPathResolver;
-import com.google.devtools.build.lib.actions.ArtifactResolver.ArtifactResolverSupplier;
 import com.google.devtools.build.lib.actions.ArtifactRoot;
 import com.google.devtools.build.lib.actions.CommandLineExpansionException;
 import com.google.devtools.build.lib.actions.CompletionContext.PathResolverFactory;
@@ -297,10 +296,7 @@
   protected final AtomicReference<TimestampGranularityMonitor> tsgm = new AtomicReference<>();
   protected final AtomicReference<Map<String, String>> clientEnv = new AtomicReference<>();
 
-  // Under normal circumstances, the artifact factory persists for the life of a Blaze server, but
-  // since it is not yet created when we create the value builders, we have to use a supplier,
-  // initialized when the build view is created.
-  private final MutableArtifactFactorySupplier artifactFactory;
+  private final ArtifactFactory artifactFactory;
   private final ActionKeyContext actionKeyContext;
 
   protected boolean active = true;
@@ -354,21 +350,6 @@
 
   private boolean siblingRepositoryLayout = false;
 
-  /** An {@link ArtifactResolverSupplier} that supports setting of an {@link ArtifactFactory}. */
-  public static class MutableArtifactFactorySupplier implements ArtifactResolverSupplier {
-
-    private ArtifactFactory artifactFactory;
-
-    void set(ArtifactFactory artifactFactory) {
-      this.artifactFactory = artifactFactory;
-    }
-
-    @Override
-    public ArtifactFactory get() {
-      return artifactFactory;
-    }
-  }
-
   class PathResolverFactoryImpl implements PathResolverFactory {
     @Override
     public boolean shouldCreatePathResolverForArtifactValues() {
@@ -413,7 +394,6 @@
       GraphInconsistencyReceiver graphInconsistencyReceiver,
       BuildOptions defaultBuildOptions,
       @Nullable PackageProgressReceiver packageProgress,
-      MutableArtifactFactorySupplier artifactResolverSupplier,
       @Nullable ConfiguredTargetProgressReceiver configuredTargetProgress,
       @Nullable NonexistentFileReceiver nonexistentFileReceiver,
       @Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge) {
@@ -448,8 +428,7 @@
         new SkyframeActionExecutor(actionKeyContext, statusReporterRef, this::getPathEntries);
     this.skyframeBuildView =
         new SkyframeBuildView(directories, this, ruleClassProvider, actionKeyContext);
-    this.artifactFactory = artifactResolverSupplier;
-    this.artifactFactory.set(skyframeBuildView.getArtifactFactory());
+    this.artifactFactory = skyframeBuildView.getArtifactFactory();
     this.externalFilesHelper =
         ExternalFilesHelper.create(
             pkgLocator,
@@ -602,7 +581,7 @@
             () -> !skyframeActionExecutor.actionFileSystemType().inMemoryFileSystem()));
     map.put(
         SkyFunctions.BUILD_INFO_COLLECTION,
-        new BuildInfoCollectionFunction(actionKeyContext, artifactFactory::get));
+        new BuildInfoCollectionFunction(actionKeyContext, artifactFactory));
     map.put(SkyFunctions.BUILD_INFO, new WorkspaceStatusFunction(this::makeWorkspaceStatusAction));
     map.put(SkyFunctions.COVERAGE_REPORT, new CoverageReportFunction(actionKeyContext));
     ActionExecutionFunction actionExecutionFunction =
@@ -1120,11 +1099,6 @@
   }
 
   @VisibleForTesting
-  public ArtifactResolverSupplier getArtifactResolverSupplierForTesting() {
-    return artifactFactory;
-  }
-
-  @VisibleForTesting
   @Nullable
   public WorkspaceStatusAction getLastWorkspaceStatusAction() throws InterruptedException {
     WorkspaceStatusValue workspaceStatusValue =
@@ -1430,7 +1404,7 @@
 
   private void setSiblingDirectoryLayout(boolean experimentalSiblingRepositoryLayout) {
     this.siblingRepositoryLayout = experimentalSiblingRepositoryLayout;
-    this.artifactFactory.get().setSiblingRepositoryLayout(experimentalSiblingRepositoryLayout);
+    this.artifactFactory.setSiblingRepositoryLayout(experimentalSiblingRepositoryLayout);
   }
 
   public StarlarkSemantics getEffectiveStarlarkSemantics(
@@ -1453,7 +1427,6 @@
       // (Some of the additional steps are carried out by ConfiguredTargetValueInvalidationListener,
       // and some by BuildView#buildHasIncompatiblePackageRoots and #updateSkyframe.)
       artifactFactory
-          .get()
           .setSourceArtifactRoots(
               createSourceArtifactRootMapOnNewPkgLocator(oldLocator, pkgLocator));
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorWrappingWalkableGraph.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorWrappingWalkableGraph.java
index 43646cc..086f5ff 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorWrappingWalkableGraph.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorWrappingWalkableGraph.java
@@ -34,7 +34,7 @@
           @Override
           public NodeEntry get(@Nullable SkyKey requestor, Reason reason, SkyKey key)
               throws InterruptedException {
-            return evaluator.getExistingEntryAtLatestVersion(key);
+            return evaluator.getExistingEntryAtCurrentlyEvaluatingVersion(key);
           }
 
           @Override
@@ -50,7 +50,6 @@
             }
             return result;
           }
-
         });
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/SerializationDepsUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/SerializationDepsUtils.java
index 8f50010..5d829b9 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/SerializationDepsUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/SerializationDepsUtils.java
@@ -73,5 +73,10 @@
         }
       };
     }
+
+    @Override
+    public Artifact.DerivedArtifact intern(Artifact.DerivedArtifact original) {
+      return original;
+    }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
index ec773ce..c7c9046 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
@@ -311,7 +311,7 @@
   @Override
   @Nullable
   public SkyValue getExistingValue(SkyKey key) {
-    NodeEntry entry = getExistingEntryAtLatestVersion(key);
+    NodeEntry entry = getExistingEntryAtCurrentlyEvaluatingVersion(key);
     try {
       return isDone(entry) ? entry.getValue() : null;
     } catch (InterruptedException e) {
@@ -321,7 +321,7 @@
 
   @Override
   @Nullable public ErrorInfo getExistingErrorForTesting(SkyKey key) {
-    NodeEntry entry = getExistingEntryAtLatestVersion(key);
+    NodeEntry entry = getExistingEntryAtCurrentlyEvaluatingVersion(key);
     try {
       return isDone(entry) ? entry.getErrorInfo() : null;
     } catch (InterruptedException e) {
@@ -331,7 +331,7 @@
 
   @Nullable
   @Override
-  public NodeEntry getExistingEntryAtLatestVersion(SkyKey key) {
+  public NodeEntry getExistingEntryAtCurrentlyEvaluatingVersion(SkyKey key) {
     return graph.get(null, Reason.OTHER, key);
   }
 
diff --git a/src/main/java/com/google/devtools/build/skyframe/MemoizingEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/MemoizingEvaluator.java
index 3c9cf9b..f0a9beb 100644
--- a/src/main/java/com/google/devtools/build/skyframe/MemoizingEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/MemoizingEvaluator.java
@@ -130,7 +130,7 @@
   SkyValue getExistingValue(SkyKey key) throws InterruptedException;
 
   @Nullable
-  NodeEntry getExistingEntryAtLatestVersion(SkyKey key) throws InterruptedException;
+  NodeEntry getExistingEntryAtCurrentlyEvaluatingVersion(SkyKey key) throws InterruptedException;
 
   /**
    * Returns an error if and only if an earlier call to {@link #evaluate} created it; null
diff --git a/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java b/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java
index 3f23573..188743a 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java
@@ -80,6 +80,6 @@
   @Nullable
   @Override
   public NodeEntry getEntryForTesting(SkyKey key) throws InterruptedException {
-    return memoizingEvaluator.getExistingEntryAtLatestVersion(key);
+    return memoizingEvaluator.getExistingEntryAtCurrentlyEvaluatingVersion(key);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java b/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
index 070896f..bdf925b 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
@@ -32,6 +32,7 @@
 import com.google.devtools.build.lib.rules.java.JavaSemantics;
 import com.google.devtools.build.lib.skyframe.serialization.AutoRegistry;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecs;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationDepsUtils;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.vfs.FileSystem;
@@ -261,6 +262,7 @@
         .addDependency(FileSystem.class, scratch.getFileSystem())
         .addDependency(
             Root.RootCodecDependencies.class, new Root.RootCodecDependencies(anotherRoot.getRoot()))
+        .addDependencies(SerializationDepsUtils.SERIALIZATION_DEPS_FOR_TEST)
         .runTests();
   }
 
@@ -271,7 +273,18 @@
     ArtifactFactory artifactFactory =
         new ArtifactFactory(execDir.getParentDirectory(), "blaze-out");
     artifactFactory.setSourceArtifactRoots(ImmutableMap.of(root, artifactRoot));
-    ArtifactResolverSupplier artifactResolverSupplierForTest = () -> artifactFactory;
+    ArtifactResolverSupplier artifactResolverSupplierForTest =
+        new ArtifactResolverSupplier() {
+          @Override
+          public Artifact.DerivedArtifact intern(Artifact.DerivedArtifact original) {
+            return original;
+          }
+
+          @Override
+          public ArtifactResolver get() {
+            return artifactFactory;
+          }
+        };
 
     ObjectCodecs objectCodecs =
         new ObjectCodecs(
diff --git a/src/test/java/com/google/devtools/build/lib/actions/BUILD b/src/test/java/com/google/devtools/build/lib/actions/BUILD
index 45c7186..6c94a2c 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/actions/BUILD
@@ -43,6 +43,7 @@
         "//src/main/java/com/google/devtools/build/lib/rules/java:java-compilation",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils:depsutils",
         "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:string",
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java b/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
index 8c9c672..e1df4a8 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetExpander;
 import com.google.devtools.build.lib.exec.SingleBuildFileCache;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationDepsUtils;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.testutil.TestFileOutErr;
@@ -144,6 +145,7 @@
         .addDependency(
             Root.RootCodecDependencies.class,
             new Root.RootCodecDependencies(Root.absoluteRoot(scratch.getFileSystem())))
+        .addDependencies(SerializationDepsUtils.SERIALIZATION_DEPS_FOR_TEST)
         .setVerificationFunction(
             (in, out) -> {
               SymlinkAction inAction = (SymlinkAction) in;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcBinaryThinLtoTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcBinaryThinLtoTest.java
index 8c7313f..194eeb1 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcBinaryThinLtoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcBinaryThinLtoTest.java
@@ -189,7 +189,7 @@
         (ConfiguredTargetValue)
             getSkyframeExecutor()
                 .getEvaluatorForTesting()
-                .getExistingEntryAtLatestVersion(
+                .getExistingEntryAtCurrentlyEvaluatingVersion(
                     ConfiguredTargetKey.builder()
                         .setLabel(pkg.getLabel())
                         .setConfiguration(getConfiguration(pkg))
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
index 67924f1..d542c52 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
@@ -45,6 +45,7 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.events.NullEventHandler;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationDepsUtils;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.FileStatus;
@@ -343,6 +344,7 @@
         .addDependency(
             Root.RootCodecDependencies.class,
             new Root.RootCodecDependencies(Root.absoluteRoot(root.getFileSystem())))
+        .addDependencies(SerializationDepsUtils.SERIALIZATION_DEPS_FOR_TEST)
         .runTests();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
index cf471d2..eb983c6 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -233,6 +233,7 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils:depsutils",
         "//src/main/java/net/starlark/java/annot",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java
index 70ceece..1ee43a4 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java
@@ -54,6 +54,7 @@
 import com.google.devtools.build.lib.events.EventCollector;
 import com.google.devtools.build.lib.events.EventKind;
 import com.google.devtools.build.lib.skyframe.ActionTemplateExpansionValue.ActionTemplateExpansionKey;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationDepsUtils;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.util.CrashFailureDetails;
@@ -89,6 +90,7 @@
         .addDependency(
             Root.RootCodecDependencies.class,
             new Root.RootCodecDependencies(Root.absoluteRoot(scratch.getFileSystem())))
+        .addDependencies(SerializationDepsUtils.SERIALIZATION_DEPS_FOR_TEST)
         .runTests();
   }
 
