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 9928c4a..3971a35 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
@@ -32,7 +32,6 @@
 import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
-import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
 import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
 import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
 import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
@@ -74,6 +73,23 @@
           nullToEmptyList(configToDepsCollectionMap.get(childConfig)),
           nullToEmptyList(configurationToNonPropagatedObjcMap.get(childConfig)));
       ObjcProvider objcProvider = common.getObjcProvider();
+      ImmutableList.Builder<J2ObjcMappingFileProvider> j2ObjcMappingFileProviders =
+          ImmutableList.builder();
+      J2ObjcEntryClassProvider.Builder j2ObjcEntryClassProviderBuilder =
+          new J2ObjcEntryClassProvider.Builder(); 
+      for (TransitiveInfoCollection dep : configToDepsCollectionMap.get(childConfig)) {
+        if (dep.getProvider(J2ObjcMappingFileProvider.class) != null) {
+          j2ObjcMappingFileProviders.add(dep.getProvider(J2ObjcMappingFileProvider.class));
+        }
+        if (dep.getProvider(J2ObjcEntryClassProvider.class) != null) {
+          j2ObjcEntryClassProviderBuilder.addTransitive(
+              dep.getProvider(J2ObjcEntryClassProvider.class));
+        }
+      }
+      J2ObjcMappingFileProvider j2ObjcMappingFileProvider =
+          J2ObjcMappingFileProvider.union(j2ObjcMappingFileProviders.build());
+      J2ObjcEntryClassProvider j2ObjcEntryClassProvider = j2ObjcEntryClassProviderBuilder.build();
+      
       if (!hasLibraryOrSources(objcProvider)) {
         ruleContext.ruleError(REQUIRES_AT_LEAST_ONE_LIBRARY_OR_SOURCE_FILE);
         return null;
@@ -81,11 +97,13 @@
       if (ruleContext.hasErrors()) {
         return null;
       }
+
       binariesToLipo.add(intermediateArtifacts.strippedSingleArchitectureBinary());
       new CompilationSupport(ruleContext, childConfig)
           .registerCompileAndArchiveActions(common)
           .registerLinkActions(
-              objcProvider, new ExtraLinkArgs(), ImmutableList.<Artifact>of(),
+              common.getObjcProvider(), j2ObjcMappingFileProvider, j2ObjcEntryClassProvider,
+              new ExtraLinkArgs(), ImmutableList.<Artifact>of(),
               DsymOutputType.APP)
           .validateAttributes();
 
@@ -116,18 +134,6 @@
       IntermediateArtifacts intermediateArtifacts,
       List<TransitiveInfoCollection> propagatedDeps,
       List<ObjcProvider> nonPropagatedObjcDeps) {
-    ImmutableList.Builder<ObjcProvider> propagatedObjcDeps = ImmutableList.<ObjcProvider>builder();
-    ImmutableList.Builder<CppCompilationContext> cppDeps =
-        ImmutableList.<CppCompilationContext>builder();
-    
-    for (TransitiveInfoCollection dep : propagatedDeps) {
-      if (dep.getProvider(ObjcProvider.class) != null) {
-        propagatedObjcDeps.add(dep.getProvider(ObjcProvider.class));
-      }
-      if (dep.getProvider(CppCompilationContext.class) != null) {
-        cppDeps.add(dep.getProvider(CppCompilationContext.class));
-      }
-    }
 
     CompilationArtifacts compilationArtifacts =
         CompilationSupport.compilationArtifacts(ruleContext, intermediateArtifacts);
@@ -137,9 +143,7 @@
         .setResourceAttributes(new ResourceAttributes(ruleContext))
         .setCompilationArtifacts(compilationArtifacts)
         .addDefines(ruleContext.getTokenizedStringListAttr("defines"))
-        .addDepObjcProviders(propagatedObjcDeps.build())
-        .addDepCcHeaderProviders(cppDeps.build())
-        .addDepCcLinkProviders(propagatedDeps)
+        .addDeps(propagatedDeps)
         .addDepObjcProviders(
             ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
         .addNonPropagatedDepObjcProviders(nonPropagatedObjcDeps)
@@ -149,7 +153,7 @@
         .setLinkedBinary(intermediateArtifacts.strippedSingleArchitectureBinary())
         .build();
   }
-  
+
   private <T> List<T> nullToEmptyList(List<T> inputList) {
     return inputList != null ? inputList : ImmutableList.<T>of();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java
index 498789c..0979c8f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java
@@ -16,7 +16,6 @@
 
 import static com.google.devtools.build.lib.packages.Attribute.attr;
 import static com.google.devtools.build.lib.packages.BuildType.LABEL;
-import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
 import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates;
 import static com.google.devtools.build.lib.syntax.Type.BOOLEAN;
 
@@ -43,24 +42,12 @@
   @Override
   public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
     return builder
-        .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class,
-            AppleConfiguration.class)
+        .requiresConfigurationFragments(
+            ObjcConfiguration.class, J2ObjcConfiguration.class, AppleConfiguration.class)
         .add(attr("$is_executable", BOOLEAN).value(true)
             .nonconfigurable("Called from RunCommand.isExecutable, which takes a Target"))
-        .override(attr("deps", LABEL_LIST)
-            .cfg(IosApplication.SPLIT_ARCH_TRANSITION)
-            .direct_compile_time_input()
-            .allowedRuleClasses(ObjcRuleClasses.CompilingRule.ALLOWED_DEPS_RULE_CLASSES)
-            .allowedFileTypes())
-        .override(attr("non_propagated_deps", LABEL_LIST)
-            .direct_compile_time_input()
-            .cfg(IosApplication.SPLIT_ARCH_TRANSITION)
-            .allowedRuleClasses(ObjcRuleClasses.CompilingRule.ALLOWED_DEPS_RULE_CLASSES)
-            .allowedFileTypes())
-        .override(attr("srcs", LABEL_LIST)
-            .direct_compile_time_input()
-            .cfg(IosApplication.SPLIT_ARCH_TRANSITION)
-            .allowedFileTypes(ObjcRuleClasses.SRCS_TYPE))
+        .override(builder.copy("deps").cfg(IosApplication.SPLIT_ARCH_TRANSITION))
+        .override(builder.copy("non_propagated_deps").cfg(IosApplication.SPLIT_ARCH_TRANSITION))
         // This is currently a hack to obtain all child configurations regardless of the attribute
         // values of this rule -- this rule does not currently use the actual info provided by
         // this attribute.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
index d06a374..ef86fe6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
@@ -31,7 +31,6 @@
 import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
 import com.google.devtools.build.lib.rules.apple.Platform;
-import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
 import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
 import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
 import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
@@ -97,13 +96,20 @@
       return null;
     }
 
+    J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
+        ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+    J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
+        .addTransitive(
+            ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
+        .build();
+
     CompilationSupport compilationSupport =
         new CompilationSupport(ruleContext)
             .registerCompileAndArchiveActions(common)
             .registerFullyLinkAction(common.getObjcProvider())
             .addXcodeSettings(xcodeProviderBuilder, common)
             .registerLinkActions(
-                objcProvider,
+                objcProvider, j2ObjcMappingFileProvider, j2ObjcEntryClassProvider,
                 getExtraLinkArgs(ruleContext),
                 ImmutableList.<Artifact>of(),
                 DsymOutputType.APP)
@@ -202,11 +208,7 @@
             .setResourceAttributes(new ResourceAttributes(ruleContext))
             .setCompilationArtifacts(compilationArtifacts)
             .addDefines(ruleContext.getTokenizedStringListAttr("defines"))
-            .addDepObjcProviders(
-                ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class))
-            .addDepCcHeaderProviders(
-                ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class))
-            .addDepCcLinkProviders(ruleContext.getPrerequisites("deps", Mode.TARGET))
+            .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET))
             .addDepObjcProviders(
                 ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
             .addNonPropagatedDepObjcProviders(
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 e2d0a0b..395a2be 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
@@ -784,6 +784,8 @@
    * {@code -dead_strip} and {@code -no_dead_strip_inits_and_terms}).
    *
    * @param objcProvider common information about this rule's attributes and its dependencies
+   * @param j2ObjcMappingFileProvider contains mapping files for j2objc transpilation
+   * @param j2ObjcEntryClassProvider contains j2objc entry class information for dead code removal
    * @param extraLinkArgs any additional arguments to pass to the linker
    * @param extraLinkInputs any additional input artifacts to pass to the link action
    * @param dsymOutputType the file type of the dSYM bundle to be generated
@@ -792,6 +794,8 @@
    */
   CompilationSupport registerLinkActions(
       ObjcProvider objcProvider,
+      J2ObjcMappingFileProvider j2ObjcMappingFileProvider,
+      J2ObjcEntryClassProvider j2ObjcEntryClassProvider,
       ExtraLinkArgs extraLinkArgs,
       Iterable<Artifact> extraLinkInputs,
       DsymOutputType dsymOutputType) {
@@ -809,9 +813,9 @@
     }
 
     Iterable<Artifact> prunedJ2ObjcArchives = ImmutableList.<Artifact>of();
-    if (stripJ2ObjcDeadCode()) {
-      J2ObjcEntryClassProvider provider = J2ObjcEntryClassProvider.buildFrom(ruleContext);
-      registerJ2ObjcDeadCodeRemovalActions(objcProvider, provider.getEntryClasses());
+    if (stripJ2ObjcDeadCode(j2ObjcEntryClassProvider)) {
+      registerJ2ObjcDeadCodeRemovalActions(objcProvider, j2ObjcMappingFileProvider,
+          j2ObjcEntryClassProvider);
       prunedJ2ObjcArchives = j2objcPrunedLibraries(objcProvider);
     }
 
@@ -831,13 +835,13 @@
     return this;
   }
 
-  private boolean stripJ2ObjcDeadCode() {
-    J2ObjcEntryClassProvider provider = J2ObjcEntryClassProvider.buildFrom(ruleContext);
+  private boolean stripJ2ObjcDeadCode(J2ObjcEntryClassProvider j2ObjcEntryClassProvider) {
     J2ObjcConfiguration j2objcConfiguration =
         buildConfiguration.getFragment(J2ObjcConfiguration.class);
     // Only perform J2ObjC dead code stripping if flag --j2objc_dead_code_removal is specified and
     // users have specified entry classes.
-    return j2objcConfiguration.removeDeadCode() && !provider.getEntryClasses().isEmpty();
+    return j2objcConfiguration.removeDeadCode()
+        && !j2ObjcEntryClassProvider.getEntryClasses().isEmpty();
   }
 
   /**
@@ -1175,12 +1179,16 @@
   }
 
   private void registerJ2ObjcDeadCodeRemovalActions(ObjcProvider objcProvider,
-      Iterable<String> entryClasses) {
+      J2ObjcMappingFileProvider j2ObjcMappingFileProvider,
+      J2ObjcEntryClassProvider j2ObjcEntryClassProvider) {
+    NestedSet<String> entryClasses = j2ObjcEntryClassProvider.getEntryClasses();
     Artifact pruner = ruleContext.getPrerequisiteArtifact("$j2objc_dead_code_pruner", Mode.HOST);
-    J2ObjcMappingFileProvider provider = ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext);
-    NestedSet<Artifact> j2ObjcDependencyMappingFiles = provider.getDependencyMappingFiles();
-    NestedSet<Artifact> j2ObjcHeaderMappingFiles = provider.getHeaderMappingFiles();
-    NestedSet<Artifact> j2ObjcArchiveSourceMappingFiles = provider.getArchiveSourceMappingFiles();
+    NestedSet<Artifact> j2ObjcDependencyMappingFiles =
+        j2ObjcMappingFileProvider.getDependencyMappingFiles();
+    NestedSet<Artifact> j2ObjcHeaderMappingFiles =
+        j2ObjcMappingFileProvider.getHeaderMappingFiles();
+    NestedSet<Artifact> j2ObjcArchiveSourceMappingFiles =
+        j2ObjcMappingFileProvider.getArchiveSourceMappingFiles();
 
     for (Artifact j2objcArchive : objcProvider.get(ObjcProvider.J2OBJC_LIBRARY)) {
       PathFragment paramFilePath = FileSystemUtils.replaceExtension(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
index 89541d6..c21a780 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
@@ -129,10 +129,18 @@
 
       filesToBuild.add(testApp.getIpa());
     }
+    
+    J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
+        ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+    J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
+        .addTransitive(
+            ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
+        .build();
 
     new CompilationSupport(ruleContext)
         .registerLinkActions(
-            common.getObjcProvider(), extraLinkArgs, extraLinkInputs, DsymOutputType.TEST)
+            common.getObjcProvider(), j2ObjcMappingFileProvider, j2ObjcEntryClassProvider,
+            extraLinkArgs, extraLinkInputs, DsymOutputType.TEST)
         .registerCompileAndArchiveActions(common)
         .registerFullyLinkAction(common.getObjcProvider())
         .addXcodeSettings(xcodeProviderBuilder, common)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java
index 6bbc6a5..0b3cd38 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java
@@ -54,6 +54,20 @@
     }
 
     /**
+     * Transitively adds the given {@link J2ObjcEntryClassProvider}s
+     * and all their properties to this builder.
+     *
+     * @param providers the J2ObjcEntryClassProviders to add
+     * @return this builder
+     */
+    public Builder addTransitive(Iterable<J2ObjcEntryClassProvider> providers) {
+      for (J2ObjcEntryClassProvider provider : providers) {
+        addTransitive(provider);
+      }
+      return this;
+    }
+
+    /**
      * Transitively adds all the J2ObjcEntryClassProviders and all their properties
      * that can be reached through the "deps" attribute.
      *
@@ -62,10 +76,8 @@
      */
     public Builder addTransitive(RuleContext ruleContext) {
       if (ruleContext.attributes().has("deps", BuildType.LABEL_LIST)) {
-        for (J2ObjcEntryClassProvider provider :
-            ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class)) {
-          addTransitive(provider);
-        }
+        addTransitive(
+            ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class));
       }
 
       return this;
@@ -93,16 +105,6 @@
   }
 
   /**
-   * Constructs a new J2ObjcEntryClassProvider that contains all the information
-   * that can be transitively reached through the "deps" attribute of the given rule context.
-   *
-   * @param ruleContext the rule context in which to look for deps
-   */
-  public static J2ObjcEntryClassProvider buildFrom(RuleContext ruleContext) {
-    return new Builder().addTransitive(ruleContext).build();
-  }
-
-  /**
    * Constructs a {@link J2ObjcEntryClassProvider} to supply J2ObjC-translated ObjC sources to
    * objc_binary for compilation and linking.
    *
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 fd37871..2cf414f 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
@@ -74,12 +74,14 @@
     ObjcProvider objcProvider = objcProviderBuilder.build();
     xcodeSupport.addXcodeSettings(xcodeProviderBuilder, objcProvider, LIBRARY_STATIC);
 
+    J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
+        ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+
     return new RuleConfiguredTargetBuilder(ruleContext)
         .setFilesToBuild(NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
         .add(RunfilesProvider.class, RunfilesProvider.EMPTY)
         .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider)
-        .addProvider(
-            J2ObjcMappingFileProvider.class, ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext))
+        .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider)
         .addProvider(ObjcProvider.class, objcProvider)
         .addProvider(XcodeProvider.class, xcodeProviderBuilder.build())
         .build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java
index e785130..2d40857 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java
@@ -33,6 +33,20 @@
   private final NestedSet<Artifact> archiveSourceMappingFiles;
 
   /**
+   * Returns a {@link J2ObjcMappingFileProvider} which combines all input
+   * {@link J2ObjcMappingFileProvider}s. All mapping files present in any of the input providers
+   * will be present in the output provider.
+   */
+  public static J2ObjcMappingFileProvider union(Iterable<J2ObjcMappingFileProvider> providers) {
+    J2ObjcMappingFileProvider.Builder builder = new J2ObjcMappingFileProvider.Builder();
+    for (J2ObjcMappingFileProvider provider : providers) {
+      builder.addTransitive(provider);
+    }
+
+    return builder.build();
+  }
+
+  /**
    * Constructs a {@link J2ObjcMappingFileProvider} with mapping files to export mappings required
    * by J2ObjC translation and proto compilation.
    *
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 5f832eb..bf35252 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
@@ -65,6 +65,7 @@
 import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.BuildType;
@@ -375,6 +376,39 @@
       return this;
     }
 
+    Builder addDeps(List<? extends TransitiveInfoCollection> deps) {
+      ImmutableList.Builder<ObjcProvider> propagatedObjcDeps =
+          ImmutableList.<ObjcProvider>builder();
+      ImmutableList.Builder<CppCompilationContext> cppDeps =
+          ImmutableList.<CppCompilationContext>builder();
+      ImmutableList.Builder<CcLinkParamsProvider> cppDepLinkParams =
+          ImmutableList.<CcLinkParamsProvider>builder();
+
+      for (TransitiveInfoCollection dep : deps) {
+        addAnyProviders(propagatedObjcDeps, dep, ObjcProvider.class);
+        addAnyProviders(cppDeps, dep, CppCompilationContext.class);
+        // Hack to determine if dep is a cc target. Required so objc_library archives packed in
+        // CcLinkParamsProvider do not get consumed as cc targets.
+        if (dep.getProvider(CppRunfilesProvider.class) != null) {
+          cppDepLinkParams.add(dep.getProvider(CcLinkParamsProvider.class));
+        }
+      }
+      addDepObjcProviders(propagatedObjcDeps.build());
+      this.depCcHeaderProviders = Iterables.concat(this.depCcHeaderProviders, cppDeps.build());
+      this.depCcLinkProviders =
+          Iterables.concat(this.depCcLinkProviders, cppDepLinkParams.build());
+      return this;
+    }
+
+    private <T extends TransitiveInfoProvider> ImmutableList.Builder<T> addAnyProviders(
+        ImmutableList.Builder<T> listBuilder, TransitiveInfoCollection collection,
+        Class<T> providerClass) {
+      if (collection.getProvider(providerClass) != null) {
+        listBuilder.add(collection.getProvider(providerClass));
+      }
+      return listBuilder;
+    }
+
     /**
      * Add providers which will be exposed both to the declaring rule and to any dependers on the
      * declaring rule.
@@ -469,34 +503,6 @@
       return this;
     }
 
-    /**
-     * Sets information from {@code cc_library} dependencies to be used during compilation.
-     */
-    public Builder addDepCcHeaderProviders(Iterable<CppCompilationContext> depCcHeaderProviders) {
-      this.depCcHeaderProviders = Iterables.concat(this.depCcHeaderProviders, depCcHeaderProviders);
-      return this;
-    }
-
-    /**
-     * Sets information from {@code cc_library} dependencies to be used during linking from
-     * the {@link TransitiveInfoCollection} objects which contain the relevant link providers
-     * (for example, from the current rule's "deps" attribute).
-     */
-    public Builder addDepCcLinkProviders(List<? extends TransitiveInfoCollection> deps) {
-      for (TransitiveInfoCollection dep : deps) {
-        // Hack to determine if dep is a cc target. Required so objc_library archives packed in
-        // CcLinkParamsProvider do not get consumed as cc targets.
-        if (dep.getProvider(CppRunfilesProvider.class) != null) {
-          CcLinkParamsProvider ccLinkParamsProvider = dep.getProvider(CcLinkParamsProvider.class);
-          this.depCcLinkProviders =
-              Iterables.concat(
-                  this.depCcLinkProviders,
-                  ImmutableList.<CcLinkParamsProvider>of(ccLinkParamsProvider));
-        }
-      }
-      return this;
-    }
-
     ObjcCommon build() {
       Iterable<BundleableFile> bundleImports = BundleableFile.bundleImportsFromRule(context);
 
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 aad16f1..76130d9 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
@@ -27,7 +27,6 @@
 import com.google.devtools.build.lib.rules.cpp.CcLinkParams;
 import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
 import com.google.devtools.build.lib.rules.cpp.CcLinkParamsStore;
-import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
 import com.google.devtools.build.lib.rules.cpp.LinkerInputs;
 import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
 import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
@@ -82,14 +81,11 @@
         .addExtraSdkFrameworks(extraSdkFrameworks)
         .addDefines(ruleContext.getTokenizedStringListAttr("defines"))
         .setCompilationArtifacts(compilationArtifacts)
-        .addDepObjcProviders(ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class))
+        .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET))
         .addDepObjcProviders(
             ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
         .addNonPropagatedDepObjcProviders(
             ruleContext.getPrerequisites("non_propagated_deps", Mode.TARGET, ObjcProvider.class))
-        .addDepCcHeaderProviders(
-            ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class))
-        .addDepCcLinkProviders(ruleContext.getPrerequisites("deps", Mode.TARGET))
         .setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext))
         .setAlwayslink(alwayslink)
         .setHasModuleMap()
@@ -130,13 +126,17 @@
             xcodeProviderBuilder, new Attribute("non_propagated_deps", Mode.TARGET))
         .registerActions(xcodeProviderBuilder.build());
 
+    J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
+        ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+    J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
+        .addTransitive(ruleContext.getPrerequisites("deps", Mode.TARGET,
+            J2ObjcEntryClassProvider.class)).build();
+
     return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build())
         .addProvider(XcodeProvider.class, xcodeProviderBuilder.build())
         .addProvider(ObjcProvider.class, common.getObjcProvider())
-        .addProvider(
-            J2ObjcEntryClassProvider.class, J2ObjcEntryClassProvider.buildFrom(ruleContext))
-        .addProvider(
-            J2ObjcMappingFileProvider.class, ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext))
+        .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider)
+        .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider)
         .addProvider(
             InstrumentedFilesProvider.class,
             compilationSupport.getInstrumentedFilesProvider(common))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
index 8ccc437..b11e26f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
@@ -29,7 +29,6 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.BaseRuleClasses;
-import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
@@ -107,25 +106,6 @@
         /*archiveFileNameSuffix=*/"_j2objc");
   }
 
-  /**
-   * Returns a {@link J2ObjcMappingFileProvider} containing J2ObjC mapping files from rules
-   * that can be reached transitively through the "deps" attribute.
-   *
-   * @param ruleContext the rule context of the current rule
-   * @return a {@link J2ObjcMappingFileProvider} containing J2ObjC mapping files information from
-   *     the transitive closure.
-   */
-  public static J2ObjcMappingFileProvider j2ObjcMappingFileProvider(RuleContext ruleContext) {
-    J2ObjcMappingFileProvider.Builder builder = new J2ObjcMappingFileProvider.Builder();
-    Iterable<J2ObjcMappingFileProvider> providers =
-        ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class);
-    for (J2ObjcMappingFileProvider provider : providers) {
-      builder.addTransitive(provider);
-    }
-
-    return builder.build();
-  }
-
   public static Artifact artifactByAppendingToBaseName(RuleContext context, String suffix) {
     return context.getPackageRelativeArtifact(
         context.getLabel().getName() + suffix, context.getBinOrGenfilesDirectory());
