diff --git a/core/modules/menu_link_content/menu_link_content.install b/core/modules/menu_link_content/menu_link_content.install
new file mode 100644
index 0000000..c31536b
--- /dev/null
+++ b/core/modules/menu_link_content/menu_link_content.install
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the menu_link_content module.
+ */
+
+/**
+ * Implements hook_install().
+ */
+function menu_link_content_install() {
+  // Add a higher weight so that menu_link_content_path_update comes after
+  // system_path_uodate().
+  module_set_weight('menu_link_content', 1);
+}
diff --git a/core/modules/menu_link_content/menu_link_content.module b/core/modules/menu_link_content/menu_link_content.module
index 6d33dce..1c8eb85 100644
--- a/core/modules/menu_link_content/menu_link_content.module
+++ b/core/modules/menu_link_content/menu_link_content.module
@@ -36,3 +36,54 @@ function menu_link_content_menu_delete(MenuInterface $menu) {
   $menu_links = $storage->loadByProperties(array('menu_name' => $menu->id()));
   $storage->delete($menu_links);
 }
+
+/**
+ * Implements hook_path_insert().
+ */
+function menu_link_content_path_insert($path) {
+  _menu_link_content_update_path_alias($path['alias']);
+}
+
+/**
+ * Helper function to update plugin definition using user-path scheme.
+ *
+ * @param string $path
+ *   The path alias.
+ *
+ */
+function _menu_link_content_update_path_alias($path) {
+  /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */
+  $menu_link_manager = \Drupal::service('plugin.manager.menu.link');
+  // @todo Use link.uri once https://www.drupal.org/node/2391217 is in.
+  /* @var $entities  \Drupal\menu_link_content\MenuLinkContentInterface[] */
+  $entities = \Drupal::entityManager()
+    ->getStorage('menu_link_content')
+    ->loadByProperties(['link__uri' => 'user-path:' . $path]);
+  foreach ($entities as $menu_link) {
+    $menu_link_manager->updateDefinition($menu_link->getPluginId(), $menu_link->getPluginDefinition(), FALSE);
+  }
+}
+
+/**
+ * Implements hook_path_update().
+ */
+function menu_link_content_path_update($path) {
+  //
+  if ($path['alias'] != $path['original']['alias']) {
+    _menu_link_content_update_path_alias($path['alias']);
+    _menu_link_content_update_path_alias($path['original']['alias']);
+  }
+
+  if ($path['source'] != $path['original']['source']) {
+    _menu_link_content_update_path_alias($path['alias']);
+    _menu_link_content_update_path_alias($path['source']);
+    _menu_link_content_update_path_alias($path['original']['source']);
+  }
+}
+
+/**
+ * Implements hook_path_delete().
+ */
+function menu_link_content_path_delete($path) {
+  _menu_link_content_update_path_alias($path['alias']);
+}
diff --git a/core/modules/menu_link_content/src/Tests/PathAliasMenuLinkContentTest.php b/core/modules/menu_link_content/src/Tests/PathAliasMenuLinkContentTest.php
new file mode 100644
index 0000000..4e04ec6
--- /dev/null
+++ b/core/modules/menu_link_content/src/Tests/PathAliasMenuLinkContentTest.php
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\menu_link_content\Tests\PathAliasMenuLinkContentTest.
+ */
+
+namespace Drupal\menu_link_content\Tests;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Menu\MenuTreeParameters;
+use Drupal\menu_link_content\Entity\MenuLinkContent;
+use Drupal\simpletest\KernelTestBase;
+
+/**
+ * Ensures that the menu tree adapts to path alias changes.
+ *
+ * @group menu_link_content
+ */
+class PathAliasMenuLinkContentTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['menu_link_content', 'system', 'link', 'test_page_test'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installEntitySchema('menu_link_content');
+    $this->installSchema('system', ['url_alias', 'router']);
+
+    // Ensure that the weight of module_link_content is higher than system.
+    // @see menu_link_content_install()
+    module_set_weight('menu_link_content', 1);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function containerBuild(ContainerBuilder $container) {
+    parent::containerBuild($container);
+
+    $definition = $container->getDefinition('path_processor_alias');
+    $definition
+      ->addTag('path_processor_inbound', ['priority' => 100]);
+  }
+
+
+  /**
+   * Tests the path aliasing changing.
+   */
+  public function testPathAliasChange() {
+    \Drupal::service('router.builder')->rebuild();
+
+    /** @var \Drupal\Core\Path\AliasStorageInterface $path_alias_storage */
+    $path_alias_storage = \Drupal::service('path.alias_storage');
+    $alias = $path_alias_storage->save('test-page', 'destination');
+    $pid = $alias['pid'];
+
+    $menu_link_content = MenuLinkContent::create([
+      'title' => 'Menu title',
+      'link' => ['uri' => 'user-path:destination'],
+      'menu_name' => 'tools',
+    ]);
+    $menu_link_content->save();
+
+    $tree = \Drupal::menuTree()->load('tools', new MenuTreeParameters());
+    $this->assertEqual('test_page_test.test_page', $tree[$menu_link_content->getPluginId()]->link->getPluginDefinition()['route_name']);
+
+    // Saving an alias should clear the alias manager cache.
+    $path_alias_storage->save('test-render-title', 'destination', LanguageInterface::LANGCODE_NOT_SPECIFIED, $pid);
+
+    $tree = \Drupal::menuTree()->load('tools', new MenuTreeParameters());
+    $this->assertEqual('test_page_test.render_title', $tree[$menu_link_content->getPluginId()]->link->getPluginDefinition()['route_name']);
+
+    // Delete the alias.
+    $path_alias_storage->delete(['pid' => $pid]);
+    $tree = \Drupal::menuTree()->load('tools', new MenuTreeParameters());
+    $this->assertTrue(isset($tree[$menu_link_content->getPluginId()]));
+    $this->assertEqual('', $tree[$menu_link_content->getPluginId()]->link->getRouteName());
+    $this->assertEqual('base:destination', $tree[$menu_link_content->getPluginId()]->link->getUrlObject()->getUri());
+  }
+
+}
