diff --git a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
index 968c721..00f918a 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
@@ -395,7 +395,7 @@
   }
 
   @Override
-  public boolean shouldReportPathPrefixConflict(Action action) {
+  public boolean shouldReportPathPrefixConflict(ActionAnalysisMetadata action) {
     return this != action;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Action.java b/src/main/java/com/google/devtools/build/lib/actions/Action.java
index 51514af..85d22ef 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Action.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Action.java
@@ -77,7 +77,7 @@
  * known set of fields is covered, not that all fields are covered), so carefully check all changes
  * to action subclasses.
  */
-public interface Action extends ActionMetadata, Describable {
+public interface Action extends ActionExecutionMetadata, Describable {
 
   /**
    * Prepares for executing this action; called by the Builder prior to
@@ -192,14 +192,6 @@
   @Nullable ResourceSet estimateResourceConsumption(Executor executor);
 
   /**
-   * @return true iff path prefix conflict (conflict where two actions generate
-   *         two output artifacts with one of the artifact's path being the
-   *         prefix for another) between this action and another action should
-   *         be reported.
-   */
-  boolean shouldReportPathPrefixConflict(Action action);
-
-  /**
    * Returns true if the output should bypass output filtering. This is used for test actions.
    */
   boolean showsOutputUnconditionally();
@@ -218,38 +210,4 @@
    * a different thread than the one this action is executed on.
    */
   ExtraActionInfo.Builder getExtraActionInfo();
-
-  /**
-   * Returns the action type. Must not be {@code null}.
-   */
-  MiddlemanType getActionType();
-
-  /**
-   * The action type.
-   */
-  public enum MiddlemanType {
-
-    /** A normal action. */
-    NORMAL,
-
-    /** A normal middleman, which just encapsulates a list of artifacts. */
-    AGGREGATING_MIDDLEMAN,
-
-    /**
-     * A middleman that enforces action ordering, is not validated by the dependency checker, but
-     * allows errors to be propagated.
-     */
-    ERROR_PROPAGATING_MIDDLEMAN,
-
-    /**
-     * A runfiles middleman, which is validated by the dependency checker, but is not expanded
-     * in blaze. Instead, the runfiles manifest is sent to remote execution client, which
-     * performs the expansion.
-     */
-    RUNFILES_MIDDLEMAN;
-
-    public boolean isMiddleman() {
-      return this != NORMAL;
-    }
-  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionMetadata.java b/src/main/java/com/google/devtools/build/lib/actions/ActionAnalysisMetadata.java
similarity index 64%
rename from src/main/java/com/google/devtools/build/lib/actions/ActionMetadata.java
rename to src/main/java/com/google/devtools/build/lib/actions/ActionAnalysisMetadata.java
index 08b501c..a3e73b3 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionMetadata.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionAnalysisMetadata.java
@@ -16,26 +16,11 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 
-import javax.annotation.Nullable;
-
 /**
- * Side-effect free query methods for information about an {@link Action}.
- *
- * <p>This method is intended for use in situations when the intention is to pass around information
- * about an action without allowing actual execution of the action.
- *
- * <p>The split between {@link Action} and {@link ActionMetadata} is somewhat arbitrary, other than
- * that all methods with side effects must belong to the former.
+ * An Analysis phase interface for an {@link Action} or Action-like object, containing only
+ * side-effect-free query methods for information needed during action analysis.
  */
-public interface ActionMetadata {
-  /**
-   * If this executable can supply verbose information, returns a string that can be used as a
-   * progress message while this executable is running. A return value of {@code null} indicates no
-   * message should be reported.
-   */
-  @Nullable
-  String getProgressMessage();
-
+public interface ActionAnalysisMetadata {
   /**
    * Returns the owner of this executable if this executable can supply verbose information. This is
    * typically the rule that constructed it; see ActionOwner class comment for details. Returns
@@ -158,63 +143,40 @@
   Iterable<Artifact> getMandatoryInputs();
 
   /**
-   * <p>Returns a string encoding all of the significant behaviour of this
-   * Action that might affect the output.  The general contract of
-   * <code>getKey</code> is this: if the work to be performed by the
-   * execution of this action changes, the key must change. </p>
-   *
-   * <p>As a corollary, the build system is free to omit the execution of an
-   * Action <code>a1</code> if (a) at some time in the past, it has already
-   * executed an Action <code>a0</code> with the same key as
-   * <code>a1</code>, and (b) the names and contents of the input files listed
-   * by <code>a1.getInputs()</code> are identical to the names and contents of
-   * the files listed by <code>a0.getInputs()</code>. </p>
-   *
-   * <p>Examples of changes that should affect the key are:
-   * <ul>
-   *  <li>Changes to the BUILD file that materially affect the rule which gave
-   *  rise to this Action.</li>
-   *
-   *  <li>Changes to the command-line options, environment, or other global
-   *  configuration resources which affect the behaviour of this kind of Action
-   *  (other than changes to the names of the input/output files, which are
-   *  handled externally).</li>
-   *
-   *  <li>An upgrade to the build tools which changes the program logic of this
-   *  kind of Action (typically this is achieved by incorporating a UUID into
-   *  the key, which is changed each time the program logic of this action
-   *  changes).</li>
-   *
-   * </ul></p>
+   * @return true iff path prefix conflict (conflict where two actions generate
+   *         two output artifacts with one of the artifact's path being the
+   *         prefix for another) between this action and another action should
+   *         be reported.
    */
-  String getKey();
+  boolean shouldReportPathPrefixConflict(ActionAnalysisMetadata action);
 
-  /**
-   * Returns a human-readable description of the inputs to {@link #getKey()}.
-   * Used in the output from '--explain', and in error messages for
-   * '--check_up_to_date' and '--check_tests_up_to_date'.
-   * May return null, meaning no extra information is available.
-   *
-   * <p>If the return value is non-null, for consistency it should be a multiline message of the
-   * form:
-   * <pre>
-   *   <var>Summary</var>
-   *     <var>Fieldname</var>: <var>value</var>
-   *     <var>Fieldname</var>: <var>value</var>
-   *     ...
-   * </pre>
-   * where each line after the first one is intended two spaces, and where any fields that might
-   * contain newlines or other funny characters are escaped using {@link
-   * com.google.devtools.build.lib.shell.ShellUtils#shellEscape}.
-   * For example:
-   * <pre>
-   *   Compiling foo.cc
-   *     Command: /usr/bin/gcc
-   *     Argument: '-c'
-   *     Argument: foo.cc
-   *     Argument: '-o'
-   *     Argument: foo.o
-   * </pre>
-   */
-  @Nullable String describeKey();
+  /** Returns the action type. Must not be {@code null}. */
+  MiddlemanType getActionType();
+
+  /** The action type. */
+  public enum MiddlemanType {
+
+    /** A normal action. */
+    NORMAL,
+
+    /** A normal middleman, which just encapsulates a list of artifacts. */
+    AGGREGATING_MIDDLEMAN,
+
+    /**
+     * A middleman that enforces action ordering, is not validated by the dependency checker, but
+     * allows errors to be propagated.
+     */
+    ERROR_PROPAGATING_MIDDLEMAN,
+
+    /**
+     * A runfiles middleman, which is validated by the dependency checker, but is not expanded
+     * in blaze. Instead, the runfiles manifest is sent to remote execution client, which
+     * performs the expansion.
+     */
+    RUNFILES_MIDDLEMAN;
+
+    public boolean isMiddleman() {
+      return this != NORMAL;
+    }
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java
index 4fd06a9..4a97789 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java
@@ -16,7 +16,7 @@
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.actions.Action.MiddlemanType;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType;
 import com.google.devtools.build.lib.actions.cache.ActionCache;
 import com.google.devtools.build.lib.actions.cache.ActionCache.Entry;
 import com.google.devtools.build.lib.actions.cache.Digest;
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionMetadata.java b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionMetadata.java
new file mode 100644
index 0000000..004a37a
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionMetadata.java
@@ -0,0 +1,94 @@
+// 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.actions;
+
+import javax.annotation.Nullable;
+
+/**
+ * An interface for an {@link Action}, containing only side-effect-free query methods for
+ * information needed during both action analysis and execution.
+ *
+ * <p>The split between {@link Action} and {@link ActionExecutionMetadata} is somewhat arbitrary,
+ * other than that all methods with side effects must belong to the former.
+ */
+public interface ActionExecutionMetadata extends ActionAnalysisMetadata {
+  /**
+   * If this executable can supply verbose information, returns a string that can be used as a
+   * progress message while this executable is running. A return value of {@code null} indicates no
+   * message should be reported.
+   */
+  @Nullable
+  String getProgressMessage();
+
+  /**
+   * <p>Returns a string encoding all of the significant behaviour of this
+   * Action that might affect the output.  The general contract of
+   * <code>getKey</code> is this: if the work to be performed by the
+   * execution of this action changes, the key must change. </p>
+   *
+   * <p>As a corollary, the build system is free to omit the execution of an
+   * Action <code>a1</code> if (a) at some time in the past, it has already
+   * executed an Action <code>a0</code> with the same key as
+   * <code>a1</code>, and (b) the names and contents of the input files listed
+   * by <code>a1.getInputs()</code> are identical to the names and contents of
+   * the files listed by <code>a0.getInputs()</code>. </p>
+   *
+   * <p>Examples of changes that should affect the key are:
+   * <ul>
+   *  <li>Changes to the BUILD file that materially affect the rule which gave
+   *  rise to this Action.</li>
+   *
+   *  <li>Changes to the command-line options, environment, or other global
+   *  configuration resources which affect the behaviour of this kind of Action
+   *  (other than changes to the names of the input/output files, which are
+   *  handled externally).</li>
+   *
+   *  <li>An upgrade to the build tools which changes the program logic of this
+   *  kind of Action (typically this is achieved by incorporating a UUID into
+   *  the key, which is changed each time the program logic of this action
+   *  changes).</li>
+   *
+   * </ul></p>
+   */
+  String getKey();
+
+  /**
+   * Returns a human-readable description of the inputs to {@link #getKey()}.
+   * Used in the output from '--explain', and in error messages for
+   * '--check_up_to_date' and '--check_tests_up_to_date'.
+   * May return null, meaning no extra information is available.
+   *
+   * <p>If the return value is non-null, for consistency it should be a multiline message of the
+   * form:
+   * <pre>
+   *   <var>Summary</var>
+   *     <var>Fieldname</var>: <var>value</var>
+   *     <var>Fieldname</var>: <var>value</var>
+   *     ...
+   * </pre>
+   * where each line after the first one is intended two spaces, and where any fields that might
+   * contain newlines or other funny characters are escaped using {@link
+   * com.google.devtools.build.lib.shell.ShellUtils#shellEscape}.
+   * For example:
+   * <pre>
+   *   Compiling foo.cc
+   *     Command: /usr/bin/gcc
+   *     Argument: '-c'
+   *     Argument: foo.cc
+   *     Argument: '-o'
+   *     Argument: foo.o
+   * </pre>
+   */
+  @Nullable String describeKey();
+}
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporter.java b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporter.java
index 7a2a410..fd56653 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporter.java
@@ -57,7 +57,7 @@
    * The status of each action "in flight", i.e. whose ExecuteBuildAction.call() method is active.
    * Used for implementing the "still waiting" message.
    */
-  private final Map<ActionMetadata, Pair<String, Long>> actionStatus =
+  private final Map<ActionExecutionMetadata, Pair<String, Long>> actionStatus =
       new ConcurrentHashMap<>(100);
 
   public static ActionExecutionStatusReporter create(EventHandler eventHandler) {
@@ -98,7 +98,7 @@
     }
   }
 
-  private void setStatus(ActionMetadata action, String message) {
+  private void setStatus(ActionExecutionMetadata action, String message) {
     actionStatus.put(action, Pair.of(message, clock.nanoTime()));
   }
 
@@ -116,14 +116,14 @@
     updateStatus(ActionStatusMessage.preparingStrategy(action));
   }
 
-  public void setRunningFromBuildData(ActionMetadata action) {
+  public void setRunningFromBuildData(ActionExecutionMetadata action) {
     updateStatus(ActionStatusMessage.runningStrategy(action, "unknown"));
   }
 
   @Subscribe
   public void updateStatus(ActionStatusMessage statusMsg) {
     String message = statusMsg.getMessage();
-    ActionMetadata action = statusMsg.getActionMetadata();
+    ActionExecutionMetadata action = statusMsg.getActionMetadata();
     setStatus(action, message);
   }
 
@@ -132,9 +132,10 @@
   }
 
   private static void appendGroupStatus(StringBuilder buffer,
-      Map<ActionMetadata, Pair<String, Long>> statusMap,  String status, long currentTime) {
-    List<Pair<Long, ActionMetadata>> actions = new ArrayList<>();
-    for (Map.Entry<ActionMetadata, Pair<String, Long>> entry : statusMap.entrySet()) {
+      Map<ActionExecutionMetadata, Pair<String, Long>> statusMap,  String status,
+      long currentTime) {
+    List<Pair<Long, ActionExecutionMetadata>> actions = new ArrayList<>();
+    for (Map.Entry<ActionExecutionMetadata, Pair<String, Long>> entry : statusMap.entrySet()) {
       if (entry.getValue().first.equals(status)) {
         actions.add(Pair.of(entry.getValue().second, entry.getKey()));
       }
@@ -142,12 +143,12 @@
     if (actions.isEmpty()) {
       return;
     }
-    Collections.sort(actions, Pair.<Long, ActionMetadata>compareByFirst());
+    Collections.sort(actions, Pair.<Long, ActionExecutionMetadata>compareByFirst());
 
     buffer.append("\n      " + status + ":");
 
     boolean truncateList = actions.size() > MAX_LINES;
-    for (Pair<Long, ActionMetadata> entry : actions.subList(0,
+    for (Pair<Long, ActionExecutionMetadata> entry : actions.subList(0,
         truncateList ? MAX_LINES - 1 : actions.size())) {
       String message = entry.second.getProgressMessage();
       if (message == null) {
@@ -167,7 +168,8 @@
   /**
    * Get message showing currently executing actions.
    */
-  private String getExecutionStatusMessage(Map<ActionMetadata, Pair<String, Long>> statusMap) {
+  private String getExecutionStatusMessage(
+      Map<ActionExecutionMetadata, Pair<String, Long>> statusMap) {
     int count = statusMap.size();
     StringBuilder s = count != 1
         ? new StringBuilder("Still waiting for ").append(count).append(" jobs to complete:")
@@ -177,7 +179,7 @@
 
     // A tree is just as fast as HashSet for small data sets.
     Set<String> statuses = new TreeSet<>();
-    for (Map.Entry<ActionMetadata, Pair<String, Long>> entry : statusMap.entrySet()) {
+    for (Map.Entry<ActionExecutionMetadata, Pair<String, Long>> entry : statusMap.entrySet()) {
       statuses.add(entry.getValue().first);
     }
 
@@ -192,7 +194,7 @@
    */
   public void showCurrentlyExecutingActions(String progressPercentageMessage) {
     // Defensive copy to ensure thread safety.
-    Map<ActionMetadata, Pair<String, Long>> statusMap = new HashMap<>(actionStatus);
+    Map<ActionExecutionMetadata, Pair<String, Long>> statusMap = new HashMap<>(actionStatus);
     if (!statusMap.isEmpty()) {
       eventHandler.handle(
           Event.progress(progressPercentageMessage + getExecutionStatusMessage(statusMap)));
@@ -205,13 +207,13 @@
    */
   void warnAboutCurrentlyExecutingActions() {
     // Defensive copy to ensure thread safety.
-    Map<ActionMetadata, Pair<String, Long>> statusMap = new HashMap<>(actionStatus);
+    Map<ActionExecutionMetadata, Pair<String, Long>> statusMap = new HashMap<>(actionStatus);
     if (statusMap.isEmpty()) {
       // There are no tasks in the queue so there is nothing to report.
       eventHandler.handle(Event.warn("There are no active jobs - stopping the build"));
       return;
     }
-    Iterator<ActionMetadata> iterator = statusMap.keySet().iterator();
+    Iterator<ActionExecutionMetadata> iterator = statusMap.keySet().iterator();
     while (iterator.hasNext()) {
       // Filter out actions that are not executed yet.
       if (statusMap.get(iterator.next()).first.equals(ActionStatusMessage.PREPARING)) {
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionGraph.java b/src/main/java/com/google/devtools/build/lib/actions/ActionGraph.java
index bd105c4..5b850d9 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionGraph.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionGraph.java
@@ -34,5 +34,5 @@
    * are unknown.
    */
   @Nullable
-  Action getGeneratingAction(Artifact artifact);
+  ActionAnalysisMetadata getGeneratingAction(Artifact artifact);
 }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionGraphVisitor.java b/src/main/java/com/google/devtools/build/lib/actions/ActionGraphVisitor.java
index 7e13e5d..6d335a8 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionGraphVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionGraphVisitor.java
@@ -17,7 +17,8 @@
  * An abstract visitor for the action graph.  Specializes {@link BipartiteVisitor} for artifacts and
  * actions, and takes care of visiting the complete transitive closure.
  */
-public abstract class ActionGraphVisitor extends BipartiteVisitor<Action, Artifact> {
+public abstract class ActionGraphVisitor extends
+    BipartiteVisitor<ActionAnalysisMetadata, Artifact> {
 
   private final ActionGraph actionGraph;
 
@@ -37,7 +38,7 @@
    *
    * @param action
    */
-  protected void visitAction(Action action) {}
+  protected void visitAction(ActionAnalysisMetadata action) {}
 
   /**
    * Whether the given action should be visited. If this returns false, the visitation stops here,
@@ -45,7 +46,7 @@
    *
    * @param action  
    */
-  protected boolean shouldVisit(Action action) {
+  protected boolean shouldVisit(ActionAnalysisMetadata action) {
     return true;
   }
 
@@ -67,14 +68,14 @@
   }
 
   @Override protected void white(Artifact artifact) {
-    Action action = actionGraph.getGeneratingAction(artifact);
+    ActionAnalysisMetadata action = actionGraph.getGeneratingAction(artifact);
     visitArtifact(artifact);
     if (action != null && shouldVisit(action)) {
       visitBlackNode(action);
     }
   }
 
-  @Override protected void black(Action action) {
+  @Override protected void black(ActionAnalysisMetadata action) {
     visitAction(action);
     for (Artifact input : action.getInputs()) {
       if (shouldVisit(input)) {
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java b/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java
index a4a85d2..26bbb6d 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java
@@ -49,7 +49,7 @@
         // going away anyway.
         Preconditions.checkArgument(mm.isMiddlemanArtifact(),
             "%s is not a middleman artifact", mm);
-        Action middlemanAction = actionGraph.getGeneratingAction(mm);
+        ActionAnalysisMetadata middlemanAction = actionGraph.getGeneratingAction(mm);
         Preconditions.checkState(middlemanAction != null, mm);
         // TODO(bazel-team): Consider expanding recursively or throwing an exception here.
         // Most likely, this code will cause silent errors if we ever have a middleman that
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionRegistry.java b/src/main/java/com/google/devtools/build/lib/actions/ActionRegistry.java
index 8755879..de85ce9 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionRegistry.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionRegistry.java
@@ -23,7 +23,7 @@
   /**
    * This method notifies the registry new actions.
    */
-  void registerAction(Action... actions);
+  void registerAction(ActionAnalysisMetadata... actions);
 
   /**
    * Get the (Label and BuildConfiguration) of the ConfiguredTarget ultimately responsible for all
@@ -37,7 +37,7 @@
   @VisibleForTesting
   public static final ActionRegistry NOP = new ActionRegistry() {
     @Override
-    public void registerAction(Action... actions) {}
+    public void registerAction(ActionAnalysisMetadata... actions) {}
 
     @Override
     public ArtifactOwner getOwner() {
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionStatusMessage.java b/src/main/java/com/google/devtools/build/lib/actions/ActionStatusMessage.java
index 144e862..f0ef8d8 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionStatusMessage.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionStatusMessage.java
@@ -20,16 +20,16 @@
  * used to notify any interested parties.
  */
 public class ActionStatusMessage {
-  private final ActionMetadata action;
+  private final ActionExecutionMetadata action;
   private final String message;
   public static final String PREPARING = "Preparing";
 
-  private ActionStatusMessage(ActionMetadata action, String message) {
+  private ActionStatusMessage(ActionExecutionMetadata action, String message) {
     this.action = action;
     this.message = message;
   }
 
-  public ActionMetadata getActionMetadata() {
+  public ActionExecutionMetadata getActionMetadata() {
     return action;
   }
 
@@ -38,22 +38,23 @@
   }
 
   /** Creates "Analyzing" status message. */
-  public static ActionStatusMessage analysisStrategy(ActionMetadata action) {
+  public static ActionStatusMessage analysisStrategy(ActionExecutionMetadata action) {
     return new ActionStatusMessage(action, "Analyzing");
   }
 
   /** Creates "Preparing" status message. */
-  public static ActionStatusMessage preparingStrategy(ActionMetadata action) {
+  public static ActionStatusMessage preparingStrategy(ActionExecutionMetadata action) {
     return new ActionStatusMessage(action, PREPARING);
   }
 
   /** Creates "Scheduling" status message. */
-  public static ActionStatusMessage schedulingStrategy(ActionMetadata action) {
+  public static ActionStatusMessage schedulingStrategy(ActionExecutionMetadata action) {
     return new ActionStatusMessage(action, "Scheduling");
   }
 
   /** Creates "Running (strategy)" status message. */
-  public static ActionStatusMessage runningStrategy(ActionMetadata action, String strategy) {
+  public static ActionStatusMessage runningStrategy(
+      ActionExecutionMetadata action, String strategy) {
     return new ActionStatusMessage(action, String.format("Running (%s)", strategy));
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Actions.java b/src/main/java/com/google/devtools/build/lib/actions/Actions.java
index 3878fcd..9d74e3b 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Actions.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Actions.java
@@ -51,19 +51,27 @@
    * <p>This method implements an equivalence relationship across actions, based on the action
    * class, the key, and the list of inputs and outputs.
    */
-  public static boolean canBeShared(Action a, Action b) {
+  public static boolean canBeShared(ActionAnalysisMetadata a, ActionAnalysisMetadata b) {
     if (!a.getMnemonic().equals(b.getMnemonic())) {
       return false;
     }
-    if (!a.getKey().equals(b.getKey())) {
+
+    // Non-Actions cannot be shared.
+    if (!(a instanceof Action) || !(b instanceof Action)) {
+      return false;
+    }
+
+    Action actionA = (Action) a;
+    Action actionB = (Action) b;
+    if (!actionA.getKey().equals(actionB.getKey())) {
       return false;
     }
     // Don't bother to check input and output counts first; the expected result for these tests is
     // to always be true (i.e., that this method returns true).
-    if (!Iterables.elementsEqual(a.getMandatoryInputs(), b.getMandatoryInputs())) {
+    if (!Iterables.elementsEqual(actionA.getMandatoryInputs(), actionB.getMandatoryInputs())) {
       return false;
     }
-    if (!Iterables.elementsEqual(a.getOutputs(), b.getOutputs())) {
+    if (!Iterables.elementsEqual(actionA.getOutputs(), actionB.getOutputs())) {
       return false;
     }
     return true;
@@ -80,18 +88,19 @@
    * @throws ActionConflictException iff there are two unshareable actions generating the same
    *     output
    */
-  public static Map<Artifact, Action> filterSharedActionsAndThrowActionConflict(
-      Iterable<Action> actions) throws ActionConflictException {
+  public static Map<Artifact, ActionAnalysisMetadata> filterSharedActionsAndThrowActionConflict(
+      Iterable<? extends ActionAnalysisMetadata> actions) throws ActionConflictException {
     return Actions.maybeFilterSharedActionsAndThrowIfConflict(
         actions, /*allowSharedAction=*/ true);
   }
 
-  private static Map<Artifact, Action> maybeFilterSharedActionsAndThrowIfConflict(
-      Iterable<Action> actions, boolean allowSharedAction) throws ActionConflictException {
-    Map<Artifact, Action> generatingActions = new HashMap<>();
-    for (Action action : actions) {
+  private static Map<Artifact, ActionAnalysisMetadata> maybeFilterSharedActionsAndThrowIfConflict(
+      Iterable<? extends ActionAnalysisMetadata> actions, boolean allowSharedAction)
+      throws ActionConflictException {
+    Map<Artifact, ActionAnalysisMetadata> generatingActions = new HashMap<>();
+    for (ActionAnalysisMetadata action : actions) {
       for (Artifact artifact : action.getOutputs()) {
-        Action previousAction = generatingActions.put(artifact, action);
+        ActionAnalysisMetadata previousAction = generatingActions.put(artifact, action);
         if (previousAction != null && previousAction != action) {
           if (!allowSharedAction || !Actions.canBeShared(previousAction, action)) {
             throw new ActionConflictException(artifact, previousAction, action);
@@ -112,16 +121,17 @@
    * @return A map between actions that generated the conflicting artifacts and their associated
    *     {@link ArtifactPrefixConflictException}.
    */
-  public static Map<Action, ArtifactPrefixConflictException> findArtifactPrefixConflicts(
-      ActionGraph actionGraph, SortedMap<PathFragment, Artifact> artifactPathMap) {
+  public static Map<ActionAnalysisMetadata, ArtifactPrefixConflictException>
+      findArtifactPrefixConflicts(ActionGraph actionGraph,
+      SortedMap<PathFragment, Artifact> artifactPathMap) {
     // No actions in graph -- currently happens only in tests. Special-cased because .next() call
     // below is unconditional.
     if (artifactPathMap.isEmpty()) {
-      return ImmutableMap.<Action, ArtifactPrefixConflictException>of();
+      return ImmutableMap.<ActionAnalysisMetadata, ArtifactPrefixConflictException>of();
     }
 
     // Keep deterministic ordering of bad actions.
-    Map<Action, ArtifactPrefixConflictException> badActions = new LinkedHashMap();
+    Map<ActionAnalysisMetadata, ArtifactPrefixConflictException> badActions = new LinkedHashMap();
     Iterator<PathFragment> iter = artifactPathMap.keySet().iterator();
 
     // Report an error for every derived artifact which is a prefix of another.
@@ -140,9 +150,9 @@
         if (pathJ.startsWith(pathI)) { // prefix conflict.
           Artifact artifactI = Preconditions.checkNotNull(artifactPathMap.get(pathI), pathI);
           Artifact artifactJ = Preconditions.checkNotNull(artifactPathMap.get(pathJ), pathJ);
-          Action actionI =
+          ActionAnalysisMetadata actionI =
               Preconditions.checkNotNull(actionGraph.getGeneratingAction(artifactI), artifactI);
-          Action actionJ =
+          ActionAnalysisMetadata actionJ =
               Preconditions.checkNotNull(actionGraph.getGeneratingAction(artifactJ), artifactJ);
           if (actionI.shouldReportPathPrefixConflict(actionJ)) {
             ArtifactPrefixConflictException exception = new ArtifactPrefixConflictException(pathI,
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 f28683b..95faf51 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
@@ -22,7 +22,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Ordering;
-import com.google.devtools.build.lib.actions.Action.MiddlemanType;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.shell.ShellUtils;
diff --git a/src/main/java/com/google/devtools/build/lib/actions/BaseSpawn.java b/src/main/java/com/google/devtools/build/lib/actions/BaseSpawn.java
index 8e34389..2e3a69d 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/BaseSpawn.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/BaseSpawn.java
@@ -44,7 +44,7 @@
   private final ImmutableMap<PathFragment, Artifact> runfilesManifests;
   private final ImmutableSet<PathFragment> optionalOutputFiles;
   private final RunfilesSupplier runfilesSupplier;
-  private final ActionMetadata action;
+  private final ActionExecutionMetadata action;
   private final ResourceSet localResources;
 
   // TODO(bazel-team): When we migrate ActionSpawn to use this constructor decide on and enforce
@@ -57,7 +57,7 @@
       Map<String, String> executionInfo,
       Map<PathFragment, Artifact> runfilesManifests,
       RunfilesSupplier runfilesSupplier,
-      ActionMetadata action,
+      ActionExecutionMetadata action,
       ResourceSet localResources,
       Collection<PathFragment> optionalOutputFiles) {
     this.arguments = ImmutableList.copyOf(arguments);
@@ -78,7 +78,7 @@
      Map<String, String> environment,
      Map<String, String> executionInfo,
      RunfilesSupplier runfilesSupplier,
-     ActionMetadata action,
+     ActionExecutionMetadata action,
      ResourceSet localResources) {
     this(
         arguments,
@@ -99,7 +99,7 @@
       Map<String, String> environment,
       Map<String, String> executionInfo,
       Map<PathFragment, Artifact> runfilesManifests,
-      ActionMetadata action,
+      ActionExecutionMetadata action,
       ResourceSet localResources) {
     this(
         arguments,
@@ -118,7 +118,7 @@
   public BaseSpawn(List<String> arguments,
       Map<String, String> environment,
       Map<String, String> executionInfo,
-      ActionMetadata action,
+      ActionExecutionMetadata action,
       ResourceSet localResources) {
     this(
         arguments,
@@ -134,7 +134,7 @@
       Map<String, String> environment,
       Map<String, String> executionInfo,
       RunfilesSupplier runfilesSupplier,
-      ActionMetadata action,
+      ActionExecutionMetadata action,
       ResourceSet localResources,
       Collection<PathFragment> optionalOutputFiles) {
     this(
@@ -258,7 +258,7 @@
   }
 
   @Override
-  public ActionMetadata getResourceOwner() {
+  public ActionExecutionMetadata getResourceOwner() {
     return action;
   }
 
@@ -291,7 +291,8 @@
    * A local spawn requiring zero resources.
    */
   public static class Local extends BaseSpawn {
-    public Local(List<String> arguments, Map<String, String> environment, ActionMetadata action) {
+    public Local(List<String> arguments, Map<String, String> environment,
+        ActionExecutionMetadata action) {
       super(arguments, environment, ImmutableMap.<String, String>of("local", ""),
           action, ResourceSet.ZERO);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/DelegateSpawn.java b/src/main/java/com/google/devtools/build/lib/actions/DelegateSpawn.java
index acb9cd6..d72a686 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/DelegateSpawn.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/DelegateSpawn.java
@@ -100,7 +100,7 @@
   }
 
   @Override
-  public ActionMetadata getResourceOwner() {
+  public ActionExecutionMetadata getResourceOwner() {
     return spawn.getResourceOwner();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/actions/MapBasedActionGraph.java b/src/main/java/com/google/devtools/build/lib/actions/MapBasedActionGraph.java
index 2535a2e..54d3411 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/MapBasedActionGraph.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/MapBasedActionGraph.java
@@ -24,19 +24,19 @@
  */
 @ThreadSafe
 public final class MapBasedActionGraph implements MutableActionGraph {
-  private final ConcurrentMultimapWithHeadElement<Artifact, Action> generatingActionMap =
-      new ConcurrentMultimapWithHeadElement<>();
+  private final ConcurrentMultimapWithHeadElement<Artifact, ActionAnalysisMetadata>
+      generatingActionMap = new ConcurrentMultimapWithHeadElement<>();
 
   @Override
   @Nullable
-  public Action getGeneratingAction(Artifact artifact) {
+  public ActionAnalysisMetadata getGeneratingAction(Artifact artifact) {
     return generatingActionMap.get(artifact);
   }
 
   @Override
-  public void registerAction(Action action) throws ActionConflictException {
+  public void registerAction(ActionAnalysisMetadata action) throws ActionConflictException {
     for (Artifact artifact : action.getOutputs()) {
-      Action previousAction = generatingActionMap.putAndGet(artifact, action);
+      ActionAnalysisMetadata previousAction = generatingActionMap.putAndGet(artifact, action);
       if (previousAction != null && previousAction != action
           && !Actions.canBeShared(action, previousAction)) {
         generatingActionMap.remove(artifact, action);
@@ -46,10 +46,10 @@
   }
 
   @Override
-  public void unregisterAction(Action action) {
+  public void unregisterAction(ActionAnalysisMetadata action) {
     for (Artifact artifact : action.getOutputs()) {
       generatingActionMap.remove(artifact, action);
-      Action otherAction = generatingActionMap.get(artifact);
+      ActionAnalysisMetadata otherAction = generatingActionMap.get(artifact);
       Preconditions.checkState(otherAction == null
           || (otherAction != action && Actions.canBeShared(action, otherAction)),
           "%s %s", action, otherAction);
diff --git a/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java b/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java
index 24c436c..404b0de 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.actions;
 
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.actions.Action.MiddlemanType;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.util.Pair;
diff --git a/src/main/java/com/google/devtools/build/lib/actions/MutableActionGraph.java b/src/main/java/com/google/devtools/build/lib/actions/MutableActionGraph.java
index d5da897..50b3fa7 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/MutableActionGraph.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/MutableActionGraph.java
@@ -42,7 +42,7 @@
    * then both conflicts are detected; if either A or C is registered first, then only one conflict
    * is detected.
    */
-  void registerAction(Action action) throws ActionConflictException;
+  void registerAction(ActionAnalysisMetadata action) throws ActionConflictException;
 
   /**
    * Removes an action from this action graph if it is present.
@@ -50,7 +50,7 @@
    * <p>Throws {@link IllegalStateException} if one of the outputs of the action is in fact
    * generated by a different {@link Action} instance (even if they are sharable).
    */
-  void unregisterAction(Action action);
+  void unregisterAction(ActionAnalysisMetadata action);
 
   /**
    * Clear the action graph.
@@ -65,13 +65,13 @@
   public static final class ActionConflictException extends Exception {
 
     private final Artifact artifact;
-    private final Action previousAction;
-    private final Action attemptedAction;
+    private final ActionAnalysisMetadata previousAction;
+    private final ActionAnalysisMetadata attemptedAction;
     
     private static final int MAX_DIFF_ARTIFACTS_TO_REPORT = 5;
 
-    public ActionConflictException(Artifact artifact, Action previousAction,
-        Action attemptedAction) {
+    public ActionConflictException(Artifact artifact, ActionAnalysisMetadata previousAction,
+        ActionAnalysisMetadata attemptedAction) {
       super(
           String.format(
               "for %s, previous action: %s, attempted action: %s",
@@ -145,7 +145,7 @@
     }
 
     // See also Actions.canBeShared()
-    private String suffix(Action a, Action b) {
+    private String suffix(ActionAnalysisMetadata a, ActionAnalysisMetadata b) {
       // Note: the error message reveals to users the names of intermediate files that are not
       // documented in the BUILD language.  This error-reporting logic is rather elaborate but it
       // does help to diagnose some tricky situations.
@@ -162,7 +162,15 @@
       addStringDetail(sb, "Configuration", aNull ? null : aOwner.getConfigurationChecksum(),
           bNull ? null : bOwner.getConfigurationChecksum());
       addStringDetail(sb, "Mnemonic", a.getMnemonic(), b.getMnemonic());
-      addStringDetail(sb, "Progress message", a.getProgressMessage(), b.getProgressMessage());
+
+      if ((a instanceof ActionExecutionMetadata) && (b instanceof ActionExecutionMetadata)) {
+        addStringDetail(
+            sb,
+            "Progress message",
+            ((ActionExecutionMetadata) a).getProgressMessage(),
+            ((ActionExecutionMetadata) b).getProgressMessage());
+      }
+
       addStringDetail(
           sb,
           "PrimaryInput",
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ResourceManager.java b/src/main/java/com/google/devtools/build/lib/actions/ResourceManager.java
index c263b2d..3ebaee0 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ResourceManager.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ResourceManager.java
@@ -61,16 +61,16 @@
 public class ResourceManager {
 
   /**
-   * A handle returned by {@link #acquireResources(ActionMetadata, ResourceSet)} that must be closed
-   * in order to free the resources again.
+   * A handle returned by {@link #acquireResources(ActionExecutionMetadata, ResourceSet)} that must
+   * be closed in order to free the resources again.
    */
   public static class ResourceHandle implements AutoCloseable {
     final ResourceManager rm;
-    final ActionMetadata actionMetadata;
+    final ActionExecutionMetadata actionMetadata;
     final ResourceSet resourceSet;
 
-    public ResourceHandle(
-        ResourceManager rm, ActionMetadata actionMetadata, ResourceSet resources) {
+    public ResourceHandle(ResourceManager rm, ActionExecutionMetadata actionMetadata,
+        ResourceSet resources) {
       this.rm = rm;
       this.actionMetadata = actionMetadata;
       this.resourceSet = resources;
@@ -200,7 +200,7 @@
    * Acquires requested resource set. Will block if resource is not available.
    * NB! This method must be thread-safe!
    */
-  public ResourceHandle acquireResources(ActionMetadata owner, ResourceSet resources)
+  public ResourceHandle acquireResources(ActionExecutionMetadata owner, ResourceSet resources)
       throws InterruptedException {
     Preconditions.checkNotNull(resources);
     AutoProfiler p = profiled(owner, ProfilerTask.ACTION_LOCK);
@@ -228,7 +228,7 @@
    * Acquires the given resources if available immediately. Does not block.
    * @return true iff the given resources were locked (all or nothing).
    */
-  public boolean tryAcquire(ActionMetadata owner, ResourceSet resources) {
+  public boolean tryAcquire(ActionExecutionMetadata owner, ResourceSet resources) {
     boolean acquired = false;
     synchronized (this) {
       if (areResourcesAvailable(resources)) {
@@ -279,14 +279,14 @@
     this.eventBus = null;
   }
 
-  private void waiting(ActionMetadata owner) {
+  private void waiting(ActionExecutionMetadata owner) {
     if (eventBus != null) {
       // Null only in tests.
       eventBus.post(ActionStatusMessage.schedulingStrategy(owner));
     }
   }
 
-  private void acquired(ActionMetadata owner) {
+  private void acquired(ActionExecutionMetadata owner) {
     if (eventBus != null) {
       // Null only in tests.
       eventBus.post(ActionStatusMessage.runningStrategy(owner, "unknown"));
@@ -298,7 +298,7 @@
    *
    * <p>NB! This method must be thread-safe!
    */
-  public void releaseResources(ActionMetadata owner, ResourceSet resources) {
+  public void releaseResources(ActionExecutionMetadata owner, ResourceSet resources) {
     boolean isConflict = false;
     AutoProfiler p = profiled(owner, ProfilerTask.ACTION_RELEASE);
     try {
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Spawn.java b/src/main/java/com/google/devtools/build/lib/actions/Spawn.java
index b4ed5c7..3e24fdc 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Spawn.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Spawn.java
@@ -129,7 +129,7 @@
   /**
    * Returns the resource owner for local fallback.
    */
-  ActionMetadata getResourceOwner();
+  ActionExecutionMetadata getResourceOwner();
 
   /**
    * Returns the amount of resources needed for local fallback.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
index cf1b16b..dd96b3a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
@@ -17,6 +17,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.ActionRegistry;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.MiddlemanFactory;
@@ -105,13 +106,13 @@
    * If the artifact was created in another analysis environment (e.g. by a different configured
    * target instance) or the artifact is a source artifact, it returns null.
    */
-  Action getLocalGeneratingAction(Artifact artifact);
+  ActionAnalysisMetadata getLocalGeneratingAction(Artifact artifact);
 
   /**
    * Returns the actions that were registered so far with this analysis environment, that is, all
    * the actions that were created by the current target being analyzed.
    */
-  Iterable<Action> getRegisteredActions();
+  Iterable<ActionAnalysisMetadata> getRegisteredActions();
 
   /**
    * Returns the Skyframe SkyFunction.Environment if available. Otherwise, null.
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 fb30f60..1251fe1 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
@@ -27,7 +27,7 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.common.eventbus.EventBus;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.ActionGraph;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactFactory;
@@ -552,7 +552,7 @@
           getArtifactFactory(),
           CoverageReportValue.ARTIFACT_OWNER);
       if (actionsWrapper != null) {
-        ImmutableList <Action> actions = actionsWrapper.getActions();
+        ImmutableList<ActionAnalysisMetadata> actions = actionsWrapper.getActions();
         skyframeExecutor.injectCoverageReportData(actions);
         artifactsToBuild.addAll(actionsWrapper.getCoverageOutputs());
       }
@@ -571,7 +571,7 @@
     final ActionGraph actionGraph = new ActionGraph() {
       @Nullable
       @Override
-      public Action getGeneratingAction(Artifact artifact) {
+      public ActionAnalysisMetadata getGeneratingAction(Artifact artifact) {
         ArtifactOwner artifactOwner = artifact.getArtifactOwner();
         if (artifactOwner instanceof ActionLookupValue.ActionLookupKey) {
           SkyKey key = ActionLookupValue.key((ActionLookupValue.ActionLookupKey) artifactOwner);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
index 4d1d787..2f8762d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
@@ -17,7 +17,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactFactory;
 import com.google.devtools.build.lib.actions.ArtifactOwner;
@@ -90,7 +90,7 @@
    * The list of actions registered by the configured target this analysis environment is
    * responsible for. May get cleared out at the end of the analysis of said target.
    */
-  final List<Action> actions = new ArrayList<>();
+  final List<ActionAnalysisMetadata> actions = new ArrayList<>();
 
   public CachingAnalysisEnvironment(ArtifactFactory artifactFactory,
       ArtifactOwner owner, boolean isSystemEnv, boolean extendedSanityChecks,
@@ -119,7 +119,7 @@
     skyframeEnv = null;
   }
 
-  private static StringBuilder shortDescription(Action action) {
+  private static StringBuilder shortDescription(ActionAnalysisMetadata action) {
     if (action == null) {
       return new StringBuilder("null Action");
     }
@@ -138,7 +138,7 @@
     List<String> checkedActions = null;
     if (!orphanArtifacts.isEmpty()) {
       checkedActions = Lists.newArrayListWithCapacity(actions.size());
-      for (Action action : actions) {
+      for (ActionAnalysisMetadata action : actions) {
         StringBuilder sb = shortDescription(action);
         for (Artifact o : action.getOutputs()) {
           sb.append("\n    ");
@@ -166,7 +166,7 @@
   private Map<Artifact, String> getOrphanArtifactMap() {
     // Construct this set to avoid poor performance under large --runs_per_test.
     Set<Artifact> artifactsWithActions = new HashSet<>();
-    for (Action action : actions) {
+    for (ActionAnalysisMetadata action : actions) {
       // Don't bother checking that every Artifact only appears once; that test is performed
       // elsewhere (see #testNonUniqueOutputs in ActionListenerIntegrationTest).
       artifactsWithActions.addAll(action.getOutputs());
@@ -258,7 +258,7 @@
   }
 
   @Override
-  public void registerAction(Action... actions) {
+  public void registerAction(ActionAnalysisMetadata... actions) {
     Preconditions.checkState(enabled);
     if (allowRegisteringActions) {
       Collections.addAll(this.actions, actions);
@@ -266,9 +266,9 @@
   }
 
   @Override
-  public Action getLocalGeneratingAction(Artifact artifact) {
+  public ActionAnalysisMetadata getLocalGeneratingAction(Artifact artifact) {
     Preconditions.checkState(allowRegisteringActions);
-    for (Action action : actions) {
+    for (ActionAnalysisMetadata action : actions) {
       if (action.getOutputs().contains(artifact)) {
         return action;
       }
@@ -277,7 +277,7 @@
   }
 
   @Override
-  public Collection<Action> getRegisteredActions() {
+  public Collection<ActionAnalysisMetadata> getRegisteredActions() {
     return Collections.unmodifiableCollection(actions);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
index 645cd6d..7f3db2a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
@@ -20,7 +20,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.UnmodifiableIterator;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -174,7 +174,8 @@
       addProvider(
           ExtraActionArtifactsProvider.class,
           createExtraActionProvider(
-              ImmutableSet.<Action>of() /* actionsWithoutExtraAction */, ruleContext));
+              ImmutableSet.<ActionAnalysisMetadata>of() /* actionsWithoutExtraAction */,
+              ruleContext));
 
       return new ConfiguredAspect(name, ImmutableMap.copyOf(providers));
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java
index 829e637..782eaa2 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java
@@ -16,7 +16,7 @@
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Multimap;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.ExtraActionArtifactsProvider.ExtraArtifactSet;
 import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
@@ -44,7 +44,7 @@
    * bookkeeping.
    */
   static ExtraActionArtifactsProvider createExtraActionProvider(
-      Set<Action> actionsWithoutExtraAction, RuleContext ruleContext) {
+      Set<ActionAnalysisMetadata> actionsWithoutExtraAction, RuleContext ruleContext) {
     BuildConfiguration configuration = ruleContext.getConfiguration();
     if (configuration.isHostConfiguration()) {
       return ExtraActionArtifactsProvider.EMPTY;
@@ -61,7 +61,7 @@
 
       // The action list is modified within the body of the loop by the maybeAddExtraAction() call,
       // thus the copy
-      for (Action action :
+      for (ActionAnalysisMetadata action :
           ImmutableList.copyOf(ruleContext.getAnalysisEnvironment().getRegisteredActions())) {
         if (!actionsWithoutExtraAction.contains(action)) {
           visitor.maybeAddExtraAction(action);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionsVisitor.java b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionsVisitor.java
index 3b4069e..db10173 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionsVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionsVisitor.java
@@ -17,8 +17,8 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.ActionGraph;
 import com.google.devtools.build.lib.actions.ActionGraphVisitor;
 import com.google.devtools.build.lib.actions.Artifact;
@@ -26,7 +26,6 @@
 
 import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 
 import javax.annotation.Nullable;
 
@@ -37,7 +36,6 @@
   private final RuleContext ruleContext;
   private final Multimap<String, ExtraActionSpec> mnemonicToExtraActionMap;
   private final List<Artifact> extraArtifacts;
-  public final Set<Action> actions = Sets.newHashSet();
 
   /** Creates a new visitor for the extra actions associated with the given target. */
   public ExtraActionsVisitor(RuleContext ruleContext,
@@ -48,21 +46,23 @@
     extraArtifacts = Lists.newArrayList();
   }
 
-  void maybeAddExtraAction(Action original) {
-    if (original.extraActionCanAttach()) {
-      Collection<ExtraActionSpec> extraActions =
-          mnemonicToExtraActionMap.get(original.getMnemonic());
-      if (extraActions != null) {
-        for (ExtraActionSpec extraAction : extraActions) {
-          extraArtifacts.addAll(extraAction.addExtraAction(ruleContext, original));
+  void maybeAddExtraAction(ActionAnalysisMetadata original) {
+    if (original instanceof Action) {
+      Action action = (Action) original;
+      if (action.extraActionCanAttach()) {
+        Collection<ExtraActionSpec> extraActions =
+            mnemonicToExtraActionMap.get(action.getMnemonic());
+        if (extraActions != null) {
+          for (ExtraActionSpec extraAction : extraActions) {
+            extraArtifacts.addAll(extraAction.addExtraAction(ruleContext, action));
+          }
         }
       }
     }
   }
 
   @Override
-  protected void visitAction(Action action) {
-    actions.add(action);
+  protected void visitAction(ActionAnalysisMetadata action) {
     maybeAddExtraAction(action);
   }
 
@@ -78,7 +78,7 @@
     return new ActionGraph() {
       @Override
       @Nullable
-      public Action getGeneratingAction(Artifact artifact) {
+      public ActionAnalysisMetadata getGeneratingAction(Artifact artifact) {
         return ruleContext.getAnalysisEnvironment().getLocalGeneratingAction(artifact);
       }
     };
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PrintActionVisitor.java b/src/main/java/com/google/devtools/build/lib/analysis/PrintActionVisitor.java
index 2878092..abe62c1 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/PrintActionVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/PrintActionVisitor.java
@@ -16,7 +16,7 @@
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.ActionGraph;
 import com.google.devtools.build.lib.actions.ActionGraphVisitor;
 import com.google.devtools.build.lib.actions.ActionOwner;
@@ -28,8 +28,8 @@
  */
 public final class PrintActionVisitor extends ActionGraphVisitor {
   private final ConfiguredTarget target;
-  private final List<Action> actions;
-  private final Predicate<Action> actionMnemonicMatcher;
+  private final List<ActionAnalysisMetadata> actions;
+  private final Predicate<ActionAnalysisMetadata> actionMnemonicMatcher;
   private final String targetConfigurationChecksum;
 
   /**
@@ -37,7 +37,7 @@
    * mnemonic.
    */
   public PrintActionVisitor(ActionGraph actionGraph, ConfiguredTarget target,
-      Predicate<Action> actionMnemonicMatcher) {
+      Predicate<ActionAnalysisMetadata> actionMnemonicMatcher) {
     super(actionGraph);
     this.target = target;
     this.actionMnemonicMatcher = actionMnemonicMatcher;
@@ -46,21 +46,21 @@
   }
 
   @Override
-  protected boolean shouldVisit(Action action) {
+  protected boolean shouldVisit(ActionAnalysisMetadata action) {
     ActionOwner owner = action.getOwner();
     return owner != null && target.getLabel().equals(owner.getLabel())
         && targetConfigurationChecksum.equals(owner.getConfigurationChecksum());
   }
 
   @Override
-  protected void visitAction(Action action) {
+  protected void visitAction(ActionAnalysisMetadata action) {
     if (actionMnemonicMatcher.apply(action)) {
       actions.add(action);
     }
   }
 
   /** Retrieves the collected actions since this method was last called and clears the list. */
-  public ImmutableList<Action> getActions() {
+  public ImmutableList<ActionAnalysisMetadata> getActions() {
     return ImmutableList.copyOf(actions);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
index 07b0d86..853fdf7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
@@ -18,7 +18,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.LicensesProvider.TargetLicense;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -62,7 +62,7 @@
   private NestedSet<Artifact> filesToBuild = NestedSetBuilder.emptySet(Order.STABLE_ORDER);
   private RunfilesSupport runfilesSupport;
   private Artifact executable;
-  private ImmutableSet<Action> actionsWithoutExtraAction = ImmutableSet.of();
+  private ImmutableSet<ActionAnalysisMetadata> actionsWithoutExtraAction = ImmutableSet.of();
 
   public RuleConfiguredTargetBuilder(RuleContext ruleContext) {
     this.ruleContext = ruleContext;
@@ -341,7 +341,8 @@
   /**
    * Set the extra action pseudo actions.
    */
-  public RuleConfiguredTargetBuilder setActionsWithoutExtraAction(ImmutableSet<Action> actions) {
+  public RuleConfiguredTargetBuilder setActionsWithoutExtraAction(
+      ImmutableSet<ActionAnalysisMetadata> actions) {
     this.actionsWithoutExtraAction = actions;
     return this;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index fef9393..cc3118b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -29,6 +29,7 @@
 import com.google.common.collect.Multimaps;
 import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.ActionOwner;
 import com.google.devtools.build.lib.actions.ActionRegistry;
 import com.google.devtools.build.lib.actions.Artifact;
@@ -379,7 +380,7 @@
   }
 
   @Override
-  public void registerAction(Action... action) {
+  public void registerAction(ActionAnalysisMetadata... action) {
     getAnalysisEnvironment().registerAction(action);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoCollection.java
index 39b1d96..18a147e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoCollection.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.analysis.buildinfo;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 
 import java.util.List;
@@ -23,19 +23,19 @@
  * A collection of build-info files for both stamped and unstamped modes.
  */
 public final class BuildInfoCollection {
-  private final ImmutableList<Action> actions;
+  private final ImmutableList<ActionAnalysisMetadata> actions;
   private final ImmutableList<Artifact> stampedBuildInfo;
   private final ImmutableList<Artifact> redactedBuildInfo;
 
-  public BuildInfoCollection(List<? extends Action> actions, List<Artifact> stampedBuildInfo,
-      List<Artifact> redactedBuildInfo) {
+  public BuildInfoCollection(List<? extends ActionAnalysisMetadata> actions,
+      List<Artifact> stampedBuildInfo, List<Artifact> redactedBuildInfo) {
     // Do not remove <Action>: workaround for Java 7 type inference.
-    this.actions = ImmutableList.<Action>copyOf(actions);
+    this.actions = ImmutableList.<ActionAnalysisMetadata>copyOf(actions);
     this.stampedBuildInfo = ImmutableList.copyOf(stampedBuildInfo);
     this.redactedBuildInfo = ImmutableList.copyOf(redactedBuildInfo);
   }
 
-  public ImmutableList<Action> getActions() {
+  public ImmutableList<ActionAnalysisMetadata> getActions() {
     return actions;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnStrategy.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnStrategy.java
index f688fd2..75ba75e 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnStrategy.java
@@ -19,10 +19,10 @@
 import com.google.common.hash.Hashing;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.devtools.build.lib.actions.ActionExecutionContext;
+import com.google.devtools.build.lib.actions.ActionExecutionMetadata;
 import com.google.devtools.build.lib.actions.ActionInput;
 import com.google.devtools.build.lib.actions.ActionInputFileCache;
 import com.google.devtools.build.lib.actions.ActionInputHelper;
-import com.google.devtools.build.lib.actions.ActionMetadata;
 import com.google.devtools.build.lib.actions.ExecException;
 import com.google.devtools.build.lib.actions.ExecutionStrategy;
 import com.google.devtools.build.lib.actions.Executor;
@@ -84,7 +84,7 @@
     }
 
     Executor executor = actionExecutionContext.getExecutor();
-    ActionMetadata actionMetadata = spawn.getResourceOwner();
+    ActionExecutionMetadata actionMetadata = spawn.getResourceOwner();
     ActionInputFileCache inputFileCache = actionExecutionContext.getActionInputFileCache();
     EventHandler eventHandler = executor.getEventHandler();
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
index e1c1348..9c9b19c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -19,7 +19,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.AnalysisEnvironment;
 import com.google.devtools.build.lib.analysis.FileProvider;
@@ -72,7 +72,7 @@
     public void collectMetadataArtifacts(Iterable<Artifact> objectFiles,
         AnalysisEnvironment analysisEnvironment, NestedSetBuilder<Artifact> metadataFilesBuilder) {
       for (Artifact artifact : objectFiles) {
-        Action action = analysisEnvironment.getLocalGeneratingAction(artifact);
+        ActionAnalysisMetadata action = analysisEnvironment.getLocalGeneratingAction(artifact);
         if (action instanceof CppCompileAction) {
           addOutputs(metadataFilesBuilder, action, CppFileTypes.COVERAGE_NOTES);
         }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java
index e3250cab..b8a6854 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java
@@ -16,7 +16,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.actions.AbstractAction;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.ActionExecutionContext;
 import com.google.devtools.build.lib.actions.ActionExecutionException;
 import com.google.devtools.build.lib.actions.ActionOwner;
@@ -224,7 +224,7 @@
   }
 
   @Override
-  public boolean shouldReportPathPrefixConflict(Action action) {
+  public boolean shouldReportPathPrefixConflict(ActionAnalysisMetadata action) {
     return false; // Always ignore path prefix conflict for the SolibSymlinkAction.
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
index 7fa48b1..b4650d2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
@@ -18,7 +18,7 @@
 import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.AnalysisEnvironment;
 import com.google.devtools.build.lib.analysis.AnalysisUtils;
@@ -86,7 +86,7 @@
     public void collectMetadataArtifacts(Iterable<Artifact> objectFiles,
         AnalysisEnvironment analysisEnvironment, NestedSetBuilder<Artifact> metadataFilesBuilder) {
       for (Artifact artifact : objectFiles) {
-        Action action = analysisEnvironment.getLocalGeneratingAction(artifact);
+        ActionAnalysisMetadata action = analysisEnvironment.getLocalGeneratingAction(artifact);
         if (action instanceof JavaCompileAction) {
           addOutputs(metadataFilesBuilder, action, JavaSemantics.COVERAGE_METADATA);
         }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
index 8fe7df3..57e5215 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
@@ -55,6 +55,7 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ParameterFile;
 import com.google.devtools.build.lib.analysis.AnalysisEnvironment;
@@ -1354,7 +1355,7 @@
         AnalysisEnvironment analysisEnvironment,
         NestedSetBuilder<Artifact> metadataFilesBuilder) {
       for (Artifact artifact : artifacts) {
-        Action action = analysisEnvironment.getLocalGeneratingAction(artifact);
+        ActionAnalysisMetadata action = analysisEnvironment.getLocalGeneratingAction(artifact);
         if (action.getMnemonic().equals("ObjcCompile")) {
           addOutputs(metadataFilesBuilder, action, ObjcRuleClasses.COVERAGE_NOTES);
         }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/CoverageReportActionFactory.java b/src/main/java/com/google/devtools/build/lib/rules/test/CoverageReportActionFactory.java
index 3c81ee5..621b352 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/CoverageReportActionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/CoverageReportActionFactory.java
@@ -16,7 +16,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactFactory;
 import com.google.devtools.build.lib.actions.ArtifactOwner;
@@ -43,16 +43,16 @@
    */
 
   public static final class CoverageReportActionsWrapper {
-    private final Action lcovWriteAction;
-    private final Action coverageReportAction;
+    private final ActionAnalysisMetadata lcovWriteAction;
+    private final ActionAnalysisMetadata coverageReportAction;
 
     public CoverageReportActionsWrapper (
-        Action lcovWriteAction, Action coverageReportAction) {
+        ActionAnalysisMetadata lcovWriteAction, ActionAnalysisMetadata coverageReportAction) {
       this.lcovWriteAction = lcovWriteAction;
       this.coverageReportAction = coverageReportAction;
     }
 
-    public ImmutableList<Action> getActions() {
+    public ImmutableList<ActionAnalysisMetadata> getActions() {
       return ImmutableList.of(lcovWriteAction, coverageReportAction);
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java b/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java
index 4b62f41..9951f63 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.rules.test;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.AnalysisEnvironment;
 import com.google.devtools.build.lib.analysis.FileProvider;
@@ -234,7 +234,7 @@
      * @param fileType the filetype of outputs which should be collected
      */
     protected void addOutputs(NestedSetBuilder<Artifact> metadataFilesBuilder,
-                              Action action, FileType fileType) {
+                              ActionAnalysisMetadata action, FileType fileType) {
       for (Artifact output : action.getOutputs()) {
         if (fileType.matches(output.getFilename())) {
           metadataFilesBuilder.add(output);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
index 5a39dbb..a6a110c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
@@ -92,6 +92,7 @@
   @Override
   public SkyValue compute(SkyKey skyKey, Environment env) throws ActionExecutionFunctionException,
       InterruptedException {
+    Preconditions.checkArgument(skyKey.argument() instanceof Action);
     Action action = (Action) skyKey.argument();
     // TODO(bazel-team): Non-volatile NotifyOnActionCacheHit actions perform worse in Skyframe than
     // legacy when they are not at the top of the action graph. In legacy, they are stored
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 fdce7c6..e56ef46 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
@@ -18,7 +18,7 @@
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.actions.Action;
-import com.google.devtools.build.lib.actions.Action.MiddlemanType;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java
index e40817c..db23b45 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java
@@ -16,7 +16,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Actions;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactOwner;
@@ -34,10 +34,10 @@
  * actions of target completion values and build info artifacts also fall into this category.
  */
 public class ActionLookupValue implements SkyValue {
-  protected final ImmutableMap<Artifact, Action> generatingActionMap;
+  protected final ImmutableMap<Artifact, ActionAnalysisMetadata> generatingActionMap;
 
-  private static Map<Artifact, Action> filterSharedActionsAndThrowRuntimeIfConflict(
-      Iterable<Action> actions) {
+  private static Map<Artifact, ActionAnalysisMetadata> filterSharedActionsAndThrowRuntimeIfConflict(
+      Iterable<ActionAnalysisMetadata> actions) {
     try {
       return Actions.filterSharedActionsAndThrowActionConflict(actions);
     } catch (ActionConflictException e) {
@@ -46,24 +46,24 @@
     }
   }
 
-  ActionLookupValue(Iterable<Action> actions) {
+  ActionLookupValue(Iterable<ActionAnalysisMetadata> actions) {
     this(filterSharedActionsAndThrowRuntimeIfConflict(actions));
   }
 
-  ActionLookupValue(Action action) {
+  ActionLookupValue(ActionAnalysisMetadata action) {
     this(ImmutableList.of(action));
   }
 
-  ActionLookupValue(Map<Artifact, Action> generatingActionMap) {
+  ActionLookupValue(Map<Artifact, ActionAnalysisMetadata> generatingActionMap) {
     this.generatingActionMap = ImmutableMap.copyOf(generatingActionMap);
   }
 
-  public Action getGeneratingAction(Artifact artifact) {
+  public ActionAnalysisMetadata getGeneratingAction(Artifact artifact) {
     return generatingActionMap.get(artifact);
   }
 
   /** To be used only when checking consistency of the action graph -- not by other values. */
-  ImmutableMap<Artifact, Action> getMapForConsistencyCheck() {
+  ImmutableMap<Artifact, ActionAnalysisMetadata> getMapForConsistencyCheck() {
     return generatingActionMap;
   }
 
@@ -71,7 +71,7 @@
    * To be used only when setting the owners of deserialized artifacts whose owners were unknown at
    * creation time -- not by other callers or values.
    */
-  Iterable<Action> getActionsForFindingArtifactOwners() {
+  Iterable<ActionAnalysisMetadata> getActionsForFindingArtifactOwners() {
     return generatingActionMap.values();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java
index 312feef..c8022d5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java
@@ -16,7 +16,8 @@
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.actions.Action;
-import com.google.devtools.build.lib.actions.Action.MiddlemanType;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType;
 import com.google.devtools.build.lib.actions.ActionExecutionException;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactOwner;
@@ -65,11 +66,16 @@
       }
     }
 
-    Action action = extractActionFromArtifact(artifact, env);
-    if (action == null) {
+    ActionAnalysisMetadata actionMetadata = extractActionFromArtifact(artifact, env);
+    if (actionMetadata == null) {
       return null;
     }
 
+    Preconditions.checkState(
+        actionMetadata instanceof Action,
+        "%s is not a proper Action object and therefore cannot be executed",
+        actionMetadata);
+    Action action = (Action) actionMetadata;
     ActionExecutionValue actionValue =
         (ActionExecutionValue) env.getValue(ActionExecutionValue.key(action));
     if (actionValue == null) {
@@ -165,8 +171,8 @@
     return FileArtifactValue.create(artifact, data);
   }
 
-  private AggregatingArtifactValue createAggregatingValue(Artifact artifact, Action action,
-      FileArtifactValue value, SkyFunction.Environment env) {
+  private AggregatingArtifactValue createAggregatingValue(Artifact artifact,
+      ActionAnalysisMetadata action, FileArtifactValue value, SkyFunction.Environment env) {
     // This artifact aggregates other artifacts. Keep track of them so callers can find them.
     ImmutableList.Builder<Pair<Artifact, FileArtifactValue>> inputs = ImmutableList.builder();
     for (Map.Entry<SkyKey, SkyValue> entry :
@@ -190,7 +196,7 @@
    * see if the action is an aggregating middleman action. However, may include runfiles middleman
    * actions and Fileset artifacts in the future.
    */
-  private static boolean isAggregatingValue(Action action) {
+  private static boolean isAggregatingValue(ActionAnalysisMetadata action) {
     return action.getActionType() == MiddlemanType.AGGREGATING_MIDDLEMAN;
   }
 
@@ -199,7 +205,8 @@
     return Label.print(((OwnedArtifact) skyKey.argument()).getArtifact().getOwner());
   }
 
-  private Action extractActionFromArtifact(Artifact artifact, SkyFunction.Environment env) {
+  private ActionAnalysisMetadata extractActionFromArtifact(
+      Artifact artifact, SkyFunction.Environment env) {
     ArtifactOwner artifactOwner = artifact.getArtifactOwner();
 
     Preconditions.checkState(artifactOwner instanceof ActionLookupKey, "", artifact, artifactOwner);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
index 56878b1..f37e5e2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
@@ -16,7 +16,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ListMultimap;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.analysis.CachingAnalysisEnvironment;
 import com.google.devtools.build.lib.analysis.ConfiguredAspect;
 import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
@@ -288,7 +288,7 @@
         originalTarget.getLabel(),
         originalTarget.getLocation(),
         ConfiguredAspect.forAlias(real.getConfiguredAspect()),
-        ImmutableList.<Action>of(),
+        ImmutableList.<ActionAnalysisMetadata>of(),
         transitivePackages);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java
index effd33f..33cf880 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.skyframe;
 
 import com.google.common.base.Objects;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.analysis.ConfiguredAspect;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -247,7 +247,7 @@
       Label label,
       Location location,
       ConfiguredAspect configuredAspect,
-      Iterable<Action> actions,
+      Iterable<ActionAnalysisMetadata> actions,
       NestedSet<Package> transitivePackages) {
     super(actions);
     this.aspect = aspect;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index 0a5caf0..6fb86c8 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -23,7 +23,7 @@
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Actions;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
@@ -846,7 +846,7 @@
     analysisEnvironment.disable(target);
     Preconditions.checkNotNull(configuredTarget, target);
 
-    Map<Artifact, Action> generatingActions;
+    Map<Artifact, ActionAnalysisMetadata> generatingActions;
     // Check for conflicting actions within this configured target (that indicates a bug in the
     // rule implementation).
     try {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetValue.java
index 3918bf7..7f32c1e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetValue.java
@@ -16,7 +16,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -46,12 +46,13 @@
 
   // We overload this variable to check whether the value has been clear()ed. We don't use a
   // separate variable in order to save memory.
-  @Nullable private volatile Iterable<Action> actions;
+  @Nullable private volatile Iterable<ActionAnalysisMetadata> actions;
 
   private final NestedSet<Package> transitivePackages;
 
   ConfiguredTargetValue(ConfiguredTarget configuredTarget,
-      Map<Artifact, Action> generatingActionMap, NestedSet<Package> transitivePackages) {
+      Map<Artifact, ActionAnalysisMetadata> generatingActionMap,
+      NestedSet<Package> transitivePackages) {
     super(generatingActionMap);
     this.configuredTarget = configuredTarget;
     this.actions = generatingActionMap.values();
@@ -65,7 +66,7 @@
   }
 
   @VisibleForTesting
-  public Iterable<Action> getActions() {
+  public Iterable<ActionAnalysisMetadata> getActions() {
     return Preconditions.checkNotNull(actions, configuredTarget);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportFunction.java
index 0a13579..53d7a86 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportFunction.java
@@ -16,7 +16,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.skyframe.SkyFunction;
@@ -35,14 +35,14 @@
         CoverageReportValue.SKY_KEY.equals(skyKey), String.format(
             "Expected %s for SkyKey but got %s instead", CoverageReportValue.SKY_KEY, skyKey));
 
-    ImmutableList <Action> actions = PrecomputedValue.COVERAGE_REPORT_KEY.get(env);
+    ImmutableList<ActionAnalysisMetadata> actions = PrecomputedValue.COVERAGE_REPORT_KEY.get(env);
     if (actions == null) {
       return null;
     }
 
     ImmutableSet.Builder<Artifact> outputs = new ImmutableSet.Builder<>();
 
-    for (Action action : actions) {
+    for (ActionAnalysisMetadata action : actions) {
       outputs.addAll(action.getOutputs());
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java
index 44722b5..27ace76 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java
@@ -16,7 +16,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactOwner;
 import com.google.devtools.build.skyframe.SkyFunctionName;
@@ -34,7 +34,7 @@
   public static final ArtifactOwner ARTIFACT_OWNER = new CoverageReportKey();
 
   public CoverageReportValue(ImmutableSet<Artifact> coverageReportArtifacts,
-      ImmutableList <Action> coverageReportActions) {
+      ImmutableList <ActionAnalysisMetadata> coverageReportActions) {
     super(coverageReportActions);
     this.coverageReportArtifacts = coverageReportArtifacts;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java
index 878caec..c33e599 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java
@@ -18,7 +18,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.ListMultimap;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.Dependency;
 import com.google.devtools.build.lib.analysis.LabelAndConfiguration;
@@ -72,14 +72,15 @@
   @Override
   public SkyValue compute(SkyKey skyKey, Environment env)
       throws SkyFunctionException, InterruptedException {
-    ImmutableMap<Action, ConflictException> badActions = PrecomputedValue.BAD_ACTIONS.get(env);
+    ImmutableMap<ActionAnalysisMetadata, ConflictException> badActions =
+        PrecomputedValue.BAD_ACTIONS.get(env);
     ConfiguredTargetValue ctValue = (ConfiguredTargetValue)
         env.getValue(ConfiguredTargetValue.key((ConfiguredTargetKey) skyKey.argument()));
     if (env.valuesMissing()) {
       return null;
     }
 
-    for (Action action : ctValue.getActions()) {
+    for (ActionAnalysisMetadata action : ctValue.getActions()) {
       if (badActions.containsKey(action)) {
         throw new ActionConflictFunctionException(badActions.get(action));
       }
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 0746b62..8d20b9e 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
@@ -18,7 +18,7 @@
 import com.google.common.base.Suppliers;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
 import com.google.devtools.build.lib.analysis.WorkspaceStatusAction;
@@ -89,7 +89,7 @@
   static final Precomputed<WorkspaceStatusAction> WORKSPACE_STATUS_KEY =
       new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "workspace_status_action"));
 
-  static final Precomputed<ImmutableList<Action>> COVERAGE_REPORT_KEY =
+  static final Precomputed<ImmutableList<ActionAnalysisMetadata>> COVERAGE_REPORT_KEY =
       new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "coverage_report_actions"));
 
   static final Precomputed<TopLevelArtifactContext> TOP_LEVEL_CONTEXT =
@@ -101,7 +101,7 @@
   public static final Precomputed<BlazeDirectories> BLAZE_DIRECTORIES =
       new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "blaze_directories"));
 
-  static final Precomputed<ImmutableMap<Action, ConflictException>> BAD_ACTIONS =
+  static final Precomputed<ImmutableMap<ActionAnalysisMetadata, ConflictException>> BAD_ACTIONS =
       new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "bad_actions"));
 
   public static final Precomputed<PathPackageLocator> PATH_PACKAGE_LOCATOR =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java
index 520cc0f..3e0f2a5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java
@@ -21,6 +21,7 @@
 import com.google.common.eventbus.EventBus;
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.ActionCacheChecker;
 import com.google.devtools.build.lib.actions.ActionCacheChecker.Token;
 import com.google.devtools.build.lib.actions.ActionCompletionEvent;
@@ -126,7 +127,7 @@
   // Errors found when examining all actions in the graph are stored here, so that they can be
   // thrown when execution of the action is requested. This field is set during each call to
   // findAndStoreArtifactConflicts, and is preserved across builds otherwise.
-  private ImmutableMap<Action, ConflictException> badActionMap = ImmutableMap.of();
+  private ImmutableMap<ActionAnalysisMetadata, ConflictException> badActionMap = ImmutableMap.of();
   private boolean keepGoing;
   private boolean hadExecutionError;
   private ActionInputFileCache perBuildFileCache;
@@ -179,7 +180,7 @@
    * Return the map of mostly recently executed bad actions to their corresponding exception.
    * See {#findAndStoreArtifactConflicts()}.
    */
-  public ImmutableMap<Action, ConflictException> badActions() {
+  public ImmutableMap<ActionAnalysisMetadata, ConflictException> badActions() {
     // TODO(bazel-team): Move badActions() and findAndStoreArtifactConflicts() to SkyframeBuildView
     // now that it's done in the analysis phase.
     return badActionMap;
@@ -215,15 +216,16 @@
    */
   void findAndStoreArtifactConflicts(Iterable<ActionLookupValue> actionLookupValues)
       throws InterruptedException {
-    ConcurrentMap<Action, ConflictException> temporaryBadActionMap = new ConcurrentHashMap<>();
+    ConcurrentMap<ActionAnalysisMetadata, ConflictException> temporaryBadActionMap =
+        new ConcurrentHashMap<>();
     Pair<ActionGraph, SortedMap<PathFragment, Artifact>> result;
     result = constructActionGraphAndPathMap(actionLookupValues, temporaryBadActionMap);
     ActionGraph actionGraph = result.first;
     SortedMap<PathFragment, Artifact> artifactPathMap = result.second;
 
-    Map<Action, ArtifactPrefixConflictException> actionsWithArtifactPrefixConflict =
+    Map<ActionAnalysisMetadata, ArtifactPrefixConflictException> actionsWithArtifactPrefixConflict =
         Actions.findArtifactPrefixConflicts(actionGraph, artifactPathMap);
-    for (Map.Entry<Action, ArtifactPrefixConflictException> actionExceptionPair :
+    for (Map.Entry<ActionAnalysisMetadata, ArtifactPrefixConflictException> actionExceptionPair :
         actionsWithArtifactPrefixConflict.entrySet()) {
       temporaryBadActionMap.put(
           actionExceptionPair.getKey(), new ConflictException(actionExceptionPair.getValue()));
@@ -240,7 +242,8 @@
   private static Pair<ActionGraph, SortedMap<PathFragment, Artifact>>
       constructActionGraphAndPathMap(
           Iterable<ActionLookupValue> values,
-          ConcurrentMap<Action, ConflictException> badActionMap) throws InterruptedException {
+          ConcurrentMap<ActionAnalysisMetadata, ConflictException> badActionMap)
+      throws InterruptedException {
     MutableActionGraph actionGraph = new MapBasedActionGraph();
     ConcurrentNavigableMap<PathFragment, Artifact> artifactPathMap = new ConcurrentSkipListMap<>();
     // Action graph construction is CPU-bound.
@@ -274,14 +277,15 @@
       final List<ActionLookupValue> values,
       final MutableActionGraph actionGraph,
       final ConcurrentMap<PathFragment, Artifact> artifactPathMap,
-      final ConcurrentMap<Action, ConflictException> badActionMap) {
+      final ConcurrentMap<ActionAnalysisMetadata, ConflictException> badActionMap) {
     return new Runnable() {
       @Override
       public void run() {
         for (ActionLookupValue value : values) {
-          Set<Action> registeredActions = new HashSet<>();
-          for (Map.Entry<Artifact, Action> entry : value.getMapForConsistencyCheck().entrySet()) {
-            Action action = entry.getValue();
+          Set<ActionAnalysisMetadata> registeredActions = new HashSet<>();
+          for (Map.Entry<Artifact, ActionAnalysisMetadata> entry :
+              value.getMapForConsistencyCheck().entrySet()) {
+            ActionAnalysisMetadata action = entry.getValue();
             // We have an entry for each <action, artifact> pair. Only try to register each action
             // once.
             if (registeredActions.add(action)) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
index fc00b57..140dfbc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
@@ -24,7 +24,7 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.common.eventbus.EventBus;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.ArtifactFactory;
 import com.google.devtools.build.lib.actions.ArtifactOwner;
 import com.google.devtools.build.lib.actions.ArtifactPrefixConflictException;
@@ -213,7 +213,8 @@
     } finally {
       enableAnalysis(false);
     }
-    ImmutableMap<Action, ConflictException> badActions = skyframeExecutor.findArtifactConflicts();
+    ImmutableMap<ActionAnalysisMetadata, ConflictException> badActions =
+        skyframeExecutor.findArtifactConflicts();
 
     Collection<AspectValue> goodAspects = Lists.newArrayListWithCapacity(values.size());
     NestedSetBuilder<Package> packages = NestedSetBuilder.stableOrder();
@@ -256,7 +257,7 @@
     // TODO(bazel-team): We might want to report the other errors through the event bus but
     // for keeping this code in parity with legacy we just report the first error for now.
     if (!keepGoing) {
-      for (Map.Entry<Action, ConflictException> bad : badActions.entrySet()) {
+      for (Map.Entry<ActionAnalysisMetadata, ConflictException> bad : badActions.entrySet()) {
         ConflictException ex = bad.getValue();
         try {
           ex.rethrowTyped();
@@ -339,7 +340,7 @@
     }
 
     Collection<Exception> reportedExceptions = Sets.newHashSet();
-    for (Map.Entry<Action, ConflictException> bad : badActions.entrySet()) {
+    for (Map.Entry<ActionAnalysisMetadata, ConflictException> bad : badActions.entrySet()) {
       ConflictException ex = bad.getValue();
       try {
         ex.rethrowTyped();
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 25bfc92..beea6b5 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
@@ -33,7 +33,7 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Range;
 import com.google.common.eventbus.EventBus;
-import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.ActionCacheChecker;
 import com.google.devtools.build.lib.actions.ActionExecutionContextFactory;
 import com.google.devtools.build.lib.actions.ActionExecutionStatusReporter;
@@ -634,7 +634,7 @@
             artifactFactory.get(), WorkspaceStatusValue.ARTIFACT_OWNER, buildId));
   }
 
-  public void injectCoverageReportData(ImmutableList<Action> actions) {
+  public void injectCoverageReportData(ImmutableList<ActionAnalysisMetadata> actions) {
     PrecomputedValue.COVERAGE_REPORT_KEY.set(injectable(), actions);
   }
 
@@ -1037,8 +1037,8 @@
    * {@link SkyframeActionExecutor#findAndStoreArtifactConflicts} to do the work, since any
    * conflicts found will only be reported during execution.
    */
-  ImmutableMap<Action, SkyframeActionExecutor.ConflictException> findArtifactConflicts()
-      throws InterruptedException {
+  ImmutableMap<ActionAnalysisMetadata, SkyframeActionExecutor.ConflictException>
+      findArtifactConflicts() throws InterruptedException {
     if (skyframeBuildView.isSomeConfiguredTargetEvaluated()
         || skyframeBuildView.isSomeConfiguredTargetInvalidated()) {
       // This operation is somewhat expensive, so we only do it if the graph might have changed in
@@ -1384,7 +1384,7 @@
    */
   public EvaluationResult<PostConfiguredTargetValue> postConfigureTargets(
       EventHandler eventHandler, List<ConfiguredTargetKey> values, boolean keepGoing,
-      ImmutableMap<Action, SkyframeActionExecutor.ConflictException> badActions)
+      ImmutableMap<ActionAnalysisMetadata, SkyframeActionExecutor.ConflictException> badActions)
           throws InterruptedException {
     checkActive();
     PrecomputedValue.BAD_ACTIONS.set(injectable(), badActions);
@@ -1464,7 +1464,7 @@
   /**
    * Returns the generating action of a given artifact ({@code null} if it's a source artifact).
    */
-  private Action getGeneratingAction(EventHandler eventHandler, Artifact artifact)
+  private ActionAnalysisMetadata getGeneratingAction(EventHandler eventHandler, Artifact artifact)
       throws InterruptedException {
     if (artifact.isSourceArtifact()) {
       return null;
@@ -1498,11 +1498,11 @@
   public ActionGraph getActionGraph(final EventHandler eventHandler) {
     return new ActionGraph() {
       @Override
-      public Action getGeneratingAction(final Artifact artifact) {
+      public ActionAnalysisMetadata getGeneratingAction(final Artifact artifact) {
         try {
-          return callUninterruptibly(new Callable<Action>() {
+          return callUninterruptibly(new Callable<ActionAnalysisMetadata>() {
             @Override
-            public Action call() throws InterruptedException {
+            public ActionAnalysisMetadata call() throws InterruptedException {
               return SkyframeExecutor.this.getGeneratingAction(eventHandler, artifact);
             }
           });
