diff --git a/core/includes/common.inc b/core/includes/common.inc
index 88d6fd3..75c9b82 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -257,36 +257,6 @@ function drupal_get_profile() {
   return $profile;
 }
 
-
-/**
- * Sets the breadcrumb trail for the current page.
- *
- * @param $breadcrumb
- *   Array of links, starting with "home" and proceeding up to but not including
- *   the current page.
- */
-function drupal_set_breadcrumb($breadcrumb = NULL) {
-  $stored_breadcrumb = &drupal_static(__FUNCTION__);
-
-  if (isset($breadcrumb)) {
-    $stored_breadcrumb = $breadcrumb;
-  }
-  return $stored_breadcrumb;
-}
-
-/**
- * Gets the breadcrumb trail for the current page.
- */
-function drupal_get_breadcrumb() {
-  $breadcrumb = drupal_set_breadcrumb();
-
-  if (!isset($breadcrumb)) {
-    $breadcrumb = menu_get_active_breadcrumb();
-  }
-
-  return $breadcrumb;
-}
-
 /**
  * Adds output to the HEAD tag of the HTML page.
  *
diff --git a/core/includes/menu.inc b/core/includes/menu.inc
index 57681a3..fdeb3d0 100644
--- a/core/includes/menu.inc
+++ b/core/includes/menu.inc
@@ -2306,8 +2306,8 @@ function menu_set_active_item($path) {
  * Any trail set by this function will only be used for functionality that calls
  * menu_get_active_trail(). Drupal core only uses trails set here for
  * breadcrumbs and the page title and not for menu trees or page content.
- * Additionally, breadcrumbs set by drupal_set_breadcrumb() will override any
- * trail set here.
+ * Additionally, breadcrumbs set by Drupal::service('breadcrumb')->set() will
+ * override any trail set here.
  *
  * To affect the trail used by menu trees, use menu_tree_set_path(). To affect
  * the page content, use menu_set_active_item() instead.
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 8d527df..5c12792 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -2878,7 +2878,7 @@ function template_process_page(&$variables) {
     // re-use the cache of an already rendered menu containing the active link
     // for the current page.
     // @see menu_tree_page_data()
-    $variables['breadcrumb'] = theme('breadcrumb', array('breadcrumb' => drupal_get_breadcrumb()));
+    $variables['breadcrumb'] = theme('breadcrumb', array('breadcrumb' => Drupal::service('breadcrumb')->get()));
   }
   if (!isset($variables['title'])) {
     $variables['title'] = drupal_get_title();
diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 91bba3c..7826812 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -317,6 +317,9 @@ public function build(ContainerBuilder $container) {
     $container->register('ajax.subscriber', 'Drupal\Core\Ajax\AjaxSubscriber')
       ->addTag('event_subscriber');
 
+    // Register Breadcrumbs service.
+    $container->register('breadcrumb', 'Drupal\Core\Menu\Breadcrumbs');
+
     $container->addCompilerPass(new RegisterMatchersPass());
     $container->addCompilerPass(new RegisterRouteFiltersPass());
     // Add a compiler pass for registering event subscribers.
diff --git a/core/lib/Drupal/Core/Menu/Breadcrumbs.php b/core/lib/Drupal/Core/Menu/Breadcrumbs.php
new file mode 100644
index 0000000..c54ed60
--- /dev/null
+++ b/core/lib/Drupal/Core/Menu/Breadcrumbs.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Menu\Breadcrumbs.php
+ */
+
+namespace Drupal\Core\Menu;
+
+class Breadcrumbs {
+
+  /**
+   * Array of breadcrumbs.
+   *
+   * @var array
+   */
+  protected $breadcrumbs;
+
+  /**
+   * Constructor.
+   */
+  public function __construct() {
+    $this->breadcrumbs = menu_get_active_breadcrumb();
+  }
+
+  /**
+   * Gets the current breadcrumbs.
+   *
+   * @return array
+   *   Array of current breadcrumbs.
+   */
+  public function get() {
+    return $this->breadcrumbs;
+  }
+
+  /**
+   * Sets the current breadcrumbs.
+   *
+   * @param array $breadcrumbs
+   *   Array of current breadcrumbs to be set.
+   */
+  public function set(array $breadcrumbs) {
+    $this->breadcrumbs = $breadcrumbs;
+  }
+
+  /**
+   * Appends a new crumb to the breadcrumbs.
+   *
+   * @param string $breadcrumb
+   *   The breadcrumb to append.
+   *
+   * @return array
+   *   The current breadcrumbs.
+   */
+  public function append($breadcrumb) {
+    $this->breadcrumbs[] = $breadcrumb;
+    return $this->breadcrumbs;
+  }
+
+  /**
+   * Inserts a new breadcrumb at the provided position.
+   *
+   * @param string $breadcrumb
+   *   The breadcrumb to insert.
+   * @param int $position
+   *   The position to insert the breadcrumb at.
+   *
+   * @return array
+   *   The current breadcrumbs.
+   */
+  public function insert($breadcrumb, $position) {
+    if (count($this->breadcrumbs) >= $position) {
+      $this->breadcrumbs = array_merge(array_slice($this->breadcrumbs, 0, $position, TRUE), $breadcrumb, array_slice($this->breadcrumbs, $position, count($this->breadcrumbs) - 1, TRUE));
+    }
+  }
+}
diff --git a/core/modules/comment/comment.pages.inc b/core/modules/comment/comment.pages.inc
index be4ef3f..8648447 100644
--- a/core/modules/comment/comment.pages.inc
+++ b/core/modules/comment/comment.pages.inc
@@ -36,7 +36,7 @@
  */
 function comment_reply(EntityInterface $node, $pid = NULL) {
   // Set the breadcrumb trail.
-  drupal_set_breadcrumb(array(l(t('Home'), NULL), l($node->label(), 'node/' . $node->nid)));
+  Drupal::service('breadcrumb')->set(array(l(t('Home'), NULL), l($node->label(), 'node/' . $node->nid)));
   $op = isset($_POST['op']) ? $_POST['op'] : '';
   $build = array();
 
diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module
index 574d536..d38c8cd 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -269,7 +269,7 @@ function forum_node_view(EntityInterface $node, EntityDisplay $display, $view_mo
           $breadcrumb[] = l($parent->label(), 'forum/' . $parent->tid);
         }
       }
-      drupal_set_breadcrumb($breadcrumb);
+      Drupal::service('breadcrumb')->set($breadcrumb);
 
     }
   }
diff --git a/core/modules/forum/forum.pages.inc b/core/modules/forum/forum.pages.inc
index 78eabbd..8e4fa54 100644
--- a/core/modules/forum/forum.pages.inc
+++ b/core/modules/forum/forum.pages.inc
@@ -42,7 +42,7 @@ function forum_page($forum_term = NULL) {
       }
     }
   }
-  drupal_set_breadcrumb($breadcrumb);
+  Drupal::service('breadcrumb')->set($breadcrumb);
 
   if ($forum_term->tid && array_search($forum_term->tid, $config->get('containers')) === FALSE) {
     // Add RSS feed for forums.
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php
index 9506602..0530ddf 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php
@@ -31,7 +31,7 @@ public function form(array $form, array &$form_state, EntityInterface $menu_link
       // Get the current breadcrumb and add a link to that menu's overview page.
       $breadcrumb = menu_get_active_breadcrumb();
       $breadcrumb[] = l($current_title, 'admin/structure/menu/manage/' . $menu_link->menu_name);
-      drupal_set_breadcrumb($breadcrumb);
+      Drupal::service('breadcrumb')->set($breadcrumb);
     }
 
     $form['link_title'] = array(
diff --git a/core/modules/node/node.api.php b/core/modules/node/node.api.php
index d5e396c..8ccd995 100644
--- a/core/modules/node/node.api.php
+++ b/core/modules/node/node.api.php
@@ -1338,7 +1338,7 @@ function hook_view(\Drupal\Core\Entity\EntityInterface $node, \Drupal\entity\Plu
     $breadcrumb[] = l(t('Home'), NULL);
     $breadcrumb[] = l(t('Example'), 'example');
     $breadcrumb[] = l($node->field1, 'example/' . $node->field1);
-    drupal_set_breadcrumb($breadcrumb);
+    Drupal::service('breadcrumb')->set($breadcrumb);
   }
 
   // Only do the extra work if the component is configured to be displayed.
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index ac8bac3..4df5421 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -980,7 +980,7 @@ function hook_menu_local_tasks_alter(&$data, $router_item, $root_path) {
  *
  * This hook is invoked by menu_get_active_breadcrumb() and allows alteration
  * of the breadcrumb links for the current page, which may be preferred instead
- * of setting a custom breadcrumb via drupal_set_breadcrumb().
+ * of setting a custom breadcrumb via \Drupal\Core\Menu\Breadcrumbs::set().
  *
  * Implementations should take into account that menu_get_active_breadcrumb()
  * subsequently performs the following adjustments to the active trail *after*
@@ -1004,7 +1004,7 @@ function hook_menu_local_tasks_alter(&$data, $router_item, $root_path) {
  * @param $item
  *   The menu router item of the current page.
  *
- * @see drupal_set_breadcrumb()
+ * @see \Drupal\Core\Menu\Breadcrumbs::set()
  * @see menu_get_active_breadcrumb()
  * @see menu_get_active_trail()
  * @see menu_set_active_trail()
diff --git a/core/modules/taxonomy/taxonomy.pages.inc b/core/modules/taxonomy/taxonomy.pages.inc
index b6f1329..51f6146 100644
--- a/core/modules/taxonomy/taxonomy.pages.inc
+++ b/core/modules/taxonomy/taxonomy.pages.inc
@@ -32,7 +32,7 @@ function taxonomy_term_page(Term $term) {
   }
   $breadcrumb[] = l(t('Home'), NULL);
   $breadcrumb = array_reverse($breadcrumb);
-  drupal_set_breadcrumb($breadcrumb);
+  Drupal::service('breadcrumb')->set($breadcrumb);
   drupal_add_feed('taxonomy/term/' . $term->tid . '/feed', 'RSS - ' . $term->label());
 
   $uri = $term->uri();
diff --git a/core/modules/views/lib/Drupal/views/ViewExecutable.php b/core/modules/views/lib/Drupal/views/ViewExecutable.php
index aa39dae..2cc5dee 100644
--- a/core/modules/views/lib/Drupal/views/ViewExecutable.php
+++ b/core/modules/views/lib/Drupal/views/ViewExecutable.php
@@ -1685,7 +1685,8 @@ public function getPath() {
    * Get the breadcrumb used for this view.
    *
    * @param $set
-   *   If true, use drupal_set_breadcrumb() to install the breadcrumb.
+   *   If true, use Drupal::service('breadcrumb')->set() to install the
+   *   breadcrumb.
    */
   public function getBreadcrumb($set = FALSE) {
     // Now that we've built the view, extract the breadcrumb.
@@ -1706,10 +1707,11 @@ public function getBreadcrumb($set = FALSE) {
       }
 
       if ($set) {
+        $breadcrumbs = Drupal::service('breadcrumb');
         if ($base) {
-          $breadcrumb = array_merge(drupal_get_breadcrumb(), $breadcrumb);
+          $breadcrumb = array_merge($breadcrumbs->get(), $breadcrumb);
         }
-        drupal_set_breadcrumb($breadcrumb);
+        $breadcrumbs->set($breadcrumb);
       }
     }
     return $breadcrumb;
