diff --git a/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php
new file mode 100644
index 0000000..7aae91a
--- /dev/null
+++ b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface.
+ */
+
+namespace Drupal\Core\Breadcrumb;
+
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Defines an interface for classes that build breadcrumbs.
+ */
+interface BreadcrumbBuilderInterface {
+
+  /**
+   * Build the breadcrumb.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The HttpRequest object representing the current request.
+   */
+  public function build(Request $request);
+}
diff --git a/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php
new file mode 100644
index 0000000..41a156c
--- /dev/null
+++ b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\Breadcrumb\BreadcrumbManager.
+ */
+
+namespace Drupal\Core\Breadcrumb;
+
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Breadcrumb manager.
+ *
+ * Holds an array of path processor objects and uses them to sequentially process
+ * a path, in order of processor priority.
+ */
+class BreadcrumbManager implements BreadcrumbBuilderInterface {
+
+  /**
+   * Holds the array of breadcrumb builders to cycle through.
+   *
+   * @var array
+   *   An array whose keys are priorities and whose values are arrays of
+   *   breadcrumb builder objects.
+   */
+  protected $builders = array();
+
+  /**
+   * Add another breadcrumb builder.
+   *
+   * @param \Drupal\Core\Breadcrumb\BreadcrumbBuilder $builder
+   *   The breadcrumb builder to add.
+   * @param int $priority
+   *   Priority of the breadcrumb builder.
+   */
+  public function addBuilder(BreadcrumbBuilderInterface $builder, $priority) {
+    $this->builders[$priority][] = $builder;
+    // The internal $this->builders array always needs to be correctly sorted.
+    // Builders with high priority are first in the array.
+    krsort($this->builders);
+  }
+
+  /**
+   * Implements Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface::build().
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The HttpRequest object representing the current request.
+   */
+  public function build(Request $request) {
+    // Call the build method of all breadcrumb builders.
+    foreach ($this->builders as $priority => $builders) {
+      foreach ($builders as $builder) {
+        $breadcrumb = $builder->build($request);
+        if (isset($breadcrumb) && is_array($breadcrumb)) {
+          return $breadcrumb;
+        }
+      }
+    }
+  }
+}
diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 8734772..b5c336c 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -16,6 +16,7 @@
 use Drupal\Core\DependencyInjection\Compiler\RegisterRouteEnhancersPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterParamConvertersPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterServicesForDestructionPass;
+use Drupal\Core\DependencyInjection\Compiler\RegisterBreadcrumbBuilderPass;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\DependencyInjection\Reference;
@@ -47,6 +48,8 @@ public function build(ContainerBuilder $container) {
     $this->registerTwig($container);
     $this->registerModuleHandler($container);
 
+    $this->registerBreadcrumbBuilders($container);
+
     $container->addCompilerPass(new RegisterMatchersPass());
     $container->addCompilerPass(new RegisterRouteFiltersPass());
     // Add a compiler pass for registering event subscribers.
@@ -118,4 +121,19 @@ public static function registerTwig(ContainerBuilder $container) {
       ->addMethodCall('addExtension', array(new Definition('Twig_Extension_Debug')));
   }
 
+  /**
+   * Register breadcrumb builder services.
+   */
+  protected function registerBreadcrumbBuilders(ContainerBuilder $container) {
+    $container->register('breadcrumb', 'Drupal\Core\Breadcrumb\BreadcrumbManager');
+
+    // Register the breadcrumb builder from the menu_link module.
+    $container->register('menu_link_breadcrumb', 'Drupal\menu_link\MenuLinkBreadcrumbBuilder')
+      ->addArgument(new Reference('request'))
+      ->addTag('breadcrumb_builder', array('priority' => 200));
+
+    // Add the compiler pass that will process the tagged services.
+    $container->addCompilerPass(new RegisterBreadcrumbBuilderPass());
+  }
+
 }
diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterBreadcrumbBuilderPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterBreadcrumbBuilderPass.php
new file mode 100644
index 0000000..c123b53
--- /dev/null
+++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterBreadcrumbBuilderPass.php
@@ -0,0 +1,30 @@
+<?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 {
+
+
+  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/modules/menu_link/lib/Drupal/menu_link/MenuLinkBreadcrumbBuilder.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkBreadcrumbBuilder.php
new file mode 100644
index 0000000..992b6da
--- /dev/null
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkBreadcrumbBuilder.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\menu_link\MenuLinkBreadcrumbBuilder.
+ */
+
+namespace Drupal\menu_link;
+
+use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Class to define the menu_link breadcrumb builder.
+ */
+class MenuLinkBreadcrumbBuilder implements BreadcrumbBuilderInterface {
+
+  /**
+   * Implements \Drupal\Breadcrumb\BreadcrumbBuilderInterface::build().
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The HttpRequest object representing the current request.
+   */
+  public function build(Request $request) {
+    // TODO: Move the implementation out of menu.inc, into this method.
+    $breadcrumb = menu_get_active_breadcrumb();
+    return $breadcrumb;
+  }
+}
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkBundle.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkBundle.php
new file mode 100644
index 0000000..0cc9d0d
--- /dev/null
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkBundle.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\menu_link\MenuLinkBundle.
+ */
+
+namespace Drupal\menu_link;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+use Symfony\Component\DependencyInjection\Compiler\PassConfig;
+
+/**
+ * Bundle class for menu_link services.
+ */
+class MenuLinkBundle extends Bundle {
+
+  /**
+   * Implements \Symfony\Component\HttpKernel\Bundle\BundleInterface::build().
+   */
+  public function build(ContainerBuilder $container) {
+    // Register the breadcrumb builder from the menu_link module.
+    $container->register('menu_link_breadcrumb', 'Drupal\menu_link\MenuLinkBreadcrumbBuilder')
+      ->addArgument(new Reference('request'))
+      ->addTag('breadcrumb_builder', array('priority' => 200));
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Plugin/block/block/SystemBreadcrumbBlock.php b/core/modules/system/lib/Drupal/system/Plugin/block/block/SystemBreadcrumbBlock.php
new file mode 100644
index 0000000..c2776f2
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Plugin/block/block/SystemBreadcrumbBlock.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Plugin\block\block\SystemBreadcrumbBlock.
+ */
+
+namespace Drupal\system\Plugin\block\block;
+
+use Drupal\block\BlockBase;
+use Drupal\Component\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+
+/**
+ * Provides a 'System Breadcrumb' block.
+ *
+ * @Plugin(
+ *   id = "system_breadcrumb_block",
+ *   admin_label = @Translation("System Breadcrumb"),
+ *   module = "system"
+ * )
+ */
+class SystemBreadcrumbBlock extends BlockBase {
+
+  /**
+   * Overrides \Drupal\block\BlockBase::blockAccess().
+   */
+  public function blockAccess() {
+    return TRUE;
+  }
+
+  /**
+   * Implements \Drupal\block\BlockBase::build().
+   */
+  public function build() {
+    $builder = \Drupal::service('breadcrumb');
+    $request = \Drupal::service('request');
+    $breadcrumb = $builder->build($request);
+    if (isset($breadcrumb) && is_array($breadcrumb)) {
+      return array(
+        '#theme' => 'breadcrumb',
+        '#breadcrumb' => $breadcrumb,
+      );
+    }
+  }
+}
