diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java
index e34830a..f857cc9 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java
@@ -90,7 +90,7 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 import com.google.devtools.common.options.OptionsBase;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
@@ -187,7 +187,7 @@
   }
 
   @Override
-  public void serverInit(OptionsProvider startupOptions, ServerBuilder builder) {
+  public void serverInit(OptionsParsingResult startupOptions, ServerBuilder builder) {
     builder.addCommands(new FetchCommand());
     builder.addCommands(new SyncCommand());
     builder.addInfoItems(new RepositoryCacheInfoItem(repositoryCache));
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
index 202a29b..60fe650 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
@@ -37,7 +37,7 @@
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.ExitCode;
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.IOException;
 import java.util.EnumSet;
 
@@ -61,7 +61,7 @@
   public void editOptions(OptionsParser optionsParser) { }
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     BlazeRuntime runtime = env.getRuntime();
     if (options.getResidue().isEmpty()) {
       env.getReporter().handle(Event.error(String.format(
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
index 3ea7364..1f4cf12 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
@@ -39,7 +39,7 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 
 /** Syncs all repositories specifed in the workspace file */
 @Command(
@@ -63,7 +63,7 @@
   }
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     try {
       env.setupPackageCache(options, env.getRuntime().getDefaultsPackageContent());
       SkyframeExecutor skyframeExecutor = env.getSkyframeExecutor();
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceModule.java b/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceModule.java
index e31d00c..20a5446 100644
--- a/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceModule.java
+++ b/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceModule.java
@@ -44,7 +44,7 @@
 import com.google.devtools.build.lib.util.io.OutErr;
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParsingException;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.IOException;
 import java.util.Set;
 import java.util.logging.Logger;
@@ -147,8 +147,8 @@
   @Nullable
   @VisibleForTesting
   BuildEventStreamer tryCreateStreamer(
-      OptionsProvider startupOptionsProvider,
-      OptionsProvider optionsProvider,
+      OptionsParsingResult startupOptionsProvider,
+      OptionsParsingResult optionsProvider,
       EventHandler commandLineReporter,
       ModuleEnvironment moduleEnvironment,
       Clock clock,
@@ -216,8 +216,8 @@
       Clock clock,
       BuildEventArtifactUploaderFactoryMap buildEventArtifactUploaderFactoryMap,
       EventHandler commandLineReporter,
-      OptionsProvider startupOptionsProvider,
-      OptionsProvider optionsProvider)
+      OptionsParsingResult startupOptionsProvider,
+      OptionsParsingResult optionsProvider)
       throws IOException, OptionsParsingException {
     T besOptions =
         checkNotNull(
@@ -300,7 +300,8 @@
 
   protected abstract Set<String> whitelistedCommands();
 
-  protected Set<String> keywords(T besOptions, @Nullable OptionsProvider startupOptionsProvider) {
+  protected Set<String> keywords(
+      T besOptions, @Nullable OptionsParsingResult startupOptionsProvider) {
     return besOptions
         .besKeywords
         .stream()
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventArtifactUploaderFactory.java b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventArtifactUploaderFactory.java
index 66b55e6..9c62a8d 100644
--- a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventArtifactUploaderFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventArtifactUploaderFactory.java
@@ -16,18 +16,18 @@
 
 import static com.google.devtools.build.lib.buildeventstream.BuildEventArtifactUploader.LOCAL_FILES_UPLOADER;
 
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 
 /** A factory for {@link BuildEventArtifactUploader}. */
 public interface BuildEventArtifactUploaderFactory {
 
   BuildEventArtifactUploaderFactory LOCAL_FILES_UPLOADER_FACTORY =
-      (OptionsProvider options) -> LOCAL_FILES_UPLOADER;
+      (OptionsParsingResult options) -> LOCAL_FILES_UPLOADER;
 
   /**
    * Returns a new instance of a {@link BuildEventArtifactUploader}. The call is responsible for
    * calling {@link BuildEventArtifactUploader#shutdown()} on the returned instance.
    */
-  BuildEventArtifactUploader create(OptionsProvider options);
+  BuildEventArtifactUploader create(OptionsParsingResult options);
 }
 
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/transports/BuildEventTransportFactory.java b/src/main/java/com/google/devtools/build/lib/buildeventstream/transports/BuildEventTransportFactory.java
index cafc20a..57d312e 100644
--- a/src/main/java/com/google/devtools/build/lib/buildeventstream/transports/BuildEventTransportFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/transports/BuildEventTransportFactory.java
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.buildeventstream.BuildEventProtocolOptions;
 import com.google.devtools.build.lib.buildeventstream.BuildEventTransport;
 import com.google.devtools.build.lib.util.AbruptExitException;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.IOException;
 import java.util.function.Consumer;
 
@@ -107,7 +107,7 @@
    * @throws IOException Exception propagated from a {@link BuildEventTransport} creation failure.
    */
   public static ImmutableSet<BuildEventTransport> createFromOptions(
-      OptionsProvider options,
+      OptionsParsingResult options,
       BuildEventArtifactUploaderFactoryMap artifactUploaders,
       Consumer<AbruptExitException> exitFunc)
       throws IOException {
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java
index 02a99e7..6599396 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java
@@ -35,7 +35,7 @@
 import com.google.devtools.build.lib.util.io.OutErr;
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsClassProvider;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -83,8 +83,8 @@
           LoadingPhaseThreadsOption.class);
 
   private BuildRequest(String commandName,
-                       final OptionsProvider options,
-                       final OptionsProvider startupOptions,
+                       final OptionsParsingResult options,
+                       final OptionsParsingResult startupOptions,
                        List<String> targets,
                        OutErr outErr,
                        UUID id,
@@ -301,8 +301,8 @@
     return ImmutableList.copyOf(getBuildOptions().aspects);
   }
 
-  public static BuildRequest create(String commandName, OptionsProvider options,
-      OptionsProvider startupOptions,
+  public static BuildRequest create(String commandName, OptionsParsingResult options,
+      OptionsParsingResult startupOptions,
       List<String> targets, OutErr outErr, UUID commandId, long commandStartTime) {
 
     BuildRequest request = new BuildRequest(commandName, options, startupOptions, targets, outErr,
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerModule.java b/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerModule.java
index 72f1fe1..f3ebbef 100644
--- a/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerModule.java
+++ b/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerModule.java
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.runtime.WorkspaceBuilder;
 import com.google.devtools.build.lib.syntax.Callstack;
 import com.google.devtools.build.lib.vfs.FileSystem;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.util.UUID;
 
 /**
@@ -55,7 +55,7 @@
 
   @Override
   public void blazeStartup(
-      OptionsProvider startupOptions,
+      OptionsParsingResult startupOptions,
       BlazeVersionInfo versionInfo,
       UUID instanceId,
       FileSystem fileSystem,
diff --git a/src/main/java/com/google/devtools/build/lib/remote/ByteStreamBuildEventArtifactUploaderFactory.java b/src/main/java/com/google/devtools/build/lib/remote/ByteStreamBuildEventArtifactUploaderFactory.java
index be43302..39d7537 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/ByteStreamBuildEventArtifactUploaderFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/ByteStreamBuildEventArtifactUploaderFactory.java
@@ -15,7 +15,7 @@
 
 import com.google.devtools.build.lib.buildeventstream.BuildEventArtifactUploader;
 import com.google.devtools.build.lib.buildeventstream.BuildEventArtifactUploaderFactory;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import io.grpc.Context;
 import javax.annotation.Nullable;
 
@@ -40,7 +40,7 @@
   }
 
   @Override
-  public BuildEventArtifactUploader create(OptionsProvider options) {
+  public BuildEventArtifactUploader create(OptionsParsingResult options) {
     return new ByteStreamBuildEventArtifactUploader(uploader.retain(), remoteServerName, ctx,
         remoteInstanceName);
   }
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 14f373e..ff7bbac 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
@@ -40,7 +40,7 @@
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.common.options.OptionsBase;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import com.google.protobuf.Any;
 import com.google.protobuf.InvalidProtocolBufferException;
 import com.google.rpc.PreconditionFailure;
@@ -71,7 +71,7 @@
       buildEventArtifactUploaderFactoryDelegate = new BuildEventArtifactUploaderFactoryDelegate();
 
   @Override
-  public void serverInit(OptionsProvider startupOptions, ServerBuilder builder) {
+  public void serverInit(OptionsParsingResult startupOptions, ServerBuilder builder) {
     builder.addBuildEventArtifactUploaderFactory(buildEventArtifactUploaderFactoryDelegate, "remote");
   }
 
@@ -310,7 +310,7 @@
     }
 
     @Override
-    public BuildEventArtifactUploader create(OptionsProvider options) {
+    public BuildEventArtifactUploader create(OptionsParsingResult options) {
       BuildEventArtifactUploaderFactory uploaderFactory0 = this.uploaderFactory;
       if (uploaderFactory0 == null) {
         return BuildEventArtifactUploader.LOCAL_FILES_UPLOADER;
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BazelFileSystemModule.java b/src/main/java/com/google/devtools/build/lib/runtime/BazelFileSystemModule.java
index 9e57bf8..db26f14 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BazelFileSystemModule.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BazelFileSystemModule.java
@@ -25,7 +25,7 @@
 import com.google.devtools.build.lib.vfs.JavaIoFileSystem;
 import com.google.devtools.build.lib.windows.WindowsFileSystem;
 import com.google.devtools.common.options.OptionsParsingException;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 
 /**
  * Module to provide a {@link FileSystem} instance that uses {@code SHA256} as the default hash
@@ -36,7 +36,7 @@
 public class BazelFileSystemModule extends BlazeModule {
 
   @Override
-  public void globalInit(OptionsProvider startupOptionsProvider) throws AbruptExitException {
+  public void globalInit(OptionsParsingResult startupOptionsProvider) throws AbruptExitException {
     BlazeServerStartupOptions startupOptions =
         Preconditions.checkNotNull(
             startupOptionsProvider.getOptions(BlazeServerStartupOptions.class));
@@ -60,7 +60,7 @@
   }
 
   @Override
-  public FileSystem getFileSystem(OptionsProvider startupOptions) {
+  public FileSystem getFileSystem(OptionsParsingResult startupOptions) {
     if ("0".equals(System.getProperty("io.bazel.EnableJni"))) {
       // Ignore UnixFileSystem, to be used for bootstrapping.
       return OS.getCurrent() == OS.WINDOWS ? new WindowsFileSystem() : new JavaIoFileSystem();
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommand.java
index f1ffeec..80a64a7 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommand.java
@@ -14,19 +14,19 @@
 package com.google.devtools.build.lib.runtime;
 
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 
 /**
- * Interface implemented by Blaze commands. In addition to implementing this interface, each
- * command must be annotated with a {@link Command} annotation.
+ * Interface implemented by Blaze commands. In addition to implementing this interface, each command
+ * must be annotated with a {@link Command} annotation.
  */
 public interface BlazeCommand {
   /**
-   * This method provides the imperative portion of the command. It takes a {@link OptionsProvider}
-   * instance {@code options}, which provides access to the options instances via {@link
-   * OptionsProvider#getOptions(Class)}, and access to the residue (the remainder of the command
-   * line) via {@link OptionsProvider#getResidue()}. The framework parses and makes available
-   * exactly the options that the command class specifies via the annotation {@link
+   * This method provides the imperative portion of the command. It takes a {@link
+   * OptionsParsingResult} instance {@code options}, which provides access to the options instances
+   * via {@link OptionsParsingResult#getOptions(Class)}, and access to the residue (the remainder of
+   * the command line) via {@link OptionsParsingResult#getResidue()}. The framework parses and makes
+   * available exactly the options that the command class specifies via the annotation {@link
    * Command#options()}. The command indicates success / failure via its return value, which becomes
    * the Unix exit status of the Blaze client process. It may indicate that the server needs to be
    * shut down or that a particular binary needs to be exec()ed on the terminal where Blaze was
@@ -37,12 +37,11 @@
    *     in {@link Command#options()}.
    * @return The Unix exit status for the Blaze client.
    */
-  BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options);
+  BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options);
 
   /**
-   * Allows the command to provide command-specific option defaults and/or
-   * requirements. This method is called after all command-line and rc file options have been
-   * parsed.
+   * Allows the command to provide command-specific option defaults and/or requirements. This method
+   * is called after all command-line and rc file options have been parsed.
    *
    * @param optionsParser the options parser for the current command
    */
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
index 70ae168..99bbd81 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
@@ -47,7 +47,7 @@
 import com.google.devtools.common.options.OpaqueOptionsData;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.BufferedOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -252,7 +252,7 @@
             createOptionsParser(command),
             invocationPolicy);
     ExitCode earlyExitCode = optionHandler.parseOptions(args, storedEventHandler);
-    OptionsProvider options = optionHandler.getOptionsResult();
+    OptionsParsingResult options = optionHandler.getOptionsResult();
 
     CommandLineEvent originalCommandLineEvent =
         new CommandLineEvent.OriginalCommandLineEvent(
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java
index 5f2bb66..806ca40 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java
@@ -37,7 +37,7 @@
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsClassProvider;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.IOException;
 import java.util.UUID;
 import javax.annotation.Nullable;
@@ -70,7 +70,7 @@
    *
    * @throws AbruptExitException to shut down the server immediately
    */
-  public void globalInit(OptionsProvider startupOptions) throws AbruptExitException {
+  public void globalInit(OptionsParsingResult startupOptions) throws AbruptExitException {
   }
 
   /**
@@ -82,7 +82,7 @@
    *
    * @param startupOptions the server's startup options
    */
-  public FileSystem getFileSystem(OptionsProvider startupOptions) throws AbruptExitException {
+  public FileSystem getFileSystem(OptionsParsingResult startupOptions) throws AbruptExitException {
     return null;
   }
 
@@ -99,7 +99,7 @@
    * @throws AbruptExitException to shut down the server immediately
    */
   public void blazeStartup(
-      OptionsProvider startupOptions,
+      OptionsParsingResult startupOptions,
       BlazeVersionInfo versionInfo,
       UUID instanceId,
       FileSystem fileSystem,
@@ -117,7 +117,7 @@
    *
    * @throws AbruptExitException to shut down the server immediately
    */
-  public void serverInit(OptionsProvider startupOptions, ServerBuilder builder)
+  public void serverInit(OptionsParsingResult startupOptions, ServerBuilder builder)
       throws AbruptExitException {
   }
 
@@ -148,13 +148,13 @@
 
   /**
    * Called to notify modules that the given command is about to be executed. This allows capturing
-   * the {@link com.google.common.eventbus.EventBus}, {@link Command}, or {@link OptionsProvider}.
+   * the {@link com.google.common.eventbus.EventBus}, {@link Command}, or {@link
+   * OptionsParsingResult}.
    *
    * @param env the command
    * @throws AbruptExitException modules can throw this exception to abort the command
    */
-  public void beforeCommand(CommandEnvironment env) throws AbruptExitException {
-  }
+  public void beforeCommand(CommandEnvironment env) throws AbruptExitException {}
 
   /**
    * Returns additional listeners to the console output stream. Called at the beginning of each
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeOptionHandler.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeOptionHandler.java
index 4b344ab..733ef84 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeOptionHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeOptionHandler.java
@@ -33,7 +33,7 @@
 import com.google.devtools.common.options.OptionValueDescription;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import com.google.devtools.common.options.ParsedOptionDescription;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -84,9 +84,11 @@
     this.invocationPolicy = invocationPolicy;
   }
 
-  // Return options as OptionsProvider so the options can't be easily modified after we've
-  // applied the invocation policy.
-  OptionsProvider getOptionsResult() {
+  /**
+   * Return options as {@link OptionsParsingResult} so the options can't be easily modified after
+   * we've applied the invocation policy.
+   */
+  OptionsParsingResult getOptionsResult() {
     return optionsParser;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index 5e052a2..f0a7c17 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -87,7 +87,7 @@
 import com.google.devtools.common.options.OptionsClassProvider;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import com.google.devtools.common.options.TriState;
 import java.io.File;
 import java.io.IOException;
@@ -149,7 +149,7 @@
   private final AtomicInteger storedExitCode = new AtomicInteger();
 
   // We pass this through here to make it available to the MasterLogWriter.
-  private final OptionsProvider startupOptionsProvider;
+  private final OptionsParsingResult startupOptionsProvider;
 
   private final ProjectFile.Provider projectFileProvider;
   @Nullable private final InvocationPolicy moduleInvocationPolicy;
@@ -174,7 +174,7 @@
       ActionKeyContext actionKeyContext,
       Clock clock,
       Runnable abruptShutdownHandler,
-      OptionsProvider startupOptionsProvider,
+      OptionsParsingResult startupOptionsProvider,
       Iterable<BlazeModule> blazeModules,
       SubscriberExceptionHandler eventBusExceptionHandler,
       ProjectFile.Provider projectFileProvider,
@@ -559,7 +559,7 @@
     return clock;
   }
 
-  public OptionsProvider getStartupOptionsProvider() {
+  public OptionsParsingResult getStartupOptionsProvider() {
     return startupOptionsProvider;
   }
 
@@ -989,7 +989,7 @@
    * parser can set the source for every option correctly. If that cannot be parsed or is missing,
    * we just report an unknown source for every startup option.
    */
-  private static OptionsProvider parseStartupOptions(
+  private static OptionsParsingResult parseStartupOptions(
       Iterable<BlazeModule> modules, List<String> args) throws OptionsParsingException {
     ImmutableList<Class<? extends OptionsBase>> optionClasses =
         BlazeCommandUtils.getStartupOptions(modules);
@@ -1031,7 +1031,7 @@
   private static BlazeRuntime newRuntime(Iterable<BlazeModule> blazeModules, List<String> args,
       Runnable abruptShutdownHandler)
       throws AbruptExitException, OptionsParsingException {
-    OptionsProvider options = parseStartupOptions(blazeModules, args);
+    OptionsParsingResult options = parseStartupOptions(blazeModules, args);
     for (BlazeModule module : blazeModules) {
       module.globalInit(options);
     }
@@ -1283,7 +1283,7 @@
     private ServerDirectories serverDirectories;
     private Clock clock;
     private Runnable abruptShutdownHandler;
-    private OptionsProvider startupOptionsProvider;
+    private OptionsParsingResult startupOptionsProvider;
     private final List<BlazeModule> blazeModules = new ArrayList<>();
     private SubscriberExceptionHandler eventBusExceptionHandler = new RemoteExceptionHandler();
     private UUID instanceId;
@@ -1402,7 +1402,7 @@
       return this;
     }
 
-    public Builder setStartupOptionsProvider(OptionsProvider startupOptionsProvider) {
+    public Builder setStartupOptionsProvider(OptionsParsingResult startupOptionsProvider) {
       this.startupOptionsProvider = startupOptionsProvider;
       return this;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java
index 608bb96..54d04cf 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java
@@ -34,7 +34,7 @@
 import com.google.devtools.build.lib.util.LoggingUtil;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.IOException;
 import java.util.List;
 import java.util.logging.Level;
@@ -195,7 +195,7 @@
    *     fully configured at this point.
    */
   public CommandEnvironment initCommand(
-      Command command, OptionsProvider options, List<String> warnings) {
+      Command command, OptionsParsingResult options, List<String> warnings) {
     CommandEnvironment env =
         new CommandEnvironment(
             runtime,
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BuiltinCommandModule.java b/src/main/java/com/google/devtools/build/lib/runtime/BuiltinCommandModule.java
index 63896d3c..48b4c0b 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BuiltinCommandModule.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BuiltinCommandModule.java
@@ -30,7 +30,7 @@
 import com.google.devtools.build.lib.runtime.commands.ShutdownCommand;
 import com.google.devtools.build.lib.runtime.commands.TestCommand;
 import com.google.devtools.build.lib.runtime.commands.VersionCommand;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 
 /**
  * Internal module for the built-in commands.
@@ -43,7 +43,7 @@
   }
 
   @Override
-  public void serverInit(OptionsProvider startupOptions, ServerBuilder builder) {
+  public void serverInit(OptionsParsingResult startupOptions, ServerBuilder builder) {
     builder.addCommands(
         new BuildCommand(),
         new CanonicalizeCommand(),
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
index 46aa72b..9b0d784 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
@@ -46,7 +46,7 @@
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.common.options.OptionsClassProvider;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
@@ -79,7 +79,7 @@
   private final TimestampGranularityMonitor timestampGranularityMonitor;
   private final Thread commandThread;
   private final Command command;
-  private final OptionsProvider options;
+  private final OptionsParsingResult options;
 
   private String[] crashData;
 
@@ -123,7 +123,7 @@
       EventBus eventBus,
       Thread commandThread,
       Command command,
-      OptionsProvider options,
+      OptionsParsingResult options,
       List<String> warnings) {
     this.runtime = runtime;
     this.workspace = workspace;
@@ -229,7 +229,7 @@
     return command.name();
   }
 
-  public OptionsProvider getOptions() {
+  public OptionsParsingResult getOptions() {
     return options;
   }
 
@@ -561,7 +561,7 @@
    * @throws AbruptExitException if this command is unsuitable to be run as specified
    */
   void beforeCommand(
-      OptionsProvider options,
+      OptionsParsingResult options,
       CommonCommandOptions commonOptions,
       long waitTimeInMs,
       InvocationPolicy invocationPolicy)
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommandLineEvent.java b/src/main/java/com/google/devtools/build/lib/runtime/CommandLineEvent.java
index adc9b5a..5eff056 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CommandLineEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/CommandLineEvent.java
@@ -34,7 +34,7 @@
 import com.google.devtools.common.options.OptionPriority;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import com.google.devtools.common.options.ParsedOptionDescription;
 import com.google.devtools.common.options.proto.OptionFilters;
 import com.google.protobuf.InvalidProtocolBufferException;
@@ -61,15 +61,15 @@
   /** A CommandLineEvent that stores functions and values common to both Bazel command lines. */
   public abstract static class BazelCommandLineEvent extends CommandLineEvent {
     protected final String productName;
-    protected final OptionsProvider activeStartupOptions;
+    protected final OptionsParsingResult activeStartupOptions;
     protected final String commandName;
-    protected final OptionsProvider commandOptions;
+    protected final OptionsParsingResult commandOptions;
 
     BazelCommandLineEvent(
         String productName,
-        OptionsProvider activeStartupOptions,
+        OptionsParsingResult activeStartupOptions,
         String commandName,
-        OptionsProvider commandOptions) {
+        OptionsParsingResult commandOptions) {
       this.productName = productName;
       this.activeStartupOptions = activeStartupOptions;
       this.commandName = commandName;
@@ -187,7 +187,7 @@
     public OriginalCommandLineEvent(
         BlazeRuntime runtime,
         String commandName,
-        OptionsProvider commandOptions,
+        OptionsParsingResult commandOptions,
         Optional<List<Pair<String, String>>> originalStartupOptions) {
       this(
           runtime.getProductName(),
@@ -200,9 +200,9 @@
     @VisibleForTesting
     OriginalCommandLineEvent(
         String productName,
-        OptionsProvider activeStartupOptions,
+        OptionsParsingResult activeStartupOptions,
         String commandName,
-        OptionsProvider commandOptions,
+        OptionsParsingResult commandOptions,
         Optional<List<Pair<String, String>>> originalStartupOptions) {
       super(productName, activeStartupOptions, commandName, commandOptions);
       this.originalStartupOptions = originalStartupOptions;
@@ -280,7 +280,7 @@
     public static final String LABEL = "canonical";
 
     public CanonicalCommandLineEvent(
-        BlazeRuntime runtime, String commandName, OptionsProvider commandOptions) {
+        BlazeRuntime runtime, String commandName, OptionsParsingResult commandOptions) {
       this(
           runtime.getProductName(),
           runtime.getStartupOptionsProvider(),
@@ -291,9 +291,9 @@
     @VisibleForTesting
     CanonicalCommandLineEvent(
         String productName,
-        OptionsProvider activeStartupOptions,
+        OptionsParsingResult activeStartupOptions,
         String commandName,
-        OptionsProvider commandOptions) {
+        OptionsParsingResult commandOptions) {
       super(productName, activeStartupOptions, commandName, commandOptions);
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommandLogModule.java b/src/main/java/com/google/devtools/build/lib/runtime/CommandLogModule.java
index e0b3b60..a5ef728 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CommandLogModule.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/CommandLogModule.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.util.LoggingUtil;
 import com.google.devtools.build.lib.util.io.OutErr;
 import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.logging.Level;
@@ -33,7 +33,7 @@
   private OutputStream logOutputStream;
 
   @Override
-  public void serverInit(OptionsProvider startupOptions, ServerBuilder builder) {
+  public void serverInit(OptionsParsingResult startupOptions, ServerBuilder builder) {
     builder.addInfoItems(new CommandLogInfoItem());
   }
 
@@ -64,7 +64,7 @@
   }
 
   static boolean writeCommandLog(BlazeRuntime runtime) {
-    OptionsProvider startupOptionsProvider = runtime.getStartupOptionsProvider();
+    OptionsParsingResult startupOptionsProvider = runtime.getStartupOptionsProvider();
     return startupOptionsProvider.getOptions(BlazeServerStartupOptions.class).writeCommandLog;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/GotOptionsEvent.java b/src/main/java/com/google/devtools/build/lib/runtime/GotOptionsEvent.java
index 00eee34..7acbc16 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/GotOptionsEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/GotOptionsEvent.java
@@ -22,15 +22,15 @@
 import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent;
 import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy;
 import com.google.devtools.build.lib.util.OptionsUtils;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.util.Collection;
 import java.util.Objects;
 
 /** An event in which the command line options are discovered. */
 public class GotOptionsEvent implements BuildEventWithOrderConstraint {
 
-  private final OptionsProvider startupOptions;
-  private final OptionsProvider options;
+  private final OptionsParsingResult startupOptions;
+  private final OptionsParsingResult options;
   private final InvocationPolicy invocationPolicy;
 
   /**
@@ -40,23 +40,21 @@
    * @param options the parsed options
    */
   public GotOptionsEvent(
-      OptionsProvider startupOptions, OptionsProvider options, InvocationPolicy invocationPolicy) {
+      OptionsParsingResult startupOptions,
+      OptionsParsingResult options,
+      InvocationPolicy invocationPolicy) {
     this.startupOptions = startupOptions;
     this.options = options;
     this.invocationPolicy = invocationPolicy;
   }
 
-  /**
-   * @return the parsed startup options
-   */
-  public OptionsProvider getStartupOptions() {
+  /** @return the parsed startup options */
+  public OptionsParsingResult getStartupOptions() {
     return startupOptions;
   }
 
-  /**
-   * @return the parsed options.
-   */
-  public OptionsProvider getOptions() {
+  /** @return the parsed options. */
+  public OptionsParsingResult getOptions() {
     return options;
   }
 
@@ -80,7 +78,7 @@
     BuildEventStreamProtos.OptionsParsed.Builder optionsBuilder =
         BuildEventStreamProtos.OptionsParsed.newBuilder();
 
-    OptionsProvider options = getStartupOptions();
+    OptionsParsingResult options = getStartupOptions();
     optionsBuilder.addAllStartupOptions(OptionsUtils.asArgumentList(options));
     optionsBuilder.addAllExplicitStartupOptions(
         OptionsUtils.asArgumentList(
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/TerminalTestResultNotifier.java b/src/main/java/com/google/devtools/build/lib/runtime/TerminalTestResultNotifier.java
index 320cc54..74e041b 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/TerminalTestResultNotifier.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/TerminalTestResultNotifier.java
@@ -26,7 +26,7 @@
 import com.google.devtools.common.options.OptionDocumentationCategory;
 import com.google.devtools.common.options.OptionEffectTag;
 import com.google.devtools.common.options.OptionsBase;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -76,13 +76,13 @@
   }
 
   private final AnsiTerminalPrinter printer;
-  private final OptionsProvider options;
+  private final OptionsParsingResult options;
   private final TestSummaryOptions summaryOptions;
 
   /**
    * @param printer The terminal to print to
    */
-  public TerminalTestResultNotifier(AnsiTerminalPrinter printer, OptionsProvider options) {
+  public TerminalTestResultNotifier(AnsiTerminalPrinter printer, OptionsParsingResult options) {
     this.printer = printer;
     this.options = options;
     this.summaryOptions = options.getOptions(TestSummaryOptions.class);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/AqueryCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/AqueryCommand.java
index ec8ca19..1e8b991 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/AqueryCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/AqueryCommand.java
@@ -33,7 +33,7 @@
 import com.google.devtools.common.options.OptionPriority.PriorityCategory;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedHashSet;
@@ -66,7 +66,7 @@
   }
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     // TODO(twerth): Reduce overlap with CqueryCommand.
     env.getReporter()
         .handle(
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 b217e93..d2c5471 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
@@ -32,7 +32,7 @@
 import com.google.devtools.build.lib.runtime.LoadingPhaseThreadsOption;
 import com.google.devtools.build.lib.util.ExitCode;
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.util.List;
 
 /**
@@ -65,7 +65,7 @@
   }
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     BlazeRuntime runtime = env.getRuntime();
     List<String> targets;
     try (SilentCloseable closeable = Profiler.instance().profile("ProjectFileSupport.getTargets")) {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CanonicalizeCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CanonicalizeCommand.java
index f181c0b..bdd9894 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CanonicalizeCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CanonicalizeCommand.java
@@ -32,7 +32,7 @@
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.util.Collection;
 import java.util.List;
 import java.util.logging.Level;
@@ -127,7 +127,7 @@
   }
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     BlazeRuntime runtime = env.getRuntime();
     Options canonicalizeOptions = options.getOptions(Options.class);
     String commandName = canonicalizeOptions.forCommand;
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
index d848d47..8b42274 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
@@ -36,7 +36,7 @@
 import com.google.devtools.common.options.OptionEffectTag;
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.FileDescriptor;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -99,14 +99,14 @@
 
   /** Posted on the public event stream to announce that a clean is happening. */
   public static class CleanStartingEvent {
-    private final OptionsProvider optionsProvider;
+    private final OptionsParsingResult optionsParsingResult;
 
-    public CleanStartingEvent(OptionsProvider optionsProvider) {
-      this.optionsProvider = optionsProvider;
+    public CleanStartingEvent(OptionsParsingResult optionsParsingResult) {
+      this.optionsParsingResult = optionsParsingResult;
     }
 
-    public OptionsProvider getOptionsProvider() {
-      return optionsProvider;
+    public OptionsParsingResult getOptionsProvider() {
+      return optionsParsingResult;
     }
   }
 
@@ -124,7 +124,7 @@
   private static final Logger logger = Logger.getLogger(CleanCommand.class.getName());
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     Options cleanOptions = options.getOptions(Options.class);
     boolean async = cleanOptions.async;
     env.getEventBus().post(new NoBuildEvent());
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CqueryCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CqueryCommand.java
index 9574e58..131ce46 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CqueryCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CqueryCommand.java
@@ -33,7 +33,7 @@
 import com.google.devtools.common.options.OptionPriority.PriorityCategory;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedHashSet;
@@ -76,7 +76,7 @@
   }
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     if (options.getResidue().isEmpty()) {
       env.getReporter()
           .handle(
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
index a396c80..ece5e19 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
@@ -42,7 +42,7 @@
 import com.google.devtools.common.options.OptionEffectTag;
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.PrintStream;
@@ -187,7 +187,7 @@
   public void editOptions(OptionsParser optionsParser) {}
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     BlazeRuntime runtime = env.getRuntime();
     DumpOptions dumpOptions = options.getOptions(DumpOptions.class);
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/HelpCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/HelpCommand.java
index acd43a0..16d2d75 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/HelpCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/HelpCommand.java
@@ -50,7 +50,7 @@
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParser.HelpVerbosity;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.util.ArrayList;
 import java.util.Base64;
 import java.util.Collections;
@@ -121,7 +121,7 @@
   public void editOptions(OptionsParser optionsParser) {}
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     env.getEventBus().post(new NoBuildEvent());
 
     BlazeRuntime runtime = env.getRuntime();
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
index b2e2ec5..5e65c97 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
@@ -35,7 +35,7 @@
 import com.google.devtools.common.options.OptionMetadataTag;
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
@@ -112,10 +112,10 @@
 
   @Override
   public BlazeCommandResult exec(
-      final CommandEnvironment env, final OptionsProvider optionsProvider) {
+      final CommandEnvironment env, final OptionsParsingResult optionsParsingResult) {
     final BlazeRuntime runtime = env.getRuntime();
     env.getReporter().switchToAnsiAllowingHandler();
-    Options infoOptions = optionsProvider.getOptions(Options.class);
+    Options infoOptions = optionsParsingResult.getOptions(Options.class);
     OutErr outErr = env.getReporter().getOutErr();
     // Creating a BuildConfiguration is expensive and often unnecessary. Delay the creation until
     // it is needed. We memoize so that it's cached intra-command (it's still created freshly on
@@ -128,14 +128,14 @@
                 // the package path. Since info inherits all the build options, all the necessary
                 // information is available here.
                 env.setupPackageCache(
-                    optionsProvider, runtime.getDefaultsPackageContent(optionsProvider));
+                    optionsParsingResult, runtime.getDefaultsPackageContent(optionsParsingResult));
                 env.getSkyframeExecutor()
                     .setConfigurationFragmentFactories(runtime.getConfigurationFragmentFactories());
                 // TODO(bazel-team): What if there are multiple configurations? [multi-config]
                 return env.getSkyframeExecutor()
                     .getConfiguration(
                         env.getReporter(),
-                        runtime.createBuildOptions(optionsProvider),
+                        runtime.createBuildOptions(optionsParsingResult),
                         /*keepGoing=*/ true);
               } catch (InvalidConfigurationException e) {
                 env.getReporter().handle(Event.error(e.getMessage()));
@@ -149,7 +149,7 @@
               }
             });
 
-    Map<String, InfoItem> items = getInfoItemMap(env, optionsProvider);
+    Map<String, InfoItem> items = getInfoItemMap(env, optionsParsingResult);
 
     try {
       if (infoOptions.showMakeEnvironment) {
@@ -160,7 +160,7 @@
         }
       }
 
-      List<String> residue = optionsProvider.getResidue();
+      List<String> residue = optionsParsingResult.getResidue();
       if (residue.size() > 1) {
         env.getReporter().handle(Event.error("at most one key may be specified"));
         return BlazeCommandResult.exitCode(ExitCode.COMMAND_LINE_ERROR);
@@ -206,7 +206,7 @@
     return BlazeCommandResult.exitCode(ExitCode.SUCCESS);
   }
 
-  static Map<String, InfoItem> getHardwiredInfoItemMap(OptionsProvider commandOptions,
+  static Map<String, InfoItem> getHardwiredInfoItemMap(OptionsParsingResult commandOptions,
       String productName) {
     List<InfoItem> hardwiredInfoItems =
         ImmutableList.<InfoItem>of(
@@ -251,9 +251,9 @@
   }
 
   static Map<String, InfoItem> getInfoItemMap(
-      CommandEnvironment env, OptionsProvider optionsProvider) {
+      CommandEnvironment env, OptionsParsingResult optionsParsingResult) {
     Map<String, InfoItem> items = new TreeMap<>(env.getRuntime().getInfoItems());
-    items.putAll(getHardwiredInfoItemMap(optionsProvider, env.getRuntime().getProductName()));
+    items.putAll(getHardwiredInfoItemMap(optionsParsingResult, env.getRuntime().getProductName()));
     return items;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
index 004335d..b209a5d0 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
@@ -38,7 +38,7 @@
 import com.google.devtools.build.lib.util.ProcessUtils;
 import com.google.devtools.build.lib.util.StringUtilities;
 import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
@@ -308,9 +308,9 @@
    * Info item for package_path
    */
   public static final class PackagePathInfoItem extends InfoItem {
-    private final OptionsProvider commandOptions;
+    private final OptionsParsingResult commandOptions;
 
-    public PackagePathInfoItem(OptionsProvider commandOptions) {
+    public PackagePathInfoItem(OptionsParsingResult commandOptions) {
       super("package_path",
           "The search path for resolving package labels.",
           false);
@@ -659,9 +659,9 @@
    */
   @Deprecated
   public static final class DefaultPackagePathInfoItem extends InfoItem {
-    private final OptionsProvider commandOptions;
+    private final OptionsParsingResult commandOptions;
 
-    public DefaultPackagePathInfoItem(OptionsProvider commandOptions) {
+    public DefaultPackagePathInfoItem(OptionsParsingResult commandOptions) {
       super("default-package-path",
           "The default package path",
           true);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/LicenseCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/LicenseCommand.java
index a7ca2c6..d181bd2 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/LicenseCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/LicenseCommand.java
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.util.ResourceFileLoader;
 import com.google.devtools.build.lib.util.io.OutErr;
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.nio.file.FileVisitResult;
@@ -50,7 +50,7 @@
   }
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     env.getEventBus().post(new NoBuildEvent());
     OutErr outErr = env.getReporter().getOutErr();
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/PrintActionCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/PrintActionCommand.java
index 46507cc..b7ea9f4 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/PrintActionCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/PrintActionCommand.java
@@ -57,7 +57,7 @@
 import com.google.devtools.common.options.OptionEffectTag;
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import com.google.protobuf.TextFormat;
 import java.util.ArrayList;
 import java.util.LinkedHashSet;
@@ -100,7 +100,7 @@
   }
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     LoadingOptions loadingOptions =
         options.getOptions(LoadingOptions.class);
 
@@ -117,15 +117,19 @@
    */
   private class PrintActionRunner {
     private final boolean compileOneDependency;
-    private final OptionsProvider options;
+    private final OptionsParsingResult options;
     private final OutErr outErr;
     private final List<String> requestedTargets;
     private final boolean keepGoing;
     private final ExtraActionSummary.Builder summaryBuilder;
     private final Predicate<ActionAnalysisMetadata> actionMnemonicMatcher;
 
-    public PrintActionRunner(boolean compileOneDependency, OptionsProvider options, OutErr outErr,
-        List<String> requestedTargets, final Set<String> printActionMnemonics) {
+    public PrintActionRunner(
+        boolean compileOneDependency,
+        OptionsParsingResult options,
+        OutErr outErr,
+        List<String> requestedTargets,
+        final Set<String> printActionMnemonics) {
       this.compileOneDependency = compileOneDependency;
       this.options = options;
       this.outErr = outErr;
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
index 971bd90..8590ea4 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
@@ -43,7 +43,7 @@
 import com.google.devtools.common.options.OptionEffectTag;
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.BufferedOutputStream;
 import java.io.IOException;
 import java.io.PrintStream;
@@ -213,7 +213,7 @@
   public void editOptions(OptionsParser optionsParser) {}
 
   @Override
-  public BlazeCommandResult exec(final CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(final CommandEnvironment env, OptionsParsingResult options) {
     ProfileOptions opts =
         options.getOptions(ProfileOptions.class);
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java
index d4d54b7..39701de 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java
@@ -27,7 +27,7 @@
 import com.google.devtools.common.options.OptionPriority.PriorityCategory;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.util.List;
 
 /**
@@ -89,7 +89,7 @@
    * process it.
    */
   public static List<String> getTargets(
-      ProjectFile.Provider projectFileProvider, OptionsProvider options) {
+      ProjectFile.Provider projectFileProvider, OptionsParsingResult options) {
     List<String> targets = options.getResidue();
     if (projectFileProvider != null && !targets.isEmpty()
         && targets.get(0).startsWith(PROJECT_FILE_PREFIX)) {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
index ae80554..659d6c5 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
@@ -50,7 +50,7 @@
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.skyframe.WalkableGraph;
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.BufferedOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -89,7 +89,7 @@
    *        (only when --keep_going is in effect.)
    */
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     BlazeRuntime runtime = env.getRuntime();
     QueryOptions queryOptions = options.getOptions(QueryOptions.class);
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
index 67a00b6..be09a8b 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
@@ -77,7 +77,7 @@
 import com.google.devtools.common.options.OptionEffectTag;
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import com.google.protobuf.ByteString;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
@@ -233,7 +233,7 @@
   }
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     RunOptions runOptions = options.getOptions(RunOptions.class);
     // This list should look like: ["//executable:target", "arg1", "arg2"]
     List<String> targetAndArgs = options.getResidue();
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ShutdownCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ShutdownCommand.java
index 2047679..f6b6c50 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ShutdownCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ShutdownCommand.java
@@ -23,7 +23,7 @@
 import com.google.devtools.common.options.OptionEffectTag;
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 
 /**
  * The 'blaze shutdown' command.
@@ -55,7 +55,7 @@
   public void editOptions(OptionsParser optionsParser) {}
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     int limit = options.getOptions(Options.class).heapSizeLimit;
 
     // Iff limit is non-zero, shut down the server if total memory exceeds the
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java
index 5887aa5..1c380f9 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/TestCommand.java
@@ -42,7 +42,7 @@
 import com.google.devtools.common.options.OptionPriority.PriorityCategory;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.util.Collection;
 import java.util.List;
 
@@ -82,7 +82,7 @@
   }
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     TestOutputFormat testOutput = options.getOptions(ExecutionOptions.class).testOutput;
     if (testOutput == TestStrategy.TestOutputFormat.STREAMED) {
       env.getReporter().handle(Event.warn(
@@ -107,7 +107,7 @@
   }
 
   private BlazeCommandResult doTest(CommandEnvironment env,
-      OptionsProvider options,
+      OptionsParsingResult options,
       AggregatingTestListener testListener) {
     BlazeRuntime runtime = env.getRuntime();
     // Run simultaneous build and test.
@@ -176,7 +176,7 @@
   private boolean analyzeTestResults(Collection<ConfiguredTarget> testTargets,
                                      Collection<ConfiguredTarget> skippedTargets,
                                      AggregatingTestListener listener,
-                                     OptionsProvider options) {
+                                     OptionsParsingResult options) {
     TestResultNotifier notifier = new TerminalTestResultNotifier(printer, options);
     return listener.getAnalyzer().differentialAnalyzeAndReport(
         testTargets, skippedTargets, listener, notifier);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/VersionCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/VersionCommand.java
index 729c3b7..ce0b18f 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/VersionCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/VersionCommand.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.util.ExitCode;
 import com.google.devtools.common.options.OptionsParser;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 
 /**
  * The 'blaze version' command, which informs users about the blaze version
@@ -39,7 +39,7 @@
   public void editOptions(OptionsParser optionsParser) {}
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     BlazeVersionInfo info = BlazeVersionInfo.instance();
     if (info.getSummary() == null) {
       env.getReporter().handle(Event.error("Version information not available"));
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java
index e5a3329..3b61fb4 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java
@@ -51,7 +51,7 @@
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -141,7 +141,7 @@
   private static final String NO_TARGET_MESSAGE = "No targets found to run";
 
   @Override
-  public BlazeCommandResult exec(CommandEnvironment env, OptionsProvider options) {
+  public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
     Options mobileInstallOptions = options.getOptions(Options.class);
     WriteAdbArgsAction.Options adbOptions = options.getOptions(WriteAdbArgsAction.Options.class);
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallModule.java b/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallModule.java
index 5942699..5ae08e8 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallModule.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallModule.java
@@ -15,14 +15,14 @@
 
 import com.google.devtools.build.lib.runtime.BlazeModule;
 import com.google.devtools.build.lib.runtime.ServerBuilder;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 
 /**
  * Module for mobile_install.
  */
 public final class MobileInstallModule extends BlazeModule {
   @Override
-  public void serverInit(OptionsProvider startupOptions, ServerBuilder builder) {
+  public void serverInit(OptionsParsingResult startupOptions, ServerBuilder builder) {
     builder.addCommands(
         new MobileInstallCommand());
   }
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxHelpers.java b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxHelpers.java
index 29b6065..ee6a959 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxHelpers.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxHelpers.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.exec.SpawnRunner.SpawnExecutionContext;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.ArrayList;
@@ -124,7 +124,7 @@
    * reference to the full set of build options (and also for performance, since this only needs to
    * be checked once-per-build).
    */
-  static boolean shouldAllowNetwork(OptionsProvider buildOptions) {
+  static boolean shouldAllowNetwork(OptionsParsingResult buildOptions) {
     // Allow network access, when --java_debug is specified, otherwise we can't connect to the
     // remote debug server of the test. This intentionally overrides the "block-network" execution
     // tag.
diff --git a/src/main/java/com/google/devtools/build/lib/util/OptionsUtils.java b/src/main/java/com/google/devtools/build/lib/util/OptionsUtils.java
index 029d08c..343c9d5 100644
--- a/src/main/java/com/google/devtools/build/lib/util/OptionsUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/util/OptionsUtils.java
@@ -18,7 +18,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.common.options.Converter;
-import com.google.devtools.common.options.OptionsProvider;
+import com.google.devtools.common.options.OptionsParsingResult;
 import com.google.devtools.common.options.ParsedOptionDescription;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -51,7 +51,7 @@
    * Returns a string representation of the non-hidden explicitly or implicitly
    * specified options; option values are shell-escaped.
    */
-  public static String asShellEscapedString(OptionsProvider options) {
+  public static String asShellEscapedString(OptionsParsingResult options) {
     return asShellEscapedString(options.asCompleteListOfParsedOptions());
   }
 
@@ -74,7 +74,7 @@
    * Return a representation of the non-hidden specified options, as a list of string. No escaping
    * is done.
    */
-  public static List<String> asArgumentList(OptionsProvider options) {
+  public static List<String> asArgumentList(OptionsParsingResult options) {
     return asArgumentList(options.asCompleteListOfParsedOptions());
   }
 
@@ -83,7 +83,7 @@
    * filtering out any sensitive options; option values are shell-escaped.
    */
   public static String asFilteredShellEscapedString(
-      OptionsProvider options, Iterable<ParsedOptionDescription> optionsList) {
+      OptionsParsingResult options, Iterable<ParsedOptionDescription> optionsList) {
     return asShellEscapedString(optionsList);
   }
 
@@ -92,7 +92,7 @@
    * specified options, filtering out any sensitive options; option values are
    * shell-escaped.
    */
-  public static String asFilteredShellEscapedString(OptionsProvider options) {
+  public static String asFilteredShellEscapedString(OptionsParsingResult options) {
     return asFilteredShellEscapedString(options, options.asCompleteListOfParsedOptions());
   }
 
diff --git a/src/main/java/com/google/devtools/common/options/OptionsParser.java b/src/main/java/com/google/devtools/common/options/OptionsParser.java
index e1c7cbb..9810988 100644
--- a/src/main/java/com/google/devtools/common/options/OptionsParser.java
+++ b/src/main/java/com/google/devtools/common/options/OptionsParser.java
@@ -66,7 +66,7 @@
  *
  * @see Options a simpler class which you can use if you only have one options specification class
  */
-public class OptionsParser implements OptionsProvider {
+public class OptionsParser implements OptionsParsingResult {
 
   // TODO(b/65049598) make ConstructionException checked.
   /**
diff --git a/src/main/java/com/google/devtools/common/options/OptionsProvider.java b/src/main/java/com/google/devtools/common/options/OptionsParsingResult.java
similarity index 97%
rename from src/main/java/com/google/devtools/common/options/OptionsProvider.java
rename to src/main/java/com/google/devtools/common/options/OptionsParsingResult.java
index 3168564..655b856 100644
--- a/src/main/java/com/google/devtools/common/options/OptionsProvider.java
+++ b/src/main/java/com/google/devtools/common/options/OptionsParsingResult.java
@@ -21,7 +21,7 @@
  * A read-only interface for options parser results, which does not allow any
  * further parsing of options.
  */
-public interface OptionsProvider extends OptionsClassProvider {
+public interface OptionsParsingResult extends OptionsClassProvider {
 
 
   /**
