diff --git a/core/modules/menu_link/lib/Drupal/menu_link/Entity/MenuLink.php b/core/modules/menu_link/lib/Drupal/menu_link/Entity/MenuLink.php
index f51b585..273804d 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/Entity/MenuLink.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/Entity/MenuLink.php
@@ -80,6 +80,13 @@ class MenuLink extends Entity implements \ArrayAccess, MenuLinkInterface {
   public $uuid;
 
   /**
+   * The menu link machine name.
+   *
+   * @var string
+   */
+  public $machine_name;
+
+  /**
    * The parent link ID.
    *
    * @var int
@@ -254,7 +261,14 @@ class MenuLink extends Entity implements \ArrayAccess, MenuLinkInterface {
    *
    * @var string
    */
-  public $route_name;
+  public $route_name = '';
+
+  /**
+   * The parameters of the route associated with this menu link, if any.
+   *
+   * @var array
+   */
+  public $route_parameters = array();
 
   /**
    * The route object associated with this menu link, if any.
@@ -303,6 +317,20 @@ public function getRoute() {
   /**
    * {@inheritdoc}
    */
+  public function getRouteName() {
+    return $this->route_name;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRouteParameters() {
+    return $this->route_parameters;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function setRouteObject(Route $route) {
     $this->routeObject = $route;
   }
@@ -424,6 +452,34 @@ public static function postDelete(EntityStorageControllerInterface $storage_cont
   }
 
   /**
+   * Returns the route_name and route parameters matching a system path.
+   *
+   * @param string $link_path
+   *   The link path to find a route name for.
+   *
+   * @return array
+   *   Returns an array with both the route name and parameters.
+   */
+  protected static function findRouteNameParameters($link_path) {
+    // Look up the route_name used for the given path.
+    $request = Request::create('/' . $link_path);
+    $request->attributes->set('_system_path', $link_path);
+    try {
+      // Use router.dynamic instead of router, because router will call the
+      // legacy router which will call hook_menu() and you will get back to
+      // this method.
+      $result = \Drupal::service('router.dynamic')->matchRequest($request);
+      $return = array();
+      $return[] = isset($result['_route']) ? $result['_route'] : '';
+      $return[] = $result['_raw_variables']->all();
+      return $return;
+    }
+    catch (\Exception $e) {
+      return array();
+    }
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function preSave(EntityStorageControllerInterface $storage_controller) {
@@ -485,7 +541,13 @@ public function preSave(EntityStorageControllerInterface $storage_controller) {
     }
     // Find the route_name.
     if (!isset($this->route_name)) {
-      $this->route_name = $this::findRouteName($this->link_path);
+      if ($result = static::findRouteNameParameters($this->link_path)) {
+        list($this->route_name, $this->route_parameters) = $result;
+      }
+      else {
+        $this->route_name = '';
+        $this->route_parameters = array();
+      }
     }
   }
 
@@ -508,25 +570,6 @@ public function postSave(EntityStorageControllerInterface $storage_controller, $
   /**
    * {@inheritdoc}
    */
-  public static function findRouteName($link_path) {
-    // Look up the route_name used for the given path.
-    $request = Request::create('/' . $link_path);
-    $request->attributes->set('_system_path', $link_path);
-    try {
-      // Use router.dynamic instead of router, because router will call the
-      // legacy router which will call hook_menu() and you will get back to
-      // this method.
-      $result = \Drupal::service('router.dynamic')->matchRequest($request);
-      return isset($result['_route']) ? $result['_route'] : '';
-    }
-    catch (\Exception $e) {
-      return '';
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function setParents(EntityInterface $parent) {
     $i = 1;
     while ($i < $this->depth) {
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkInterface.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkInterface.php
index f4c4e0e..d5f291f 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkInterface.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkInterface.php
@@ -26,6 +26,22 @@
   public function getRoute();
 
   /**
+   * Returns the Route name associated with this link, if any.
+   *
+   * @return string
+   *   The route name for this menu link, an empty string if there isn't one.
+   */
+  public function getRouteName();
+
+  /**
+   * Returns the Route parameters associated with this link, if any.
+   *
+   * @return array
+   *   The route parameters for this menu link, or an empty array.
+   */
+  public function getRouteParameters();
+
+  /**
    * Sets the route object for this link.
    *
    * This should only be called by MenuLinkStorageController when loading
@@ -56,17 +72,6 @@ public function reset();
   public static function buildFromRouterItem(array $item);
 
   /**
-   * Returns the route_name matching a URL.
-   *
-   * @param string $link_path
-   *   The link path to find a route name for.
-   *
-   * @return string
-   *   The route name.
-   */
-  public static function findRouteName($link_path);
-
-  /**
    * Sets the p1 through p9 properties for a menu link entity being saved.
    *
    * @param \Drupal\Core\Entity\EntityInterface $parent
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
index 43d54ce..31d14f6 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
@@ -111,6 +111,7 @@ protected function attachLoad(&$menu_links, $load_revision = FALSE) {
 
     foreach ($menu_links as &$menu_link) {
       $menu_link->options = unserialize($menu_link->options);
+      $menu_link->route_parameters = unserialize($menu_link->route_parameters);
 
       // Use the weight property from the menu link.
       $menu_link->router_item['weight'] = $menu_link->weight;
diff --git a/core/modules/menu_link/menu_link.install b/core/modules/menu_link/menu_link.install
index a09be43..b566845 100644
--- a/core/modules/menu_link/menu_link.install
+++ b/core/modules/menu_link/menu_link.install
@@ -31,6 +31,12 @@ function menu_link_schema() {
         'length' => 128,
         'not null' => FALSE,
       ),
+      'machine_name' => array(
+        'description' => 'A name to use to look up a specific link in code.',
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => FALSE,
+      ),
       'plid' => array(
         'description' => 'The parent link ID (plid) is the mlid of the link above in the hierarchy, or zero if the link is at the top level in its menu.',
         'type' => 'int',
@@ -202,6 +208,13 @@ function menu_link_schema() {
         'type' => 'varchar',
         'length' => 255,
       ),
+      'route_parameters' => array(
+        'description' => 'Serialized array of route parameters of this menu link.',
+        'type' => 'blob',
+        'size' => 'big',
+        'not null' => FALSE,
+        'serialize' => TRUE,
+      ),
     ),
     'indexes' => array(
       'path_menu' => array(array('link_path', 128), 'menu_name'),
diff --git a/core/modules/system/lib/Drupal/system/Tests/Menu/LinksTest.php b/core/modules/system/lib/Drupal/system/Tests/Menu/LinksTest.php
index ddc834b..5df9629 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Menu/LinksTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Menu/LinksTest.php
@@ -13,6 +13,14 @@
  * Tests for menu links.
  */
 class LinksTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('router_test');
+
   public static function getInfo() {
     return array(
       'name' => 'Menu links',
@@ -229,4 +237,28 @@ function testMenuLinkRouterReparenting() {
     );
     $this->assertMenuLinkParents($links, $expected_hierarchy);
   }
+
+  /**
+   * Tests the router system integration (route_name and route_parameters).
+   */
+  public function testRouterIntegration() {
+    $menu_link = entity_create('menu_link', array(
+      'link_path' => 'router_test/test1',
+    ));
+    $menu_link->save();
+    $this->assertEqual($menu_link->route_name, 'router_test_1');
+    $this->assertEqual($menu_link->route_parameters, array());
+
+    $menu_link = entity_create('menu_link', array(
+      'link_path' => 'router_test/test3/test',
+    ));
+    $menu_link->save();
+    $this->assertEqual($menu_link->route_name, 'router_test_3');
+    $this->assertEqual($menu_link->route_parameters, array('value' => 'test'));
+
+    $menu_link = entity_load('menu_link', $menu_link->id());
+    $this->assertEqual($menu_link->route_name, 'router_test_3');
+    $this->assertEqual($menu_link->route_parameters, array('value' => 'test'));
+  }
+
 }
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 3f0fac0..2901579 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -2242,6 +2242,28 @@ function system_update_8059() {
 }
 
 /**
+ * Add route_parameters and machine_name columns to the menu_links table.
+ */
+function system_update_8060() {
+  $schema['route_parameters'] = array(
+    'description' => 'Serialized array of route parameters of this menu link.',
+    'type' => 'blob',
+    'size' => 'big',
+    'not null' => FALSE,
+    'serialize' => TRUE,
+  );
+  $schema['machine_name'] = array(
+    'description' => 'A name to use to look up a specific link in code.',
+    'type' => 'varchar',
+    'length' => 128,
+    'not null' => FALSE,
+  );
+  foreach ($schema as $field => $spec) {
+    db_add_field('menu_links', $field, $spec);
+  }
+}
+
+/**
  * @} End of "defgroup updates-7.x-to-8.x".
  * The next series of updates should start at 9000.
  */
