diff --git a/core/core.services.yml b/core/core.services.yml
index ac24e17..96c7fd4 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -613,7 +613,7 @@ services:
     arguments: ['@image.toolkit.manager']
   breadcrumb:
     class: Drupal\Core\Breadcrumb\BreadcrumbManager
-    arguments: ['@module_handler']
+    arguments: ['@module_handler', '%container.tags.breadcrumb_builder%']
   token:
     class: Drupal\Core\Utility\Token
     arguments: ['@module_handler']
diff --git a/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php
index a995317..0c612fc 100644
--- a/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php
+++ b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php
@@ -46,9 +46,14 @@ class BreadcrumbManager implements BreadcrumbBuilderInterface {
    *
    * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
    *   The module handler.
+   * @param array $builders
+   *   An associative array of services tagged with 'breadcrumb_builder'.
    */
-  public function __construct(ModuleHandlerInterface $module_handler) {
+  public function __construct(ModuleHandlerInterface $module_handler, array $builders) {
     $this->moduleHandler = $module_handler;
+    foreach ($builders as $id => $params) {
+      $this->addBuilder(\Drupal::service($id), $params['priority']);
+    }
   }
 
   /**
diff --git a/core/lib/Drupal/Core/CoreServiceProvider.php b/core/lib/Drupal/Core/CoreServiceProvider.php
index 847960c..24edc53 100644
--- a/core/lib/Drupal/Core/CoreServiceProvider.php
+++ b/core/lib/Drupal/Core/CoreServiceProvider.php
@@ -11,6 +11,7 @@
 use Drupal\Core\DependencyInjection\ServiceProviderInterface;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\DependencyInjection\Compiler\ModifyServiceDefinitionsPass;
+use Drupal\Core\DependencyInjection\Compiler\TagParametersPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterKernelListenersPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterAccessChecksPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterPathProcessorsPass;
@@ -57,6 +58,10 @@ public function register(ContainerBuilder $container) {
     // service definitions. This pass must come first so that later
     // list-building passes are operating on the post-alter services list.
     $container->addCompilerPass(new ModifyServiceDefinitionsPass());
+
+    // Collect all tagged services into %container.tag.[tag]% parameters.
+    $container->addCompilerPass(new TagParametersPass());
+
     $container->addCompilerPass(new RegisterRouteFiltersPass());
     // Add a compiler pass for registering event subscribers.
     $container->addCompilerPass(new RegisterKernelListenersPass(), PassConfig::TYPE_AFTER_REMOVING);
@@ -72,9 +77,6 @@ public function register(ContainerBuilder $container) {
     $container->addCompilerPass(new ListCacheBinsPass());
     // Add the compiler pass for appending string translators.
     $container->addCompilerPass(new RegisterStringTranslatorsPass());
-    // Add the compiler pass that will process the tagged breadcrumb builder
-    // services.
-    $container->addCompilerPass(new RegisterBreadcrumbBuilderPass());
     // Add the compiler pass that will process the tagged theme negotiator
     // service.
     $container->addCompilerPass(new ThemeNegotiatorPass());
diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterBreadcrumbBuilderPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterBreadcrumbBuilderPass.php
deleted file mode 100644
index 1119989..0000000
--- a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterBreadcrumbBuilderPass.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\DependencyInjection\Compiler\RegisterBreadcrumbBuilderPass.
- */
-
-namespace Drupal\Core\DependencyInjection\Compiler;
-
-use Symfony\Component\DependencyInjection\Reference;
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
-
-/**
- * Adds services to the breadcrumb_builder service.
- */
-class RegisterBreadcrumbBuilderPass implements CompilerPassInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function process(ContainerBuilder $container) {
-    if (!$container->hasDefinition('breadcrumb')) {
-      return;
-    }
-    $manager = $container->getDefinition('breadcrumb');
-    foreach ($container->findTaggedServiceIds('breadcrumb_builder') as $id => $attributes) {
-      $priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
-      $manager->addMethodCall('addBuilder', array(new Reference($id), $priority));
-    }
-  }
-
-}
diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/TagParametersPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/TagParametersPass.php
new file mode 100644
index 0000000..146e721
--- /dev/null
+++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/TagParametersPass.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\DependencyInjection\Compiler\TagParametersPass.
+ */
+
+namespace Drupal\Core\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+
+/**
+ * Collects all tagged services into separate container parameters.
+ */
+class TagParametersPass implements CompilerPassInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function process(ContainerBuilder $container) {
+    $tags = $container->findTags();
+    foreach ($tags as $tag) {
+      $services = array();
+      $has_priority = FALSE;
+      foreach ($container->findTaggedServiceIds($tag) as $id => $attributes) {
+        $services[$id] = $attributes[0];
+        if (isset($services[$id]['priority'])) {
+          $has_priority = TRUE;
+        }
+      }
+      if ($has_priority) {
+        uasort($services, array($this, 'sortByPriorityKey'));
+      }
+      $container->setParameter("container.tag.$tag", $services);
+    }
+  }
+
+  /**
+   * uasort() callback to sort tagged services by priority.
+   */
+  protected function sortByPriorityKey(array $a, array $b) {
+    $a_priority = isset($a['priority']) ? $a['priority'] : 0;
+    $b_priority = isset($b['priority']) ? $b['priority'] : 0;
+    if ($a == $b) {
+      return 0;
+    }
+    return $a > $b ? -1 : 1;
+  }
+
+}
