diff --git a/src/MenuBasedBreadcrumbBuilder.php b/src/MenuBasedBreadcrumbBuilder.php
index 46df2b4..fe5c1e0 100644
--- a/src/MenuBasedBreadcrumbBuilder.php
+++ b/src/MenuBasedBreadcrumbBuilder.php
@@ -5,18 +5,16 @@ namespace Drupal\menu_breadcrumb;
 use Drupal\Component\Utility\SortArray;
 use Drupal\Core\Breadcrumb\Breadcrumb;
 use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface;
-use Drupal\Core\Config\ConfigFactory;
+use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Controller\TitleResolverInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Entity\FieldableEntityInterface;
-use Drupal\Core\Language\LanguageInterface;
-use Drupal\Core\Language\LanguageManager;
+use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Link;
 use Drupal\Core\Menu\MenuActiveTrailInterface;
-use Drupal\Core\Menu\MenuLinkManager;
+use Drupal\Core\Menu\MenuLinkManagerInterface;
 use Drupal\Core\Routing\AdminContext;
 use Drupal\Core\Routing\RouteMatchInterface;
-use Drupal\Core\TypedData\TranslatableInterface;
 use Drupal\Core\Url;
 use Symfony\Component\HttpFoundation\RequestStack;
 
@@ -114,13 +112,13 @@ class MenuBasedBreadcrumbBuilder implements BreadcrumbBuilderInterface {
    * {@inheritdoc}
    */
   public function __construct(
-    ConfigFactory $config_factory,
+    ConfigFactoryInterface $config_factory,
     MenuActiveTrailInterface $menu_active_trail,
-    MenuLinkManager $menu_link_manager,
+    MenuLinkManagerInterface $menu_link_manager,
     AdminContext $admin_context,
     TitleResolverInterface $title_resolver,
     RequestStack $request_stack,
-    LanguageManager $language_manager,
+    LanguageManagerInterface $language_manager,
     EntityTypeManagerInterface $entity_type_manager
   ) {
     $this->configFactory = $config_factory;
@@ -219,19 +217,13 @@ class MenuBasedBreadcrumbBuilder implements BreadcrumbBuilderInterface {
    * {@inheritdoc}
    */
   public function build(RouteMatchInterface $route_match) {
-
     $breadcrumb = new Breadcrumb();
     // Breadcrumbs accumulate in this array, with lowest index being the root
     // (i.e., the reverse of the assigned breadcrumb trail):
     $links = array();
-    //
-    // Do we need to handle multilingual menu titles & cache based on language?
-    $translated = FALSE;
-    if (count($this->languageManager->getLanguages()) > 1) {
-      $language = $this->languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT);
-      $langcode = $language->getId();
+
+    if (count($this->languageManager->isMultilingual()) > 1) {
       $breadcrumb->addCacheContexts(['languages:language_content']);
-      $translated = TRUE;
     }
 
     // Changing the <front> page will invalidate any breadcrumb generated here:
@@ -248,30 +240,16 @@ class MenuBasedBreadcrumbBuilder implements BreadcrumbBuilderInterface {
     // Generate basic breadcrumb trail from active trail.
     // Keep same link ordering as Menu Breadcrumb (so also reverses menu trail)
     foreach (array_reverse($this->menuTrail) as $id) {
-      $def = $this->menuLinkManager->getDefinition($id);
-      if ($translated) {
-        $entity = $this->entityTypeManager->getStorage('menu_link_content')->load($def['metadata']['entity_id']);
-        if ($entity instanceof TranslatableInterface && $entity->hasTranslation($langcode)) {
-          $parent = $entity->getTranslation($langcode);
-          $def['title'] = $parent->getTitle();
-        }
-      }
-      $def_route_name = $def['route_name'];
-      if ($def_route_name) {
-        $url_object = Url::fromRoute($def_route_name, $def['route_parameters']);
-      }
-      else {
-        // If no route, it's an external URI (issue 2750821):
-        $url_object = Url::fromUri($def['url']);
-      }
-      $links[] = Link::fromTextAndUrl($def['title'], $url_object);
+      $plugin = $this->menuLinkManager->createInstance($id);
+      $links[] = Link::fromTextAndUrl($plugin->getTitle(), $plugin->getUrlObject());
+      $breadcrumb->addCacheableDependency($plugin);
     }
     $this->addMissingCurrentPage($links, $route_match);
 
     // Create a breadcrumb for <front> which may be either added or replaced:
     $label = $this->config->get('home_as_site_name') ?
       $this->configFactory->get('system.site')->get('name') :
-      t('Home');
+      $this->t('Home');
     $home_link = Link::createFromRoute($label, '<front>');
 
     // The first link from the menu trail, being the root, may be the
diff --git a/tests/src/Unit/BreadcrumbCacheTest.php b/tests/src/Unit/BreadcrumbCacheTest.php
new file mode 100644
index 0000000..a9d7884
--- /dev/null
+++ b/tests/src/Unit/BreadcrumbCacheTest.php
@@ -0,0 +1,250 @@
+<?php
+
+namespace Drupal\Tests\menu_breadcrumb\Unit;
+
+use Drupal\Core\Cache\Cache;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Controller\TitleResolver;
+use Drupal\Core\Controller\TitleResolverInterface;
+use Drupal\Core\Entity\EntityTypeManager;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Language\LanguageManager;
+use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\Core\Menu\MenuActiveTrail;
+use Drupal\Core\Menu\MenuActiveTrailInterface;
+use Drupal\Core\Menu\MenuLinkDefault;
+use Drupal\Core\Menu\MenuLinkManager;
+use Drupal\Core\Menu\MenuLinkManagerInterface;
+use Drupal\Core\Path\PathValidator;
+use Drupal\Core\Routing\AdminContext;
+use Drupal\Core\Routing\RouteMatch;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Url;
+use Drupal\menu_breadcrumb\MenuBasedBreadcrumbBuilder;
+use Drupal\Tests\UnitTestCase;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\HttpFoundation\ParameterBag;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\Routing\Route;
+
+/**
+ * Test correct caching of menu breadcrumb.
+ *
+ * Make sure menu breadcrumb has correct caching context and tags.
+ *
+ * @group menu_breadcrumb
+ */
+class BreadcrumbCacheTest extends UnitTestCase {
+
+  /**
+   * @var MenuBasedBreadcrumbBuilder
+   */
+  protected $menuBreadcrumbBuilder;
+
+  /**
+   * @var ConfigFactoryInterface
+   */
+  protected $configFactory;
+
+  /**
+   * @var MenuActiveTrailInterface
+   */
+  protected $menuActiveTrail;
+
+  /**
+   * @var MenuLinkManagerInterface
+   */
+  protected $menuLinkManager;
+
+  /**
+   * @var AdminContext
+   */
+  protected $adminContext;
+
+  /**
+   * @var TitleResolverInterface
+   */
+  protected $titleResolver;
+
+  /**
+   * @var RequestStack
+   */
+  protected $requestStack;
+
+  /**
+   * @var LanguageManagerInterface
+   */
+  protected $languageManager;
+
+  /**
+   * @var EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * @var RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $cache_contexts_manager = $this->getMockBuilder('Drupal\Core\Cache\Context\CacheContextsManager')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $cache_contexts_manager->method('assertValidTokens')->willReturn(TRUE);
+    $container = new ContainerBuilder();
+    $container->set('cache_contexts_manager', $cache_contexts_manager);
+    $container->set('string_translation', $this->getStringTranslationStub());
+    $path_validator = $this->getMockBuilder(PathValidator::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+    $path_validator->expects($this->any())
+      ->method('getUrlIfValidWithoutAccessCheck')
+      ->willReturn(new Url('<front>'));
+    $container->set('path.validator', $path_validator);
+
+    \Drupal::setContainer($container);
+
+    $active_trail = ['menu_breadcrumb.test_parent', 'menu_breadcrumb.test'];
+
+    $config_map = [
+      'menu_breadcrumb.settings' => [
+        'determine_menu' => TRUE,
+        'disable_admin_page' => TRUE,
+        'append_current_page' => TRUE,
+        'current_page_as_link' => FALSE,
+        'append_member_page' => FALSE,
+        'member_page_as_link' => FALSE,
+        'remove_home' => FALSE,
+        'add_home' => FALSE,
+        'home_as_site_name' => FALSE,
+        'menu_breadcrumb_menus' => [
+          'main' => [
+            'enabled' => 1,
+            'weight' => -10,
+          ],
+        ],
+      ],
+      'system.site' => [
+        'page.front' => '/node',
+      ],
+    ];
+    $this->configFactory = self::getConfigFactoryStub($config_map);
+    foreach ($config_map as $config_name => $data) {
+      $this->configFactory->get($config_name)->expects($this->atLeastOnce())
+        ->method('getCacheContexts')
+        ->willReturn([]);
+      $this->configFactory->get($config_name)->expects($this->atLeastOnce())
+        ->method('getCacheTags')
+        ->willReturn([]);
+      $this->configFactory->get($config_name)->expects($this->atLeastOnce())
+        ->method('getCacheMaxAge')
+        ->willReturn(Cache::PERMANENT);
+    }
+
+    $this->menuActiveTrail = $this->getMockBuilder(MenuActiveTrail::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+    $this->menuActiveTrail->expects($this->any())
+      ->method('getActiveTrailIds')
+      ->with('main')
+      ->willReturn($active_trail);
+
+    $this->menuLinkManager = $this->getMockBuilder(MenuLinkManager::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    $menu_link_plugin_map = [];
+    foreach ($active_trail as $v) {
+      $menu_link_plugin = $this->getMockBuilder(MenuLinkDefault::class)
+        ->disableOriginalConstructor()
+        ->getMock();
+      $menu_link_plugin->expects($this->any())
+        ->method('getTitle')
+        ->willReturn($v);
+      $menu_link_plugin->expects($this->any())
+        ->method('getUrlObject')
+        ->willReturn(new Url($v));
+      $menu_link_plugin->expects($this->atLeastOnce())
+        ->method('getCacheContexts')
+        ->willReturn([]);
+      $menu_link_plugin->expects($this->atLeastOnce())
+        ->method('getCacheTags')
+        ->willReturn([]);
+      $menu_link_plugin->expects($this->atLeastOnce())
+        ->method('getCacheMaxAge')
+        ->willReturn(Cache::PERMANENT);
+
+      $menu_link_plugin_map[] = [$v, [], $menu_link_plugin];
+    }
+
+    $this->menuLinkManager->expects($this->any())
+      ->method('createInstance')
+      ->willReturnMap($menu_link_plugin_map);
+
+    $this->adminContext = $this->getMockBuilder(AdminContext::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+    $this->adminContext->expects($this->any())
+      ->method('isAdminRoute')
+      ->willReturn(FALSE);
+
+    $this->titleResolver = $this->getMockBuilder(TitleResolver::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    $this->requestStack = $this->getMockBuilder(RequestStack::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+    $this->requestStack->expects($this->any())
+      ->method('getCurrentRequest')
+      ->willReturn($this->getMockBuilder(Request::class)
+        ->disableOriginalConstructor()
+        ->getMock());
+
+    $this->languageManager = $this->getMockBuilder(LanguageManager::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+    $this->languageManager->expects($this->any())
+      ->method('getLanguages')
+      ->willReturn([]);
+
+    $this->entityTypeManager = $this->getMockBuilder(EntityTypeManager::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    $this->routeMatch = $this->getMockBuilder(RouteMatch::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+    $this->routeMatch->expects($this->any())
+      ->method('getRouteName')
+      ->willReturn('menu_breadcrumb.test');
+    $this->routeMatch->expects($this->any())
+      ->method('getParameters')
+      ->willReturn(new ParameterBag(array()));
+    $this->routeMatch->expects($this->any())
+      ->method('getRouteObject')
+      ->willReturn($this->getMockBuilder(Route::class)
+        ->disableOriginalConstructor()
+        ->getMock());
+
+    $this->menuBreadcrumbBuilder = new MenuBasedBreadcrumbBuilder($this->configFactory, $this->menuActiveTrail, $this->menuLinkManager, $this->adminContext, $this->titleResolver, $this->requestStack, $this->languageManager, $this->entityTypeManager);
+  }
+
+  /**
+   * Test correct cache context and tags.
+   */
+  public function testCacheContextAndTags() {
+    $this->assertTrue($this->menuBreadcrumbBuilder->applies($this->routeMatch));
+
+    // We do not explicitly assert anything, but rather track that cache meta
+    // data is requested from the mocks.
+    $breadcrumb = $this->menuBreadcrumbBuilder->build($this->routeMatch);
+  }
+
+}
