diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index cecc9b0..1cef34f 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -1170,6 +1170,7 @@
         "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
         "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/exec/local",
         "//src/main/java/com/google/devtools/build/lib/query2",
         "//src/main/java/com/google/devtools/build/lib/query2:query-engine",
         "//src/main/java/com/google/devtools/build/lib/query2:query-output",
diff --git a/src/main/java/com/google/devtools/build/lib/exec/ActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/exec/ActionContextProvider.java
index 2362fcc..bcf7287 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/ActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/ActionContextProvider.java
@@ -31,7 +31,7 @@
    * <p>These may or may not actually end up in the executor depending on the command line options
    * and other factors influencing how the executor is set up.
    */
-  public abstract Iterable<ActionContext> getActionContexts();
+  public abstract Iterable<? extends ActionContext> getActionContexts();
 
   /**
    * Two-phase initialization. The input file cache and the input prefetcher usually come from a
diff --git a/src/main/java/com/google/devtools/build/lib/exec/FilesetActionContextImpl.java b/src/main/java/com/google/devtools/build/lib/exec/FilesetActionContextImpl.java
index 0be6549..a234e8f 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/FilesetActionContextImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/FilesetActionContextImpl.java
@@ -57,8 +57,8 @@
     }
 
     @Override
-    public Iterable<ActionContext> getActionContexts() {
-      return ImmutableList.<ActionContext>of(impl);
+    public Iterable<? extends ActionContext> getActionContexts() {
+      return ImmutableList.of(impl);
     }
 
     @Override
diff --git a/src/main/java/com/google/devtools/build/lib/exec/SimpleActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/exec/SimpleActionContextProvider.java
index a0f8aae..a459ba5 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/SimpleActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/SimpleActionContextProvider.java
@@ -28,7 +28,7 @@
   }
 
   @Override
-  public Iterable<ActionContext> getActionContexts() {
+  public Iterable<? extends ActionContext> getActionContexts() {
     return actionContexts;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/exec/SpawnInputExpander.java b/src/main/java/com/google/devtools/build/lib/exec/SpawnInputExpander.java
index ef538a0..dc0fde0 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/SpawnInputExpander.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/SpawnInputExpander.java
@@ -198,7 +198,10 @@
       FilesetActionContext filesetContext)
           throws IOException {
     return getInputMapping(
-        spawn, artifactExpander, actionInputFileCache, filesetContext.getWorkspaceName());
+        spawn,
+        artifactExpander,
+        actionInputFileCache,
+        filesetContext == null ? null : filesetContext.getWorkspaceName());
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/exec/StandaloneTestStrategy.java b/src/main/java/com/google/devtools/build/lib/exec/StandaloneTestStrategy.java
index 51aeabd..cbbabe4 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/StandaloneTestStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/StandaloneTestStrategy.java
@@ -46,7 +46,6 @@
 import com.google.devtools.build.lib.view.test.TestStatus.TestCase;
 import com.google.devtools.build.lib.view.test.TestStatus.TestResultData;
 import com.google.devtools.build.lib.view.test.TestStatus.TestResultData.Builder;
-import com.google.devtools.common.options.OptionsClassProvider;
 import java.io.Closeable;
 import java.io.IOException;
 import java.util.HashMap;
@@ -80,10 +79,8 @@
   protected final Path tmpDirRoot;
 
   public StandaloneTestStrategy(
-      OptionsClassProvider requestOptions,
-      BinTools binTools,
-      Path tmpDirRoot) {
-    super(requestOptions, binTools);
+      ExecutionOptions executionOptions, BinTools binTools, Path tmpDirRoot) {
+    super(executionOptions, binTools);
     this.tmpDirRoot = tmpDirRoot;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/exec/TestStrategy.java b/src/main/java/com/google/devtools/build/lib/exec/TestStrategy.java
index 3e860a9..8b0450a 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/TestStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/TestStrategy.java
@@ -44,7 +44,6 @@
 import com.google.devtools.build.lib.view.test.TestStatus.TestCase;
 import com.google.devtools.common.options.Converters.RangeConverter;
 import com.google.devtools.common.options.EnumConverter;
-import com.google.devtools.common.options.OptionsClassProvider;
 import com.google.devtools.common.options.OptionsParsingException;
 import java.io.Closeable;
 import java.io.IOException;
@@ -137,8 +136,8 @@
   protected final ExecutionOptions executionOptions;
   protected final BinTools binTools;
 
-  public TestStrategy(OptionsClassProvider requestOptionsProvider, BinTools binTools) {
-    this.executionOptions = requestOptionsProvider.getOptions(ExecutionOptions.class);
+  public TestStrategy(ExecutionOptions executionOptions, BinTools binTools) {
+    this.executionOptions = executionOptions;
     this.binTools = binTools;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/exec/local/BUILD b/src/main/java/com/google/devtools/build/lib/exec/local/BUILD
index 79e5dbf..74f4f7b 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/local/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/exec/local/BUILD
@@ -14,7 +14,6 @@
         "//src/main/java/com/google/devtools/build/lib:io",
         "//src/main/java/com/google/devtools/build/lib:packages-internal",
         "//src/main/java/com/google/devtools/build/lib:process_util",
-        "//src/main/java/com/google/devtools/build/lib:runtime",
         "//src/main/java/com/google/devtools/build/lib:shell",
         "//src/main/java/com/google/devtools/build/lib:util",
         "//src/main/java/com/google/devtools/build/lib:vfs",
diff --git a/src/main/java/com/google/devtools/build/lib/exec/local/LocalSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/exec/local/LocalSpawnRunner.java
index acbb578..5cd191b 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/local/LocalSpawnRunner.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/local/LocalSpawnRunner.java
@@ -36,6 +36,8 @@
 import com.google.devtools.build.lib.shell.CommandException;
 import com.google.devtools.build.lib.shell.CommandResult;
 import com.google.devtools.build.lib.util.NetUtil;
+import com.google.devtools.build.lib.util.OS;
+import com.google.devtools.build.lib.util.OsUtils;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.lib.util.io.FileOutErr;
 import com.google.devtools.build.lib.vfs.Path;
@@ -87,13 +89,17 @@
       LocalExecutionOptions localExecutionOptions,
       ResourceManager resourceManager,
       boolean useProcessWrapper,
+      OS localOs,
       String productName,
       LocalEnvProvider localEnvProvider) {
     this.logger = logger;
     this.execRoot = execRoot;
     this.actionInputPrefetcher = Preconditions.checkNotNull(actionInputPrefetcher);
-    this.processWrapper = execRoot.getRelative("_bin/process-wrapper").getPathString();
-    this.localExecutionOptions = localExecutionOptions;
+    this.processWrapper =
+        execRoot
+            .getRelative("_bin/process-wrapper" + OsUtils.executableExtension(localOs))
+            .getPathString();
+    this.localExecutionOptions = Preconditions.checkNotNull(localExecutionOptions);
     this.hostName = NetUtil.findShortHostName();
     this.execCount = execCount;
     this.resourceManager = resourceManager;
@@ -102,6 +108,26 @@
     this.localEnvProvider = localEnvProvider;
   }
 
+  public LocalSpawnRunner(
+      Path execRoot,
+      ActionInputPrefetcher actionInputPrefetcher,
+      LocalExecutionOptions localExecutionOptions,
+      ResourceManager resourceManager,
+      String productName,
+      LocalEnvProvider localEnvProvider) {
+    this(
+        Logger.getLogger(LocalSpawnRunner.class.getName()),
+        new AtomicInteger(),
+        execRoot,
+        actionInputPrefetcher,
+        localExecutionOptions,
+        resourceManager,
+        /*useProcessWrapper=*/OS.getCurrent() != OS.WINDOWS,
+        OS.getCurrent(),
+        productName,
+        localEnvProvider);
+  }
+
   @Override
   public SpawnResult exec(
       Spawn spawn,
diff --git a/src/main/java/com/google/devtools/build/lib/remote/BUILD b/src/main/java/com/google/devtools/build/lib/remote/BUILD
index cbe44c0..3a5404e 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/remote/BUILD
@@ -22,6 +22,7 @@
         "//src/main/java/com/google/devtools/build/lib:util",
         "//src/main/java/com/google/devtools/build/lib:vfs",
         "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/exec/local",
         "//src/main/java/com/google/devtools/build/lib/standalone",
         "//src/main/java/com/google/devtools/common/options",
         "//third_party:apache_httpclient",
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java
index f859306..7966f9e 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java
@@ -14,39 +14,56 @@
 
 package com.google.devtools.build.lib.remote;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableList.Builder;
+import com.google.devtools.build.lib.actions.ActionInputFileCache;
 import com.google.devtools.build.lib.actions.Executor.ActionContext;
+import com.google.devtools.build.lib.actions.ResourceManager;
+import com.google.devtools.build.lib.actions.SpawnActionContext;
 import com.google.devtools.build.lib.authandtls.AuthAndTLSOptions;
-import com.google.devtools.build.lib.buildtool.BuildRequest;
 import com.google.devtools.build.lib.exec.ActionContextProvider;
+import com.google.devtools.build.lib.exec.ActionInputPrefetcher;
 import com.google.devtools.build.lib.exec.ExecutionOptions;
+import com.google.devtools.build.lib.exec.local.LocalExecutionOptions;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
+import com.google.devtools.build.lib.standalone.StandaloneSpawnStrategy;
 
 /**
  * Provide a remote execution context.
  */
 final class RemoteActionContextProvider extends ActionContextProvider {
-  private final ImmutableList<ActionContext> strategies;
+  private final CommandEnvironment env;
+  private ActionInputPrefetcher actionInputPrefetcher;
 
-  RemoteActionContextProvider(
-      CommandEnvironment env,
-      BuildRequest buildRequest) {
-    boolean verboseFailures = buildRequest.getOptions(ExecutionOptions.class).verboseFailures;
-    Builder<ActionContext> strategiesBuilder = ImmutableList.builder();
-    strategiesBuilder.add(
-        new RemoteSpawnStrategy(
-            env.getClientEnv(),
-            env.getExecRoot(),
-            buildRequest.getOptions(RemoteOptions.class),
-            buildRequest.getOptions(AuthAndTLSOptions.class),
-            verboseFailures,
-            env.getRuntime().getProductName()));
-    this.strategies = strategiesBuilder.build();
+  RemoteActionContextProvider(CommandEnvironment env) {
+    this.env = env;
   }
 
   @Override
-  public Iterable<ActionContext> getActionContexts() {
-    return strategies;
+  public void init(
+      ActionInputFileCache actionInputFileCache, ActionInputPrefetcher actionInputPrefetcher) {
+    this.actionInputPrefetcher = Preconditions.checkNotNull(actionInputPrefetcher);
+  }
+
+  @Override
+  public Iterable<? extends ActionContext> getActionContexts() {
+    ExecutionOptions executionOptions = env.getOptions().getOptions(ExecutionOptions.class);
+    LocalExecutionOptions localExecutionOptions =
+        env.getOptions().getOptions(LocalExecutionOptions.class);
+    SpawnActionContext fallbackStrategy =
+        new StandaloneSpawnStrategy(
+            env.getExecRoot(),
+            actionInputPrefetcher,
+            localExecutionOptions,
+            executionOptions.verboseFailures,
+            env.getRuntime().getProductName(),
+            ResourceManager.instance());
+    return ImmutableList.of(
+        new RemoteSpawnStrategy(
+            env.getExecRoot(),
+            env.getOptions().getOptions(RemoteOptions.class),
+            env.getOptions().getOptions(AuthAndTLSOptions.class),
+            executionOptions.verboseFailures,
+            fallbackStrategy));
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
index 0bd677f..6e5f790 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
@@ -103,7 +103,7 @@
 
   @Override
   public void executorInit(CommandEnvironment env, BuildRequest request, ExecutorBuilder builder) {
-    builder.addActionContextProvider(new RemoteActionContextProvider(env, request));
+    builder.addActionContextProvider(new RemoteActionContextProvider(env));
   }
 
   @Subscribe
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 98af305..70623b1 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
@@ -34,7 +34,6 @@
 import com.google.devtools.build.lib.remote.Digests.ActionKey;
 import com.google.devtools.build.lib.remote.TreeNodeRepository.TreeNode;
 import com.google.devtools.build.lib.rules.fileset.FilesetActionContext;
-import com.google.devtools.build.lib.standalone.StandaloneSpawnStrategy;
 import com.google.devtools.build.lib.util.CommandFailureUtils;
 import com.google.devtools.build.lib.util.io.FileOutErr;
 import com.google.devtools.build.lib.vfs.Path;
@@ -54,7 +53,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeSet;
 
@@ -68,7 +66,7 @@
 )
 final class RemoteSpawnStrategy implements SpawnActionContext {
   private final Path execRoot;
-  private final StandaloneSpawnStrategy standaloneStrategy;
+  private final SpawnActionContext fallbackStrategy;
   private final boolean verboseFailures;
   private final RemoteOptions remoteOptions;
   // TODO(olaola): This will be set on a per-action basis instead.
@@ -77,14 +75,13 @@
   private final SpawnInputExpander spawnInputExpander = new SpawnInputExpander(/*strict=*/ false);
 
   RemoteSpawnStrategy(
-      Map<String, String> clientEnv,
       Path execRoot,
       RemoteOptions remoteOptions,
       AuthAndTLSOptions authTlsOptions,
       boolean verboseFailures,
-      String productName) {
+      SpawnActionContext fallbackStrategy) {
     this.execRoot = execRoot;
-    this.standaloneStrategy = new StandaloneSpawnStrategy(execRoot, verboseFailures, productName);
+    this.fallbackStrategy = fallbackStrategy;
     this.verboseFailures = verboseFailures;
     this.remoteOptions = remoteOptions;
     channelOptions = ChannelOptions.create(authTlsOptions);
@@ -144,7 +141,7 @@
       RemoteActionCache remoteCache,
       ActionKey actionKey)
       throws ExecException, InterruptedException {
-    standaloneStrategy.exec(spawn, actionExecutionContext);
+    fallbackStrategy.exec(spawn, actionExecutionContext);
     if (remoteOptions.remoteUploadLocalResults && remoteCache != null && actionKey != null) {
       ArrayList<Path> outputFiles = new ArrayList<>();
       for (ActionInput output : spawn.getOutputFiles()) {
@@ -253,7 +250,7 @@
       }
     }
     if (!spawn.isRemotable() || remoteCache == null) {
-      standaloneStrategy.exec(spawn, actionExecutionContext);
+      fallbackStrategy.exec(spawn, actionExecutionContext);
       return;
     }
     if (executor.reportsSubcommands()) {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/BuildCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/BuildCommand.java
index cf487bb..13f3f21 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/BuildCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/BuildCommand.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.buildtool.BuildRequest.BuildRequestOptions;
 import com.google.devtools.build.lib.buildtool.BuildTool;
 import com.google.devtools.build.lib.exec.ExecutionOptions;
+import com.google.devtools.build.lib.exec.local.LocalExecutionOptions;
 import com.google.devtools.build.lib.pkgcache.LoadingOptions;
 import com.google.devtools.build.lib.pkgcache.PackageCacheOptions;
 import com.google.devtools.build.lib.runtime.BlazeCommand;
@@ -38,6 +39,7 @@
          builds = true,
          options = { BuildRequestOptions.class,
                      ExecutionOptions.class,
+                     LocalExecutionOptions.class,
                      PackageCacheOptions.class,
                      SkylarkSemanticsOptions.class,
                      BuildView.Options.class,
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java
index 74084c3..1c37cd3 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java
@@ -28,8 +28,6 @@
  * Provides the sandboxed spawn strategy.
  */
 final class SandboxActionContextProvider extends ActionContextProvider {
-
-  @SuppressWarnings("unchecked")
   private final ImmutableList<ActionContext> contexts;
 
   private SandboxActionContextProvider(ImmutableList<ActionContext> contexts) {
@@ -72,7 +70,7 @@
   }
 
   @Override
-  public Iterable<ActionContext> getActionContexts() {
+  public Iterable<? extends ActionContext> getActionContexts() {
     return contexts;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java
index 12e508d..c1dbbac 100644
--- a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java
@@ -13,20 +13,23 @@
 // limitations under the License.
 package com.google.devtools.build.lib.standalone;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableList.Builder;
 import com.google.devtools.build.lib.actions.Action;
 import com.google.devtools.build.lib.actions.ActionExecutionContext;
+import com.google.devtools.build.lib.actions.ActionInputFileCache;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactResolver;
 import com.google.devtools.build.lib.actions.ExecutionStrategy;
 import com.google.devtools.build.lib.actions.Executor.ActionContext;
-import com.google.devtools.build.lib.buildtool.BuildRequest;
+import com.google.devtools.build.lib.actions.ResourceManager;
 import com.google.devtools.build.lib.exec.ActionContextProvider;
+import com.google.devtools.build.lib.exec.ActionInputPrefetcher;
 import com.google.devtools.build.lib.exec.ExecutionOptions;
 import com.google.devtools.build.lib.exec.FileWriteStrategy;
 import com.google.devtools.build.lib.exec.StandaloneTestStrategy;
 import com.google.devtools.build.lib.exec.TestStrategy;
+import com.google.devtools.build.lib.exec.local.LocalExecutionOptions;
 import com.google.devtools.build.lib.rules.cpp.IncludeScanningContext;
 import com.google.devtools.build.lib.rules.cpp.SpawnGccStrategy;
 import com.google.devtools.build.lib.rules.test.ExclusiveTestStrategy;
@@ -64,39 +67,46 @@
   }
 
   private final CommandEnvironment env;
-  private final ImmutableList<ActionContext> strategies;
+  private ActionInputPrefetcher actionInputPrefetcher;
 
-  public StandaloneActionContextProvider(CommandEnvironment env, BuildRequest buildRequest) {
+  public StandaloneActionContextProvider(CommandEnvironment env) {
     this.env = env;
-    ExecutionOptions options = buildRequest.getOptions(ExecutionOptions.class);
-    boolean verboseFailures = options.verboseFailures;
+  }
 
-    Path testTmpRoot = TestStrategy.getTmpRoot(env.getWorkspace(), env.getExecRoot(), options);
+  @Override
+  public void init(
+      ActionInputFileCache actionInputFileCache, ActionInputPrefetcher actionInputPrefetcher) {
+    this.actionInputPrefetcher = Preconditions.checkNotNull(actionInputPrefetcher);
+  }
+
+  @Override
+  public Iterable<? extends ActionContext> getActionContexts() {
+    ExecutionOptions executionOptions = env.getOptions().getOptions(ExecutionOptions.class);
+    LocalExecutionOptions localExecutionOptions =
+        env.getOptions().getOptions(LocalExecutionOptions.class);
+    Path testTmpRoot =
+        TestStrategy.getTmpRoot(env.getWorkspace(), env.getExecRoot(), executionOptions);
+
     TestActionContext testStrategy =
         new StandaloneTestStrategy(
-            buildRequest, env.getBlazeWorkspace().getBinTools(), testTmpRoot);
-
-    Builder<ActionContext> strategiesBuilder = ImmutableList.builder();
-
+            executionOptions,
+            env.getBlazeWorkspace().getBinTools(),
+            testTmpRoot);
     // Order of strategies passed to builder is significant - when there are many strategies that
     // could potentially be used and a spawnActionContext doesn't specify which one it wants, the
     // last one from strategies list will be used
-    strategiesBuilder.add(
+    return ImmutableList.of(
         new StandaloneSpawnStrategy(
             env.getExecRoot(),
-            verboseFailures,
-            env.getRuntime().getProductName()),
+            actionInputPrefetcher,
+            localExecutionOptions,
+            executionOptions.verboseFailures,
+            env.getRuntime().getProductName(),
+            ResourceManager.instance()),
         new DummyIncludeScanningContext(),
         new SpawnGccStrategy(),
         testStrategy,
         new ExclusiveTestStrategy(testStrategy),
         new FileWriteStrategy());
-
-    this.strategies = strategiesBuilder.build();
-  }
-
-  @Override
-  public Iterable<ActionContext> getActionContexts() {
-    return strategies;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneModule.java b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneModule.java
index b60f47a..6f299fa 100644
--- a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneModule.java
+++ b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneModule.java
@@ -24,7 +24,7 @@
 public class StandaloneModule extends BlazeModule {
   @Override
   public void executorInit(CommandEnvironment env, BuildRequest request, ExecutorBuilder builder) {
-    builder.addActionContextProvider(new StandaloneActionContextProvider(env, request));
+    builder.addActionContextProvider(new StandaloneActionContextProvider(env));
     builder.addActionContextConsumer(new StandaloneActionContextConsumer());
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java
index 724542f..de47fe4 100644
--- a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java
@@ -15,32 +15,36 @@
 
 import com.google.common.eventbus.EventBus;
 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.ActionStatusMessage;
 import com.google.devtools.build.lib.actions.ExecException;
 import com.google.devtools.build.lib.actions.ExecutionStrategy;
 import com.google.devtools.build.lib.actions.Executor;
 import com.google.devtools.build.lib.actions.ResourceManager;
-import com.google.devtools.build.lib.actions.ResourceManager.ResourceHandle;
 import com.google.devtools.build.lib.actions.Spawn;
 import com.google.devtools.build.lib.actions.SpawnActionContext;
 import com.google.devtools.build.lib.actions.Spawns;
 import com.google.devtools.build.lib.actions.UserExecException;
+import com.google.devtools.build.lib.exec.ActionInputPrefetcher;
+import com.google.devtools.build.lib.exec.SpawnExecException;
+import com.google.devtools.build.lib.exec.SpawnInputExpander;
+import com.google.devtools.build.lib.exec.SpawnResult;
+import com.google.devtools.build.lib.exec.SpawnResult.Status;
+import com.google.devtools.build.lib.exec.SpawnRunner.ProgressStatus;
+import com.google.devtools.build.lib.exec.SpawnRunner.SpawnExecutionPolicy;
 import com.google.devtools.build.lib.exec.apple.XCodeLocalEnvProvider;
 import com.google.devtools.build.lib.exec.local.LocalEnvProvider;
-import com.google.devtools.build.lib.shell.AbnormalTerminationException;
-import com.google.devtools.build.lib.shell.Command;
-import com.google.devtools.build.lib.shell.CommandException;
-import com.google.devtools.build.lib.shell.TerminationStatus;
+import com.google.devtools.build.lib.exec.local.LocalExecutionOptions;
+import com.google.devtools.build.lib.exec.local.LocalSpawnRunner;
+import com.google.devtools.build.lib.rules.fileset.FilesetActionContext;
 import com.google.devtools.build.lib.util.CommandFailureUtils;
 import com.google.devtools.build.lib.util.OS;
-import com.google.devtools.build.lib.util.OsUtils;
 import com.google.devtools.build.lib.util.io.FileOutErr;
 import com.google.devtools.build.lib.vfs.Path;
-import java.io.File;
+import com.google.devtools.build.lib.vfs.PathFragment;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.SortedMap;
 
 /**
  * Strategy that uses subprocessing to execute a process.
@@ -48,112 +52,97 @@
 @ExecutionStrategy(name = { "standalone", "local" }, contextType = SpawnActionContext.class)
 public class StandaloneSpawnStrategy implements SpawnActionContext {
   private final boolean verboseFailures;
-  private final Path processWrapper;
-  private final Path execRoot;
-  private final String productName;
-  private final ResourceManager resourceManager;
-  private final LocalEnvProvider localEnvProvider;
-
-  public StandaloneSpawnStrategy(Path execRoot, boolean verboseFailures, String productName) {
-    this(execRoot, verboseFailures, productName, ResourceManager.instance());
-  }
+  private final LocalSpawnRunner localSpawnRunner;
 
   public StandaloneSpawnStrategy(
-      Path execRoot, boolean verboseFailures, String productName, ResourceManager resourceManager) {
+      Path execRoot, ActionInputPrefetcher actionInputPrefetcher,
+      LocalExecutionOptions localExecutionOptions, boolean verboseFailures, String productName,
+      ResourceManager resourceManager) {
     this.verboseFailures = verboseFailures;
-    this.execRoot = execRoot;
-    this.processWrapper = execRoot.getRelative(
-        "_bin/process-wrapper" + OsUtils.executableExtension());
-    this.productName = productName;
-    this.resourceManager = resourceManager;
-    this.localEnvProvider = OS.getCurrent() == OS.DARWIN
+    LocalEnvProvider localEnvProvider = OS.getCurrent() == OS.DARWIN
         ? new XCodeLocalEnvProvider()
         : LocalEnvProvider.UNMODIFIED;
+    this.localSpawnRunner = new LocalSpawnRunner(
+        execRoot,
+        actionInputPrefetcher,
+        localExecutionOptions,
+        resourceManager,
+        productName,
+        localEnvProvider);
   }
 
   /**
    * Executes the given {@code spawn}.
    */
   @Override
-  public void exec(Spawn spawn,
-      ActionExecutionContext actionExecutionContext)
+  public void exec(final Spawn spawn, final ActionExecutionContext actionExecutionContext)
       throws ExecException, InterruptedException {
-    EventBus eventBus = actionExecutionContext.getExecutor().getEventBus();
-    ActionExecutionMetadata owner = spawn.getResourceOwner();
-    eventBus.post(ActionStatusMessage.schedulingStrategy(owner));
-    try (ResourceHandle handle =
-        resourceManager.acquireResources(owner, spawn.getLocalResources())) {
-      eventBus.post(ActionStatusMessage.runningStrategy(owner, "standalone"));
-      try {
-        actuallyExec(spawn, actionExecutionContext);
-      } catch (IOException e) {
-        throw new UserExecException("I/O exception during local execution", e);
+    final int timeoutSeconds = Spawns.getTimeoutSeconds(spawn);
+    final EventBus eventBus = actionExecutionContext.getExecutor().getEventBus();
+    SpawnExecutionPolicy policy = new SpawnExecutionPolicy() {
+      @Override
+      public ActionInputFileCache getActionInputFileCache() {
+        return actionExecutionContext.getActionInputFileCache();
       }
-    }
-  }
 
-  /**
-   * Executes the given {@code spawn}.
-   */
-  private void actuallyExec(Spawn spawn,
-      ActionExecutionContext actionExecutionContext)
-      throws ExecException, IOException {
+      @Override
+      public void lockOutputFiles() throws InterruptedException {
+        // Do nothing for now.
+      }
+
+      @Override
+      public long getTimeoutMillis() {
+        return timeoutSeconds * 1000L;
+      }
+
+      @Override
+      public FileOutErr getFileOutErr() {
+        return actionExecutionContext.getFileOutErr();
+      }
+
+      @Override
+      public SortedMap<PathFragment, ActionInput> getInputMapping() throws IOException {
+        return new SpawnInputExpander(/*strict*/false)
+            .getInputMapping(
+                spawn,
+                actionExecutionContext.getArtifactExpander(),
+                actionExecutionContext.getActionInputFileCache(),
+                actionExecutionContext.getExecutor().getContext(FilesetActionContext.class));
+      }
+
+      @Override
+      public void report(ProgressStatus state) {
+        switch (state) {
+          case EXECUTING:
+            String strategyName = "local";
+            eventBus.post(
+                ActionStatusMessage.runningStrategy(spawn.getResourceOwner(), strategyName));
+            break;
+          case SCHEDULING:
+            eventBus.post(ActionStatusMessage.schedulingStrategy(spawn.getResourceOwner()));
+            break;
+          default:
+            break;
+        }
+      }
+    };
+
     Executor executor = actionExecutionContext.getExecutor();
-
     if (executor.reportsSubcommands()) {
       executor.reportSubcommand(spawn);
     }
 
-    int timeoutSeconds = Spawns.getTimeoutSeconds(spawn);
-
-    // We must wrap the subprocess with process-wrapper to kill the process tree.
-    // All actions therefore depend on the process-wrapper file. Since it's embedded,
-    // we don't bother with declaring it as an input.
-    List<String> args = new ArrayList<>();
-    if (OS.getCurrent() != OS.WINDOWS) {
-      // TODO(bazel-team): process-wrapper seems to work on Windows, but requires
-      // additional setup as it is an msys2 binary, so it needs msys2 DLLs on %PATH%.
-      // Disable it for now to make the setup easier and to avoid further PATH hacks.
-      // Ideally we should have a native implementation of process-wrapper for Windows.
-      args.add(processWrapper.getPathString());
-      args.add(Integer.toString(timeoutSeconds));
-      args.add("5"); /* kill delay: give some time to print stacktraces and whatnot. */
-
-      // TODO(bazel-team): use process-wrapper redirection so we don't have to
-      // pass test logs through the Java heap.
-      args.add("-"); /* stdout. */
-      args.add("-"); /* stderr. */
-    }
-    args.addAll(spawn.getArguments());
-
-    String cwd = executor.getExecRoot().getPathString();
-    Command cmd =
-        new Command(
-            args.toArray(new String[] {}),
-            localEnvProvider.rewriteLocalEnv(spawn.getEnvironment(), execRoot, productName),
-            new File(cwd),
-            OS.getCurrent() == OS.WINDOWS && timeoutSeconds >= 0 ? timeoutSeconds * 1000 : -1);
-
-    FileOutErr outErr = actionExecutionContext.getFileOutErr();
     try {
-      cmd.execute(
-          /* stdin */ new byte[] {},
-          Command.NO_OBSERVER,
-          outErr.getOutputStream(),
-          outErr.getErrorStream(),
-          /*killSubprocessOnInterrupt*/ true);
-    } catch (AbnormalTerminationException e) {
-      TerminationStatus status = e.getResult().getTerminationStatus();
-      boolean timedOut = !status.exited() && (
-          status.timedout() || status.getTerminatingSignal() == 14 /* SIGALRM */);
-      String message =
-          CommandFailureUtils.describeCommandFailure(
-              verboseFailures, spawn.getArguments(), spawn.getEnvironment(), cwd);
-      throw new UserExecException(String.format("%s: %s", message, e), timedOut);
-    } catch (CommandException e) {
-      String message = CommandFailureUtils.describeCommandFailure(
-          verboseFailures, spawn.getArguments(), spawn.getEnvironment(), cwd);
-      throw new UserExecException(message, e);
+      SpawnResult result = localSpawnRunner.exec(spawn, policy);
+      if (result.status() != Status.SUCCESS || result.exitCode() != 0) {
+        String message =
+            CommandFailureUtils.describeCommandFailure(
+                verboseFailures, spawn.getArguments(), spawn.getEnvironment(), null);
+        throw new SpawnExecException(
+            message, result, /*forciblyRunRemotely=*/false, /*catastrophe=*/false);
+      }
+    } catch (IOException e) {
+      throw new UserExecException("I/O exception during local execution", e);
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/util/OsUtils.java b/src/main/java/com/google/devtools/build/lib/util/OsUtils.java
index a25e64b..d3d0f4e 100644
--- a/src/main/java/com/google/devtools/build/lib/util/OsUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/util/OsUtils.java
@@ -19,12 +19,16 @@
  */
 public final class OsUtils {
 
-  private static final String EXECUTABLE_EXTENSION = OS.getCurrent() == OS.WINDOWS ? ".exe" : "";
+  private static final String EXECUTABLE_EXTENSION = executableExtension(OS.getCurrent());
 
   // Utility class.
   private OsUtils() {
   }
 
+  public static String executableExtension(OS os) {
+    return os == OS.WINDOWS ? ".exe" : "";
+  }
+
   /**
    * Returns the extension used for executables on the current platform (.exe
    * for Windows, empty string for others).
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java
index f480117..609ebf7 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerActionContextProvider.java
@@ -45,7 +45,7 @@
   }
 
   @Override
-  public Iterable<ActionContext> getActionContexts() {
+  public Iterable<? extends ActionContext> getActionContexts() {
     return strategies;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerTestStrategy.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerTestStrategy.java
index 1ab0766..d384694 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerTestStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerTestStrategy.java
@@ -28,6 +28,7 @@
 import com.google.devtools.build.lib.actions.TestExecException;
 import com.google.devtools.build.lib.actions.UserExecException;
 import com.google.devtools.build.lib.events.Event;
+import com.google.devtools.build.lib.exec.ExecutionOptions;
 import com.google.devtools.build.lib.exec.StandaloneTestStrategy;
 import com.google.devtools.build.lib.rules.test.TestActionContext;
 import com.google.devtools.build.lib.rules.test.TestRunnerAction;
@@ -67,7 +68,7 @@
       WorkerPool workerPool,
       Multimap<String, String> extraFlags) {
     super(
-        requestOptions,
+        requestOptions.getOptions(ExecutionOptions.class),
         env.getBlazeWorkspace().getBinTools(),
         env.getWorkspace());
     this.workerPool = workerPool;
