diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java
index 20879e4..5733e07 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java
@@ -14,14 +14,10 @@
 
 package com.google.devtools.build.lib.bazel.rules.cpp;
 
-import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.packages.SkylarkProvider.SkylarkKey;
 import com.google.devtools.build.lib.packages.StructImpl;
@@ -76,11 +72,6 @@
   }
 
   @Override
-  public NestedSet<Artifact> getAdditionalPrunableIncludes() {
-    return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
-  }
-
-  @Override
   public HeadersCheckingMode determineHeadersCheckingMode(RuleContext ruleContext) {
     return HeadersCheckingMode.STRICT;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
index 940f88a..2cca679 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
@@ -965,12 +965,10 @@
     private final Artifact.DerivedArtifact picHeaderModule;
 
     /** All header files that are compiled into this module. */
-    // Note: this change will be reverted in the migration cl.
-    public final ImmutableList<Artifact> modularHeaders;
+    private final ImmutableList<Artifact> modularHeaders;
 
     /** All header files that are contained in this module. */
-    // Note: this change will be reverted in the migration cl.
-    public final ImmutableList<Artifact> textualHeaders;
+    private final ImmutableList<Artifact> textualHeaders;
 
     HeaderInfo(
         Artifact.DerivedArtifact headerModule,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
index 079185f..c135a77 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
@@ -444,17 +444,6 @@
   }
 
   /**
-   * Add directly to privateHeaders, which are added to the compilation prerequisites and can be
-   * removed by include scanning. This is only used to work around cases where we are not
-   * propagating transitive dependencies properly via scheduling dependency middleman (i.e. objc
-   * compiles).
-   */
-  public CcCompilationHelper addPrivateHeadersUnchecked(Collection<Artifact> privateHeaders) {
-    this.privateHeaders.addAll(privateHeaders);
-    return this;
-  }
-
-  /**
    * Add the corresponding files as source files. These may also be header files, in which case they
    * will not be compiled, but also not made visible as includes to dependent rules. The given build
    * variables will be added to those used for compiling this source.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
index 80a98e0..2485bff 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
@@ -56,7 +56,6 @@
 import com.google.devtools.build.lib.analysis.skylark.Args;
 import com.google.devtools.build.lib.cmdline.LabelConstants;
 import com.google.devtools.build.lib.collect.CollectionUtils;
-import com.google.devtools.build.lib.collect.compacthashset.CompactHashSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -67,7 +66,6 @@
 import com.google.devtools.build.lib.profiler.ProfilerTask;
 import com.google.devtools.build.lib.profiler.SilentCloseable;
 import com.google.devtools.build.lib.rules.cpp.CcCommon.CoptsFilter;
-import com.google.devtools.build.lib.rules.cpp.CcCompilationContext.IncludeScanningHeaderDataHelper;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.IncludeScanner.IncludeScanningHeaderData;
 import com.google.devtools.build.lib.skyframe.ActionExecutionValue;
@@ -92,8 +90,6 @@
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
@@ -199,8 +195,6 @@
   private ParamFileActionInput paramFileActionInput;
   private PathFragment paramFilePath;
 
-  private final Iterable<Artifact> alternateIncludeScanningDataInputs;
-
   /**
    * Creates a new action to compile C/C++ source files.
    *
@@ -310,7 +304,6 @@
               .getParentDirectory()
               .getChild(outputFile.getFilename() + ".params");
     }
-    this.alternateIncludeScanningDataInputs = cppSemantics.getAlternateIncludeScanningDataInputs();
   }
 
   static CompileCommandLine buildCommandLine(
@@ -515,60 +508,6 @@
    * This method returns null when a required SkyValue is missing and a Skyframe restart is
    * required.
    */
-  // Note: this function will be deleted in the migration cl.
-  @Nullable
-  private static IncludeScanningHeaderData.Builder createIncludeScanningHeaderData(
-      SkyFunction.Environment env,
-      List<CcCompilationContext.HeaderInfo> headerInfos,
-      Iterable<Artifact> inputs)
-      throws InterruptedException {
-    Map<PathFragment, Artifact> pathToLegalOutputArtifact = new HashMap<>();
-    ArrayList<Artifact> treeArtifacts = new ArrayList<>();
-    // Not using range-based for loops here and below as the additional overhead of the
-    // ImmutableList iterators has shown up in profiles.
-    for (CcCompilationContext.HeaderInfo headerInfo : headerInfos) {
-      for (Artifact a : headerInfo.modularHeaders) {
-        IncludeScanningHeaderDataHelper.handleArtifact(a, pathToLegalOutputArtifact, treeArtifacts);
-      }
-      for (Artifact a : headerInfo.textualHeaders) {
-        IncludeScanningHeaderDataHelper.handleArtifact(a, pathToLegalOutputArtifact, treeArtifacts);
-      }
-    }
-    for (Artifact a : inputs) {
-      IncludeScanningHeaderDataHelper.handleArtifact(a, pathToLegalOutputArtifact, treeArtifacts);
-    }
-    if (!IncludeScanningHeaderDataHelper.handleTreeArtifacts(
-        env, pathToLegalOutputArtifact, treeArtifacts)) {
-      return null;
-    }
-    return new IncludeScanningHeaderData.Builder(
-        Collections.unmodifiableMap(pathToLegalOutputArtifact),
-        Collections.unmodifiableSet(CompactHashSet.create()));
-  }
-
-  /**
-   * This method returns null when a required SkyValue is missing and a Skyframe restart is
-   * required.
-   */
-  @Nullable
-  public IncludeScanningHeaderData.Builder createIncludeScanningHeaderData(
-      SkyFunction.Environment env,
-      boolean usePic,
-      boolean useHeaderModules,
-      List<CcCompilationContext.HeaderInfo> headerInfo)
-      throws InterruptedException {
-    if (alternateIncludeScanningDataInputs != null) {
-      return createIncludeScanningHeaderData(env, headerInfo, alternateIncludeScanningDataInputs);
-    } else {
-      return ccCompilationContext.createIncludeScanningHeaderData(
-          env, usePic, useHeaderModules, headerInfo);
-    }
-  }
-
-  /**
-   * This method returns null when a required SkyValue is missing and a Skyframe restart is
-   * required.
-   */
   @Nullable
   @Override
   public NestedSet<Artifact> discoverInputs(ActionExecutionContext actionExecutionContext)
@@ -593,7 +532,7 @@
       List<CcCompilationContext.HeaderInfo> headerInfo =
           ccCompilationContext.getTransitiveHeaderInfos();
       IncludeScanningHeaderData.Builder includeScanningHeaderData =
-          createIncludeScanningHeaderData(
+          ccCompilationContext.createIncludeScanningHeaderData(
               actionExecutionContext.getEnvironmentForDiscoveringInputs(),
               usePic,
               useHeaderModules,
@@ -1612,7 +1551,7 @@
       throws ActionExecutionException, InterruptedException {
     try {
       IncludeScanningHeaderData.Builder includeScanningHeaderData =
-          createIncludeScanningHeaderData(
+          ccCompilationContext.createIncludeScanningHeaderData(
               actionExecutionContext.getEnvironmentForDiscoveringInputs(),
               usePic,
               useHeaderModules,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
index d4fd87c..8c1d2d6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
@@ -362,9 +362,7 @@
   }
 
   NestedSet<Artifact> buildPrunableHeaders() {
-    return NestedSetBuilder.fromNestedSet(cppSemantics.getAdditionalPrunableIncludes())
-        .addAll(additionalPrunableHeaders)
-        .build();
+    return NestedSetBuilder.<Artifact>stableOrder().addAll(additionalPrunableHeaders).build();
   }
 
   NestedSet<Artifact> buildInputsForInvalidation() {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java
index 55f793c..72b9fa3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java
@@ -14,11 +14,9 @@
 
 package com.google.devtools.build.lib.rules.cpp;
 
-import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.HeadersCheckingMode;
@@ -36,16 +34,6 @@
       FeatureConfiguration featureConfiguration,
       CppCompileActionBuilder actionBuilder);
 
-  /**
-   * Returns the set of includes which are not mandatory and may be pruned by include processing.
-   */
-  NestedSet<Artifact> getAdditionalPrunableIncludes();
-
-  /** Return an alternate source of inputs for constructing the include scanning data. */
-  default Iterable<Artifact> getAlternateIncludeScanningDataInputs() {
-    return null;
-  }
-
   /** Determines the applicable mode of headers checking for the passed in ruleContext. */
   HeadersCheckingMode determineHeadersCheckingMode(RuleContext ruleContext);
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
index 2400ac6..8a42747f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
@@ -201,7 +201,7 @@
             platform);
 
     ObjcProvider.Builder objcProviderBuilder =
-        new ObjcProvider.Builder(ruleContext.getAnalysisEnvironment().getSkylarkSemantics());
+        new ObjcProvider.NativeBuilder(ruleContext.getAnalysisEnvironment().getSkylarkSemantics());
     for (DependencySpecificConfiguration dependencySpecificConfiguration :
         dependencySpecificConfigurations) {
       objcProviderBuilder.addTransitiveAndPropagate(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
index 7f446cc..10a327e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
@@ -71,6 +71,10 @@
       "Value for key %s must be a set of %s, instead found %s.";
 
   @VisibleForTesting
+  public static final String BAD_FRAMEWORK_PATH_ERROR =
+      "Value for key framework_search_paths must end in .framework; instead found %s.";
+
+  @VisibleForTesting
   public static final String BAD_PROVIDERS_ITER_ERROR =
       "Value for argument 'providers' must be a list of ObjcProvider instances, instead found %s.";
 
@@ -187,7 +191,8 @@
   // This method is registered statically for skylark, and never called directly.
   public ObjcProvider newObjcProvider(Boolean usesSwift, Dict<?, ?> kwargs, StarlarkThread thread)
       throws EvalException {
-    ObjcProvider.Builder resultBuilder = new ObjcProvider.Builder(thread.getSemantics());
+    ObjcProvider.StarlarkBuilder resultBuilder =
+        new ObjcProvider.StarlarkBuilder(thread.getSemantics());
     if (usesSwift) {
       resultBuilder.add(ObjcProvider.FLAG, ObjcProvider.Flag.USES_SWIFT);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java
index 1735084..2e7f19d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java
@@ -100,7 +100,7 @@
             .add(ruleIntermediateArtifacts.combinedArchitectureArchive());
 
     ObjcProvider.Builder objcProviderBuilder =
-        new ObjcProvider.Builder(ruleContext.getAnalysisEnvironment().getSkylarkSemantics());
+        new ObjcProvider.NativeBuilder(ruleContext.getAnalysisEnvironment().getSkylarkSemantics());
 
     ImmutableListMultimap<BuildConfiguration, ObjcProtoProvider> objcProtoProvidersByConfig =
         ruleContext.getPrerequisitesByConfiguration(
@@ -146,7 +146,8 @@
               protosObjcProvider);
       ObjcProvider objcProvider =
           common
-              .getObjcProvider()
+              .getObjcProviderBuilder()
+              .build()
               .subtractSubtrees(
                   cpuToObjcAvoidDepsMap.get(childCpu),
                   cpuToCcAvoidDepsMap.get(childCpu).stream()
@@ -220,7 +221,7 @@
 
     CompilationArtifacts compilationArtifacts = new CompilationArtifacts.Builder().build();
 
-    return new ObjcCommon.Builder(ruleContext, buildConfiguration)
+    return new ObjcCommon.Builder(ObjcCommon.Purpose.LINK_ONLY, ruleContext, buildConfiguration)
         .setCompilationAttributes(
             CompilationAttributes.Builder.fromRuleContext(ruleContext).build())
         .setCompilationArtifacts(compilationArtifacts)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
index 054bf65..a81f873 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
@@ -14,17 +14,14 @@
 
 package com.google.devtools.build.lib.rules.objc;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.ImmutableSortedSet.toImmutableSortedSet;
 import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates;
 import static com.google.devtools.build.lib.rules.cpp.Link.LINK_LIBRARY_FILETYPES;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.DEFINE;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.DYNAMIC_FRAMEWORK_FILE;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.FORCE_LOAD_LIBRARY;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.FRAMEWORK_SEARCH_PATHS;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.IMPORTED_LIBRARY;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.INCLUDE;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.INCLUDE_SYSTEM;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.IQUOTE;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LIBRARY;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LINK_INPUTS;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.SDK_DYLIB;
@@ -42,7 +39,6 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
@@ -249,19 +245,6 @@
   public static final SafeImplicitOutputsFunction FULLY_LINKED_LIB =
       fromTemplates("%{name}_fully_linked.a");
 
-  /**
-   * Returns additional inputs to include processing, outside of the headers provided by
-   * ObjProvider.
-   */
-  private Iterable<Artifact> getExtraIncludeProcessingInputs(
-      Collection<Artifact> privateHdrs, Artifact pchHdr) {
-    Iterable<Artifact> extraInputs = privateHdrs;
-    if (pchHdr != null) {
-      extraInputs = Iterables.concat(extraInputs, ImmutableList.of(pchHdr));
-    }
-    return extraInputs;
-  }
-
   /** Create and return the include processing to be used. */
   private IncludeProcessing createIncludeProcessing() {
     switch (includeProcessingType) {
@@ -272,6 +255,14 @@
     }
   }
 
+  private static ImmutableList<String> pathsToIncludeArgs(Iterable<PathFragment> paths) {
+    ImmutableList.Builder<String> builder = ImmutableList.<String>builder();
+    for (PathFragment path : paths) {
+      builder.add("-I" + path);
+    }
+    return builder.build();
+  }
+
   private CompilationInfo compile(
       ObjcCompilationContext objcCompilationContext,
       VariablesExtension extension,
@@ -282,13 +273,11 @@
       Collection<Artifact> sources,
       Collection<Artifact> privateHdrs,
       Collection<Artifact> publicHdrs,
-      Collection<Artifact> dependentGeneratedHdrs,
       Artifact pchHdr,
       ObjcCppSemantics semantics,
       String purpose,
       boolean generateModuleMap)
       throws RuleErrorException, InterruptedException {
-    ObjcProvider depObjcProvidersSummary = objcCompilationContext.getDepObjcProvidersSummary();
     CcCompilationHelper result =
         new CcCompilationHelper(
                 ruleContext,
@@ -307,17 +296,12 @@
             .addPublicHeaders(publicHdrs)
             .addPublicTextualHeaders(objcCompilationContext.getPublicTextualHeaders())
             .addPrivateHeaders(privateHdrs)
-            .addPrivateHeadersUnchecked(dependentGeneratedHdrs)
-            .addDefines(depObjcProvidersSummary.get(DEFINE))
-            .addDefines(objcCompilationContext.getDefines())
+            .addDefines(
+                NestedSetBuilder.wrap(Order.LINK_ORDER, objcCompilationContext.getDefines()))
             .addIncludeDirs(priorityHeaders)
             .addIncludeDirs(objcCompilationContext.getIncludes())
-            .addIncludeDirs(depObjcProvidersSummary.get(INCLUDE))
             .addSystemIncludeDirs(objcCompilationContext.getSystemIncludes())
-            .addSystemIncludeDirs(depObjcProvidersSummary.get(INCLUDE_SYSTEM))
             .addQuoteIncludeDirs(objcCompilationContext.getQuoteIncludes())
-            .addQuoteIncludeDirs(depObjcProvidersSummary.get(IQUOTE))
-            .addFrameworkIncludeDirs(frameworkHeaderSearchPathFragments(depObjcProvidersSummary))
             .addCcCompilationContexts(objcCompilationContext.getDepCcCompilationContexts())
             .setCopts(
                 ImmutableList.<String>builder()
@@ -327,6 +311,8 @@
                             .getFragment(ObjcConfiguration.class)
                             .getCoptsForCompilationMode())
                     .addAll(extraCompileArgs)
+                    .addAll(
+                        pathsToIncludeArgs(objcCompilationContext.getStrictDependencyIncludes()))
                     .build())
             .setCppModuleMap(intermediateArtifacts.moduleMap())
             .setPropagateModuleMapToCompileAction(false)
@@ -336,7 +322,7 @@
             .setHeadersCheckingMode(semantics.determineHeadersCheckingMode(ruleContext));
 
     if (pchHdr != null) {
-      result.addAdditionalInputs(ImmutableList.of(pchHdr));
+      result.addPublicTextualHeaders(ImmutableList.of(pchHdr));
     }
 
     if (getCustomModuleMap(ruleContext).isPresent() || !generateModuleMap) {
@@ -346,7 +332,34 @@
     return result.compile();
   }
 
-  private Pair<CcCompilationOutputs, ImmutableMap<String, NestedSet<Artifact>>> ccCompileAndLink(
+  private static class CompilationResult {
+    private final CcCompilationContext ccCompilationContext;
+    private final CcCompilationOutputs ccCompilationOutputs;
+    private final ImmutableMap<String, NestedSet<Artifact>> outputGroups;
+
+    public CompilationResult(
+        CcCompilationContext ccCompilationContext,
+        CcCompilationOutputs ccCompilationOutputs,
+        ImmutableMap<String, NestedSet<Artifact>> outputGroups) {
+      this.ccCompilationContext = ccCompilationContext;
+      this.ccCompilationOutputs = ccCompilationOutputs;
+      this.outputGroups = outputGroups;
+    }
+
+    public CcCompilationContext getCcCompilationContext() {
+      return ccCompilationContext;
+    }
+
+    public CcCompilationOutputs getCcCompilationOutputs() {
+      return ccCompilationOutputs;
+    }
+
+    public ImmutableMap<String, NestedSet<Artifact>> getOutputGroups() {
+      return outputGroups;
+    }
+  }
+
+  private CompilationResult ccCompileAndLink(
       ObjcCompilationContext objcCompilationContext,
       CompilationArtifacts compilationArtifacts,
       ObjcVariablesExtension.Builder extensionBuilder,
@@ -369,22 +382,8 @@
                 attributes.hdrs().toList().stream(),
                 compilationArtifacts.getAdditionalHdrs().toList().stream())
             .collect(toImmutableSortedSet(naturalOrder()));
-    // This is a hack to inject generated headers into the action graph for include scanning.  This
-    // is supposed to be done via the compilation prerequisite middleman artifact of dependent
-    // CcCompilationContexts, but ObjcProvider does not propagate that.  This issue will go away
-    // when we finish migrating the compile info in ObjcProvider to CcCompilationContext.
-    //
-    // To limit the extra work we're adding, we only add what is required, i.e. the generated
-    // headers.  Headers from own rule's attributes and from dependent CcCompilationContext are
-    // already accounted for, so we only need the ones from depObjcProviders.
-    Collection<Artifact> dependentGeneratedHdrs =
-        (includeProcessingType == IncludeProcessingType.INCLUDE_SCANNING)
-            ? objcCompilationContext.getDepObjcProvidersSummary().getGeneratedHeaderList()
-            : ImmutableList.of();
     Artifact pchHdr = getPchFile().orNull();
-    ObjcCppSemantics semantics =
-        createObjcCppSemantics(
-            objcCompilationContext.getDepObjcProvidersSummary(), privateHdrs, pchHdr);
+    ObjcCppSemantics semantics = createObjcCppSemantics();
 
     String purpose = String.format("%s_objc_arc", semantics.getPurpose());
     extensionBuilder.setArcEnabled(true);
@@ -399,7 +398,6 @@
             arcSources,
             privateHdrs,
             publicHdrs,
-            dependentGeneratedHdrs,
             pchHdr,
             semantics,
             purpose,
@@ -418,7 +416,6 @@
             nonArcSources,
             privateHdrs,
             publicHdrs,
-            dependentGeneratedHdrs,
             pchHdr,
             semantics,
             purpose,
@@ -511,17 +508,16 @@
     Map<String, NestedSet<Artifact>> mergedOutputGroups =
         CcCommon.mergeOutputGroups(ImmutableList.of(arcOutputGroups, nonArcOutputGroups));
 
-    return new Pair<>(compilationOutputsBuilder.build(), ImmutableMap.copyOf(mergedOutputGroups));
+    return new CompilationResult(
+        ccCompilationContextBuilder.build(),
+        compilationOutputsBuilder.build(),
+        ImmutableMap.copyOf(mergedOutputGroups));
   }
 
-  ObjcCppSemantics createObjcCppSemantics(
-      ObjcProvider objcProvider, Collection<Artifact> privateHdrs, Artifact pchHdr) {
-    Iterable<Artifact> extraInputs = getExtraIncludeProcessingInputs(privateHdrs, pchHdr);
+  ObjcCppSemantics createObjcCppSemantics() {
     return new ObjcCppSemantics(
-        objcProvider,
         includeProcessingType,
         createIncludeProcessing(),
-        extraInputs,
         ruleContext.getFragment(ObjcConfiguration.class),
         intermediateArtifacts,
         buildConfiguration,
@@ -666,11 +662,6 @@
         .build();
   }
 
-  /** Returns a list of framework header search path fragments. */
-  static ImmutableList<PathFragment> frameworkHeaderSearchPathFragments(ObjcProvider provider) {
-    return uniqueParentDirectories(provider.get(FRAMEWORK_SEARCH_PATHS)).asList();
-  }
-
   /** Returns a list of framework library search paths. */
   static ImmutableList<String> frameworkLibrarySearchPaths(ObjcProvider provider) {
     ImmutableList.Builder<String> searchPaths = new ImmutableList.Builder<>();
@@ -694,6 +685,17 @@
   private final boolean isTestRule;
   private final boolean usePch;
   private final IncludeProcessingType includeProcessingType;
+  private Optional<ObjcProvider> objcProvider;
+
+  private void setObjcProvider(ObjcProvider objcProvider) {
+    checkState(!this.objcProvider.isPresent());
+    this.objcProvider = Optional.of(objcProvider);
+  }
+
+  public ObjcProvider getObjcProvider() {
+    checkState(objcProvider.isPresent());
+    return objcProvider.get();
+  }
 
   /**
    * Creates a new compilation support for the given rule and build configuration.
@@ -728,6 +730,7 @@
     this.isTestRule = isTestRule;
     this.outputGroupCollector = outputGroupCollector;
     this.objectFilesCollector = objectFilesCollector;
+    this.objcProvider = Optional.absent();
     this.usePch = usePch;
     if (toolchain == null
         && ruleContext
@@ -833,7 +836,7 @@
 
     /** Returns a {@link CompilationSupport} instance. */
     public CompilationSupport build() throws InterruptedException {
-      Preconditions.checkNotNull(ruleContext, "CompilationSupport is missing RuleContext");
+      checkNotNull(ruleContext, "CompilationSupport is missing RuleContext");
 
       if (buildConfiguration == null) {
         buildConfiguration = ruleContext.getConfiguration();
@@ -948,6 +951,7 @@
     return registerCompileAndArchiveActions(
         compilationArtifacts,
         objcCompilationContext,
+        Optional.absent(),
         ExtraCompileArgs.NONE,
         ImmutableList.<PathFragment>of());
   }
@@ -992,11 +996,12 @@
   private CompilationSupport registerCompileAndArchiveActions(
       CompilationArtifacts compilationArtifacts,
       ObjcCompilationContext objcCompilationContext,
+      Optional<ObjcCommon> objcCommon,
       ExtraCompileArgs extraCompileArgs,
       List<PathFragment> priorityHeaders)
       throws RuleErrorException, InterruptedException {
-    Preconditions.checkNotNull(toolchain);
-    Preconditions.checkNotNull(toolchain.getFdoContext());
+    checkNotNull(toolchain);
+    checkNotNull(toolchain.getFdoContext());
     ObjcVariablesExtension.Builder extension =
         new ObjcVariablesExtension.Builder()
             .setRuleContext(ruleContext)
@@ -1004,14 +1009,14 @@
             .setIntermediateArtifacts(intermediateArtifacts)
             .setConfiguration(buildConfiguration);
 
-    Pair<CcCompilationOutputs, ImmutableMap<String, NestedSet<Artifact>>> compilationInfo;
+    CompilationResult compilationResult;
 
     if (compilationArtifacts.getArchive().isPresent()) {
       Artifact objList = intermediateArtifacts.archiveObjList();
 
       extension.addVariableCategory(VariableCategory.ARCHIVE_VARIABLES);
 
-      compilationInfo =
+      compilationResult =
           ccCompileAndLink(
               objcCompilationContext,
               compilationArtifacts,
@@ -1025,10 +1030,11 @@
 
       // TODO(b/30783125): Signal the need for this action in the CROSSTOOL.
       registerObjFilelistAction(
-          ImmutableSet.copyOf(compilationInfo.getFirst().getObjectFiles(/* usePic= */ false)),
+          ImmutableSet.copyOf(
+              compilationResult.getCcCompilationOutputs().getObjectFiles(/* usePic= */ false)),
           objList);
     } else {
-      compilationInfo =
+      compilationResult =
           ccCompileAndLink(
               objcCompilationContext,
               compilationArtifacts,
@@ -1041,8 +1047,21 @@
               /* linkActionInput */ null);
     }
 
-    objectFilesCollector.addAll(compilationInfo.getFirst().getObjectFiles(/* usePic= */ false));
-    outputGroupCollector.putAll(compilationInfo.getSecond());
+    objectFilesCollector.addAll(
+        compilationResult.getCcCompilationOutputs().getObjectFiles(/* usePic= */ false));
+    outputGroupCollector.putAll(compilationResult.getOutputGroups());
+
+    if (objcCommon.isPresent()
+        && objcCommon.get().getPurpose() == ObjcCommon.Purpose.COMPILE_AND_LINK) {
+
+      ObjcProvider.NativeBuilder objcProviderBuilder = objcCommon.get().getObjcProviderBuilder();
+      ObjcProvider objcProvider =
+          objcProviderBuilder
+              .setCcCompilationContext(compilationResult.getCcCompilationContext())
+              .build();
+
+      setObjcProvider(objcProvider);
+    }
 
     return this;
   }
@@ -1063,6 +1082,7 @@
       registerCompileAndArchiveActions(
           common.getCompilationArtifacts().get(),
           common.getObjcCompilationContext(),
+          Optional.of(common),
           extraCompileArgs,
           priorityHeaders);
     }
@@ -1156,8 +1176,7 @@
                 toolchain,
                 toolchain.getFdoContext(),
                 getFeatureConfiguration(ruleContext, toolchain, buildConfiguration),
-                createObjcCppSemantics(
-                    objcProvider, /* privateHdrs= */ ImmutableList.of(), /* pchHdr= */ null))
+                createObjcCppSemantics())
             .setGrepIncludes(CppHelper.getGrepIncludes(ruleContext))
             .setIsStampingEnabled(AnalysisUtils.isStampingEnabled(ruleContext))
             .setTestOrTestOnlyTarget(ruleContext.isTestOnlyTarget() || ruleContext.isTestTarget())
@@ -1286,8 +1305,8 @@
    */
   CompilationSupport registerFullyLinkAction(ObjcProvider objcProvider, Artifact outputArchive)
       throws InterruptedException, RuleErrorException {
-    Preconditions.checkNotNull(toolchain);
-    Preconditions.checkNotNull(toolchain.getFdoContext());
+    checkNotNull(toolchain);
+    checkNotNull(toolchain.getFdoContext());
     PathFragment labelName = PathFragment.create(ruleContext.getLabel().getName());
     String libraryIdentifier =
         ruleContext
@@ -1313,8 +1332,7 @@
                 toolchain,
                 toolchain.getFdoContext(),
                 getFeatureConfiguration(ruleContext, toolchain, buildConfiguration),
-                createObjcCppSemantics(
-                    objcProvider, /* privateHdrs= */ ImmutableList.of(), /* pchHdr= */ null))
+                createObjcCppSemantics())
             .setGrepIncludes(CppHelper.getGrepIncludes(ruleContext))
             .setIsStampingEnabled(AnalysisUtils.isStampingEnabled(ruleContext))
             .setTestOrTestOnlyTarget(ruleContext.isTestOnlyTarget() || ruleContext.isTestTarget())
@@ -1669,14 +1687,6 @@
     }
   }
 
-  private static ImmutableSet<PathFragment> uniqueParentDirectories(NestedSet<PathFragment> paths) {
-    ImmutableSet.Builder<PathFragment> parents = new ImmutableSet.Builder<>();
-    for (PathFragment path : paths.toList()) {
-      parents.add(path.getParentDirectory());
-    }
-    return parents.build();
-  }
-
   public static Optional<Artifact> getCustomModuleMap(RuleContext ruleContext) {
     if (ruleContext.attributes().has("module_map", BuildType.LABEL)) {
       return Optional.fromNullable(ruleContext.getPrerequisiteArtifact("module_map", Mode.TARGET));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
index 777a2ad..71ae723 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
@@ -258,10 +258,12 @@
       throws InterruptedException, ActionConflictException {
     ConfiguredAspect.Builder builder = new ConfiguredAspect.Builder(this, parameters, ruleContext);
     ObjcCommon common;
+    ObjcProvider objcProvider = null;
 
     if (!j2ObjcSource.getObjcSrcs().isEmpty()) {
       common =
           common(
+              ObjcCommon.Purpose.COMPILE_AND_LINK,
               ruleContext,
               j2ObjcSource.getObjcSrcs(),
               j2ObjcSource.getObjcHdrs(),
@@ -284,26 +286,29 @@
             .registerCompileAndArchiveActions(
                 common, EXTRA_COMPILE_ARGS, ImmutableList.<PathFragment>of())
             .registerFullyLinkAction(
-                common.getObjcProvider(),
+                compilationSupport.getObjcProvider(),
                 ruleContext.getImplicitOutputArtifact(CompilationSupport.FULLY_LINKED_LIB));
+        objcProvider = compilationSupport.getObjcProvider();
       } catch (RuleErrorException e) {
         ruleContext.ruleError(e.getMessage());
       }
     } else {
       common =
           common(
+              ObjcCommon.Purpose.LINK_ONLY,
               ruleContext,
               ImmutableList.<Artifact>of(),
               ImmutableList.<Artifact>of(),
               ImmutableList.<PathFragment>of(),
               depAttributes,
               otherDeps);
+      objcProvider = common.getObjcProviderBuilder().build();
     }
 
     return builder
         .addProvider(
             exportedJ2ObjcMappingFileProvider(base, ruleContext, directJ2ObjcMappingFileProvider))
-        .addNativeDeclaredProvider(common.getObjcProvider())
+        .addNativeDeclaredProvider(objcProvider)
         .build();
   }
 
@@ -832,6 +837,7 @@
 
   /** Sets up and returns an {@link ObjcCommon} object containing the J2ObjC-translated code. */
   private static ObjcCommon common(
+      ObjcCommon.Purpose purpose,
       RuleContext ruleContext,
       List<Artifact> transpiledSources,
       List<Artifact> transpiledHeaders,
@@ -839,7 +845,7 @@
       List<Attribute> dependentAttributes,
       List<TransitiveInfoCollection> otherObjcProviders)
       throws InterruptedException {
-    ObjcCommon.Builder builder = new ObjcCommon.Builder(ruleContext);
+    ObjcCommon.Builder builder = new ObjcCommon.Builder(purpose, ruleContext);
     IntermediateArtifacts intermediateArtifacts =
         ObjcRuleClasses.j2objcIntermediateArtifacts(ruleContext);
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
index b36115a..7839f14 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
@@ -45,7 +45,7 @@
       ImmutableList.of("java_import", "java_library", "java_proto_library", "proto_library");
 
   private ObjcCommon common(RuleContext ruleContext) throws InterruptedException {
-    return new ObjcCommon.Builder(ruleContext)
+    return new ObjcCommon.Builder(ObjcCommon.Purpose.LINK_ONLY, ruleContext)
         .setCompilationAttributes(
             CompilationAttributes.Builder.fromRuleContext(ruleContext).build())
         .addDeps(ruleContext.getPrerequisiteConfiguredTargetAndTargets("deps", Mode.TARGET))
@@ -70,7 +70,7 @@
         .build();
 
     ObjcCommon common = common(ruleContext);
-    ObjcProvider objcProvider = common.getObjcProvider();
+    ObjcProvider objcProvider = common.getObjcProviderBuilder().build();
 
     J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
         ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java
index 3bb3156..272f803 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java
@@ -256,7 +256,7 @@
               intermediateArtifacts,
               nullToEmptyList(cpuToCTATDepsCollectionMap.get(childCpu)),
               additionalDepProviders);
-      ObjcProvider objcProviderWithDylibSymbols = common.getObjcProvider();
+      ObjcProvider objcProviderWithDylibSymbols = common.getObjcProviderBuilder().build();
       ObjcProvider objcProvider =
           objcProviderWithDylibSymbols.subtractSubtrees(dylibObjcProviders, ImmutableList.of());
 
@@ -300,7 +300,7 @@
       Iterable<ObjcProvider> additionalDepProviders) throws InterruptedException {
 
     ObjcCommon.Builder commonBuilder =
-        new ObjcCommon.Builder(ruleContext, buildConfiguration)
+        new ObjcCommon.Builder(ObjcCommon.Purpose.LINK_ONLY, ruleContext, buildConfiguration)
             .setCompilationAttributes(
                 CompilationAttributes.Builder.fromRuleContext(ruleContext).build())
             .addDeps(propagatedConfiguredTargetAndDataDeps)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
index 8b98f7d..258712b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
@@ -15,15 +15,11 @@
 package com.google.devtools.build.lib.rules.objc;
 
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.CC_LIBRARY;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.DEFINE;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.FLAG;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.FORCE_LOAD_LIBRARY;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.Flag.USES_CPP;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.HEADER;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.IMPORTED_LIBRARY;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.INCLUDE;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.INCLUDE_SYSTEM;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.IQUOTE;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.J2OBJC_LIBRARY;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LIBRARY;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LINKED_BINARY;
@@ -86,18 +82,29 @@
     return inputs.build();
   }
 
-  /** Filters fileset artifacts out of a group of artifacts. */
-  public static ImmutableList<Artifact> filterFileset(NestedSet<Artifact> artifacts) {
-    return filterFileset(artifacts.toList());
+  /**
+   * Indicates the purpose the ObjcCommon is used for.
+   *
+   * <p>The purpose determines whether ObjcCommon.build() will build an ObjcProvider or an
+   * ObjcProvider.Builder. In compile-and-link mode, ObjcCommon.build() will output an
+   * ObjcProvider.Builder. The builder is expected to combine with the CcCompilationContext from a
+   * compile action, to form a complete ObjcProvider. In link-only mode, ObjcCommon can (and does)
+   * output the full ObjcProvider.
+   */
+  public enum Purpose {
+    /** The ObjcCommon will be used for compile and link. */
+    COMPILE_AND_LINK,
+    /** The ObjcCommon will be used for linking only. */
+    LINK_ONLY,
   }
 
   static class Builder {
+    private final Purpose purpose;
     private final RuleContext context;
     private final StarlarkSemantics semantics;
     private final BuildConfiguration buildConfiguration;
     private Optional<CompilationAttributes> compilationAttributes = Optional.absent();
     private Optional<CompilationArtifacts> compilationArtifacts = Optional.absent();
-    private ImmutableSet.Builder<Artifact> textualHeaders = ImmutableSet.builder();
     private Iterable<ObjcProvider> depObjcProviders = ImmutableList.of();
     private Iterable<ObjcProvider> runtimeDepObjcProviders = ImmutableList.of();
     private Iterable<PathFragment> includes = ImmutableList.of();
@@ -110,11 +117,11 @@
     private Iterable<CcLinkingContext> depCcLinkProviders = ImmutableList.of();
 
     /**
-     * Builder for {@link ObjcCommon} obtaining both attribute data and configuration data from
-     * the given rule context.
+     * Builder for {@link ObjcCommon} obtaining both attribute data and configuration data from the
+     * given rule context.
      */
-    Builder(RuleContext context) throws InterruptedException {
-      this(context, context.getConfiguration());
+    Builder(Purpose purpose, RuleContext context) throws InterruptedException {
+      this(purpose, context, context.getConfiguration());
     }
 
     /**
@@ -122,8 +129,9 @@
      * configuration data from the given configuration object for use in situations where a single
      * target's outputs are under multiple configurations.
      */
-    Builder(RuleContext context, BuildConfiguration buildConfiguration)
+    Builder(Purpose purpose, RuleContext context, BuildConfiguration buildConfiguration)
         throws InterruptedException {
+      this.purpose = purpose;
       this.context = Preconditions.checkNotNull(context);
       this.semantics = context.getAnalysisEnvironment().getSkylarkSemantics();
       this.buildConfiguration = Preconditions.checkNotNull(buildConfiguration);
@@ -268,21 +276,24 @@
     ObjcCommon build() {
 
       ObjcCompilationContext.Builder objcCompilationContextBuilder =
-          ObjcCompilationContext.builder(semantics);
+          ObjcCompilationContext.builder();
 
-      ObjcProvider.Builder objcProvider =
-          new ObjcProvider.Builder(semantics)
-              .addAll(IMPORTED_LIBRARY, extraImportLibraries)
-              .addTransitiveAndPropagateNonCompileInfo(depObjcProviders);
+      ObjcProvider.Builder objcProvider = new ObjcProvider.NativeBuilder(semantics);
+
+      objcProvider
+          .addAll(IMPORTED_LIBRARY, extraImportLibraries)
+          .addTransitiveAndPropagate(depObjcProviders);
 
       objcCompilationContextBuilder
           .addIncludes(includes)
           .addDepObjcProviders(depObjcProviders)
           .addDepObjcProviders(runtimeDepObjcProviders)
+          // TODO(bazel-team): This pulls in stl via
+          // CcCompilationHelper.getStlCcCompilationContext(), but probably shouldn't.
           .addDepCcCompilationContexts(depCcHeaderProviders);
 
       for (CcCompilationContext headerProvider : depCcHeaderProviders) {
-        textualHeaders.addAll(headerProvider.getTextualHdrs());
+        objcProvider.addAllDirect(HEADER, headerProvider.getDeclaredIncludeSrcs().toList());
       }
 
       for (ObjcProvider provider : runtimeDepObjcProviders) {
@@ -323,7 +334,9 @@
         objcProvider
             .addAll(SDK_FRAMEWORK, attributes.sdkFrameworks())
             .addAll(WEAK_SDK_FRAMEWORK, attributes.weakSdkFrameworks())
-            .addAll(SDK_DYLIB, attributes.sdkDylibs());
+            .addAll(SDK_DYLIB, attributes.sdkDylibs())
+            .addAllDirect(HEADER, attributes.hdrs().toList())
+            .addAllDirect(HEADER, attributes.textualHdrs().toList());
         objcCompilationContextBuilder
             .addPublicHeaders(filterFileset(attributes.hdrs().toList()))
             .addPublicTextualHeaders(filterFileset(attributes.textualHdrs().toList()))
@@ -340,9 +353,11 @@
         // them.
         objcProvider
             .addAll(LIBRARY, artifacts.getArchive().asSet())
-            .addAll(SOURCE, allSources);
+            .addAll(SOURCE, allSources)
+            .addAllDirect(SOURCE, allSources)
+            .addAllDirect(HEADER, filterFileset(artifacts.getAdditionalHdrs().toList()));
         objcCompilationContextBuilder.addPublicHeaders(
-            filterFileset(artifacts.getAdditionalHdrs()));
+            filterFileset(artifacts.getAdditionalHdrs().toList()));
         objcCompilationContextBuilder.addPrivateHeaders(artifacts.getPrivateHdrs());
 
         if (artifacts.getArchive().isPresent()
@@ -378,43 +393,22 @@
           objcProvider.add(UMBRELLA_HEADER, umbrellaHeader.get());
         }
         objcProvider.add(MODULE_MAP, moduleMap.getArtifact());
+        objcProvider.addDirect(MODULE_MAP, moduleMap.getArtifact());
         objcProvider.add(TOP_LEVEL_MODULE_MAP, moduleMap);
       }
 
       objcProvider.addAll(LINKED_BINARY, linkedBinary.asSet());
 
       ObjcCompilationContext objcCompilationContext = objcCompilationContextBuilder.build();
-      addObjcCompilationContext(objcProvider, objcCompilationContext);
 
-      return new ObjcCommon(
-          objcProvider.build(),
-          objcCompilationContext,
-          compilationArtifacts,
-          textualHeaders.build());
-    }
-
-    private static void addObjcCompilationContext(
-        ObjcProvider.Builder objcProvider, ObjcCompilationContext objcCompilationContext) {
-      // No need to add frameworkIncludes because same info is used for linking so should
-      // already have been added.
-      objcProvider
-          .addAll(DEFINE, objcCompilationContext.getDefines())
-          .addAll(HEADER, objcCompilationContext.getPublicHeaders())
-          .addAll(HEADER, objcCompilationContext.getPublicTextualHeaders())
-          .addAll(INCLUDE, objcCompilationContext.getIncludes())
-          .addAll(INCLUDE_SYSTEM, objcCompilationContext.getSystemIncludes())
-          .addAll(IQUOTE, objcCompilationContext.getQuoteIncludes())
-          // We can't use the summary provider here because it would mess up the strict
-          // dependency and non-propagate items.
-          .addTransitiveAndPropagateCompileInfo(objcCompilationContext.getDepObjcProviders());
-      for (CcCompilationContext ccCompilationContext :
-          objcCompilationContext.getDepCcCompilationContexts()) {
-        objcProvider
-            .addAll(DEFINE, ccCompilationContext.getDefines())
-            .addAll(HEADER, ccCompilationContext.getDeclaredIncludeSrcs())
-            .addAll(INCLUDE, ccCompilationContext.getIncludeDirs())
-            .addAll(INCLUDE_SYSTEM, ccCompilationContext.getSystemIncludeDirs());
+      ObjcProvider.NativeBuilder objcProviderNativeBuilder =
+          (ObjcProvider.NativeBuilder) objcProvider;
+      if (purpose == Purpose.LINK_ONLY) {
+        objcProviderNativeBuilder.setCcCompilationContext(
+            objcCompilationContext.createCcCompilationContext());
       }
+      return new ObjcCommon(
+          purpose, objcProviderNativeBuilder, objcCompilationContext, compilationArtifacts);
     }
 
     private static boolean isCcLibrary(ConfiguredTargetAndData info) {
@@ -433,25 +427,29 @@
     }
   }
 
-  private final ObjcProvider objcProvider;
+  private final Purpose purpose;
+  private final ObjcProvider.NativeBuilder objcProviderBuilder;
   private final ObjcCompilationContext objcCompilationContext;
 
   private final Optional<CompilationArtifacts> compilationArtifacts;
-  private final ImmutableSet<Artifact> textualHdrs;
 
   private ObjcCommon(
-      ObjcProvider objcProvider,
+      Purpose purpose,
+      ObjcProvider.NativeBuilder objcProviderBuilder,
       ObjcCompilationContext objcCompilationContext,
-      Optional<CompilationArtifacts> compilationArtifacts,
-      ImmutableSet<Artifact> textualHdrs) {
-    this.objcProvider = Preconditions.checkNotNull(objcProvider);
+      Optional<CompilationArtifacts> compilationArtifacts) {
+    this.purpose = purpose;
+    this.objcProviderBuilder = Preconditions.checkNotNull(objcProviderBuilder);
     this.objcCompilationContext = Preconditions.checkNotNull(objcCompilationContext);
     this.compilationArtifacts = Preconditions.checkNotNull(compilationArtifacts);
-    this.textualHdrs = textualHdrs;
   }
 
-  public ObjcProvider getObjcProvider() {
-    return objcProvider;
+  public Purpose getPurpose() {
+    return purpose;
+  }
+
+  public ObjcProvider.NativeBuilder getObjcProviderBuilder() {
+    return objcProviderBuilder;
   }
 
   public ObjcCompilationContext getObjcCompilationContext() {
@@ -462,10 +460,6 @@
     return compilationArtifacts;
   }
 
-  public ImmutableSet<Artifact> getTextualHdrs() {
-    return textualHdrs;
-  }
-
   /**
    * Returns an {@link Optional} containing the compiled {@code .a} file, or
    * {@link Optional#absent()} if this object contains no {@link CompilationArtifacts} or the
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompilationContext.java
index 774cca1..f408c3d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompilationContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompilationContext.java
@@ -14,14 +14,13 @@
 
 package com.google.devtools.build.lib.rules.objc;
 
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.HEADER;
-
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationContext;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.ArrayList;
 import java.util.List;
@@ -33,8 +32,7 @@
  */
 @Immutable
 public final class ObjcCompilationContext {
-  public static final ObjcCompilationContext EMPTY =
-      builder(StarlarkSemantics.DEFAULT_SEMANTICS).build();
+  public static final ObjcCompilationContext EMPTY = builder().build();
 
   private final ImmutableList<String> defines;
 
@@ -49,9 +47,8 @@
   private final ImmutableList<PathFragment> includes;
   private final ImmutableList<PathFragment> systemIncludes;
   private final ImmutableList<PathFragment> quoteIncludes;
-  private final ImmutableList<ObjcProvider> depObjcProviders;
+  private final ImmutableList<PathFragment> strictDependencyIncludes;
   private final ImmutableList<CcCompilationContext> depCcCompilationContexts;
-  private final ObjcProvider depObjcProvidersSummary;
 
   ObjcCompilationContext(
       Iterable<String> defines,
@@ -61,9 +58,8 @@
       Iterable<PathFragment> includes,
       Iterable<PathFragment> systemIncludes,
       Iterable<PathFragment> quoteIncludes,
-      Iterable<ObjcProvider> depObjcProviders,
-      Iterable<CcCompilationContext> depCcCompilationContexts,
-      ObjcProvider depObjcProvidersSummary) {
+      Iterable<PathFragment> strictDependencyIncludes,
+      Iterable<CcCompilationContext> depCcCompilationContexts) {
     this.defines = ImmutableList.copyOf(defines);
     this.publicHeaders = ImmutableList.copyOf(publicHeaders);
     this.publicTextualHeaders = ImmutableList.copyOf(publicTextualHeaders);
@@ -71,9 +67,8 @@
     this.includes = ImmutableList.copyOf(includes);
     this.systemIncludes = ImmutableList.copyOf(systemIncludes);
     this.quoteIncludes = ImmutableList.copyOf(quoteIncludes);
-    this.depObjcProviders = ImmutableList.copyOf(depObjcProviders);
+    this.strictDependencyIncludes = ImmutableList.copyOf(strictDependencyIncludes);
     this.depCcCompilationContexts = ImmutableList.copyOf(depCcCompilationContexts);
-    this.depObjcProvidersSummary = depObjcProvidersSummary;
   }
 
   public ImmutableList<String> getDefines() {
@@ -104,36 +99,38 @@
     return quoteIncludes;
   }
 
-  public ImmutableList<ObjcProvider> getDepObjcProviders() {
-    return depObjcProviders;
+  public ImmutableList<PathFragment> getStrictDependencyIncludes() {
+    return strictDependencyIncludes;
   }
 
   public ImmutableList<CcCompilationContext> getDepCcCompilationContexts() {
     return depCcCompilationContexts;
   }
 
-  public ObjcProvider getDepObjcProvidersSummary() {
-    return depObjcProvidersSummary;
+  public CcCompilationContext createCcCompilationContext() {
+    CcCompilationContext.Builder builder =
+        CcCompilationContext.builder(
+            /* actionConstructionContext= */ null, /* configuration= */ null, /* label= */ null);
+    builder
+        .addDefines(NestedSetBuilder.wrap(Order.LINK_ORDER, getDefines()))
+        .addDeclaredIncludeSrcs(getPublicHeaders())
+        .addDeclaredIncludeSrcs(getPrivateHeaders())
+        .addDeclaredIncludeSrcs(getPublicTextualHeaders())
+        .addModularHdrs(ImmutableList.copyOf(getPublicHeaders()))
+        .addModularHdrs(ImmutableList.copyOf(getPrivateHeaders()))
+        .addTextualHdrs(ImmutableList.copyOf(getPublicTextualHeaders()))
+        .addIncludeDirs(getIncludes())
+        .addSystemIncludeDirs(getSystemIncludes())
+        .addQuoteIncludeDirs(getQuoteIncludes())
+        .mergeDependentCcCompilationContexts(getDepCcCompilationContexts());
+    return builder.build();
   }
 
-  // Note: this function will be deleted in the migration cl.
-  public ImmutableList<Artifact> getAllTransitiveHeaders() {
-    ImmutableList.Builder<Artifact> allHeaders = ImmutableList.builder();
-    allHeaders.addAll(publicHeaders);
-    allHeaders.addAll(publicTextualHeaders);
-    allHeaders.addAll(depObjcProvidersSummary.get(HEADER).toList());
-    for (CcCompilationContext ccCompilationContext : depCcCompilationContexts) {
-      allHeaders.addAll(ccCompilationContext.getDeclaredIncludeSrcs().toList());
-    }
-    return allHeaders.build();
-  }
-
-  public static Builder builder(StarlarkSemantics semantics) {
-    return new Builder(semantics);
+  public static Builder builder() {
+    return new Builder();
   }
 
   static class Builder {
-    private final StarlarkSemantics semantics;
     private final List<String> defines = new ArrayList<>();
     private final List<Artifact> publicHeaders = new ArrayList<>();
     private final List<Artifact> publicTextualHeaders = new ArrayList<>();
@@ -141,12 +138,10 @@
     private final List<PathFragment> includes = new ArrayList<>();
     private final List<PathFragment> systemIncludes = new ArrayList<>();
     private final List<PathFragment> quoteIncludes = new ArrayList<>();
-    private final List<ObjcProvider> depObjcProviders = new ArrayList<>();
+    private final List<PathFragment> strictDependencyIncludes = new ArrayList<>();
     private final List<CcCompilationContext> depCcCompilationContexts = new ArrayList<>();
 
-    Builder(StarlarkSemantics semantics) {
-      this.semantics = semantics;
-    }
+    Builder() {}
 
     public Builder addDefines(Iterable<String> defines) {
       Iterables.addAll(this.defines, defines);
@@ -184,9 +179,11 @@
     }
 
     public Builder addDepObjcProviders(Iterable<ObjcProvider> objcProviders) {
-      // After migration, we will have nice embedded CcCompilationContexts that we can
-      // addDepCcCompilationContexts().
-      Iterables.addAll(this.depObjcProviders, objcProviders);
+      for (ObjcProvider objcProvider : objcProviders) {
+        this.depCcCompilationContexts.add(objcProvider.getCcCompilationContext());
+
+        this.strictDependencyIncludes.addAll(objcProvider.getStrictDependencyIncludes());
+      }
       return this;
     }
 
@@ -202,12 +199,6 @@
     }
 
     ObjcCompilationContext build() {
-      ObjcProvider.Builder depObjcProvidersSummaryBuilder = new ObjcProvider.Builder(semantics);
-      for (ObjcProvider dep : depObjcProviders) {
-        depObjcProvidersSummaryBuilder.addTransitiveAndPropagateCompileInfo(dep);
-      }
-      ObjcProvider depObjcProvidersSummary = depObjcProvidersSummaryBuilder.build();
-
       return new ObjcCompilationContext(
           defines,
           publicHeaders,
@@ -216,9 +207,8 @@
           includes,
           systemIncludes,
           quoteIncludes,
-          depObjcProviders,
-          depCcCompilationContexts,
-          depObjcProvidersSummary);
+          strictDependencyIncludes,
+          depCcCompilationContexts);
     }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java
index 6513106..d5b08ef 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java
@@ -15,15 +15,10 @@
 package com.google.devtools.build.lib.rules.objc;
 
 import static com.google.devtools.build.lib.rules.objc.CompilationSupport.IncludeProcessingType.INCLUDE_SCANNING;
-import static com.google.devtools.build.lib.rules.objc.CompilationSupport.IncludeProcessingType.NO_PROCESSING;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.HEADER;
 
-import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationContext;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
@@ -41,8 +36,6 @@
 
   private final IncludeProcessingType includeProcessingType;
   private final IncludeProcessing includeProcessing;
-  private final Iterable<Artifact> extraIncludeScanningInputs;
-  private final ObjcProvider objcProvider;
   private final ObjcConfiguration config;
   private final IntermediateArtifacts intermediateArtifacts;
   private final BuildConfiguration buildConfiguration;
@@ -51,31 +44,23 @@
   /**
    * Creates an instance of ObjcCppSemantics
    *
-   * @param objcProvider the provider that should be used in determining objc-specific inputs to
-   *     actions
    * @param includeProcessingType The type of include processing to be run.
    * @param includeProcessing the closure providing the strategy for processing of includes for
    *     actions
-   * @param extraIncludeScanningInputs additional inputs to include scanning, outside of the headers
-   *     provided by ObjProvider.
    * @param config the ObjcConfiguration for this build
    * @param intermediateArtifacts used to create headers_list artifacts
    * @param buildConfiguration the build configuration for this build
    * @param enableModules whether modules are enabled
    */
   public ObjcCppSemantics(
-      ObjcProvider objcProvider,
       IncludeProcessingType includeProcessingType,
       IncludeProcessing includeProcessing,
-      Iterable<Artifact> extraIncludeScanningInputs,
       ObjcConfiguration config,
       IntermediateArtifacts intermediateArtifacts,
       BuildConfiguration buildConfiguration,
       boolean enableModules) {
-    this.objcProvider = objcProvider;
     this.includeProcessingType = includeProcessingType;
     this.includeProcessing = includeProcessing;
-    this.extraIncludeScanningInputs = extraIncludeScanningInputs;
     this.config = config;
     this.intermediateArtifacts = intermediateArtifacts;
     this.buildConfiguration = buildConfiguration;
@@ -94,33 +79,6 @@
         // TODO(waltl): do better with include scanning.
         .addTransitiveMandatoryInputs(actionBuilder.getToolchain().getAllFilesMiddleman())
         .setShouldScanIncludes(includeProcessingType == INCLUDE_SCANNING);
-
-    if (includeProcessingType == NO_PROCESSING) {
-      // TODO(b/62060839): Identify the mechanism used to add generated headers in c++, and recycle
-      // it here.
-      //
-      // This is used to patch the action graph of missing dependencies.  We only need to do this
-      // for headers in depObjcProviderCompileInfo.  We can rid of this in the migraiton cl.
-      actionBuilder.addTransitiveMandatoryInputs(objcProvider.getGeneratedHeaders());
-    }
-  }
-
-  @Override
-  public NestedSet<Artifact> getAdditionalPrunableIncludes() {
-    // This is a hook used when header processing is off, to supply CppCompilationAction with
-    // additional inputs that are not properly added to CcCompilationContext.  We will delete this
-    // in the migration cl.
-    return objcProvider.get(HEADER);
-  }
-
-  // This function now returns "additional" (not "alternate" include scanning data inputs, over
-  // those already accounted for in dependent CcCompilationContext.  We can delete this in the
-  // migration cl so no point renaming it.
-  @Override
-  public Iterable<Artifact> getAlternateIncludeScanningDataInputs() {
-    // Include scanning data only cares about generated artifacts.  Since the generated headers from
-    // objcProvider is readily available we provide that instead of the full header list.
-    return Iterables.concat(objcProvider.getGeneratedHeaderList(), extraIncludeScanningInputs);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java
index 7bcb3a2..51174cf 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java
@@ -24,6 +24,7 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.cpp.CcCommon;
+import com.google.devtools.build.lib.rules.cpp.CcInfo;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
 
 /**
@@ -34,11 +35,18 @@
   public ConfiguredTarget create(RuleContext ruleContext)
       throws InterruptedException, RuleErrorException, ActionConflictException {
     CcCommon.checkRuleLoadedThroughMacro(ruleContext);
+
+    CompilationAttributes compilationAttributes =
+        CompilationAttributes.Builder.fromRuleContext(ruleContext).build();
+    IntermediateArtifacts intermediateArtifacts =
+        ObjcRuleClasses.intermediateArtifacts(ruleContext);
+    CompilationArtifacts compilationArtifacts = new CompilationArtifacts.Builder().build();
+
     ObjcCommon common =
-        new ObjcCommon.Builder(ruleContext)
-            .setCompilationAttributes(
-                CompilationAttributes.Builder.fromRuleContext(ruleContext).build())
-            .setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext))
+        new ObjcCommon.Builder(ObjcCommon.Purpose.LINK_ONLY, ruleContext)
+            .setCompilationArtifacts(compilationArtifacts)
+            .setCompilationAttributes(compilationAttributes)
+            .setIntermediateArtifacts(intermediateArtifacts)
             .setAlwayslink(ruleContext.attributes().get("alwayslink", Type.BOOLEAN))
             .setHasModuleMap()
             .addExtraImportLibraries(
@@ -47,11 +55,6 @@
 
     NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.stableOrder();
 
-    CompilationAttributes compilationAttributes =
-        CompilationAttributes.Builder.fromRuleContext(ruleContext).build();
-    IntermediateArtifacts intermediateArtifacts =
-        ObjcRuleClasses.intermediateArtifacts(ruleContext);
-
     NestedSet<Artifact> publicHeaders = compilationAttributes.hdrs();
     CppModuleMap moduleMap = intermediateArtifacts.moduleMap();
 
@@ -61,10 +64,14 @@
         .registerGenerateModuleMapAction(moduleMap, publicHeaders)
         .validateAttributes();
 
-    ObjcProvider objcProvider = common.getObjcProvider();
+    ObjcProvider objcProvider = common.getObjcProviderBuilder().build();
 
     return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build())
         .addNativeDeclaredProvider(objcProvider)
+        .addNativeDeclaredProvider(
+            CcInfo.builder()
+                .setCcCompilationContext(objcProvider.getCcCompilationContext())
+                .build())
         .addSkylarkTransitiveInfo(ObjcProvider.SKYLARK_NAME, objcProvider)
         .build();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
index c1fefa7..acb3ac6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
@@ -46,7 +46,7 @@
    * Constructs an {@link ObjcCommon} instance based on the attributes of the given rule context.
    */
   private ObjcCommon common(RuleContext ruleContext) throws InterruptedException {
-    return new ObjcCommon.Builder(ruleContext)
+    return new ObjcCommon.Builder(ObjcCommon.Purpose.COMPILE_AND_LINK, ruleContext)
         .setCompilationAttributes(
             CompilationAttributes.Builder.fromRuleContext(ruleContext).build())
         .setCompilationArtifacts(CompilationSupport.compilationArtifacts(ruleContext))
@@ -81,7 +81,7 @@
     compilationSupport
         .registerCompileAndArchiveActions(common)
         .registerFullyLinkAction(
-            common.getObjcProvider(),
+            compilationSupport.getObjcProvider(),
             ruleContext.getImplicitOutputArtifact(CompilationSupport.FULLY_LINKED_LIB))
         .validateAttributes();
 
@@ -90,23 +90,11 @@
     J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
       .addTransitive(ruleContext.getPrerequisites("deps", Mode.TARGET,
           J2ObjcEntryClassProvider.class)).build();
-    ObjcProvider objcProvider = common.getObjcProvider();
-    CcCompilationContext ccCompilationContext =
-        CcCompilationContext.builder(
-                ruleContext, ruleContext.getConfiguration(), ruleContext.getLabel())
-            .addDeclaredIncludeSrcs(
-                CompilationAttributes.Builder.fromRuleContext(ruleContext).build().hdrs().toList())
-            .addTextualHdrs(common.getTextualHdrs())
-            .addDeclaredIncludeSrcs(common.getTextualHdrs())
-            .setPurpose(
-                compilationSupport
-                    .createObjcCppSemantics(
-                        objcProvider, /* privateHdrs= */ ImmutableList.of(), /* pchHdr= */ null)
-                    .getPurpose())
-            .build();
-
+    ObjcProvider objcProvider = compilationSupport.getObjcProvider();
+    CcCompilationContext ccCompilationContext = objcProvider.getCcCompilationContext();
     CcLinkingContext ccLinkingContext =
-        buildCcLinkingContext(ruleContext.getLabel(), common, ruleContext.getSymbolGenerator());
+        buildCcLinkingContext(
+            ruleContext.getLabel(), objcProvider, ruleContext.getSymbolGenerator());
 
     return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build())
         .addNativeDeclaredProvider(objcProvider)
@@ -125,9 +113,8 @@
   }
 
   private CcLinkingContext buildCcLinkingContext(
-      Label label, ObjcCommon common, SymbolGenerator<?> symbolGenerator) {
+      Label label, ObjcProvider objcProvider, SymbolGenerator<?> symbolGenerator) {
     ImmutableSet.Builder<LibraryToLink> libraries = new ImmutableSet.Builder<>();
-    ObjcProvider objcProvider = common.getObjcProvider();
     for (Artifact library : objcProvider.get(ObjcProvider.LIBRARY).toList()) {
       libraries.add(
           LibraryToLink.builder()
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java
index 053fd7a..7987a90 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java
@@ -30,6 +30,7 @@
 import com.google.devtools.build.lib.packages.SkylarkNativeAspect;
 import com.google.devtools.build.lib.rules.proto.ProtoInfo;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
+import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.List;
 
 /**
@@ -100,9 +101,12 @@
       ObjcProvider protobufObjcProvider =
           ruleContext.getPrerequisite(
               ObjcRuleClasses.PROTO_LIB_ATTR, Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR);
-      aspectObjcProtoProvider.addProtobufHeaders(protobufObjcProvider.get(ObjcProvider.HEADER));
+      aspectObjcProtoProvider.addProtobufHeaders(
+          protobufObjcProvider.getCcCompilationContext().getDeclaredIncludeSrcs());
       aspectObjcProtoProvider.addProtobufHeaderSearchPaths(
-          protobufObjcProvider.get(ObjcProvider.INCLUDE));
+          NestedSetBuilder.<PathFragment>linkOrder()
+              .addAll(protobufObjcProvider.getCcCompilationContext().getIncludeDirs())
+              .build());
     }
 
     // Only add the provider if it has any values, otherwise skip it.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
index c373885..1487259 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
@@ -34,6 +34,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.Info;
 import com.google.devtools.build.lib.packages.NativeProvider.WithLegacySkylarkName;
+import com.google.devtools.build.lib.rules.cpp.CcCompilationContext;
 import com.google.devtools.build.lib.rules.cpp.CcLinkingContext;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
 import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
@@ -51,41 +52,27 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import javax.annotation.Nullable;
 
 /**
  * A provider that provides all compiling and linking information in the transitive closure of its
  * deps that are needed for building Objective-C rules.
  *
- * <p>The functional contents within the provider are stored in three maps, each of which maps a
- * {@link Key} to {@link NestedSet}. The three maps differ in how they are propagated to dependent
- * providers:
+ * <p>Most of the compilation information is stored in an embedded {@code CcCompilationContext}. The
+ * objc proto strict dependency include paths are stored in a special, non-propagated field {@code
+ * strictDependencyIncludes}.
+ *
+ * <p>The rest of the information is stored in two generic maps indexed by {@code ObjcProvider.Key}:
  *
  * <ul>
- *   <li>{@code items}: This map contains items that should be propagated transitively to all
- *       dependent ObjcProviders. Most items are stored in this map.
- *   <li>{@code strictDependencyItems}: This map contains items that should only be propagated to
- *       directly dependent ObjcProviders, but not to indirect ones. This is used to implement
- *       {@link ObjcProtoLibrary}'s requirement that its header path should only be propagated to
- *       its direct dependency, and also the experimental (and soon-to-be-deprecated) feature to
- *       propagate module maps only to direct dependencies.
- *   <li>{@code nonPropagatedItems}: This map contains items that should not be propagated. There is
- *       no longer any direct usage of this feature, but strictDependencyItems turn into
- *       nonPropagatedItems when they get propagated to their dependent ObjcProviders.
+ *   <li>{@code items}: This map contains items that are propagated transitively to all dependent
+ *       ObjcProviders.
+ *   <li>{@code directItems}: This multimap contains items whose values originate from this
+ *       ObjcProvider (as opposed to those that came from a dependent ObjcProvider). {@link
+ *       #KEYS_FOR_DIRECT} contains the keys whose items are inserted into this map. The map is
+ *       created as a performance optimization for IDEs (i.e. Tulsi), so that the IDEs don't have to
+ *       flatten large transitive nested sets returned by ObjcProvider queries. It does not
+ *       materially affect other operations of the ObjcProvider.
  * </ul>
- *
- * <p>All three maps contribute to the final value of a key in an ObjcProvider as returned by {@link
- * #get(Key<E>)}.
- *
- * <p>New usage of {@code strictDependencyItems} and {@code nonPropagatedItems} is strongly
- * discouraged, as they complicate ongoing tasks of migrating ObjcProvider to CcInfo.
- *
- * <p>There is a fourth map, {@code directItems}, that contains items whose values originate from
- * this ObjcProvider (as opposed to those that came from a dependent ObjcProvider). {@link
- * #KEYS_FOR_DIRECT} contains the keys whose items are inserted into this map. The map is created as
- * a performance optimization for IDEs (i.e. Tulsi), so that the IDEs don't have to flatten large
- * transitive nested sets returned by ObjcProvider queries. It does not materially affect other
- * operations of the ObjcProvider.
  */
 // TODO(adonovan): this is an info, not a provider; rename.
 @Immutable
@@ -320,6 +307,9 @@
   // Items which are propagated transitively to dependents.
   private final ImmutableMap<Key<?>, NestedSet<?>> items;
 
+  /** Strict dependency includes */
+  private final ImmutableList<PathFragment> strictDependencyIncludes;
+
   /**
    * This is intended to be used by clients which need to collect transitive information without
    * paying the O(n^2) behavior to flatten it during analysis time.
@@ -329,19 +319,9 @@
    */
   private final ImmutableListMultimap<Key<?>, ?> directItems;
 
-  // Items which should not be propagated to dependents.
-  private final ImmutableMap<Key<?>, NestedSet<?>> nonPropagatedItems;
+  private final CcCompilationContext ccCompilationContext;
 
-  // Items which should be passed to strictly direct dependers, but not transitive dependers.
-  private final ImmutableMap<Key<?>, NestedSet<?>> strictDependencyItems;
-
-  // Lazily initialized because it's only needed when there is no include processing.
-  @Nullable private volatile NestedSet<Artifact> generatedHeaders;
-
-  // Lazily initialized because it's only needed for including scanning.
-  @Nullable private volatile ImmutableList<Artifact> generatedHeaderList;
-
-  /** All keys in ObjProvider corresponding to information needed for compile actions. */
+  /** Keys corresponding to compile information that has been migrated to CcCompilationContext. */
   static final ImmutableSet<Key<?>> KEYS_FOR_COMPILE_INFO =
       ImmutableSet.<Key<?>>of(
           DEFINE, FRAMEWORK_SEARCH_PATHS, HEADER, INCLUDE, INCLUDE_SYSTEM, IQUOTE);
@@ -378,9 +358,6 @@
           UMBRELLA_HEADER,
           WEAK_SDK_FRAMEWORK);
 
-  /** A white list of keys we support for strict-dependency / non-propagated items. */
-  static final ImmutableList<Key<?>> STRICT_DEPENDENCY_KEYS = ImmutableList.<Key<?>>of(INCLUDE);
-
   /**
    * Keys that should be kept as directItems. This is limited to a few keys that have larger
    * performance implications when flattened in a transitive fashion and/or require non-transitive
@@ -397,13 +374,17 @@
   static final ImmutableSet<Key<?>> KEYS_FOR_DIRECT =
       ImmutableSet.<Key<?>>of(HEADER, MODULE_MAP, SOURCE);
 
+  public ImmutableList<PathFragment> getStrictDependencyIncludes() {
+    return strictDependencyIncludes;
+  }
+
   @Override
   public Depset /*<String>*/ defineForStarlark() {
-    return Depset.of(SkylarkType.STRING, define());
+    return getCcCompilationContext().getSkylarkDefines();
   }
 
   public NestedSet<String> define() {
-    return get(DEFINE);
+    return getCcCompilationContext().getDefines();
   }
 
   @Override
@@ -421,8 +402,22 @@
   }
 
   @Override
-  public Depset frameworkSearchPathOnly() {
-    return ObjcProviderSkylarkConverters.convertPathFragmentsToSkylark(get(FRAMEWORK_SEARCH_PATHS));
+  public Depset frameworkIncludeForStarlark() {
+    // Starlark code expects the framework path to include the ".framework" directory, which is then
+    // stripped to get the actual framework search path.  CcCompilationContext only stores the
+    // framework search path, so the best we can do is to append a fake ".framework" directory.
+    // This at least preserves the behavior when the field is used for its intended purpose.
+    return Depset.of(
+        SkylarkType.STRING,
+        NestedSetBuilder.wrap(
+            Order.STABLE_ORDER,
+            frameworkInclude().stream()
+                .map(x -> x.getChild("fake.framework").getSafePathString())
+                .collect(ImmutableList.toImmutableList())));
+  }
+
+  public ImmutableList<PathFragment> frameworkInclude() {
+    return getCcCompilationContext().getFrameworkIncludeDirs();
   }
 
   @Override
@@ -435,8 +430,8 @@
     return Depset.of(Artifact.TYPE, header());
   }
 
-  NestedSet<Artifact> header() {
-    return get(HEADER);
+  public NestedSet<Artifact> header() {
+    return getCcCompilationContext().getDeclaredIncludeSrcs();
   }
 
   @Override
@@ -450,18 +445,51 @@
   }
 
   @Override
-  public Depset /*<String>*/ include() {
-    return ObjcProviderSkylarkConverters.convertPathFragmentsToSkylark(get(INCLUDE));
+  public Depset /*<String>*/ includeForStarlark() {
+    return Depset.of(
+        SkylarkType.STRING,
+        NestedSetBuilder.wrap(
+            Order.STABLE_ORDER,
+            include().stream()
+                .map(PathFragment::getSafePathString)
+                .collect(ImmutableList.toImmutableList())));
+  }
+
+  public ImmutableList<PathFragment> include() {
+    ImmutableList.Builder<PathFragment> listBuilder = ImmutableList.builder();
+    return listBuilder
+        .addAll(strictDependencyIncludes)
+        .addAll(getCcCompilationContext().getIncludeDirs())
+        .build();
   }
 
   @Override
-  public Depset includeSystem() {
-    return ObjcProviderSkylarkConverters.convertPathFragmentsToSkylark(get(INCLUDE_SYSTEM));
+  public Depset /*<String>*/ strictIncludeForStarlark() {
+    return Depset.of(
+        SkylarkType.STRING,
+        NestedSetBuilder.wrap(
+            Order.STABLE_ORDER,
+            getStrictDependencyIncludes().stream()
+                .map(PathFragment::getSafePathString)
+                .collect(ImmutableList.toImmutableList())));
   }
 
   @Override
-  public Depset iquote() {
-    return ObjcProviderSkylarkConverters.convertPathFragmentsToSkylark(get(IQUOTE));
+  public Depset systemIncludeForStarlark() {
+    return getCcCompilationContext().getSkylarkSystemIncludeDirs();
+  }
+
+  public ImmutableList<PathFragment> systemInclude() {
+    return getCcCompilationContext().getSystemIncludeDirs();
+  }
+
+  @Override
+  public Depset quoteIncludeForStarlark() {
+    return getCcCompilationContext().getSkylarkQuoteIncludeDirs();
+  }
+
+  public ImmutableList<PathFragment> quoteInclude() {
+    return getCcCompilationContext().getQuoteIncludeDirs();
   }
 
   @Override
@@ -574,6 +602,11 @@
         ObjcProviderSkylarkConverters.convertToSkylark(WEAK_SDK_FRAMEWORK, get(WEAK_SDK_FRAMEWORK));
   }
 
+  @Override
+  public CcCompilationContext getCcCompilationContext() {
+    return ccCompilationContext;
+  }
+
   /**
    * All keys in ObjcProvider that are explicitly not exposed to skylark. This is used for
    * testing and verification purposes to ensure that a conscious decision is made for all keys;
@@ -634,14 +667,14 @@
   private ObjcProvider(
       StarlarkSemantics semantics,
       ImmutableMap<Key<?>, NestedSet<?>> items,
-      ImmutableMap<Key<?>, NestedSet<?>> nonPropagatedItems,
-      ImmutableMap<Key<?>, NestedSet<?>> strictDependencyItems,
-      ImmutableListMultimap<Key<?>, ?> directItems) {
+      ImmutableList<PathFragment> strictDependencyIncludes,
+      ImmutableListMultimap<Key<?>, ?> directItems,
+      CcCompilationContext ccCompilationContext) {
     this.semantics = semantics;
     this.items = Preconditions.checkNotNull(items);
-    this.nonPropagatedItems = Preconditions.checkNotNull(nonPropagatedItems);
-    this.strictDependencyItems = Preconditions.checkNotNull(strictDependencyItems);
+    this.strictDependencyIncludes = Preconditions.checkNotNull(strictDependencyIncludes);
     this.directItems = Preconditions.checkNotNull(directItems);
+    this.ccCompilationContext = ccCompilationContext;
   }
 
   @Override
@@ -655,17 +688,11 @@
   @SuppressWarnings("unchecked")
   public <E> NestedSet<E> get(Key<E> key) {
     Preconditions.checkNotNull(key);
-    NestedSetBuilder<E> builder = new NestedSetBuilder<>(key.order);
-    if (strictDependencyItems.containsKey(key)) {
-      builder.addTransitive((NestedSet<E>) strictDependencyItems.get(key));
-    }
-    if (nonPropagatedItems.containsKey(key)) {
-      builder.addTransitive((NestedSet<E>) nonPropagatedItems.get(key));
-    }
     if (items.containsKey(key)) {
-      builder.addTransitive((NestedSet<E>) items.get(key));
+      return (NestedSet<E>) items.get(key);
+    } else {
+      return new NestedSetBuilder<E>(key.order).build();
     }
-    return builder.build();
   }
 
   /** All direct artifacts, bundleable files, etc. of the type specified by {@code key}. */
@@ -678,18 +705,6 @@
   }
 
   /**
-   * Returns all keys that have at least one value in this provider (values may be propagable,
-   * non-propagable, or strict).
-   */
-  private Iterable<Key<?>> getValuedKeys() {
-    return ImmutableSet.<Key<?>>builder()
-        .addAll(strictDependencyItems.keySet())
-        .addAll(nonPropagatedItems.keySet())
-        .addAll(items.keySet())
-        .build();
-  }
-
-  /**
    * All artifacts, bundleable files, etc, that should be propagated to transitive dependers, of
    * the type specified by {@code key}.
    */
@@ -728,44 +743,6 @@
     return ccLinkingContext.getStaticModeParamsForExecutableLibraries();
   }
 
-  /** Returns the set of generated header files. */
-  NestedSet<Artifact> getGeneratedHeaders() {
-    if (generatedHeaders == null) {
-      synchronized (this) {
-        if (generatedHeaders == null) {
-          NestedSet<Artifact> headers = header();
-          NestedSetBuilder<Artifact> generatedHeadersBuilder =
-              new NestedSetBuilder<>(headers.getOrder());
-          for (Artifact header : headers.toList()) {
-            if (!header.isSourceArtifact()) {
-              generatedHeadersBuilder.add(header);
-            }
-          }
-          generatedHeaders = generatedHeadersBuilder.build();
-        }
-      }
-    }
-    return generatedHeaders;
-  }
-
-  /** Returns the list of generated header files. */
-  List<Artifact> getGeneratedHeaderList() {
-    if (generatedHeaderList == null) {
-      synchronized (this) {
-        if (generatedHeaderList == null) {
-          ImmutableList.Builder<Artifact> generatedHeadersBuilder = ImmutableList.builder();
-          for (Artifact header : header().toList()) {
-            if (!header.isSourceArtifact()) {
-              generatedHeadersBuilder.add(header);
-            }
-          }
-          generatedHeaderList = generatedHeadersBuilder.build();
-        }
-      }
-    }
-    return generatedHeaderList;
-  }
-
   /**
    * Subtracts dependency subtrees from this provider and returns the result (subtraction does not
    * mutate this provider). Note that not all provider keys are subtracted; generally only keys
@@ -803,8 +780,8 @@
         avoidLibrariesSet.add(libraryToAvoid.getRunfilesPath());
       }
     }
-    ObjcProvider.Builder objcProviderBuilder = new ObjcProvider.Builder(semantics);
-    for (Key<?> key : getValuedKeys()) {
+    ObjcProvider.NativeBuilder objcProviderBuilder = new ObjcProvider.NativeBuilder(semantics);
+    for (Key<?> key : items.keySet()) {
       if (key == CC_LIBRARY) {
         addTransitiveAndFilter(objcProviderBuilder, CC_LIBRARY,
             ccLibraryNotYetLinked(avoidLibrariesSet));
@@ -819,6 +796,8 @@
         addTransitiveAndAvoid(objcProviderBuilder, key, avoidObjcProviders);
       }
     }
+    objcProviderBuilder.addStrictDependencyIncludes(strictDependencyIncludes);
+    objcProviderBuilder.setCcCompilationContext(ccCompilationContext);
     return objcProviderBuilder.build();
   }
 
@@ -876,21 +855,10 @@
   private <T> void addTransitiveAndFilter(ObjcProvider.Builder objcProviderBuilder, Key<T> key,
       Predicate<T> filterPredicate) {
     NestedSet<T> propagableItems = (NestedSet<T>) items.get(key);
-    NestedSet<T> nonPropagableItems = (NestedSet<T>) nonPropagatedItems.get(key);
-    NestedSet<T> strictItems = (NestedSet<T>) strictDependencyItems.get(key);
-
     if (propagableItems != null) {
       objcProviderBuilder.addAll(key,
           Iterables.filter(propagableItems.toList(), filterPredicate));
     }
-    if (nonPropagableItems != null) {
-      objcProviderBuilder.addAllNonPropagable(key,
-          Iterables.filter(nonPropagableItems.toList(), filterPredicate));
-    }
-    if (strictItems != null) {
-      objcProviderBuilder.addAllForDirectDependents(key,
-          Iterables.filter(strictItems.toList(), filterPredicate));
-    }
   }
 
   private void addTransitiveAndAvoidArtifacts(ObjcProvider.Builder objcProviderBuilder,
@@ -1003,11 +971,12 @@
    * A builder for this context with an API that is optimized for collecting information from
    * several transitive dependencies.
    */
-  public static final class Builder {
+  public abstract static class Builder {
+
     private final StarlarkSemantics starlarkSemantics;
     private final Map<Key<?>, NestedSetBuilder<?>> items = new HashMap<>();
-    private final Map<Key<?>, NestedSetBuilder<?>> nonPropagatedItems = new HashMap<>();
-    private final Map<Key<?>, NestedSetBuilder<?>> strictDependencyItems = new HashMap<>();
+    private final ImmutableList.Builder<PathFragment> strictDependencyIncludes =
+        ImmutableList.builder();
 
     // Only includes items or lists added directly, never flattens any NestedSets.
     private final ImmutableListMultimap.Builder<Key<?>, ?> directItems =
@@ -1022,22 +991,20 @@
     }
 
     @SuppressWarnings({"rawtypes", "unchecked"})
-    private void uncheckedAddAll(Key key, Iterable toAdd, Map<Key<?>, NestedSetBuilder<?>> set) {
-      maybeAddEmptyBuilder(set, key);
-      set.get(key).addAll(toAdd);
+    private void uncheckedAddAll(Key key, Iterable toAdd) {
+      maybeAddEmptyBuilder(items, key);
+      items.get(key).addAll(toAdd);
     }
 
     @SuppressWarnings({"rawtypes", "unchecked"})
-    private void uncheckedAddAllDirect(
-        Key key, Iterable<?> toAdd, ImmutableListMultimap.Builder<Key<?>, ?> builder) {
-      builder.putAll(key, (Iterable) toAdd);
+    protected void uncheckedAddAllDirect(Key key, Iterable<?> toAdd) {
+      directItems.putAll(key, (Iterable) toAdd);
     }
 
     @SuppressWarnings({"rawtypes", "unchecked"})
-    private void uncheckedAddTransitive(
-        Key key, NestedSet toAdd, Map<Key<?>, NestedSetBuilder<?>> set) {
-      maybeAddEmptyBuilder(set, key);
-      set.get(key).addTransitive(toAdd);
+    protected void uncheckedAddTransitive(Key key, NestedSet toAdd) {
+      maybeAddEmptyBuilder(items, key);
+      items.get(key).addTransitive(toAdd);
     }
 
     /**
@@ -1057,10 +1024,7 @@
      */
     public Builder addTransitiveAndPropagate(ObjcProvider provider) {
       for (Map.Entry<Key<?>, NestedSet<?>> typeEntry : provider.items.entrySet()) {
-        uncheckedAddTransitive(typeEntry.getKey(), typeEntry.getValue(), this.items);
-      }
-      for (Map.Entry<Key<?>, NestedSet<?>> typeEntry : provider.strictDependencyItems.entrySet()) {
-        uncheckedAddTransitive(typeEntry.getKey(), typeEntry.getValue(), this.nonPropagatedItems);
+        uncheckedAddTransitive(typeEntry.getKey(), typeEntry.getValue());
       }
       return this;
     }
@@ -1071,11 +1035,7 @@
      */
     public Builder addTransitiveAndPropagate(Key<?> key, ObjcProvider provider) {
       if (provider.items.containsKey(key)) {
-        uncheckedAddTransitive(key, provider.items.get(key), this.items);
-      }
-      if (provider.strictDependencyItems.containsKey(key)) {
-        uncheckedAddTransitive(
-            key, provider.strictDependencyItems.get(key), this.nonPropagatedItems);
+        uncheckedAddTransitive(key, provider.items.get(key));
       }
       return this;
     }
@@ -1085,68 +1045,7 @@
      * ObjcProvider.
      */
     public <E> Builder addTransitiveAndPropagate(Key<E> key, NestedSet<E> items) {
-      uncheckedAddTransitive(key, items, this.items);
-      return this;
-    }
-
-    // The following CompileInfo/NonCompileInfo family of methods will be deleted in the migration
-    // CL.
-
-    /**
-     * Add compile info from providers, and propagate it to any (transitive) dependers on this
-     * ObjcProvider.
-     */
-    public Builder addTransitiveAndPropagateCompileInfo(Iterable<ObjcProvider> providers) {
-      for (ObjcProvider provider : providers) {
-        addTransitiveAndPropagateCompileInfo(provider);
-      }
-      return this;
-    }
-
-    /**
-     * Add compile info from provider, and propagate it to any (transitive) dependers on this
-     * ObjcProvider.
-     */
-    public Builder addTransitiveAndPropagateCompileInfo(ObjcProvider provider) {
-      for (Map.Entry<Key<?>, NestedSet<?>> typeEntry : provider.items.entrySet()) {
-        if (KEYS_FOR_COMPILE_INFO.contains(typeEntry.getKey())) {
-          uncheckedAddTransitive(typeEntry.getKey(), typeEntry.getValue(), this.items);
-        }
-      }
-      for (Map.Entry<Key<?>, NestedSet<?>> typeEntry : provider.strictDependencyItems.entrySet()) {
-        if (KEYS_FOR_COMPILE_INFO.contains(typeEntry.getKey())) {
-          uncheckedAddTransitive(typeEntry.getKey(), typeEntry.getValue(), this.nonPropagatedItems);
-        }
-      }
-      return this;
-    }
-
-    /**
-     * Add non-compile info from providers, and propagate it to any (transitive) dependers on this
-     * ObjcProvider.
-     */
-    public Builder addTransitiveAndPropagateNonCompileInfo(Iterable<ObjcProvider> providers) {
-      for (ObjcProvider provider : providers) {
-        addTransitiveAndPropagateNonCompileInfo(provider);
-      }
-      return this;
-    }
-
-    /**
-     * Add non-compile info from provider, and propagate it to any (transitive) dependers on this
-     * ObjcProvider.
-     */
-    public Builder addTransitiveAndPropagateNonCompileInfo(ObjcProvider provider) {
-      for (Map.Entry<Key<?>, NestedSet<?>> typeEntry : provider.items.entrySet()) {
-        if (!KEYS_FOR_COMPILE_INFO.contains(typeEntry.getKey())) {
-          uncheckedAddTransitive(typeEntry.getKey(), typeEntry.getValue(), this.items);
-        }
-      }
-      for (Map.Entry<Key<?>, NestedSet<?>> typeEntry : provider.strictDependencyItems.entrySet()) {
-        if (!KEYS_FOR_COMPILE_INFO.contains(typeEntry.getKey())) {
-          uncheckedAddTransitive(typeEntry.getKey(), typeEntry.getValue(), this.nonPropagatedItems);
-        }
-      }
+      uncheckedAddTransitive(key, items);
       return this;
     }
 
@@ -1159,23 +1058,33 @@
     }
 
     /**
-     * Add all keys and values from the given provider, but propagate any normally-propagated items
-     * only to direct dependers of this ObjcProvider.
+     * Propagate keys and values from the given provider to direct dependers of this ObjcProvider.
+     * We no longer support this generically -- the only remaining use case we support is for
+     * includes.
      */
     public Builder addAsDirectDeps(ObjcProvider provider) throws EvalException {
-      for (Map.Entry<Key<?>, NestedSet<?>> typeEntry : provider.items.entrySet()) {
-        Key<?> key = typeEntry.getKey();
-        if (!ObjcProvider.STRICT_DEPENDENCY_KEYS.contains(key)) {
-          throw badDirectDependencyKeyError(key);
-        }
-        uncheckedAddTransitive(key, typeEntry.getValue(), this.strictDependencyItems);
+      CcCompilationContext providerCcCompilationContext = provider.getCcCompilationContext();
+
+      strictDependencyIncludes.addAll(providerCcCompilationContext.getIncludeDirs());
+
+      // Emit an error if we find any other information in the provider.
+      for (Key<?> key : provider.items.keySet()) {
+        throw badDirectDependencyKeyError(key);
       }
-      for (Map.Entry<Key<?>, NestedSet<?>> typeEntry : provider.strictDependencyItems.entrySet()) {
-        Key<?> key = typeEntry.getKey();
-        if (!ObjcProvider.STRICT_DEPENDENCY_KEYS.contains(key)) {
-          throw badDirectDependencyKeyError(key);
-        }
-        uncheckedAddTransitive(key, typeEntry.getValue(), this.nonPropagatedItems);
+      if (!provider.define().isEmpty()) {
+        throw badDirectDependencyKeyError(DEFINE);
+      }
+      if (!provider.header().isEmpty()) {
+        throw badDirectDependencyKeyError(HEADER);
+      }
+      if (!providerCcCompilationContext.getFrameworkIncludeDirs().isEmpty()) {
+        throw badDirectDependencyKeyError(FRAMEWORK_SEARCH_PATHS);
+      }
+      if (!providerCcCompilationContext.getSystemIncludeDirs().isEmpty()) {
+        throw badDirectDependencyKeyError(INCLUDE_SYSTEM);
+      }
+      if (!providerCcCompilationContext.getQuoteIncludeDirs().isEmpty()) {
+        throw badDirectDependencyKeyError(IQUOTE);
       }
       return this;
     }
@@ -1184,10 +1093,13 @@
      * Add element, and propagate it to any (transitive) dependers on this ObjcProvider.
      */
     public <E> Builder add(Key<E> key, E toAdd) {
-      uncheckedAddAll(key, ImmutableList.of(toAdd), this.items);
-      if (ObjcProvider.KEYS_FOR_DIRECT.contains(key)) {
-        uncheckedAddAllDirect(key, ImmutableList.of(toAdd), this.directItems);
-      }
+      uncheckedAddAll(key, ImmutableList.of(toAdd));
+      return this;
+    }
+
+    public <E> Builder addDirect(Key<E> key, E toAdd) {
+      Preconditions.checkState(KEYS_FOR_DIRECT.contains(key));
+      uncheckedAddAllDirect(key, ImmutableList.of(toAdd));
       return this;
     }
 
@@ -1202,38 +1114,65 @@
      * Add elements in toAdd, and propagate them to any (transitive) dependers on this ObjcProvider.
      */
     public <E> Builder addAll(Key<E> key, Iterable<? extends E> toAdd) {
-      uncheckedAddAll(key, toAdd, this.items);
-      if (ObjcProvider.KEYS_FOR_DIRECT.contains(key)) {
-        uncheckedAddAllDirect(key, toAdd, this.directItems);
+      uncheckedAddAll(key, toAdd);
+      return this;
+    }
+
+    public <E> Builder addAllDirect(Key<E> key, Iterable<? extends E> toAdd) {
+      Preconditions.checkState(KEYS_FOR_DIRECT.contains(key));
+      uncheckedAddAllDirect(key, toAdd);
+      return this;
+    }
+
+    Builder addStrictDependencyIncludes(Iterable<PathFragment> includes) {
+      strictDependencyIncludes.addAll(includes);
+      return this;
+    }
+
+    abstract ObjcProvider build();
+
+    protected ObjcProvider build(CcCompilationContext ccCompilationContext) {
+      ImmutableMap.Builder<Key<?>, NestedSet<?>> propagatedBuilder = new ImmutableMap.Builder<>();
+      for (Map.Entry<Key<?>, NestedSetBuilder<?>> typeEntry : items.entrySet()) {
+        propagatedBuilder.put(typeEntry.getKey(), typeEntry.getValue().build());
       }
+      return new ObjcProvider(
+          starlarkSemantics,
+          propagatedBuilder.build(),
+          strictDependencyIncludes.build(),
+          directItems.build(),
+          ccCompilationContext);
+    }
+  }
+
+  /** A builder for this context, specialized for native use. */
+  public static final class NativeBuilder extends Builder {
+    private CcCompilationContext ccCompilationContext = CcCompilationContext.EMPTY;
+
+    public NativeBuilder(StarlarkSemantics semantics) {
+      super(semantics);
+    }
+
+    Builder setCcCompilationContext(CcCompilationContext ccCompilationContext) {
+      Preconditions.checkState(this.ccCompilationContext == CcCompilationContext.EMPTY);
+      Preconditions.checkNotNull(ccCompilationContext);
+      this.ccCompilationContext = ccCompilationContext;
       return this;
     }
 
-    /**
-     * Add elements in toAdd, and do not propagate to dependents of this provider.
-     */
-    public <E> Builder addAllNonPropagable(Key<E> key, Iterable<? extends E> toAdd) {
-      Preconditions.checkState(ObjcProvider.STRICT_DEPENDENCY_KEYS.contains(key));
-      uncheckedAddAll(key, toAdd, this.nonPropagatedItems);
-      return this;
+    @Override
+    public ObjcProvider build() {
+      return build(ccCompilationContext);
     }
+  }
 
-    /**
-     * Add element toAdd, and propagate it only to direct dependents of this provider.
-     */
-    public <E> Builder addForDirectDependents(Key<E> key, E toAdd) {
-      Preconditions.checkState(ObjcProvider.STRICT_DEPENDENCY_KEYS.contains(key));
-      uncheckedAddAll(key, ImmutableList.of(toAdd), this.strictDependencyItems);
-      return this;
-    }
+  /** A builder for this context, specialized for Starlark use. */
+  public static final class StarlarkBuilder extends Builder {
+    private final CcCompilationContext.Builder ccCompilationContextBuilder =
+        CcCompilationContext.builder(null, null, null);
 
-    /**
-     * Add elements in toAdd, and propagate them only to direct dependents of this provider.
-     */
-    public <E> Builder addAllForDirectDependents(Key<E> key, Iterable<? extends E> toAdd) {
-      Preconditions.checkState(ObjcProvider.STRICT_DEPENDENCY_KEYS.contains(key));
-      uncheckedAddAll(key, toAdd, this.strictDependencyItems);
-      return this;
+    public StarlarkBuilder(StarlarkSemantics semantics) {
+      super(semantics);
     }
 
     /**
@@ -1242,9 +1181,60 @@
      */
     void addElementsFromSkylark(Key<?> key, Object skylarkToAdd) throws EvalException {
       NestedSet<?> toAdd = ObjcProviderSkylarkConverters.convertToJava(key, skylarkToAdd);
-      uncheckedAddTransitive(key, toAdd, this.items);
-      if (ObjcProvider.KEYS_FOR_DIRECT.contains(key)) {
-        uncheckedAddAllDirect(key, toAdd.toList(), this.directItems);
+      if (KEYS_FOR_COMPILE_INFO.contains(key)) {
+        String keyName = key.getSkylarkKeyName();
+
+        if (key == DEFINE) {
+          ccCompilationContextBuilder.addDefines(
+              Depset.getSetFromNoneableParam(skylarkToAdd, String.class, keyName));
+        } else if (key == FRAMEWORK_SEARCH_PATHS) {
+          // Due to legacy reasons, There is a mismatch between the starlark interface for the
+          // framework search path, and the internal representation.  The interface specifies that
+          // framework_search_paths include the framework directories, but internally we only store
+          // their parents.  We will eventually clean up the interface, but for now we need to do
+          // this ugly conversion.
+
+          ImmutableList<PathFragment> frameworks =
+              Depset.getSetFromNoneableParam(skylarkToAdd, String.class, keyName).toList().stream()
+                  .map(x -> PathFragment.create(x))
+                  .collect(ImmutableList.toImmutableList());
+
+          ImmutableList.Builder<PathFragment> frameworkSearchPaths = ImmutableList.builder();
+          for (PathFragment framework : frameworks) {
+            if (!framework.getSafePathString().endsWith(FRAMEWORK_SUFFIX)) {
+              throw new EvalException(
+                  null, String.format(AppleSkylarkCommon.BAD_FRAMEWORK_PATH_ERROR, framework));
+            }
+            frameworkSearchPaths.add(framework.getParentDirectory());
+          }
+          ccCompilationContextBuilder.addFrameworkIncludeDirs(frameworkSearchPaths.build());
+        } else if (key == HEADER) {
+          ImmutableList<Artifact> hdrs =
+              Depset.getSetFromNoneableParam(skylarkToAdd, Artifact.class, keyName).toList();
+          ccCompilationContextBuilder.addDeclaredIncludeSrcs(hdrs);
+          ccCompilationContextBuilder.addTextualHdrs(hdrs);
+        } else if (key == INCLUDE) {
+          ccCompilationContextBuilder.addIncludeDirs(
+              Depset.getSetFromNoneableParam(skylarkToAdd, String.class, keyName).toList().stream()
+                  .map(x -> PathFragment.create(x))
+                  .collect(ImmutableList.toImmutableList()));
+        } else if (key == INCLUDE_SYSTEM) {
+          ccCompilationContextBuilder.addSystemIncludeDirs(
+              Depset.getSetFromNoneableParam(skylarkToAdd, String.class, keyName).toList().stream()
+                  .map(x -> PathFragment.create(x))
+                  .collect(ImmutableList.toImmutableList()));
+        } else if (key == IQUOTE) {
+          ccCompilationContextBuilder.addQuoteIncludeDirs(
+              Depset.getSetFromNoneableParam(skylarkToAdd, String.class, keyName).toList().stream()
+                  .map(x -> PathFragment.create(x))
+                  .collect(ImmutableList.toImmutableList()));
+        }
+      } else {
+        uncheckedAddTransitive(key, toAdd);
+      }
+
+      if (KEYS_FOR_DIRECT.contains(key)) {
+        uncheckedAddAllDirect(key, toAdd.toList());
       }
     }
 
@@ -1269,7 +1259,10 @@
                     AppleSkylarkCommon.BAD_PROVIDERS_ELEM_ERROR,
                     EvalUtils.getDataTypeName(toAddObject)));
           } else {
-            this.addTransitiveAndPropagate((ObjcProvider) toAddObject);
+            ObjcProvider objcProvider = (ObjcProvider) toAddObject;
+            this.addTransitiveAndPropagate(objcProvider);
+            ccCompilationContextBuilder.mergeDependentCcCompilationContext(
+                objcProvider.getCcCompilationContext());
           }
         }
       }
@@ -1302,28 +1295,9 @@
       }
     }
 
+    @Override
     public ObjcProvider build() {
-      ImmutableMap.Builder<Key<?>, NestedSet<?>> propagatedBuilder = new ImmutableMap.Builder<>();
-      for (Map.Entry<Key<?>, NestedSetBuilder<?>> typeEntry : items.entrySet()) {
-        propagatedBuilder.put(typeEntry.getKey(), typeEntry.getValue().build());
-      }
-      ImmutableMap.Builder<Key<?>, NestedSet<?>> nonPropagatedBuilder =
-          new ImmutableMap.Builder<>();
-      for (Map.Entry<Key<?>, NestedSetBuilder<?>> typeEntry : nonPropagatedItems.entrySet()) {
-        nonPropagatedBuilder.put(typeEntry.getKey(), typeEntry.getValue().build());
-      }
-      ImmutableMap.Builder<Key<?>, NestedSet<?>> strictDependencyBuilder =
-          new ImmutableMap.Builder<>();
-      for (Map.Entry<Key<?>, NestedSetBuilder<?>> typeEntry : strictDependencyItems.entrySet()) {
-        strictDependencyBuilder.put(typeEntry.getKey(), typeEntry.getValue().build());
-      }
-
-      return new ObjcProvider(
-          starlarkSemantics,
-          propagatedBuilder.build(),
-          nonPropagatedBuilder.build(),
-          strictDependencyBuilder.build(),
-          directItems.build());
+      return build(ccCompilationContextBuilder.build());
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
index 72c4dd3..1cac4a4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
@@ -14,6 +14,8 @@
 
 package com.google.devtools.build.lib.rules.objc;
 
+import static com.google.common.base.Preconditions.checkState;
+
 import com.google.common.base.Joiner;
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
@@ -71,6 +73,7 @@
   private final NestedSet<Artifact> portableProtoFilters;
   private final CcToolchainProvider toolchain;
   private final ImmutableSet<Artifact> dylibHandledProtos;
+  private Optional<ObjcProvider> objcProvider;
 
   /**
    * Creates a new proto support for the protobuf library. This support code bundles up all the
@@ -102,6 +105,7 @@
     this.portableProtoFilters = portableProtoFilters;
     this.toolchain = toolchain;
     this.dylibHandledProtos = dylibHandledProtos.toSet();
+    this.objcProvider = Optional.absent();
   }
 
   /** Registers the action that will compile the generated code. */
@@ -133,36 +137,22 @@
             .build();
 
     compilationSupport.registerCompileAndArchiveActions(common, userHeaderSearchPaths);
+    setObjcProvider(compilationSupport.getObjcProvider());
 
     return this;
   }
 
+  private void setObjcProvider(ObjcProvider objcProvider) {
+    checkState(!this.objcProvider.isPresent());
+    this.objcProvider = Optional.of(objcProvider);
+  }
+
   /**
    * Returns the ObjcProvider for this target, or Optional.absent() if there were no protos to
    * generate.
    */
-  Optional<ObjcProvider> getObjcProvider() throws InterruptedException {
-    if (!hasOutputProtos()) {
-      return Optional.absent();
-    }
-
-    Iterable<PathFragment> includes = ImmutableList.of(getWorkspaceRelativeOutputDir());
-    ObjcCommon.Builder commonBuilder = new ObjcCommon.Builder(ruleContext);
-
-    CompilationArtifacts compilationArtifacts =
-        new CompilationArtifacts.Builder()
-            .setIntermediateArtifacts(getUniqueIntermediateArtifactsForSourceCompile())
-            .addNonArcSrcs(getGeneratedProtoOutputs(getOutputProtos(), SOURCE_SUFFIX))
-            .addAdditionalHdrs(getGeneratedProtoOutputs(getAllProtos(), HEADER_SUFFIX))
-            .addAdditionalHdrs(getProtobufHeaders())
-            .build();
-
-    ObjcCommon common =
-        getCommon(getUniqueIntermediateArtifactsForSourceCompile(), compilationArtifacts);
-    commonBuilder.addDepObjcProviders(ImmutableSet.of(common.getObjcProvider()));
-    commonBuilder.addIncludes(includes);
-
-    return Optional.of(commonBuilder.build().getObjcProvider());
+  public Optional<ObjcProvider> getObjcProvider() {
+    return objcProvider;
   }
 
   private NestedSet<Artifact> getProtobufHeaders() {
@@ -227,7 +217,7 @@
   private ObjcCommon getCommon(
       IntermediateArtifacts intermediateArtifacts, CompilationArtifacts compilationArtifacts)
       throws InterruptedException {
-    return new ObjcCommon.Builder(ruleContext)
+    return new ObjcCommon.Builder(ObjcCommon.Purpose.COMPILE_AND_LINK, ruleContext)
         .setIntermediateArtifacts(intermediateArtifacts)
         .setCompilationArtifacts(compilationArtifacts)
         .addIncludes(getProtobufHeaderSearchPaths())
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/BUILD b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/BUILD
index 0e80f2d..df8f475 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/BUILD
@@ -24,6 +24,7 @@
         "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/core",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform",
         "//src/main/java/com/google/devtools/build/lib/skylarkinterface",
         "//third_party:guava",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java
index 58c0b0a..1fbdcd2 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java
@@ -15,6 +15,7 @@
 package com.google.devtools.build.lib.skylarkbuildapi.apple;
 
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcCompilationContextApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
@@ -60,7 +61,7 @@
       doc =
           "Exec paths of .framework directories corresponding to frameworks to include "
               + "in search paths, but not to link.")
-  Depset /*<String>*/ frameworkSearchPathOnly();
+  Depset /*<String>*/ frameworkIncludeForStarlark();
 
   @SkylarkCallable(
       name = "force_load_library",
@@ -94,19 +95,27 @@
       doc =
           "Include search paths specified with '-I' on the command line. Also known as "
               + "header search paths (and distinct from <em>user</em> header search paths).")
-  Depset include();
+  Depset includeForStarlark();
+
+  @SkylarkCallable(
+      name = "strict_include",
+      structField = true,
+      doc =
+          "Non-propagated include search paths specified with '-I' on the command line. Also known "
+              + "as header search paths (and distinct from <em>user</em> header search paths).")
+  Depset strictIncludeForStarlark();
 
   @SkylarkCallable(
       name = "include_system",
       structField = true,
       doc = "System include search paths (typically specified with -isystem).")
-  Depset includeSystem();
+  Depset systemIncludeForStarlark();
 
   @SkylarkCallable(
       name = "iquote",
       structField = true,
       doc = "User header search paths (typically specified with -iquote).")
-  Depset iquote();
+  Depset quoteIncludeForStarlark();
 
   @SkylarkCallable(
       name = "j2objc_library",
@@ -261,4 +270,12 @@
       structField = true,
       doc = "Returns all framework paths to static frameworks in this provider.")
   Depset /*<String>*/ staticFrameworkPathsForStarlark();
+
+  @SkylarkCallable(
+      name = "compilation_context",
+      doc =
+          "Returns the embedded <code>CcCompilationContext</code> that contains the"
+              + "provider's compilation information.",
+      structField = true)
+  CcCompilationContextApi getCcCompilationContext();
 }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/BUILD
index 0a2d946..7005165 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/BUILD
@@ -15,11 +15,11 @@
     name = "apple",
     srcs = glob(["*.java"]),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:events",
         "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/core",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi",
         "//third_party:guava",
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeObjcProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeObjcProvider.java
index ebffe30..79d118b 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeObjcProvider.java
@@ -16,6 +16,7 @@
 
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.apple.ObjcProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcCompilationContextApi;
 import com.google.devtools.build.lib.syntax.Depset;
 import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.build.lib.syntax.Sequence;
@@ -41,7 +42,7 @@
   }
 
   @Override
-  public Depset frameworkSearchPathOnly() {
+  public Depset frameworkIncludeForStarlark() {
     return null;
   }
 
@@ -66,17 +67,22 @@
   }
 
   @Override
-  public Depset include() {
+  public Depset includeForStarlark() {
     return null;
   }
 
   @Override
-  public Depset includeSystem() {
+  public Depset /*<String>*/ strictIncludeForStarlark() {
     return null;
   }
 
   @Override
-  public Depset iquote() {
+  public Depset systemIncludeForStarlark() {
+    return null;
+  }
+
+  @Override
+  public Depset quoteIncludeForStarlark() {
     return null;
   }
 
@@ -181,6 +187,11 @@
   }
 
   @Override
+  public CcCompilationContextApi getCcCompilationContext() {
+    return null;
+  }
+
+  @Override
   public Depset /*<String>*/ dynamicFrameworkNamesForStarlark() {
     return null;
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/MockCppSemantics.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/MockCppSemantics.java
index fa4e15c..042083f 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/MockCppSemantics.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/MockCppSemantics.java
@@ -14,13 +14,9 @@
 
 package com.google.devtools.build.lib.rules.cpp;
 
-import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
@@ -44,11 +40,6 @@
       CppCompileActionBuilder actionBuilder) {}
 
   @Override
-  public NestedSet<Artifact> getAdditionalPrunableIncludes() {
-    return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
-  }
-
-  @Override
   public IncludeProcessing getIncludeProcessing() {
     return null;
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
index aa0ac0d..ee3cd05 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
@@ -91,7 +91,7 @@
             TestConstants.TOOLS_REPOSITORY_PATH_PREFIX
                 + "third_party/java/j2objc/libjre_core_lib.a",
             "java/com/google/dummy/test/libtest_j2objc.a");
-    assertThat(Artifact.toRootRelativePaths(provider.get(ObjcProvider.HEADER)))
+    assertThat(Artifact.toRootRelativePaths(provider.header()))
         .containsExactly(
             TestConstants.TOOLS_REPOSITORY_PATH_PREFIX + "third_party/java/j2objc/jre_core.h",
             "java/com/google/dummy/test/_j2objc/test/java/com/google/dummy/test/test.h");
@@ -99,9 +99,7 @@
     String execPath =
         getConfiguration(j2objcLibraryTarget).getBinDirectory(RepositoryName.MAIN).getExecPath()
             + "/";
-    assertThat(
-            Iterables.transform(
-                provider.get(ObjcProvider.INCLUDE).toList(), PathFragment::getSafePathString))
+    assertThat(Iterables.transform(provider.include(), PathFragment::getSafePathString))
         .containsExactly(execPath + "java/com/google/dummy/test/_j2objc/test");
   }
 
@@ -135,7 +133,7 @@
             TestConstants.TOOLS_REPOSITORY_PATH_PREFIX
                 + "third_party/java/j2objc/libjre_core_lib.a",
             "java/com/google/test/libtest_j2objc.a");
-    assertThat(Artifact.toRootRelativePaths(provider.get(ObjcProvider.HEADER)))
+    assertThat(Artifact.toRootRelativePaths(provider.header()))
         .containsExactly(
             TestConstants.TOOLS_REPOSITORY_PATH_PREFIX + "third_party/java/j2objc/jre_core.h",
             "java/com/google/test/_j2objc/test/"
@@ -144,9 +142,7 @@
 
     String execPath =
         getConfiguration(target).getBinDirectory(RepositoryName.MAIN).getExecPath() + "/";
-    assertThat(
-            Iterables.transform(
-                provider.get(ObjcProvider.INCLUDE).toList(), PathFragment::getSafePathString))
+    assertThat(Iterables.transform(provider.include(), PathFragment::getSafePathString))
         .containsExactly(
             execPath + "java/com/google/test/_j2objc/test/" + genfilesFragment,
             execPath + "java/com/google/test/_j2objc/test");
@@ -189,7 +185,7 @@
                 + "third_party/java/j2objc/libproto_runtime.a",
             "java/com/google/dummy/test/proto/libtest_j2objc.a",
             "java/com/google/dummy/test/proto/libtest_proto_j2objc.a");
-    assertThat(Artifact.toRootRelativePaths(provider.get(ObjcProvider.HEADER)))
+    assertThat(Artifact.toRootRelativePaths(provider.header()))
         .containsExactly(
             TestConstants.TOOLS_REPOSITORY_PATH_PREFIX + "third_party/java/j2objc/jre_core.h",
             TestConstants.TOOLS_REPOSITORY_PATH_PREFIX + "third_party/java/j2objc/runtime.h",
@@ -299,7 +295,7 @@
     ObjcProvider objcProvider = target.get(ObjcProvider.SKYLARK_CONSTRUCTOR);
     Artifact headerFile = getGenfilesArtifact("test.j2objc.pb.h", test, getJ2ObjcAspect());
     Artifact sourceFile = getGenfilesArtifact("test.j2objc.pb.m", test, getJ2ObjcAspect());
-    assertThat(objcProvider.get(ObjcProvider.HEADER).toList()).contains(headerFile);
+    assertThat(objcProvider.header().toList()).contains(headerFile);
     assertThat(objcProvider.get(ObjcProvider.SOURCE).toList()).contains(sourceFile);
   }
 
@@ -350,9 +346,9 @@
         getGenfilesArtifact("../external/bla/foo/test.j2objc.pb.h", test, getJ2ObjcAspect());
     Artifact sourceFile =
         getGenfilesArtifact("../external/bla/foo/test.j2objc.pb.m", test, getJ2ObjcAspect());
-    assertThat(objcProvider.get(ObjcProvider.HEADER).toList()).contains(headerFile);
+    assertThat(objcProvider.header().toList()).contains(headerFile);
     assertThat(objcProvider.get(ObjcProvider.SOURCE).toList()).contains(sourceFile);
-    assertThat(objcProvider.get(ObjcProvider.INCLUDE).toList())
+    assertThat(objcProvider.include())
         .contains(getConfiguration(target).getGenfilesFragment().getRelative("external/bla"));
   }
 
@@ -423,7 +419,7 @@
             TestConstants.TOOLS_REPOSITORY_PATH_PREFIX
                 + "third_party/java/j2objc/libjre_core_lib.a",
             "java/com/google/dummy/test/libtest_j2objc.a");
-    assertThat(Artifact.toRootRelativePaths(provider.get(ObjcProvider.HEADER)))
+    assertThat(Artifact.toRootRelativePaths(provider.header()))
         .containsExactly(
             TestConstants.TOOLS_REPOSITORY_PATH_PREFIX + "third_party/java/j2objc/jre_core.h",
             "java/com/google/dummy/test/_j2objc/test/java/com/google/dummy/test/test.h");
@@ -445,8 +441,7 @@
     ObjcProvider provider = target.get(ObjcProvider.SKYLARK_CONSTRUCTOR);
     Artifact srcJarSources = getFirstArtifactEndingWith(
         provider.get(ObjcProvider.SOURCE), "source_files");
-    Artifact srcJarHeaders = getFirstArtifactEndingWith(
-        provider.get(ObjcProvider.HEADER), "header_files");
+    Artifact srcJarHeaders = getFirstArtifactEndingWith(provider.header(), "header_files");
     assertThat(srcJarSources.getRootRelativePathString())
         .isEqualTo("java/com/google/transpile/_j2objc/src_jar_files/dummy/source_files");
     assertThat(srcJarHeaders.getRootRelativePathString())
@@ -462,8 +457,7 @@
     ConfiguredTarget j2objcLibraryTarget =
         getConfiguredTarget("//java/com/google/app/test:transpile");
     ObjcProvider provider = j2objcLibraryTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR);
-    Artifact headers =
-        getFirstArtifactEndingWith(provider.get(ObjcProvider.HEADER), "header_files");
+    Artifact headers = getFirstArtifactEndingWith(provider.header(), "header_files");
     Artifact sources =
         getFirstArtifactEndingWith(provider.get(ObjcProvider.SOURCE), "source_files");
     assertThat(headers.isTreeArtifact()).isTrue();
@@ -631,16 +625,14 @@
                 + "third_party/java/j2objc/libjre_core_lib.a",
             "java/com/google/dummy/test/libtest_j2objc.a",
             "app/liblib.a");
-    assertThat(Artifact.toRootRelativePaths(provider.get(ObjcProvider.HEADER)))
+    assertThat(Artifact.toRootRelativePaths(provider.header()))
         .containsExactly(
             TestConstants.TOOLS_REPOSITORY_PATH_PREFIX + "third_party/java/j2objc/jre_core.h",
             "java/com/google/dummy/test/_j2objc/test/java/com/google/dummy/test/test.h");
 
     String execPath =
         getConfiguration(objcTarget).getBinDirectory(RepositoryName.MAIN).getExecPath() + "/";
-    assertThat(
-            Iterables.transform(
-                provider.get(ObjcProvider.INCLUDE).toList(), PathFragment::getSafePathString))
+    assertThat(Iterables.transform(provider.include(), PathFragment::getSafePathString))
         .containsExactly(execPath + "java/com/google/dummy/test/_j2objc/test");
   }
 
@@ -680,7 +672,7 @@
             "app/libdummyOne_j2objc.a",
             "app/libdummyTwo_j2objc.a",
             "app/liblib.a");
-    assertThat(Artifact.toRootRelativePaths(provider.get(ObjcProvider.HEADER)))
+    assertThat(Artifact.toRootRelativePaths(provider.header()))
         .containsExactly(
             TestConstants.TOOLS_REPOSITORY_PATH_PREFIX + "third_party/java/j2objc/jre_core.h",
             "app/_j2objc/dummyOne/app/dummyOne.h",
@@ -688,9 +680,7 @@
 
     String execPath =
         getConfiguration(objcTarget).getBinDirectory(RepositoryName.MAIN).getExecPath() + "/";
-    assertThat(
-            Iterables.transform(
-                provider.get(ObjcProvider.INCLUDE).toList(), PathFragment::getSafePathString))
+    assertThat(Iterables.transform(provider.include(), PathFragment::getSafePathString))
         .containsExactly(execPath + "app/_j2objc/dummyOne", execPath + "app/_j2objc/dummyTwo");
   }
 
@@ -829,8 +819,7 @@
     CppModuleMapAction moduleMapAction = (CppModuleMapAction) getGeneratingAction(moduleMap);
     UmbrellaHeaderAction umbrellaHeaderAction =
         (UmbrellaHeaderAction) getGeneratingAction(umbrellaHeader);
-    Artifact headers =
-        getFirstArtifactEndingWith(provider.get(ObjcProvider.HEADER), "header_files");
+    Artifact headers = getFirstArtifactEndingWith(provider.header(), "header_files");
 
     // Test that the module map action contains the header tree artifact as both the public header
     // and part of the action inputs.
@@ -1102,7 +1091,7 @@
             "tools/j2objc/libalt_proto_runtime.a",
             "java/com/google/dummy/test/proto/libtest_j2objc.a",
             "java/com/google/dummy/test/proto/libtest_proto_j2objc.a");
-    assertThat(Artifact.toRootRelativePaths(provider.get(ObjcProvider.HEADER)))
+    assertThat(Artifact.toRootRelativePaths(provider.header()))
         .containsExactly(
             TestConstants.TOOLS_REPOSITORY_PATH_PREFIX + "third_party/java/j2objc/jre_core.h",
             "tools/j2objc/alt_proto_runtime.h",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcImportTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcImportTest.java
index 247fadf..c9ac71a 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcImportTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcImportTest.java
@@ -16,6 +16,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.base.Optional;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.CommandAction;
 import com.google.devtools.build.lib.testutil.Scratch;
@@ -117,7 +118,7 @@
 
   @Test
   public void testProvidesHdrsAndIncludes() throws Exception {
-    checkProvidesHdrsAndIncludes(RULE_TYPE);
+    checkProvidesHdrsAndIncludes(RULE_TYPE, Optional.absent());
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
index 095351f..1bc8def 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
@@ -21,7 +21,6 @@
 import static com.google.devtools.build.lib.rules.objc.CompilationSupport.BOTH_MODULE_NAME_AND_MODULE_MAP_SPECIFIED;
 import static com.google.devtools.build.lib.rules.objc.CompilationSupport.FILE_IN_SRCS_AND_HDRS_WARNING_FORMAT;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.CC_LIBRARY;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.HEADER;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LIBRARY;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.SDK_DYLIB;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.SDK_FRAMEWORK;
@@ -31,6 +30,7 @@
 import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 
 import com.google.common.base.Joiner;
+import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
@@ -53,7 +53,6 @@
 import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMapAction;
 import com.google.devtools.build.lib.rules.cpp.CppRuleClasses;
-import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.common.options.OptionsParsingException;
 import java.util.List;
@@ -377,10 +376,17 @@
             .setAndCreateFiles("hdrs", "d.h", "e.m")
             .setList("deps", "//objc:lib")
             .write();
-    assertThat(getArifactPaths(target, HEADER))
-        .containsExactly("objc/a.h", "objc/b.h", "objc/f.m");
-    assertThat(getArifactPaths(depender, HEADER))
-        .containsExactly("objc/a.h", "objc/b.h", "objc/f.m", "objc2/d.h", "objc2/e.m");
+    assertThat(getArifactPathsOfHeaders(target))
+        .containsExactly("objc/a.h", "objc/b.h", "objc/f.m", "objc/private.h");
+    assertThat(getArifactPathsOfHeaders(depender))
+        .containsExactly(
+            "objc/a.h",
+            "objc/b.h",
+            "objc/f.m",
+            "objc/private.h",
+            "objc2/d.h",
+            "objc2/e.m",
+            "objc2/private.h");
   }
 
   @Test
@@ -992,17 +998,23 @@
     assertThat(getArifactPaths(target, LIBRARY)).containsExactly("objc/liblib.a");
     assertThat(getArifactPaths(depender, LIBRARY)).containsExactly(
         "objc/liblib.a", "objc2/liblib.a");
-    assertThat(getArifactPaths(target, HEADER))
-        .containsExactly("objc/a.h", "objc/b.h");
-    assertThat(getArifactPaths(depender, HEADER))
-        .containsExactly("objc/a.h", "objc/b.h", "objc2/c.h", "objc2/d.h");
+    assertThat(getArifactPathsOfHeaders(target))
+        .containsExactly("objc/a.h", "objc/b.h", "objc/private.h");
+    assertThat(getArifactPathsOfHeaders(depender))
+        .containsExactly(
+            "objc/a.h", "objc/b.h", "objc/private.h", "objc2/c.h", "objc2/d.h", "objc2/private.h");
   }
 
-  private Iterable<String> getArifactPaths(ConfiguredTarget target, Key<Artifact> artifactKey) {
+  private static Iterable<String> getArifactPaths(
+      ConfiguredTarget target, ObjcProvider.Key<Artifact> artifactKey) {
     return Artifact.toRootRelativePaths(
         target.get(ObjcProvider.SKYLARK_CONSTRUCTOR).get(artifactKey));
   }
 
+  private static Iterable<String> getArifactPathsOfHeaders(ConfiguredTarget target) {
+    return Artifact.toRootRelativePaths(target.get(ObjcProvider.SKYLARK_CONSTRUCTOR).header());
+  }
+
   @Test
   public void testWeakSdkFrameworks_objcProvider() throws Exception {
     createLibraryTargetWriter("//base_lib:lib")
@@ -1565,7 +1577,7 @@
 
   @Test
   public void testProvidesHdrsAndIncludes() throws Exception {
-    checkProvidesHdrsAndIncludes(RULE_TYPE);
+    checkProvidesHdrsAndIncludes(RULE_TYPE, Optional.of("x/private.h"));
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java
index b81a060..29d42f3 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java
@@ -27,12 +27,10 @@
 import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
 import com.google.devtools.build.lib.syntax.Depset;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.Root;
 import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
-import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -41,8 +39,8 @@
 @RunWith(JUnit4.class)
 public class ObjcProviderTest {
 
-  private static ObjcProvider.Builder objcProviderBuilder() {
-    return new ObjcProvider.Builder(StarlarkSemantics.DEFAULT_SEMANTICS);
+  private static ObjcProvider.StarlarkBuilder objcProviderBuilder() {
+    return new ObjcProvider.StarlarkBuilder(StarlarkSemantics.DEFAULT_SEMANTICS);
   }
 
   private static ImmutableList<ObjcProvider.Key<?>> getAllKeys() throws Exception {
@@ -74,7 +72,7 @@
     Artifact rootArtifact = createArtifact("/root.m");
     ObjcProvider root =
         objcProviderBuilder()
-            .add(ObjcProvider.SOURCE, rootArtifact)
+            .addDirect(ObjcProvider.SOURCE, rootArtifact)
             .addTransitiveAndPropagate(leaf)
             .build();
     assertThat(root.getDirect(ObjcProvider.SOURCE)).containsExactly(rootArtifact);
@@ -87,9 +85,9 @@
     Artifact module = createArtifact("/module.modulemap");
     ObjcProvider provider =
         objcProviderBuilder()
-            .add(ObjcProvider.SOURCE, source)
-            .add(ObjcProvider.HEADER, header)
-            .add(ObjcProvider.MODULE_MAP, module)
+            .addDirect(ObjcProvider.SOURCE, source)
+            .addDirect(ObjcProvider.HEADER, header)
+            .addDirect(ObjcProvider.MODULE_MAP, module)
             .build();
     assertThat(provider.getDirect(ObjcProvider.SOURCE)).containsExactly(source);
     assertThat(provider.getDirect(ObjcProvider.HEADER)).containsExactly(header);
@@ -102,9 +100,9 @@
         ImmutableList.of(createArtifact("/foo"), createArtifact("/bar"));
     ObjcProvider provider =
         objcProviderBuilder()
-            .addAll(ObjcProvider.SOURCE, artifacts)
-            .addAll(ObjcProvider.HEADER, artifacts)
-            .addAll(ObjcProvider.MODULE_MAP, artifacts)
+            .addAllDirect(ObjcProvider.SOURCE, artifacts)
+            .addAllDirect(ObjcProvider.HEADER, artifacts)
+            .addAllDirect(ObjcProvider.MODULE_MAP, artifacts)
             .build();
     assertThat(provider.getDirect(ObjcProvider.SOURCE)).containsExactlyElementsIn(artifacts);
     assertThat(provider.getDirect(ObjcProvider.HEADER)).containsExactlyElementsIn(artifacts);
@@ -116,7 +114,7 @@
     ImmutableList<Artifact> artifacts =
         ImmutableList.of(createArtifact("/foo"), createArtifact("/bar"));
     Depset set = Depset.of(Artifact.TYPE, NestedSetBuilder.wrap(Order.STABLE_ORDER, artifacts));
-    ObjcProvider.Builder builder = objcProviderBuilder();
+    ObjcProvider.StarlarkBuilder builder = objcProviderBuilder();
     builder.addElementsFromSkylark(ObjcProvider.SOURCE, set);
     builder.addElementsFromSkylark(ObjcProvider.HEADER, set);
     builder.addElementsFromSkylark(ObjcProvider.MODULE_MAP, set);
@@ -127,28 +125,6 @@
   }
 
   @Test
-  @SuppressWarnings("unchecked")
-  public void directFieldsLimitedToCertainKeys() throws Exception {
-    ObjcProvider.Builder builder = objcProviderBuilder();
-    ImmutableList<String> values = ImmutableList.of("dummy", "fooey");
-
-    List<ObjcProvider.Key<?>> allKeys = getAllKeys();
-    for (ObjcProvider.Key<?> key : allKeys) {
-      // Use a List without a generic type to trick the compiler into allowing strings.
-      builder.addAll(key, (List) values);
-    }
-    ObjcProvider provider = builder.build();
-
-    for (ObjcProvider.Key<?> key : allKeys) {
-      if (ObjcProvider.KEYS_FOR_DIRECT.contains(key)) {
-        assertThat(provider.getDirect(key)).containsExactlyElementsIn(values);
-      } else {
-        assertThat(provider.getDirect(key)).isEmpty();
-      }
-    }
-  }
-
-  @Test
   public void onlyPropagatesProvider() {
     ObjcProvider onlyPropagates = objcProviderBuilder()
         .add(ObjcProvider.SDK_DYLIB, "foo")
@@ -157,53 +133,6 @@
   }
 
   @Test
-  public void strictDependencyDoesNotPropagateMoreThanOneLevel() {
-    PathFragment strictInclude = PathFragment.create("strict_path");
-    PathFragment propagatedInclude = PathFragment.create("propagated_path");
-
-    ObjcProvider strictDep =
-        objcProviderBuilder()
-            .addForDirectDependents(ObjcProvider.INCLUDE, strictInclude)
-            .build();
-    ObjcProvider propagatedDep =
-        objcProviderBuilder().add(ObjcProvider.INCLUDE, propagatedInclude).build();
-
-    ObjcProvider provider =
-        objcProviderBuilder()
-            .addTransitiveAndPropagate(ImmutableList.of(strictDep, propagatedDep))
-            .build();
-    ObjcProvider depender = objcProviderBuilder().addTransitiveAndPropagate(provider).build();
-
-    assertThat(provider.get(ObjcProvider.INCLUDE).toList())
-        .containsExactly(strictInclude, propagatedInclude);
-    assertThat(depender.get(ObjcProvider.INCLUDE).toList()).containsExactly(propagatedInclude);
-  }
-
-  @Test
-  public void strictDependencyDoesNotPropagateMoreThanOneLevelOnSkylark() {
-    PathFragment strictInclude = PathFragment.create("strict_path");
-    PathFragment propagatedInclude = PathFragment.create("propagated_path");
-
-    ObjcProvider strictDep =
-        objcProviderBuilder()
-            .addForDirectDependents(ObjcProvider.INCLUDE, strictInclude)
-            .build();
-    ObjcProvider propagatedDep =
-        objcProviderBuilder().add(ObjcProvider.INCLUDE, propagatedInclude).build();
-
-    ObjcProvider provider =
-        objcProviderBuilder()
-            .addTransitiveAndPropagate(ImmutableList.of(strictDep, propagatedDep))
-            .build();
-    ObjcProvider depender = objcProviderBuilder().addTransitiveAndPropagate(provider).build();
-
-    assertThat(provider.include().toCollection())
-        .containsExactly(strictInclude.toString(), propagatedInclude.toString());
-    assertThat(depender.include().toCollection())
-        .containsExactly(propagatedInclude.toString());
-  }
-
-  @Test
   public void keysExportedToSkylark() throws Exception {
     ImmutableSet<Key<?>> allRegisteredKeys = ImmutableSet.<Key<?>>builder()
         .addAll(ObjcProvider.KEYS_FOR_SKYLARK)
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java
index a32aeea..9695dfa 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java
@@ -16,8 +16,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.getFirstArtifactEndingWith;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.HEADER;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.INCLUDE;
 import static com.google.devtools.build.lib.rules.objc.ObjcProvider.MODULE_MAP;
 import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.LIPO;
 import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.SRCS_TYPE;
@@ -527,16 +525,20 @@
     assertContainsSublist(compileAction("//x:x", "b.o").getArguments(), includeFlags);
   }
 
-  protected void checkProvidesHdrsAndIncludes(RuleType ruleType) throws Exception {
+  protected void checkProvidesHdrsAndIncludes(RuleType ruleType, Optional<String> privateHdr)
+      throws Exception {
     scratch.file("x/a.h");
-    ruleType.scratchTarget(scratch,
-        "hdrs", "['a.h']",
-        "includes", "['incdir']");
+    ruleType.scratchTarget(scratch, "hdrs", "['a.h']", "includes", "['incdir']");
     ObjcProvider provider =
         getConfiguredTarget("//x:x", getAppleCrosstoolConfiguration())
             .get(ObjcProvider.SKYLARK_CONSTRUCTOR);
-    assertThat(provider.get(HEADER).toList()).containsExactly(getSourceArtifact("x/a.h"));
-    assertThat(provider.get(INCLUDE).toList())
+    if (privateHdr.isPresent()) {
+      assertThat(provider.header().toList())
+          .containsExactly(getSourceArtifact("x/a.h"), getSourceArtifact(privateHdr.get()));
+    } else {
+      assertThat(provider.header().toList()).containsExactly(getSourceArtifact("x/a.h"));
+    }
+    assertThat(provider.include())
         .containsExactly(
             PathFragment.create("x/incdir"),
             getAppleCrosstoolConfiguration().getGenfilesFragment().getRelative("x/incdir"));
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
index ece89ea..0fb9679 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
@@ -32,7 +32,6 @@
 import com.google.devtools.build.lib.rules.apple.AppleToolchain;
 import com.google.devtools.build.lib.rules.apple.DottedVersion;
 import com.google.devtools.build.lib.syntax.Depset;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.List;
 import java.util.Map;
@@ -46,10 +45,6 @@
  */
 @RunWith(JUnit4.class)
 public class ObjcSkylarkTest extends ObjcRuleTestCase {
-  private static ObjcProvider.Builder objcProviderBuilder() {
-    return new ObjcProvider.Builder(StarlarkSemantics.DEFAULT_SEMANTICS);
-  }
-
   private void writeObjcSplitTransitionTestFiles() throws Exception {
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -291,12 +286,20 @@
         "   srcs = ['a.m'],",
         "   defines = ['mock_define']",
         ")",
+        "objc_library(",
+        "   name = 'lib_root',",
+        "   deps = [':my_target']",
+        ")",
         "apple_binary(",
         "   name = 'bin',",
         "   platform_type = 'ios',",
-        "   deps = [':my_target']",
+        "   deps = [':lib_root']",
         ")");
 
+    ConfiguredTarget libRootTarget = getConfiguredTarget("//examples/apple_skylark:lib_root");
+    ObjcProvider libRootObjcProvider = libRootTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR);
+    assertThat(libRootObjcProvider.define().toList()).contains("mock_define");
+
     ConfiguredTarget binaryTarget = getConfiguredTarget("//examples/apple_skylark:bin");
     AppleExecutableBinaryInfo executableProvider =
         binaryTarget.get(AppleExecutableBinaryInfo.SKYLARK_CONSTRUCTOR);
@@ -304,7 +307,6 @@
 
     assertThat(Artifact.toRootRelativePaths(objcProvider.get(ObjcProvider.LIBRARY)))
         .contains("examples/apple_skylark/liblib.a");
-    assertThat(objcProvider.get(ObjcProvider.DEFINE).toList()).contains("mock_define");
   }
 
   @Test
@@ -337,12 +339,9 @@
         "   deps = [':lib']",
         ")");
 
-    ConfiguredTarget binaryTarget = getConfiguredTarget("//examples/apple_skylark:bin");
-    AppleExecutableBinaryInfo executableProvider =
-        binaryTarget.get(AppleExecutableBinaryInfo.SKYLARK_CONSTRUCTOR);
-    ObjcProvider objcProvider = executableProvider.getDepsObjcProvider();
-
-    assertThat(objcProvider.get(ObjcProvider.DEFINE).toList()).contains("mock_define");
+    ConfiguredTarget libTarget = getConfiguredTarget("//examples/apple_skylark:lib");
+    ObjcProvider libObjcProvider = libTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR);
+    assertThat(libObjcProvider.define().toList()).contains("mock_define");
   }
 
   @Test
@@ -924,7 +923,7 @@
     Iterable<String> foundLinkopts =
         skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR).get(ObjcProvider.LINKOPT).toList();
     Iterable<String> foundDefines =
-        skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR).get(ObjcProvider.DEFINE).toList();
+        skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR).define().toList();
     boolean usesSwift =
         skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR).is(ObjcProvider.Flag.USES_SWIFT);
 
@@ -963,7 +962,40 @@
   }
 
   @Test
-  public void testSkylarkCanCreateObjcProviderWithPathFragments() throws Exception {
+  public void testSkylarkCanCreateObjcProviderWithDefines() throws Exception {
+    ConfiguredTarget skylarkTarget =
+        createObjcProviderSkylarkTarget(
+            "   define = depset(['def1', 'def2', 'def3'])",
+            "   created_provider = apple_common.new_objc_provider\\",
+            "(define=define)",
+            "   return [created_provider]");
+
+    Iterable<String> foundDefines =
+        skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR).define().toList();
+
+    assertThat(foundDefines).containsExactly("def1", "def2", "def3");
+  }
+
+  @Test
+  public void testSkylarkCanCreateObjcProviderWithHeaders() throws Exception {
+    ConfiguredTarget skylarkTarget =
+        createObjcProviderSkylarkTarget(
+            "   hdr1 = ctx.actions.declare_file('hdr1')",
+            "   hdr2 = ctx.actions.declare_file('hdr2')",
+            "   ctx.actions.run_shell(outputs=[hdr1, hdr2], command='echo')",
+            "   header = depset([hdr1, hdr2])",
+            "   created_provider = apple_common.new_objc_provider\\",
+            "(header=header)",
+            "   return [created_provider]");
+
+    Iterable<Artifact> foundHeaders =
+        skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR).header().toList();
+
+    assertThat(ActionsTestUtil.baseArtifactNames(foundHeaders)).containsExactly("hdr1", "hdr2");
+  }
+
+  @Test
+  public void testSkylarkCanCreateObjcProviderWithIncludePathFragments() throws Exception {
     ConfiguredTarget skylarkTarget =
         createObjcProviderSkylarkTarget(
             "   includes = depset(['path1', 'path_dir/path2', 'path_dir1/path_dir2/path3'])",
@@ -972,7 +1004,61 @@
             "   return [created_provider]");
 
     Iterable<PathFragment> foundIncludes =
-        skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR).get(ObjcProvider.INCLUDE).toList();
+        skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR).include();
+
+    assertThat(foundIncludes)
+        .containsExactly(
+            PathFragment.create("path1"),
+            PathFragment.create("path_dir/path2"),
+            PathFragment.create("path_dir1/path_dir2/path3"));
+  }
+
+  @Test
+  public void testSkylarkCanCreateObjcProviderWithFrameworkIncludes() throws Exception {
+    ConfiguredTarget skylarkTarget =
+        createObjcProviderSkylarkTarget(
+            "   includes = depset(['path1/foo.framework', 'path_dir/path2/bar.framework'])",
+            "   created_provider = apple_common.new_objc_provider\\",
+            "(framework_search_paths=includes)",
+            "   return [created_provider]");
+
+    Iterable<PathFragment> foundIncludes =
+        skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR).frameworkInclude();
+
+    assertThat(foundIncludes)
+        .containsExactly(PathFragment.create("path1"), PathFragment.create("path_dir/path2"));
+  }
+
+  @Test
+  public void testSkylarkCanCreateObjcProviderWithSystemIncludes() throws Exception {
+    ConfiguredTarget skylarkTarget =
+        createObjcProviderSkylarkTarget(
+            "   includes = depset(['path1', 'path_dir/path2', 'path_dir1/path_dir2/path3'])",
+            "   created_provider = apple_common.new_objc_provider\\",
+            "(include_system=includes)",
+            "   return [created_provider]");
+
+    Iterable<PathFragment> foundIncludes =
+        skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR).systemInclude();
+
+    assertThat(foundIncludes)
+        .containsExactly(
+            PathFragment.create("path1"),
+            PathFragment.create("path_dir/path2"),
+            PathFragment.create("path_dir1/path_dir2/path3"));
+  }
+
+  @Test
+  public void testSkylarkCanCreateObjcProviderWithQuoteIncludes() throws Exception {
+    ConfiguredTarget skylarkTarget =
+        createObjcProviderSkylarkTarget(
+            "   includes = depset(['path1', 'path_dir/path2', 'path_dir1/path_dir2/path3'])",
+            "   created_provider = apple_common.new_objc_provider\\",
+            "(iquote=includes)",
+            "   return [created_provider]");
+
+    Iterable<PathFragment> foundIncludes =
+        skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR).quoteInclude();
 
     assertThat(foundIncludes)
         .containsExactly(
@@ -994,21 +1080,37 @@
             "   return [created_provider]");
 
     ObjcProvider skylarkProvider = skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR);
-    ObjcProvider skylarkProviderDirectDepender =
-        objcProviderBuilder().addTransitiveAndPropagate(skylarkProvider).build();
-    ObjcProvider skylarkProviderIndirectDepender =
-        objcProviderBuilder().addTransitiveAndPropagate(skylarkProviderDirectDepender).build();
+    assertThat(skylarkProvider.include())
+        .containsExactly(PathFragment.create("path1"), PathFragment.create("path2"));
+    assertThat(skylarkProvider.getStrictDependencyIncludes())
+        .containsExactly(PathFragment.create("path1"));
 
-    assertThat(skylarkProvider.get(ObjcProvider.INCLUDE).toList())
-        .containsExactly(PathFragment.create("path1"), PathFragment.create("path2"));
-    assertThat(skylarkProviderDirectDepender.get(ObjcProvider.INCLUDE).toList())
-        .containsExactly(PathFragment.create("path1"), PathFragment.create("path2"));
-    assertThat(skylarkProviderIndirectDepender.get(ObjcProvider.INCLUDE).toList())
+    scratch.file(
+        "examples/objc_skylark2/BUILD",
+        "objc_library(",
+        "   name = 'direct_dep',",
+        "   deps = ['//examples/objc_skylark:my_target']",
+        ")",
+        "objc_library(",
+        "   name = 'indirect_dep',",
+        "   deps = [':direct_dep']",
+        ")");
+
+    ObjcProvider skylarkProviderDirectDepender =
+        getConfiguredTarget("//examples/objc_skylark2:direct_dep")
+            .get(ObjcProvider.SKYLARK_CONSTRUCTOR);
+    assertThat(skylarkProviderDirectDepender.include())
+        .containsExactly(PathFragment.create("path2"));
+
+    ObjcProvider skylarkProviderIndirectDepender =
+        getConfiguredTarget("//examples/objc_skylark2:indirect_dep")
+            .get(ObjcProvider.SKYLARK_CONSTRUCTOR);
+    assertThat(skylarkProviderIndirectDepender.include())
         .containsExactly(PathFragment.create("path2"));
   }
 
   @Test
-  public void testSkylarkStrictDepsWhitelist() throws Exception {
+  public void testSkylarkStrictDepsDoesNotSupportDefine() throws Exception {
     AssertionError e =
         assertThrows(
             AssertionError.class,
@@ -1026,6 +1128,24 @@
   }
 
   @Test
+  public void testSkylarkStrictDepsDoesNotSupportLinkopt() throws Exception {
+    AssertionError e =
+        assertThrows(
+            AssertionError.class,
+            () ->
+                createObjcProviderSkylarkTarget(
+                    "   strict_linkopts = depset(['opt1'])",
+                    "   strict_provider = apple_common.new_objc_provider\\",
+                    "(linkopt=strict_linkopts)",
+                    "   created_provider = apple_common.new_objc_provider\\",
+                    "(direct_dep_providers=[strict_provider])",
+                    "   return [created_provider]"));
+    assertThat(e)
+        .hasMessageThat()
+        .contains(String.format(AppleSkylarkCommon.BAD_DIRECT_DEPENDENCY_KEY_ERROR, "linkopt"));
+  }
+
+  @Test
   public void testSkylarkCanCreateObjcProviderFromObjcProvider() throws Exception {
     ConfiguredTarget skylarkTarget =
         createObjcProviderSkylarkTarget(
@@ -1036,7 +1156,7 @@
             "   return [created_provider]");
 
     Iterable<String> foundStrings =
-        skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR).get(ObjcProvider.DEFINE).toList();
+        skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR).define().toList();
 
     assertThat(foundStrings).containsExactly("define_from_dep", "define_from_impl");
   }
