diff --git a/src/main/java/com/google/devtools/build/lib/exec/ModuleActionContextRegistry.java b/src/main/java/com/google/devtools/build/lib/exec/ModuleActionContextRegistry.java
index c0ad57f..8e91d6d 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/ModuleActionContextRegistry.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/ModuleActionContextRegistry.java
@@ -87,10 +87,52 @@
   }
 
   /**
+   * Returns a new {@link Builder} suitable for creating instances of ModuleActionContextRegistry.
+   */
+  public static Builder builder() {
+    return new BuilderImpl();
+  }
+
+  /**
    * Builder collecting the contexts and restrictions thereon for a {@link
    * ModuleActionContextRegistry}.
    */
-  public static final class Builder {
+  // TODO(katre): This exists only to allow incremental migration from SpawnActionContextMaps.
+  // Delete ASAP.
+  public interface Builder {
+
+    /**
+     * Restricts the registry to only return implementations for the given type if they were
+     * {@linkplain #register registered} with the provided restriction as a command-line identifier.
+     *
+     * <p>Note that if no registered action context matches the requested command-line identifiers
+     * when it is {@linkplain #build() built} then the registry will return {@code null} when
+     * queried for this identifying type.
+     *
+     * <p>This behavior can be reset by passing an empty restriction to this method which will cause
+     * the default behavior (last implementation registered for the identifying type) to be used.
+     *
+     * @param restriction command-line identifier used during registration of the desired
+     *     implementation or {@code ""} to allow any implementation of the identifying type
+     */
+    ModuleActionContextRegistry.Builder restrictTo(Class<?> identifyingType, String restriction);
+
+    /**
+     * Registers an action context implementation identified by the given type and which can be
+     * {@linkplain #restrictTo restricted} by its provided command-line identifiers.
+     */
+    <T extends ActionContext> ModuleActionContextRegistry.Builder register(
+        Class<T> identifyingType, T context, String... commandLineIdentifiers);
+
+    /** Constructs the registry configured by this builder. */
+    ModuleActionContextRegistry build() throws ExecutorInitException;
+  }
+
+  /**
+   * Builder collecting the contexts and restrictions thereon for a {@link
+   * ModuleActionContextRegistry}.
+   */
+  private static final class BuilderImpl implements Builder {
 
     private final List<ActionContextInformation<?>> actionContexts = new ArrayList<>();
     private final Map<Class<?>, String> typeToRestriction = new HashMap<>();
@@ -109,6 +151,7 @@
      * @param restriction command-line identifier used during registration of the desired
      *     implementation or {@code ""} to allow any implementation of the identifying type
      */
+    @Override
     public Builder restrictTo(Class<?> identifyingType, String restriction) {
       typeToRestriction.put(identifyingType, restriction);
       return this;
@@ -118,6 +161,7 @@
      * Registers an action context implementation identified by the given type and which can be
      * {@linkplain #restrictTo restricted} by its provided command-line identifiers.
      */
+    @Override
     public <T extends ActionContext> Builder register(
         Class<T> identifyingType, T context, String... commandLineIdentifiers) {
       actionContexts.add(
@@ -127,6 +171,7 @@
     }
 
     /** Constructs the registry configured by this builder. */
+    @Override
     public ModuleActionContextRegistry build() throws ExecutorInitException {
       HashSet<Class<?>> usedTypes = new HashSet<>();
       MutableClassToInstanceMap<ActionContext> contextToInstance =
diff --git a/src/main/java/com/google/devtools/build/lib/exec/SpawnStrategyRegistry.java b/src/main/java/com/google/devtools/build/lib/exec/SpawnStrategyRegistry.java
index 4c2e75f..a87d2bd 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/SpawnStrategyRegistry.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/SpawnStrategyRegistry.java
@@ -18,6 +18,7 @@
 import com.google.auto.value.AutoValue;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableListMultimap;
 import com.google.common.collect.ImmutableMultimap;
@@ -217,6 +218,11 @@
         .collect(joining(", "));
   }
 
+  /** Returns a new {@link Builder} suitable for creating instances of SpawnStrategyRegistry. */
+  public static Builder builder() {
+    return new BuilderImpl();
+  }
+
   /**
    * Builder collecting the strategies and restrictions thereon for a {@link SpawnStrategyRegistry}.
    *
@@ -231,7 +237,126 @@
    * all registered strategies, in registration order (i.e. the earliest strategy registered will be
    * first in the list of strategies returned by {@link SpawnStrategyRegistry#getStrategies}).
    */
-  public static final class Builder {
+  // TODO(katre): This exists only to allow incremental migration from SpawnActionContextMaps.
+  // Delete ASAP.
+  public interface Builder {
+
+    /**
+     * Adds a filter limiting any spawn whose {@linkplain
+     * ActionExecutionMetadata#getProgressMessage() owner's progress message} matches the regular
+     * expression to only use strategies with the given command-line identifiers, in order.
+     *
+     * <p>If multiple filters match the same spawn (including an identical filter) the order of
+     * precedence of calls to this method is determined by {@link
+     * #useLegacyDescriptionFilterPrecedence()}.
+     */
+    SpawnStrategyRegistry.Builder addDescriptionFilter(
+        RegexFilter filter, List<String> identifiers);
+
+    /**
+     * Adds a filter limiting any spawn whose {@linkplain Spawn#getMnemonic() mnemonic}
+     * (case-sensitively) matches the given mnemonic to only use strategies with the given
+     * command-line identifiers, in order.
+     *
+     * <p>If the same mnemonic is registered multiple times the last such call will take precedence.
+     *
+     * <p>Note that if a spawn matches a {@linkplain #addDescriptionFilter registered description
+     * filter} that filter will take precedence over any mnemonic-based filters.
+     */
+    // last one wins
+    SpawnStrategyRegistry.Builder addMnemonicFilter(String mnemonic, List<String> identifiers);
+
+    default SpawnStrategyRegistry.Builder registerStrategy(
+        SpawnStrategy strategy, String... commandlineIdentifiers) {
+      return registerStrategy(strategy, ImmutableList.copyOf(commandlineIdentifiers));
+    }
+
+    /**
+     * Registers a strategy implementation with this collector, distinguishing it from other
+     * strategies with the given command-line identifiers (of which at least one is required).
+     *
+     * <p>If multiple strategies are registered with the same command-line identifier the last one
+     * so registered will take precedence.
+     */
+    SpawnStrategyRegistry.Builder registerStrategy(
+        SpawnStrategy strategy, List<String> commandlineIdentifiers);
+
+    /**
+     * Instructs this collector to use the legacy description filter precedence, i.e. to prefer the
+     * first regular expression filter that matches a spawn over any later registered filters.
+     *
+     * <p>The default behavior of this collector is to prefer the last registered description filter
+     * over any previously registered matching filters.
+     */
+    SpawnStrategyRegistry.Builder useLegacyDescriptionFilterPrecedence();
+
+    /**
+     * Explicitly sets the identifiers of default strategies to use if a spawn matches no filters.
+     *
+     * <p>Note that if this method is not called on the builder, all registered strategies are
+     * considered default strategies, in registration order. See also the {@linkplain Builder class
+     * documentation}.
+     */
+    SpawnStrategyRegistry.Builder setDefaultStrategies(List<String> defaultStrategies);
+
+    /**
+     * Sets the strategy names to use in the remote branch of dynamic execution for a given action
+     * mnemonic.
+     *
+     * <p>During execution, each strategy is {@linkplain SpawnStrategy#canExec(Spawn,
+     * ActionContextRegistry) asked} whether it can execute a given Spawn. The first strategy in the
+     * list that says so will get the job.
+     */
+    SpawnStrategyRegistry.Builder addDynamicRemoteStrategiesByMnemonic(
+        String mnemonic, List<String> strategies);
+
+    /**
+     * Sets the strategy names to use in the local branch of dynamic execution for a given action
+     * mnemonic.
+     *
+     * <p>During execution, each strategy is {@linkplain SpawnStrategy#canExec(Spawn,
+     * ActionContextRegistry) asked} whether it can execute a given Spawn. The first strategy in the
+     * list that says so will get the job.
+     */
+    SpawnStrategyRegistry.Builder addDynamicLocalStrategiesByMnemonic(
+        String mnemonic, List<String> strategies);
+
+    /**
+     * Sets the commandline identifier of the strategy to be used when falling back from remote to
+     * local execution.
+     *
+     * <p>Note that this is an optional setting, if not provided {@link
+     * SpawnStrategyRegistry#getRemoteLocalFallbackStrategy()} will return {@code null}. If the
+     * value <b>is</b> provided it must match the commandline identifier of a registered strategy
+     * (at {@linkplain #build build} time).
+     */
+    SpawnStrategyRegistry.Builder setRemoteLocalFallbackStrategyIdentifier(
+        String commandlineIdentifier);
+
+    /**
+     * Finalizes the construction of the registry.
+     *
+     * @throws ExecutorInitException if a strategy command-line identifier was used in a filter or
+     *     the default strategies but no strategy for that identifier was registered
+     */
+    SpawnStrategyRegistry build() throws ExecutorInitException;
+  }
+
+  /**
+   * Builder collecting the strategies and restrictions thereon for a {@link SpawnStrategyRegistry}.
+   *
+   * <p>To {@linkplain SpawnStrategyRegistry#getStrategies match a strategy to a spawn} it needs to
+   * be both {@linkplain #registerStrategy registered} and its registered command-line identifier
+   * has to match {@linkplain #addDescriptionFilter a filter on the spawn's progress message},
+   * {@linkplain #addMnemonicFilter a filter on the spawn's mnemonic} or be part of the default
+   * strategies (see below).
+   *
+   * <p><strong>Default strategies</strong> are either {@linkplain #setDefaultStrategies set
+   * explicitly} or, if {@link #setDefaultStrategies} is not called on this builder, comprised of
+   * all registered strategies, in registration order (i.e. the earliest strategy registered will be
+   * first in the list of strategies returned by {@link SpawnStrategyRegistry#getStrategies}).
+   */
+  private static final class BuilderImpl implements Builder {
 
     private ImmutableList<String> explicitDefaultStrategies = ImmutableList.of();
     // TODO(schmitt): Using a list and autovalue so as to be able to reverse order while legacy sort
@@ -258,6 +383,7 @@
      * precedence of calls to this method is determined by {@link
      * #useLegacyDescriptionFilterPrecedence()}.
      */
+    @Override
     public Builder addDescriptionFilter(RegexFilter filter, List<String> identifiers) {
       filterAndIdentifiers.add(
           new AutoValue_SpawnStrategyRegistry_FilterAndIdentifiers(
@@ -276,6 +402,7 @@
      * filter} that filter will take precedence over any mnemonic-based filters.
      */
     // last one wins
+    @Override
     public Builder addMnemonicFilter(String mnemonic, List<String> identifiers) {
       mnemonicToIdentifiers.put(mnemonic, identifiers);
       return this;
@@ -288,11 +415,10 @@
      * <p>If multiple strategies are registered with the same command-line identifier the last one
      * so registered will take precedence.
      */
-    public Builder registerStrategy(
-        SpawnStrategy strategy,
-        String firstCommandlineIdentifier,
-        String... commandlineIdentifiers) {
-      identifierToStrategy.put(firstCommandlineIdentifier, strategy);
+    @Override
+    public Builder registerStrategy(SpawnStrategy strategy, List<String> commandlineIdentifiers) {
+      Preconditions.checkArgument(
+          commandlineIdentifiers.size() >= 1, "At least one commandLineIdentifier must be given");
       for (String identifier : commandlineIdentifiers) {
         identifierToStrategy.put(identifier, strategy);
       }
@@ -307,6 +433,7 @@
      * <p>The default behavior of this collector is to prefer the last registered description filter
      * over any previously registered matching filters.
      */
+    @Override
     public Builder useLegacyDescriptionFilterPrecedence() {
       legacyFilterIterationOrder = true;
       return this;
@@ -319,6 +446,7 @@
      * considered default strategies, in registration order. See also the {@linkplain Builder class
      * documentation}.
      */
+    @Override
     public Builder setDefaultStrategies(List<String> defaultStrategies) {
       this.explicitDefaultStrategies = ImmutableList.copyOf(defaultStrategies);
       useRegistrationOrderForDefault = false;
@@ -333,6 +461,7 @@
      * ActionContextRegistry) asked} whether it can execute a given Spawn. The first strategy in the
      * list that says so will get the job.
      */
+    @Override
     public Builder addDynamicRemoteStrategiesByMnemonic(String mnemonic, List<String> strategies) {
       mnemonicToRemoteIdentifiers.put(mnemonic, strategies);
       return this;
@@ -346,6 +475,7 @@
      * ActionContextRegistry) asked} whether it can execute a given Spawn. The first strategy in the
      * list that says so will get the job.
      */
+    @Override
     public Builder addDynamicLocalStrategiesByMnemonic(String mnemonic, List<String> strategies) {
       mnemonicToLocalIdentifiers.put(mnemonic, strategies);
       return this;
@@ -360,6 +490,7 @@
      * value <b>is</b> provided it must match the commandline identifier of a registered strategy
      * (at {@linkplain #build build} time).
      */
+    @Override
     public Builder setRemoteLocalFallbackStrategyIdentifier(String commandlineIdentifier) {
       this.remoteLocalFallbackStrategyIdentifier = commandlineIdentifier;
       return this;
@@ -371,6 +502,7 @@
      * @throws ExecutorInitException if a strategy command-line identifier was used in a filter or
      *     the default strategies but no strategy for that identifier was registered
      */
+    @Override
     public SpawnStrategyRegistry build() throws ExecutorInitException {
       List<FilterAndIdentifiers> orderedFilterAndIdentifiers = filterAndIdentifiers;
 
diff --git a/src/test/java/com/google/devtools/build/lib/exec/ModuleActionContextRegistryTest.java b/src/test/java/com/google/devtools/build/lib/exec/ModuleActionContextRegistryTest.java
index e26db24..2d6413c 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/ModuleActionContextRegistryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/exec/ModuleActionContextRegistryTest.java
@@ -30,7 +30,7 @@
   public void testRegistration() throws Exception {
     AC2 context = new AC2();
     ModuleActionContextRegistry contextRegistry =
-        new ModuleActionContextRegistry.Builder().register(IT1.class, context).build();
+        ModuleActionContextRegistry.builder().register(IT1.class, context).build();
     assertThat(contextRegistry.getContext(IT1.class)).isEqualTo(context);
   }
 
@@ -38,7 +38,7 @@
   public void testDoubleRegistration() throws Exception {
     AC2 context = new AC2();
     ModuleActionContextRegistry contextRegistry =
-        new ModuleActionContextRegistry.Builder()
+        ModuleActionContextRegistry.builder()
             .register(IT1.class, context)
             .register(IT1.class, context)
             .build();
@@ -50,7 +50,7 @@
     AC2 context1 = new AC2();
     AC2 context2 = new AC2();
     ModuleActionContextRegistry contextRegistry =
-        new ModuleActionContextRegistry.Builder()
+        ModuleActionContextRegistry.builder()
             .register(IT1.class, context1)
             .register(IT1.class, context2)
             .build();
@@ -61,7 +61,7 @@
   public void testSelfIdentifyingType() throws Exception {
     AC1 context = new AC1();
     ModuleActionContextRegistry contextRegistry =
-        new ModuleActionContextRegistry.Builder().register(AC1.class, context).build();
+        ModuleActionContextRegistry.builder().register(AC1.class, context).build();
     assertThat(contextRegistry.getContext(AC1.class)).isEqualTo(context);
   }
 
@@ -70,7 +70,7 @@
     AC2 general = new AC2();
     AC2 specific = new AC2();
     ModuleActionContextRegistry contextRegistry =
-        new ModuleActionContextRegistry.Builder()
+        ModuleActionContextRegistry.builder()
             .register(IT1.class, general)
             .register(IT1.class, specific, "specific", "foo")
             .register(IT1.class, general)
@@ -84,7 +84,7 @@
     AC2 context1 = new AC2();
     AC2 context2 = new AC2();
     ModuleActionContextRegistry contextRegistry =
-        new ModuleActionContextRegistry.Builder()
+        ModuleActionContextRegistry.builder()
             .register(IT1.class, context1, "foo")
             .register(IT1.class, context2, "foo")
             .restrictTo(IT1.class, "foo")
@@ -96,7 +96,7 @@
   public void testUsedNotification() throws Exception {
     RecordingContext context = new RecordingContext();
     ModuleActionContextRegistry contextRegistry =
-        new ModuleActionContextRegistry.Builder()
+        ModuleActionContextRegistry.builder()
             .register(RecordingContext.class, context)
             .register(RecordingContext.class, context)
             .build();
@@ -111,7 +111,7 @@
     AC2 general = new AC2();
     AC2 specific = new AC2();
     ModuleActionContextRegistry contextRegistry =
-        new ModuleActionContextRegistry.Builder()
+        ModuleActionContextRegistry.builder()
             .register(IT1.class, general)
             .register(IT1.class, specific, "specific", "foo")
             .register(IT1.class, general)
@@ -124,7 +124,7 @@
   @Test
   public void testNoMatch() throws Exception {
     ModuleActionContextRegistry contextRegistry =
-        new ModuleActionContextRegistry.Builder().register(AC1.class, new AC1()).build();
+        ModuleActionContextRegistry.builder().register(AC1.class, new AC1()).build();
 
     assertThat(contextRegistry.getContext(IT1.class)).isNull();
   }
@@ -134,7 +134,7 @@
     AC2 context1 = new AC2();
     AC2 context2 = new AC2();
     ModuleActionContextRegistry.Builder builder =
-        new ModuleActionContextRegistry.Builder()
+        ModuleActionContextRegistry.builder()
             .register(IT1.class, context1, "foo")
             .register(IT1.class, context2, "baz", "boz")
             .restrictTo(IT1.class, "bar");
diff --git a/src/test/java/com/google/devtools/build/lib/exec/SpawnStrategyRegistryTest.java b/src/test/java/com/google/devtools/build/lib/exec/SpawnStrategyRegistryTest.java
index 1511110..86672c9 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/SpawnStrategyRegistryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/exec/SpawnStrategyRegistryTest.java
@@ -53,7 +53,7 @@
   public void testRegistration() throws Exception {
     NoopStrategy strategy = new NoopStrategy("");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy, "foo")
             .setDefaultStrategies(ImmutableList.of("foo"))
             .build();
@@ -70,7 +70,7 @@
     NoopStrategy strategy1 = new NoopStrategy("1");
     NoopStrategy strategy2 = new NoopStrategy("2");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "foo")
             .registerStrategy(strategy2, "bar")
             .addMnemonicFilter("mnem", ImmutableList.of("bar", "foo"))
@@ -88,7 +88,7 @@
     NoopStrategy strategy1 = new NoopStrategy("1");
     NoopStrategy strategy2 = new NoopStrategy("2");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "foo")
             .registerStrategy(strategy2, "foo")
             .addMnemonicFilter("mnem", ImmutableList.of("foo"))
@@ -106,7 +106,7 @@
     NoopStrategy strategy1 = new NoopStrategy("1");
     NoopStrategy strategy2 = new NoopStrategy("2");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "foo")
             .registerStrategy(strategy2, "bar")
             .addDescriptionFilter(ELLO_MATCHER, ImmutableList.of("bar", "foo"))
@@ -123,7 +123,7 @@
   public void testFilterNoMatch() throws Exception {
     NoopStrategy strategy = new NoopStrategy("");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy, "foo")
             .addMnemonicFilter("mnem", ImmutableList.of("foo"))
             .setDefaultStrategies(ImmutableList.of())
@@ -141,7 +141,7 @@
     NoopStrategy strategy1 = new NoopStrategy("1");
     NoopStrategy strategy2 = new NoopStrategy("2");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "foo")
             .registerStrategy(strategy2, "bar")
             .addMnemonicFilter("mnem", ImmutableList.of("foo"))
@@ -160,7 +160,7 @@
     NoopStrategy strategy1 = new NoopStrategy("1");
     NoopStrategy strategy2 = new NoopStrategy("2");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "foo")
             .registerStrategy(strategy2, "bar")
             .addMnemonicFilter("mnem", ImmutableList.of("foo"))
@@ -179,7 +179,7 @@
     NoopStrategy strategy1 = new NoopStrategy("1");
     NoopStrategy strategy2 = new NoopStrategy("2");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "foo")
             .registerStrategy(strategy2, "bar")
             .addDescriptionFilter(ELLO_MATCHER, ImmutableList.of("foo"))
@@ -200,7 +200,7 @@
     NoopStrategy strategy1 = new NoopStrategy("1");
     NoopStrategy strategy2 = new NoopStrategy("2");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "foo")
             .registerStrategy(strategy2, "bar")
             .addDescriptionFilter(ELLO_MATCHER, ImmutableList.of("foo"))
@@ -223,7 +223,7 @@
     NoopStrategy strategy2 = new NoopStrategy("2");
     NoopStrategy strategy3 = new NoopStrategy("3");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "foo")
             .registerStrategy(strategy2, "bar")
             .registerStrategy(strategy3, "baz")
@@ -243,7 +243,7 @@
     NoopStrategy strategy2 = new NoopStrategy("2");
     NoopStrategy strategy3 = new NoopStrategy("3");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "foo")
             .registerStrategy(strategy2, "bar")
             .registerStrategy(strategy3, "baz")
@@ -269,7 +269,7 @@
     NoopStrategy strategy1 = new NoopStrategy("1");
     NoopStrategy strategy2 = new NoopStrategy("2");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "foo")
             .registerStrategy(strategy2, "bar")
             .build();
@@ -287,7 +287,7 @@
     NoopStrategy strategy2 = new NoopStrategy("2");
     NoopStrategy strategy3 = new NoopStrategy("3");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "foo")
             .registerStrategy(strategy2, "bar")
             .registerStrategy(strategy3, "foo")
@@ -307,7 +307,7 @@
         assertThrows(
             ExecutorInitException.class,
             () ->
-                new SpawnStrategyRegistry.Builder()
+                SpawnStrategyRegistry.builder()
                     .registerStrategy(strategy1, "foo")
                     .addMnemonicFilter("mnem", ImmutableList.of("bar", "foo"))
                     .build());
@@ -322,7 +322,7 @@
         assertThrows(
             ExecutorInitException.class,
             () ->
-                new SpawnStrategyRegistry.Builder()
+                SpawnStrategyRegistry.builder()
                     .registerStrategy(strategy1, "foo")
                     .addDescriptionFilter(ELLO_MATCHER, ImmutableList.of("bar", "foo"))
                     .build());
@@ -337,7 +337,7 @@
         assertThrows(
             ExecutorInitException.class,
             () ->
-                new SpawnStrategyRegistry.Builder()
+                SpawnStrategyRegistry.builder()
                     .registerStrategy(strategy1, "foo")
                     .setDefaultStrategies(ImmutableList.of("bar"))
                     .build());
@@ -350,7 +350,7 @@
     NoopStrategy strategy1 = new NoopSandboxedStrategy("1");
     NoopStrategy strategy2 = new NoopSandboxedStrategy("2");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "foo")
             .registerStrategy(strategy2, "bar")
             .addDynamicLocalStrategiesByMnemonic("mnem", ImmutableList.of("bar"))
@@ -374,7 +374,7 @@
         assertThrows(
             ExecutorInitException.class,
             () ->
-                new SpawnStrategyRegistry.Builder()
+                SpawnStrategyRegistry.builder()
                     .registerStrategy(strategy1, "foo")
                     .addDynamicLocalStrategiesByMnemonic("mnem", ImmutableList.of("bar"))
                     .build());
@@ -389,7 +389,7 @@
         assertThrows(
             ExecutorInitException.class,
             () ->
-                new SpawnStrategyRegistry.Builder()
+                SpawnStrategyRegistry.builder()
                     .registerStrategy(strategy1, "foo")
                     .addDynamicLocalStrategiesByMnemonic("mnem", ImmutableList.of("foo"))
                     .build());
@@ -402,7 +402,7 @@
     NoopAbstractStrategy strategy1 = new NoopAbstractStrategy("1");
     NoopAbstractStrategy strategy2 = new NoopAbstractStrategy("2");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "foo")
             .registerStrategy(strategy2, "bar")
             .setRemoteLocalFallbackStrategyIdentifier("bar")
@@ -418,7 +418,7 @@
         assertThrows(
             ExecutorInitException.class,
             () ->
-                new SpawnStrategyRegistry.Builder()
+                SpawnStrategyRegistry.builder()
                     .registerStrategy(strategy1, "foo")
                     .setRemoteLocalFallbackStrategyIdentifier("bar")
                     .build());
@@ -430,7 +430,7 @@
   public void testRemoteLocalFallbackNotRegistered() throws Exception {
     NoopStrategy strategy1 = new NoopStrategy("1");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder().registerStrategy(strategy1, "foo").build();
+        SpawnStrategyRegistry.builder().registerStrategy(strategy1, "foo").build();
 
     assertThat(strategyRegistry.getRemoteLocalFallbackStrategy()).isNull();
   }
@@ -447,7 +447,7 @@
     NoopStrategy strategy8 = new NoopStrategy("8");
     NoopStrategy strategy9 = new NoopStrategy("9");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "1")
             .registerStrategy(strategy2, "2")
             .registerStrategy(strategy3, "3")
@@ -490,7 +490,7 @@
     NoopStrategy strategy6 = new NoopSandboxedStrategy("6");
     NoopStrategy strategy7 = new NoopStrategy("7");
     SpawnStrategyRegistry strategyRegistry =
-        new SpawnStrategyRegistry.Builder()
+        SpawnStrategyRegistry.builder()
             .registerStrategy(strategy1, "1") // no notification: regular strategies are separate
             .registerStrategy(strategy2, "2") // no notification: regular strategies are separate
             .registerStrategy(strategy3, "3") // no notification: regular strategies are separate
