diff --git a/composer.json b/composer.json
index d6cdc7f..7e647d5 100644
--- a/composer.json
+++ b/composer.json
@@ -21,7 +21,7 @@
     "doctrine/annotations": "dev-master#463d926a8dcc49271cb7db5a08364a70ed6e3cd3",
     "guzzlehttp/guzzle": "4.1.*",
     "kriswallsmith/assetic": "1.1.*@alpha",
-    "symfony-cmf/routing": "1.1.*@alpha",
+    "symfony-cmf/routing": "1.2.*",
     "easyrdf/easyrdf": "0.8.*",
     "phpunit/phpunit": "4.1.*",
     "phpunit/phpunit-mock-objects": "dev-master#e60bb929c50ae4237aaf680a4f6773f4ee17f0a2",
diff --git a/composer.lock b/composer.lock
index a21d52b..082fd93 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "hash": "2b2309c748ec92230880579aaedfa1e6",
+    "hash": "6a7a4ba69644c6cf110d03b1a5346e3e",
     "packages": [
         {
             "name": "doctrine/annotations",
@@ -1415,17 +1415,17 @@
         },
         {
             "name": "symfony-cmf/routing",
-            "version": "1.1.0",
+            "version": "1.2.0",
             "target-dir": "Symfony/Cmf/Component/Routing",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony-cmf/Routing.git",
-                "reference": "9f8607950cbf888ec678713a35f3d0088857c85f"
+                "reference": "c67258b875eef3cb08009bf1428499d0f01ce5e7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony-cmf/Routing/zipball/9f8607950cbf888ec678713a35f3d0088857c85f",
-                "reference": "9f8607950cbf888ec678713a35f3d0088857c85f",
+                "url": "https://api.github.com/repos/symfony-cmf/Routing/zipball/c67258b875eef3cb08009bf1428499d0f01ce5e7",
+                "reference": "c67258b875eef3cb08009bf1428499d0f01ce5e7",
                 "shasum": ""
             },
             "require": {
@@ -1445,7 +1445,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.1-dev"
+                    "dev-master": "1.2-dev"
                 }
             },
             "autoload": {
@@ -1469,7 +1469,7 @@
                 "database",
                 "routing"
             ],
-            "time": "2013-10-14 15:32:46"
+            "time": "2014-05-08 19:37:14"
         },
         {
             "name": "symfony/class-loader",
@@ -2445,7 +2445,6 @@
         "doctrine/common": 20,
         "doctrine/annotations": 20,
         "kriswallsmith/assetic": 15,
-        "symfony-cmf/routing": 15,
         "phpunit/phpunit-mock-objects": 20
     },
     "prefer-stable": false,
diff --git a/core/config/schema/core.menu.schema.yml b/core/config/schema/core.menu.schema.yml
index c2da5ef..a1fc321 100644
--- a/core/config/schema/core.menu.schema.yml
+++ b/core/config/schema/core.menu.schema.yml
@@ -22,6 +22,6 @@ menu_link.static.overrides:
             expanded:
               type: boolean
               label: 'Expanded'
-            hidden:
+            enabled:
               type: boolean
-              label: 'Hidden'
+              label: 'Enabled'
diff --git a/core/core.services.yml b/core/core.services.yml
index 200972e..2f04124 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -749,6 +749,9 @@ services:
   plugin.manager.condition:
     class: Drupal\Core\Condition\ConditionManager
     parent: default_plugin_manager
+  plugin.manager.element_info:
+    class: Drupal\Core\Render\ElementInfoManager
+    parent: default_plugin_manager
   kernel_destruct_subscriber:
     class: Drupal\Core\EventSubscriber\KernelDestructionSubscriber
     tags:
@@ -907,8 +910,7 @@ services:
   info_parser:
     class: Drupal\Core\Extension\InfoParser
   element_info:
-    class: Drupal\Core\Render\ElementInfo
-    arguments: ['@module_handler']
+    alias: plugin.manager.element_info
   file.mime_type.guesser:
     class: Drupal\Core\File\MimeType\MimeTypeGuesser
     tags:
diff --git a/core/includes/ajax.inc b/core/includes/ajax.inc
index 4a03c68..3b5c277 100644
--- a/core/includes/ajax.inc
+++ b/core/includes/ajax.inc
@@ -6,6 +6,7 @@
  */
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element;
 
 /**
  * @defgroup ajax Ajax API
@@ -162,20 +163,10 @@
 /**
  * Form element processing handler for the #ajax form property.
  *
- * @param $element
- *   An associative array containing the properties of the element.
- *
- * @return
- *   The processed element.
- *
- * @see ajax_pre_render_element()
+ * @deprecated Use \Drupal\Core\Render\Element\FormElement::processAjaxForm().
  */
-function ajax_process_form($element, FormStateInterface $form_state) {
-  $element = ajax_pre_render_element($element);
-  if (!empty($element['#ajax_processed'])) {
-    $form_state['cache'] = TRUE;
-  }
-  return $element;
+function ajax_process_form($element, FormStateInterface $form_state, &$complete_form) {
+  return Element\FormElement::processAjaxForm($element, $form_state, $complete_form);
 }
 
 /**
diff --git a/core/includes/common.inc b/core/includes/common.inc
index 6c6c4a3..18ed1d5 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -2670,65 +2670,10 @@ function drupal_pre_render_html_tag($element) {
 /**
  * Pre-render callback: Renders a link into #markup.
  *
- * Doing so during pre_render gives modules a chance to alter the link parts.
- *
- * @param $elements
- *   A structured array whose keys form the arguments to l():
- *   - #title: The link text to pass as argument to l().
- *   - One of the following
- *     - #route_name and (optionally) and a #route_parameters array; The route
- *       name and route parameters which will be passed into the link generator.
- *     - #href: The system path or URL to pass as argument to l().
- *   - #options: (optional) An array of options to pass to l() or the link
- *     generator.
- *
- * @return
- *   The passed-in elements containing a rendered link in '#markup'.
+ * @deprecated Use \Drupal\Core\Render\Element\Link::preRenderLink().
  */
 function drupal_pre_render_link($element) {
-  // By default, link options to pass to l() are normally set in #options.
-  $element += array('#options' => array());
-  // However, within the scope of renderable elements, #attributes is a valid
-  // way to specify attributes, too. Take them into account, but do not override
-  // attributes from #options.
-  if (isset($element['#attributes'])) {
-    $element['#options'] += array('attributes' => array());
-    $element['#options']['attributes'] += $element['#attributes'];
-  }
-
-  // This #pre_render callback can be invoked from inside or outside of a Form
-  // API context, and depending on that, a HTML ID may be already set in
-  // different locations. #options should have precedence over Form API's #id.
-  // #attributes have been taken over into #options above already.
-  if (isset($element['#options']['attributes']['id'])) {
-    $element['#id'] = $element['#options']['attributes']['id'];
-  }
-  elseif (isset($element['#id'])) {
-    $element['#options']['attributes']['id'] = $element['#id'];
-  }
-
-  // Conditionally invoke ajax_pre_render_element(), if #ajax is set.
-  if (isset($element['#ajax']) && !isset($element['#ajax_processed'])) {
-    // If no HTML ID was found above, automatically create one.
-    if (!isset($element['#id'])) {
-      $element['#id'] = $element['#options']['attributes']['id'] = drupal_html_id('ajax-link');
-    }
-    // If #ajax['path] was not specified, use the href as Ajax request URL.
-    if (!isset($element['#ajax']['path'])) {
-      $element['#ajax']['path'] = $element['#href'];
-      $element['#ajax']['options'] = $element['#options'];
-    }
-    $element = ajax_pre_render_element($element);
-  }
-
-  if (isset($element['#route_name'])) {
-    $element['#route_parameters'] = empty($element['#route_parameters']) ? array() : $element['#route_parameters'];
-    $element['#markup'] = \Drupal::linkGenerator()->generate($element['#title'], $element['#route_name'], $element['#route_parameters'], $element['#options']);
-  }
-  else {
-    $element['#markup'] = l($element['#title'], $element['#href'], $element['#options']);
-  }
-  return $element;
+  return Element\Link::preRenderLink($element);
 }
 
 /**
diff --git a/core/includes/form.inc b/core/includes/form.inc
index 972fa3d..fb9add4 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -105,18 +105,6 @@ function drupal_form_submit($form_arg, FormStateInterface $form_state) {
 }
 
 /**
- * Retrieves the structured array that defines a given form.
- *
- * @deprecated in Drupal 8.x-dev, will be removed before Drupal 8.0.
- *   Use \Drupal::formBuilder()->retrieveForm().
- *
- * @see \Drupal\Core\Form\FormBuilderInterface::retrieveForm().
- */
-function drupal_retrieve_form($form_id, FormStateInterface $form_state) {
-  return \Drupal::formBuilder()->retrieveForm($form_id, $form_state);
-
-}
-/**
  * Processes a form submission.
  *
  * @deprecated in Drupal 8.x-dev, will be removed before Drupal 8.0.
@@ -578,22 +566,10 @@ function form_type_select_value($element, $input = FALSE) {
 /**
  * Determines the value for a textfield form element.
  *
- * @param $element
- *   The form element whose value is being populated.
- * @param $input
- *   The incoming input to populate the form element. If this is FALSE,
- *   the element's default value should be returned.
- *
- * @return
- *   The data that will appear in the $element_state['values'] collection
- *   for this element. Return nothing to use the default.
+ * @deprecated Use \Drupal\Core\Render\Element\Textfield::valueCallback().
  */
-function form_type_textfield_value($element, $input = FALSE) {
-  if ($input !== FALSE && $input !== NULL) {
-    // Equate $input to the form value to ensure it's marked for
-    // validation.
-    return str_replace(array("\r", "\n"), '', $input);
-  }
+function form_type_textfield_value(&$element, $input, &$form_state) {
+  return Element\Textfield::valueCallback($element, $input, $form_state);
 }
 
 /**
@@ -1318,24 +1294,10 @@ function form_pre_render_actions_dropbutton(array $element) {
 /**
  * #process callback for #pattern form element property.
  *
- * @param $element
- *   An associative array containing the properties and children of the
- *   generic input element.
- * @param $form_state
- *   The current state of the form for the form this element belongs to.
- *
- * @return
- *   The processed element.
- *
- * @see form_validate_pattern()
+ * @deprecated Use \Drupal\Core\Render\Element\FormElement::processPattern().
  */
-function form_process_pattern($element, FormStateInterface $form_state) {
-  if (isset($element['#pattern']) && !isset($element['#attributes']['pattern'])) {
-    $element['#attributes']['pattern'] = $element['#pattern'];
-    $element['#element_validate'][] = 'form_validate_pattern';
-  }
-
-  return $element;
+function form_process_pattern($element, FormStateInterface $form_state, &$complete_form) {
+  return Element\FormElement::processPattern($element, $form_state, $complete_form);
 }
 
 /**
@@ -1934,61 +1896,10 @@ function form_pre_render_details($element) {
 /**
  * Adds members of this group as actual elements for rendering.
  *
- * @param $element
- *   An associative array containing the properties and children of the
- *   element.
- *
- * @return
- *   The modified element with all group members.
+ * @deprecated Use \Drupal\Core\Render\ElementElementBase::preRenderGroup().
  */
 function form_pre_render_group($element) {
-  // The element may be rendered outside of a Form API context.
-  if (!isset($element['#parents']) || !isset($element['#groups'])) {
-    return $element;
-  }
-
-  // Inject group member elements belonging to this group.
-  $parents = implode('][', $element['#parents']);
-  $children = Element::children($element['#groups'][$parents]);
-  if (!empty($children)) {
-    foreach ($children as $key) {
-      // Break references and indicate that the element should be rendered as
-      // group member.
-      $child = (array) $element['#groups'][$parents][$key];
-      $child['#group_details'] = TRUE;
-      // Inject the element as new child element.
-      $element[] = $child;
-
-      $sort = TRUE;
-    }
-    // Re-sort the element's children if we injected group member elements.
-    if (isset($sort)) {
-      $element['#sorted'] = FALSE;
-    }
-  }
-
-  if (isset($element['#group'])) {
-    // Contains form element summary functionalities.
-    $element['#attached']['library'][] = 'core/drupal.form';
-
-    $group = $element['#group'];
-    // If this element belongs to a group, but the group-holding element does
-    // not exist, we need to render it (at its original location).
-    if (!isset($element['#groups'][$group]['#group_exists'])) {
-      // Intentionally empty to clarify the flow; we simply return $element.
-    }
-    // If we injected this element into the group, then we want to render it.
-    elseif (!empty($element['#group_details'])) {
-      // Intentionally empty to clarify the flow; we simply return $element.
-    }
-    // Otherwise, this element belongs to a group and the group exists, so we do
-    // not render it.
-    elseif (Element::children($element['#groups'][$group])) {
-      $element['#printed'] = TRUE;
-    }
-  }
-
-  return $element;
+  return Element\RenderElement::preRenderGroup($element);
 }
 
 /**
@@ -2076,43 +1987,10 @@ function template_preprocess_vertical_tabs(&$variables) {
  * Adds autocomplete functionality to elements with a valid
  * #autocomplete_route_name.
  *
- * Suppose your autocomplete route name is 'mymodule.autocomplete' and its path
- * is: '/mymodule/autocomplete/{a}/{b}'
- * In your form you have:
- * @code
- * '#autocomplete_route_name' => 'mymodule.autocomplete',
- * '#autocomplete_route_parameters' => array('a' => $some_key, 'b' => $some_id),
- * @endcode
- * The user types in "keywords" so the full path called is:
- * 'mymodule_autocomplete/$some_key/$some_id?q=keywords'
- *
- * @param array $element
- *   The form element to process. Properties used:
- *   - #autocomplete_route_name: A route to be used as callback URL by the
- *     autocomplete JavaScript library.
- *   - #autocomplete_route_parameters: The parameters to be used in conjunction
- *     with the route name.
- * @param \Drupal\Core\Form\FormStateInterface $form_state
- *   The current state of the form.
- *
- * @return array
- *   The form element.
+ * @deprecated Use \Drupal\Core\Render\Element\FormElement::processAutocomplete().
  */
-function form_process_autocomplete($element, FormStateInterface $form_state) {
-  $access = FALSE;
-  if (!empty($element['#autocomplete_route_name'])) {
-    $parameters = isset($element['#autocomplete_route_parameters']) ? $element['#autocomplete_route_parameters'] : array();
-
-    $path = \Drupal::urlGenerator()->generate($element['#autocomplete_route_name'], $parameters);
-    $access = \Drupal::service('access_manager')->checkNamedRoute($element['#autocomplete_route_name'], $parameters, \Drupal::currentUser());
-  }
-  if ($access) {
-    $element['#attributes']['class'][] = 'form-autocomplete';
-    $element['#attached']['library'][] = 'core/drupal.autocomplete';
-    // Provide a data attribute for the JavaScript behavior to bind to.
-    $element['#attributes']['data-autocomplete-path'] = $path;
-  }
-  return $element;
+function form_process_autocomplete($element, FormStateInterface $form_state, &$complete_form) {
+  return Element\FormElement::processAutocomplete($element, $form_state, $complete_form);
 }
 
 /**
@@ -2218,20 +2096,10 @@ function form_pre_render_hidden($element) {
 /**
  * Prepares a #type 'textfield' render element for theme_input().
  *
- * @param array $element
- *   An associative array containing the properties of the element.
- *   Properties used: #title, #value, #description, #size, #maxlength,
- *   #placeholder, #required, #attributes.
- *
- * @return array
- *   The $element with prepared variables ready for theme_input().
+ * @deprecated Use \Drupal\Core\Render\Element\Textfield::preRenderTextfield().
  */
 function form_pre_render_textfield($element) {
-  $element['#attributes']['type'] = 'text';
-  Element::setAttributes($element, array('id', 'name', 'value', 'size', 'maxlength', 'placeholder'));
-  _form_set_attributes($element, array('form-text'));
-
-  return $element;
+  return Element\Textfield::preRenderTextfield($element);
 }
 
 /**
diff --git a/core/lib/Drupal/Core/Config/ConfigFactory.php b/core/lib/Drupal/Core/Config/ConfigFactory.php
index 57c654b..7d9f23b 100644
--- a/core/lib/Drupal/Core/Config/ConfigFactory.php
+++ b/core/lib/Drupal/Core/Config/ConfigFactory.php
@@ -107,7 +107,7 @@ public function get($name) {
       return $config[$name];
     }
     else {
-      $cache_key = $this->getCacheKey($name);
+      $cache_key = $this->getConfigCacheKey($name);
       // If the config object has been deleted it will already exist in the
       // cache but self::loadMultiple does not return such objects.
       // @todo Explore making ConfigFactory a listener to the config.delete
@@ -143,7 +143,7 @@ public function loadMultiple(array $names) {
     foreach ($names as $key => $name) {
       // @todo: Deleted configuration stays in $this->cache, only return
       //   configuration objects that are not new.
-      $cache_key = $this->getCacheKey($name);
+      $cache_key = $this->getConfigCacheKey($name);
       if (isset($this->cache[$cache_key]) && !$this->cache[$cache_key]->isNew()) {
         $list[$name] = $this->cache[$cache_key];
         unset($names[$key]);
@@ -162,7 +162,7 @@ public function loadMultiple(array $names) {
       }
 
       foreach ($storage_data as $name => $data) {
-        $cache_key = $this->getCacheKey($name);
+        $cache_key = $this->getConfigCacheKey($name);
 
         $this->cache[$cache_key] = new Config($name, $this->storage, $this->eventDispatcher, $this->typedConfigManager);
         $this->cache[$cache_key]->initWithData($data);
@@ -206,7 +206,7 @@ protected function loadOverrides(array $names) {
   public function reset($name = NULL) {
     if ($name) {
       // Clear all cached configuration for this name.
-      foreach ($this->getCacheKeys($name) as $cache_key) {
+      foreach ($this->getConfigCacheKeys($name) as $cache_key) {
         unset($this->cache[$cache_key]);
       }
     }
@@ -226,7 +226,7 @@ public function reset($name = NULL) {
    */
   public function rename($old_name, $new_name) {
     $this->storage->rename($old_name, $new_name);
-    $old_cache_key = $this->getCacheKey($old_name);
+    $old_cache_key = $this->getConfigCacheKey($old_name);
     if (isset($this->cache[$old_cache_key])) {
       unset($this->cache[$old_cache_key]);
     }
@@ -240,23 +240,42 @@ public function rename($old_name, $new_name) {
   /**
    * {@inheritdoc}
    */
-  public function getCacheKey($name) {
+  public function getCacheKeys() {
+    $keys = array();
     if ($this->useOverrides) {
-      $cache_key = $name . ':overrides';
+      // Because get() adds overrides both from $GLOBALS and from
+      // $this->configFactoryOverrides, add cache keys for each.
+      $keys[] = 'global_overrides';
       foreach($this->configFactoryOverrides as $override) {
-        $cache_key =  $cache_key . ':' . $override->getCacheSuffix();
+        $keys[] =  $override->getCacheSuffix();
       }
     }
-    else {
-      $cache_key = $name . ':raw';
-    }
-    return $cache_key;
+    return $keys;
   }
 
   /**
-   * {@inheritdoc}
+   * Gets the cache key for a given config name.
+   *
+   * @param string $name
+   *   The name of the configuration object.
+   *
+   * @return string
+   *   The cache key.
+   */
+  protected function getConfigCacheKey($name) {
+    return $name . ':' . implode(':', $this->getCacheKeys());
+  }
+
+  /**
+   * Gets all the cache keys that match the provided config name.
+   *
+   * @param string $name
+   *   The name of the configuration object.
+   *
+   * @return array
+   *   An array of cache keys that match the provided config name.
    */
-  public function getCacheKeys($name) {
+  protected function getConfigCacheKeys($name) {
     return array_filter(array_keys($this->cache), function($key) use ($name) {
       // Return TRUE if the key starts with the configuration name.
       return strpos($key, $name . ':') === 0;
@@ -289,7 +308,7 @@ public function onConfigSave(ConfigCrudEvent $event) {
     // replacing the data on any entries for the configuration object apart
     // from the one that references the actual config object being saved.
     $saved_config = $event->getConfig();
-    foreach ($this->getCacheKeys($saved_config->getName()) as $cache_key) {
+    foreach ($this->getConfigCacheKeys($saved_config->getName()) as $cache_key) {
       $cached_config = $this->cache[$cache_key];
       if ($cached_config !== $saved_config) {
         $this->cache[$cache_key]->setData($saved_config->getRawData());
diff --git a/core/lib/Drupal/Core/Config/ConfigFactoryInterface.php b/core/lib/Drupal/Core/Config/ConfigFactoryInterface.php
index 84954f7..4166ff7 100644
--- a/core/lib/Drupal/Core/Config/ConfigFactoryInterface.php
+++ b/core/lib/Drupal/Core/Config/ConfigFactoryInterface.php
@@ -7,8 +7,6 @@
 
 namespace Drupal\Core\Config;
 
-use Drupal\Core\Language\LanguageDefault;
-
 /**
  * Defines the interface for a configuration object factory.
  */
@@ -82,26 +80,18 @@ public function reset($name = NULL);
   public function rename($old_name, $new_name);
 
   /**
-   * Gets the cache key for a given config name.
-   *
-   * @param string $name
-   *   The name of the configuration object.
-   *
-   * @return string
-   *   The cache key.
-   */
-  public function getCacheKey($name);
-
-  /**
-   * Gets all the cache keys that match the provided config name.
+   * The cache keys associated with the state of the config factory.
    *
-   * @param string $name
-   *   The name of the configuration object.
+   * All state information that can influence the result of a get() should be
+   * included. Typically, this includes a key for each override added via
+   * addOverride(). This allows external code to maintain caches of
+   * configuration data in addition to or instead of caches maintained by the
+   * factory.
    *
    * @return array
-   *   An array of cache keys that match the provided config name.
+   *   An array of strings, used to generate a cache ID.
    */
-  public function getCacheKeys($name);
+  public function getCacheKeys();
 
   /**
    * Clears the config factory static cache.
diff --git a/core/lib/Drupal/Core/Entity/EntityInterface.php b/core/lib/Drupal/Core/Entity/EntityInterface.php
index c6054a3..4399d01 100644
--- a/core/lib/Drupal/Core/Entity/EntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityInterface.php
@@ -103,9 +103,9 @@ public function label();
    * example:
    * @code
    * links = {
-   *   "canonical" = "node.view",
-   *   "edit-form" = "node.page_edit",
-   *   "version-history" = "node.revision_overview"
+   *   "canonical" = "entity.node.canonical",
+   *   "edit-form" = "entity.node.edit_form",
+   *   "version-history" = "entity.node.version_history"
    * }
    * @endcode
    * or specified in a callback function set like:
diff --git a/core/lib/Drupal/Core/Entity/EntityType.php b/core/lib/Drupal/Core/Entity/EntityType.php
index aa78adb..9e607d8 100644
--- a/core/lib/Drupal/Core/Entity/EntityType.php
+++ b/core/lib/Drupal/Core/Entity/EntityType.php
@@ -26,21 +26,21 @@ class EntityType implements EntityTypeInterface {
    *
    * @var bool
    */
-  protected $static_cache;
+  protected $static_cache = TRUE;
 
   /**
    * Indicates whether the rendered output of entities should be cached.
    *
    * @var bool
    */
-  protected $render_cache;
+  protected $render_cache = TRUE;
 
   /**
    * Indicates if the persistent cache of field data should be used.
    *
    * @var bool
    */
-  protected $persistent_cache;
+  protected $persistent_cache = TRUE;
 
   /**
    * An array of entity keys.
@@ -96,18 +96,18 @@ class EntityType implements EntityTypeInterface {
   /**
    * The permission granularity level.
    *
-   * The allowed values are respectively "entity_type", "bundle" or FALSE.
+   * The allowed values are respectively "entity_type" or "bundle".
    *
-   * @var string|bool
+   * @var string
    */
-  protected $permission_granularity;
+  protected $permission_granularity = 'entity_type';
 
   /**
    * Indicates whether fields can be attached to entities of this type.
    *
-   * @var bool (optional)
+   * @var bool
    */
-  protected $fieldable;
+  protected $fieldable = FALSE;
 
   /**
    * Link templates using the URI template syntax.
@@ -119,58 +119,58 @@ class EntityType implements EntityTypeInterface {
   /**
    * The name of a callback that returns the label of the entity.
    *
-   * @var string
+   * @var string|null
    */
-  protected $label_callback;
+  protected $label_callback = NULL;
 
   /**
    * The name of the entity type which provides bundles.
    *
    * @var string
    */
-  protected $bundle_entity_type;
+  protected $bundle_entity_type = 'bundle';
 
   /**
    * The name of the entity type for which bundles are provided.
    *
-   * @var string
+   * @var string|null
    */
-  protected $bundle_of;
+  protected $bundle_of = NULL;
 
   /**
    * The human-readable name of the entity bundles, e.g. Vocabulary.
    *
-   * @var string
+   * @var string|null
    */
-  protected $bundle_label;
+  protected $bundle_label = NULL;
 
   /**
    * The name of the entity type's base table.
    *
-   * @var string
+   * @var string|null
    */
-  protected $base_table;
+  protected $base_table = NULL;
 
   /**
    * The name of the entity type's revision data table.
    *
-   * @var string
+   * @var string|null
    */
-  protected $revision_data_table;
+  protected $revision_data_table = NULL;
 
   /**
    * The name of the entity type's revision table.
    *
-   * @var string
+   * @var string|null
    */
-  protected $revision_table;
+  protected $revision_table = NULL;
 
   /**
    * The name of the entity type's data table.
    *
-   * @var string
+   * @var string|null
    */
-  protected $data_table;
+  protected $data_table = NULL;
 
   /**
    * Indicates whether entities of this type have multilingual support.
@@ -184,14 +184,14 @@ class EntityType implements EntityTypeInterface {
    *
    * @var string
    */
-  protected $label;
+  protected $label = '';
 
   /**
    * A callable that can be used to provide the entity URI.
    *
-   * @var callable
+   * @var callable|null
    */
-  protected $uri_callback;
+  protected $uri_callback = NULL;
 
   /**
    * The machine name of the entity type group.
@@ -256,21 +256,21 @@ public function set($property, $value) {
    * {@inheritdoc}
    */
   public function isStaticallyCacheable() {
-    return isset($this->static_cache) ? $this->static_cache: TRUE;
+    return $this->static_cache;
   }
 
   /**
    * {@inheritdoc}
    */
   public function isRenderCacheable() {
-    return isset($this->render_cache) ? $this->render_cache: TRUE;
+    return $this->render_cache;
   }
 
   /**
    * {@inheritdoc}
    */
   public function isPersistentlyCacheable() {
-    return isset($this->persistent_cache) ? $this->persistent_cache: TRUE;
+    return $this->persistent_cache;
   }
 
   /**
@@ -490,21 +490,21 @@ public function getAdminPermission() {
    * {@inheritdoc}
    */
   public function getPermissionGranularity() {
-    return isset($this->permission_granularity) ? $this->permission_granularity : 'entity_type';
+    return $this->permission_granularity;
   }
 
   /**
    * {@inheritdoc}
    */
   public function isFieldable() {
-    return isset($this->fieldable) ? $this->fieldable : FALSE;
+    return $this->fieldable;
   }
 
   /**
    * {@inheritdoc}
    */
   public function getLinkTemplates() {
-    return isset($this->links) ? $this->links : array();
+    return $this->links;
   }
 
   /**
@@ -535,7 +535,7 @@ public function setLinkTemplate($key, $route_name) {
    * {@inheritdoc}
    */
   public function getLabelCallback() {
-    return isset($this->label_callback) ? $this->label_callback : FALSE;
+    return $this->label_callback;
   }
 
   /**
@@ -557,28 +557,28 @@ public function hasLabelCallback() {
    * {@inheritdoc}
    */
   public function getBundleEntityType() {
-    return isset($this->bundle_entity_type) ? $this->bundle_entity_type : 'bundle';
+    return $this->bundle_entity_type;
   }
 
   /**
    * {@inheritdoc}
    */
   public function getBundleOf() {
-    return isset($this->bundle_of) ? $this->bundle_of : FALSE;
+    return $this->bundle_of;
   }
 
   /**
    * {@inheritdoc}
    */
   public function getBundleLabel() {
-    return isset($this->bundle_label) ? $this->bundle_label : FALSE;
+    return $this->bundle_label;
   }
 
   /**
    * {@inheritdoc}
    */
   public function getBaseTable() {
-    return isset($this->base_table) ? $this->base_table : FALSE;
+    return $this->base_table;
   }
 
   /**
@@ -607,28 +607,28 @@ public function getConfigPrefix() {
    * {@inheritdoc}
    */
   public function getRevisionDataTable() {
-    return isset($this->revision_data_table) ? $this->revision_data_table : FALSE;
+    return $this->revision_data_table;
   }
 
   /**
    * {@inheritdoc}
    */
   public function getRevisionTable() {
-    return isset($this->revision_table) ? $this->revision_table : FALSE;
+    return $this->revision_table;
   }
 
   /**
    * {@inheritdoc}
    */
   public function getDataTable() {
-    return isset($this->data_table) ? $this->data_table : FALSE;
+    return $this->data_table;
   }
 
   /**
    * {@inheritdoc}
    */
   public function getLabel() {
-    return isset($this->label) ? $this->label : '';
+    return $this->label;
   }
 
   /**
@@ -642,7 +642,7 @@ public function getLowercaseLabel() {
    * {@inheritdoc}
    */
   public function getUriCallback() {
-    return isset($this->uri_callback) ? $this->uri_callback : FALSE;
+    return $this->uri_callback;
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
index af4bc13..e655df7 100644
--- a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
@@ -387,12 +387,11 @@ public function getAdminPermission();
   /**
    * Returns the permission granularity level.
    *
-   * The allowed values are respectively "entity_type", "bundle" or FALSE.
+   * The allowed values are respectively "entity_type" or "bundle".
    *
-   * @return string|bool
+   * @return string
    *   Whether a module exposing permissions for the current entity type
-   *   should use entity-type level granularity, bundle level granularity or
-   *   just skip this entity.
+   *   should use entity-type level granularity or bundle level granularity.
    */
   public function getPermissionGranularity();
 
@@ -483,8 +482,8 @@ public function setLinkTemplate($key, $route_name);
    * \Drupal\Core\Entity\EntityInterface::label() method, which implements this
    * logic.
    *
-   * @return callable|bool
-   *   The callback, or FALSE if none exists.
+   * @return callable|null
+   *   The callback, or NULL if none exists.
    */
   public function getLabelCallback();
 
@@ -519,8 +518,8 @@ public function getBundleEntityType();
    * the Field UI module uses it to add operation links to manage fields and
    * displays.
    *
-   * @return string|bool
-   *   The entity type for which this entity provides bundles, or FALSE if does
+   * @return string|null
+   *   The entity type for which this entity provides bundles, or NULL if does
    *   not provide bundles for another entity type.
    */
   public function getBundleOf();
@@ -528,8 +527,8 @@ public function getBundleOf();
   /**
    * Returns the label for the bundle.
    *
-   * @return string|bool
-   *   The bundle label, or FALSE if none exists.
+   * @return string|null
+   *   The bundle label, or NULL if none exists.
    */
   public function getBundleLabel();
 
@@ -538,8 +537,8 @@ public function getBundleLabel();
    *
    * @todo Used by ContentEntityDatabaseStorage only.
    *
-   * @return string|bool
-   *   The name of the entity's base table, or FALSE if none exists.
+   * @return string|null
+   *   The name of the entity's base table, or NULL if none exists.
    */
   public function getBaseTable();
 
@@ -575,8 +574,9 @@ public function getConfigPrefix();
    *
    * @todo Used by ContentEntityDatabaseStorage only.
    *
-   * @return string|bool
-   *   The name of the entity type's revision data table.
+   * @return string|null
+   *   The name of the entity type's revision data table, or NULL if none
+   *   exists.
    */
   public function getRevisionDataTable();
 
@@ -585,8 +585,8 @@ public function getRevisionDataTable();
    *
    * @todo Used by ContentEntityDatabaseStorage only.
    *
-   * @return string|bool
-   *   The name of the entity type's revision table.
+   * @return string|null
+   *   The name of the entity type's revision table, or NULL if none exists.
    */
   public function getRevisionTable();
 
@@ -595,8 +595,8 @@ public function getRevisionTable();
    *
    * @todo Used by ContentEntityDatabaseStorage only.
    *
-   * @return string|bool
-   *   The name of the entity type's data table.
+   * @return string|null
+   *   The name of the entity type's data table, or NULL if none exists.
    */
   public function getDataTable();
 
@@ -622,8 +622,8 @@ public function getLowercaseLabel();
    * This is only called if there is no matching link template for the link
    * relationship type, and there is no bundle-specific callback provided.
    *
-   * @return callable|bool
-   *   A valid callback that is passed the entity or FALSE if none is specified.
+   * @return callable|null
+   *   A valid callback that is passed the entity or NULL if none is specified.
    */
   public function getUriCallback();
 
diff --git a/core/lib/Drupal/Core/Field/FormatterPluginManager.php b/core/lib/Drupal/Core/Field/FormatterPluginManager.php
index e8bba9c..5d5cea2 100644
--- a/core/lib/Drupal/Core/Field/FormatterPluginManager.php
+++ b/core/lib/Drupal/Core/Field/FormatterPluginManager.php
@@ -112,10 +112,11 @@ public function getInstance(array $options) {
     $plugin_id = $configuration['type'];
 
     // Switch back to default formatter if either:
-    // - $type_info doesn't exist (the widget type is unknown),
-    // - the field type is not allowed for the widget.
+    // - the configuration does not specify a formatter class
+    // - the field type is not allowed for the formatter
+    // - the formatter is not applicable to the field definition.
     $definition = $this->getDefinition($configuration['type'], FALSE);
-    if (!isset($definition['class']) || !in_array($field_type, $definition['field_types'])) {
+    if (!isset($definition['class']) || !in_array($field_type, $definition['field_types']) || !$definition['class']::isApplicable($field_definition)) {
       // Grab the default widget for the field type.
       $field_type_definition = $this->fieldTypeManager->getDefinition($field_type);
       if (empty($field_type_definition['default_formatter'])) {
diff --git a/core/lib/Drupal/Core/Field/WidgetPluginManager.php b/core/lib/Drupal/Core/Field/WidgetPluginManager.php
index 2a0145f..207b5e3 100644
--- a/core/lib/Drupal/Core/Field/WidgetPluginManager.php
+++ b/core/lib/Drupal/Core/Field/WidgetPluginManager.php
@@ -98,10 +98,11 @@ public function getInstance(array $options) {
     $plugin_id = $configuration['type'];
 
     // Switch back to default widget if either:
-    // - $type_info doesn't exist (the widget type is unknown),
-    // - the field type is not allowed for the widget.
+    // - the configuration does not specify a widget class
+    // - the field type is not allowed for the widget
+    // - the widget is not applicable to the field definition.
     $definition = $this->getDefinition($configuration['type'], FALSE);
-    if (!isset($definition['class']) || !in_array($field_type, $definition['field_types'])) {
+    if (!isset($definition['class']) || !in_array($field_type, $definition['field_types']) || !$definition['class']::isApplicable($field_definition)) {
       // Grab the default widget for the field type.
       $field_type_definition = $this->fieldTypeManager->getDefinition($field_type);
       if (empty($field_type_definition['default_widget'])) {
diff --git a/core/lib/Drupal/Core/Form/FormBuilder.php b/core/lib/Drupal/Core/Form/FormBuilder.php
index adbb8f3..d4170a4 100644
--- a/core/lib/Drupal/Core/Form/FormBuilder.php
+++ b/core/lib/Drupal/Core/Form/FormBuilder.php
@@ -938,7 +938,14 @@ protected function handleInputElement($form_id, &$element, FormStateInterface &$
 
     // Set the element's #value property.
     if (!isset($element['#value']) && !array_key_exists('#value', $element)) {
+      // @todo Once all elements are converted to plugins in
+      //   https://www.drupal.org/node/2311393, rely on
+      //   $element['#value_callback'] directly.
       $value_callable = !empty($element['#value_callback']) ? $element['#value_callback'] : 'form_type_' . $element['#type'] . '_value';
+      if (!is_callable($value_callable)) {
+        $value_callable = '\Drupal\Core\Render\Element\FormElement::valueCallback';
+      }
+
       if ($process_input) {
         // Get the input for the current element. NULL values in the input need
         // to be explicitly distinguished from missing input. (see below)
@@ -962,9 +969,8 @@ protected function handleInputElement($form_id, &$element, FormStateInterface &$
         // If we have input for the current element, assign it to the #value
         // property, optionally filtered through $value_callback.
         if ($input_exists) {
-          if (is_callable($value_callable)) {
-            $element['#value'] = call_user_func_array($value_callable, array(&$element, $input, &$form_state));
-          }
+          $element['#value'] = call_user_func_array($value_callable, array(&$element, $input, &$form_state));
+
           if (!isset($element['#value']) && isset($input)) {
             $element['#value'] = $input;
           }
@@ -978,9 +984,8 @@ protected function handleInputElement($form_id, &$element, FormStateInterface &$
       if (!isset($element['#value'])) {
         // Call #type_value without a second argument to request default_value
         // handling.
-        if (is_callable($value_callable)) {
-          $element['#value'] = call_user_func_array($value_callable, array(&$element, FALSE, &$form_state));
-        }
+        $element['#value'] = call_user_func_array($value_callable, array(&$element, FALSE, &$form_state));
+
         // Final catch. If we haven't set a value yet, use the explicit default
         // value. Avoid image buttons (which come with garbage value), so we
         // only get value for the button actually clicked.
diff --git a/core/lib/Drupal/Core/Form/FormSubmitterInterface.php b/core/lib/Drupal/Core/Form/FormSubmitterInterface.php
index 15ce4d2..af9b3db 100644
--- a/core/lib/Drupal/Core/Form/FormSubmitterInterface.php
+++ b/core/lib/Drupal/Core/Form/FormSubmitterInterface.php
@@ -59,7 +59,7 @@ public function executeSubmitHandlers(&$form, FormStateInterface &$form_state);
    * @endcode
    * And here is an example of how to redirect to 'node/123?foo=bar#baz':
    * @code
-   * $form_state->setRedirect('node.view',
+   * $form_state->setRedirect('entity.node.canonical',
    *   array('node' => 123),
    *   array(
    *     'query' => array(
diff --git a/core/lib/Drupal/Core/Menu/Form/MenuLinkDefaultForm.php b/core/lib/Drupal/Core/Menu/Form/MenuLinkDefaultForm.php
index 865195d..f6ee14b 100644
--- a/core/lib/Drupal/Core/Menu/Form/MenuLinkDefaultForm.php
+++ b/core/lib/Drupal/Core/Menu/Form/MenuLinkDefaultForm.php
@@ -124,7 +124,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
       '#type' => 'checkbox',
       '#title' => $this->t('Enable menu link'),
       '#description' => $this->t('Menu links that are not enabled will not be listed in any menu.'),
-      '#default_value' => !$this->menuLink->isHidden(),
+      '#default_value' => $this->menuLink->isEnabled(),
     );
 
     $form['expanded'] = array(
@@ -158,7 +158,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
    */
   public function extractFormValues(array &$form, FormStateInterface $form_state) {
     $new_definition = array();
-    $new_definition['hidden'] = $form_state->getValue('enabled') ? 0 : 1;
+    $new_definition['enabled'] = $form_state->getValue('enabled') ? 1 : 0;
     $new_definition['weight'] = (int) $form_state->getValue('weight');
     $new_definition['expanded'] = $form_state->getValue('expanded') ? 1 : 0;
     list($menu_name, $parent) = explode(':', $form_state->getValue('menu_parent'), 2);
diff --git a/core/lib/Drupal/Core/Menu/MenuLinkBase.php b/core/lib/Drupal/Core/Menu/MenuLinkBase.php
index 125bbf0..9636c72 100644
--- a/core/lib/Drupal/Core/Menu/MenuLinkBase.php
+++ b/core/lib/Drupal/Core/Menu/MenuLinkBase.php
@@ -61,8 +61,8 @@ public function getParent() {
   /**
    * {@inheritdoc}
    */
-  public function isHidden() {
-    return (bool) $this->pluginDefinition['hidden'];
+  public function isEnabled() {
+    return (bool) $this->pluginDefinition['enabled'];
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Menu/MenuLinkDefault.php b/core/lib/Drupal/Core/Menu/MenuLinkDefault.php
index 5d0f8e2..c224142 100644
--- a/core/lib/Drupal/Core/Menu/MenuLinkDefault.php
+++ b/core/lib/Drupal/Core/Menu/MenuLinkDefault.php
@@ -23,7 +23,7 @@ class MenuLinkDefault extends MenuLinkBase implements ContainerFactoryPluginInte
     'parent' => 1,
     'weight' => 1,
     'expanded' => 1,
-    'hidden' => 1,
+    'enabled' => 1,
   );
 
   /**
diff --git a/core/lib/Drupal/Core/Menu/MenuLinkInterface.php b/core/lib/Drupal/Core/Menu/MenuLinkInterface.php
index 811dbf0..2738f27 100644
--- a/core/lib/Drupal/Core/Menu/MenuLinkInterface.php
+++ b/core/lib/Drupal/Core/Menu/MenuLinkInterface.php
@@ -64,12 +64,12 @@ public function getProvider();
   public function getParent();
 
   /**
-   * Returns whether the menu link is hidden.
+   * Returns whether the menu link is enabled (not hidden).
    *
    * @return bool
-   *   TRUE for hidden, FALSE otherwise.
+   *   TRUE for enabled, FALSE otherwise.
    */
-  public function isHidden();
+  public function isEnabled();
 
   /**
    * Returns whether the child menu links should always been shown.
diff --git a/core/lib/Drupal/Core/Menu/MenuLinkManager.php b/core/lib/Drupal/Core/Menu/MenuLinkManager.php
index 1aa0070..a8e73e8 100644
--- a/core/lib/Drupal/Core/Menu/MenuLinkManager.php
+++ b/core/lib/Drupal/Core/Menu/MenuLinkManager.php
@@ -58,7 +58,7 @@ class MenuLinkManager implements MenuLinkManagerInterface {
     // The default link options.
     'options' => array(),
     'expanded' => 0,
-    'hidden' => 0,
+    'enabled' => 1,
     // The name of the module providing this link.
     'provider' => '',
     'metadata' => array(),
diff --git a/core/lib/Drupal/Core/Menu/MenuLinkTree.php b/core/lib/Drupal/Core/Menu/MenuLinkTree.php
index e5d54fe..ddf924c 100644
--- a/core/lib/Drupal/Core/Menu/MenuLinkTree.php
+++ b/core/lib/Drupal/Core/Menu/MenuLinkTree.php
@@ -205,7 +205,7 @@ public function build(array $tree) {
       /** @var \Drupal\Core\Menu\MenuLinkInterface $link */
       $link = $data->link;
       // Generally we only deal with visible links, but just in case.
-      if ($link->isHidden()) {
+      if (!$link->isEnabled()) {
         continue;
       }
       // Set a class for the <li>-tag. Only set 'expanded' class if the link
diff --git a/core/lib/Drupal/Core/Menu/MenuParentFormSelector.php b/core/lib/Drupal/Core/Menu/MenuParentFormSelector.php
index 4164379..e57b7e8 100644
--- a/core/lib/Drupal/Core/Menu/MenuParentFormSelector.php
+++ b/core/lib/Drupal/Core/Menu/MenuParentFormSelector.php
@@ -143,7 +143,7 @@ protected function parentSelectOptionsTreeWalk(array $tree, $menu_name, $indent,
       $link = $element->link;
       if ($link->getPluginId() != $exclude) {
         $title = $indent . ' ' . Unicode::truncate($link->getTitle(), 30, TRUE, FALSE);
-        if ($link->isHidden()) {
+        if (!$link->isEnabled()) {
           $title .= ' (' . $this->t('disabled') . ')';
         }
         $options[$menu_name . ':' . $link->getPluginId()] = $title;
diff --git a/core/lib/Drupal/Core/Menu/MenuTreeParameters.php b/core/lib/Drupal/Core/Menu/MenuTreeParameters.php
index c18ebb1..80383be 100644
--- a/core/lib/Drupal/Core/Menu/MenuTreeParameters.php
+++ b/core/lib/Drupal/Core/Menu/MenuTreeParameters.php
@@ -184,12 +184,12 @@ public function addCondition($definition_field, $value, $operator = NULL) {
   }
 
   /**
-   * Excludes hidden links.
+   * Excludes links that are not enabled.
    *
    * @return $this
    */
-  public function excludeHiddenLinks() {
-    $this->addCondition('hidden', 0);
+  public function onlyEnabledLinks() {
+    $this->addCondition('enabled', 1);
     return $this;
   }
 
diff --git a/core/lib/Drupal/Core/Menu/MenuTreeStorage.php b/core/lib/Drupal/Core/Menu/MenuTreeStorage.php
index 2f127ef..92775b4 100644
--- a/core/lib/Drupal/Core/Menu/MenuTreeStorage.php
+++ b/core/lib/Drupal/Core/Menu/MenuTreeStorage.php
@@ -94,7 +94,7 @@ class MenuTreeStorage implements MenuTreeStorageInterface {
     'weight',
     'options',
     'expanded',
-    'hidden',
+    'enabled',
     'provider',
     'metadata',
     'class',
@@ -384,7 +384,7 @@ protected function preSave(array &$link, array $original) {
     // and fill parents based on the parent link.
     else {
       // @todo We want to also check $original['has_children'] here, but that
-      //   will be 0 even if there are children if those are hidden.
+      //   will be 0 even if there are children if those are not enabled.
       //   has_children is really just the rendering hint. So, we either need
       //   to define another column (has_any_children), or do the extra query.
       //   https://www.drupal.org/node/2302149
@@ -409,7 +409,7 @@ protected function preSave(array &$link, array $original) {
     unset($fields['mlid']);
 
     // Cast Booleans to int, if needed.
-    $fields['hidden'] = (int) $fields['hidden'];
+    $fields['enabled'] = (int) $fields['enabled'];
     $fields['expanded'] = (int) $fields['expanded'];
     return $fields;
   }
@@ -599,7 +599,7 @@ protected function updateParentalStatus(array $link) {
       $query
         ->condition('menu_name', $link['menu_name'])
         ->condition('parent', $link['parent'])
-        ->condition('hidden', 0);
+        ->condition('enabled', 1);
 
       $parent_has_children = ((bool) $query->execute()->fetchField()) ? 1 : 0;
       $this->connection->update($this->table, $this->options)
@@ -781,7 +781,7 @@ public function getExpanded($menu_name, array $parents) {
       $query->condition('menu_name', $menu_name);
       $query->condition('expanded', 1);
       $query->condition('has_children', 1);
-      $query->condition('hidden', 0);
+      $query->condition('enabled', 1);
       $query->condition('parent', $parents, 'IN');
       $query->condition('id', $parents, 'NOT IN');
       $result = $this->safeExecuteSelect($query)->fetchAllKeyed(0, 0);
@@ -997,7 +997,7 @@ public function loadSubtreeData($id, $max_relative_depth = NULL) {
       return $tree;
     }
     $parameters = new MenuTreeParameters();
-    $parameters->setRoot($id)->excludeHiddenLinks();
+    $parameters->setRoot($id)->onlyEnabledLinks();
     return $this->loadTreeData($root['menu_name'], $parameters);
   }
 
@@ -1057,7 +1057,7 @@ public function getAllChildIds($id) {
    */
   public function loadAllChildren($id, $max_relative_depth = NULL) {
     $parameters = new MenuTreeParameters();
-    $parameters->setRoot($id)->excludeRoot()->setMaxDepth($max_relative_depth)->excludeHiddenLinks();
+    $parameters->setRoot($id)->excludeRoot()->setMaxDepth($max_relative_depth)->onlyEnabledLinks();
     $links = $this->loadLinks(NULL, $parameters);
     foreach ($links as $id => $link) {
       $links[$id] = $this->prepareLink($link);
@@ -1289,11 +1289,11 @@ protected static function schemaDefinition() {
           'not null' => TRUE,
           'default' => 'system',
         ),
-        'hidden' => array(
-          'description' => 'A flag for whether the link should be rendered in menus. (1 = a disabled menu item that may be shown on admin screens, 0 = a normal, visible link)',
+        'enabled' => array(
+          'description' => 'A flag for whether the link should be rendered in menus. (0 = a disabled menu item that may be shown on admin screens, 1 = a normal, visible link)',
           'type' => 'int',
           'not null' => TRUE,
-          'default' => 0,
+          'default' => 1,
           'size' => 'small',
         ),
         'discovered' => array(
@@ -1324,7 +1324,7 @@ protected static function schemaDefinition() {
           'serialize' => TRUE,
         ),
         'has_children' => array(
-          'description' => 'Flag indicating whether any non-hidden links have this link as a parent (1 = children exist, 0 = no children).',
+          'description' => 'Flag indicating whether any enabled links have this link as a parent (1 = enabled children exist, 0 = no enabled children).',
           'type' => 'int',
           'not null' => TRUE,
           'default' => 0,
diff --git a/core/lib/Drupal/Core/Menu/MenuTreeStorageInterface.php b/core/lib/Drupal/Core/Menu/MenuTreeStorageInterface.php
index 78028e1..9b7883c 100644
--- a/core/lib/Drupal/Core/Menu/MenuTreeStorageInterface.php
+++ b/core/lib/Drupal/Core/Menu/MenuTreeStorageInterface.php
@@ -149,11 +149,11 @@ public function delete($id);
   public function loadTreeData($menu_name, MenuTreeParameters $parameters);
 
   /**
-   * Loads all the visible menu links that are below the given ID.
+   * Loads all the enabled menu links that are below the given ID.
    *
    * The returned links are not ordered, and visible children will be included
-   * even if they have a hidden parent or ancestor so would not normally appear
-   * in a rendered tree.
+   * even if they have parent that is not enabled or ancestor so would not
+   * normally appear in a rendered tree.
    *
    * @param string $id
    *   The parent menu link ID.
@@ -161,7 +161,7 @@ public function loadTreeData($menu_name, MenuTreeParameters $parameters);
    *   The maximum relative depth of the children relative to the passed parent.
    *
    * @return array
-   *   An array of visible (not hidden) link definitions, keyed by ID.
+   *   An array of enabled link definitions, keyed by ID.
    */
   public function loadAllChildren($id, $max_relative_depth = NULL);
 
diff --git a/core/lib/Drupal/Core/Menu/StaticMenuLinkOverrides.php b/core/lib/Drupal/Core/Menu/StaticMenuLinkOverrides.php
index 8b79bff..ebde906 100644
--- a/core/lib/Drupal/Core/Menu/StaticMenuLinkOverrides.php
+++ b/core/lib/Drupal/Core/Menu/StaticMenuLinkOverrides.php
@@ -129,7 +129,7 @@ public function saveOverride($id, array $definition) {
       'parent' => 1,
       'weight' => 1,
       'expanded' => 1,
-      'hidden' => 1,
+      'enabled' => 1,
     );
     // Filter the overrides to only those that are expected.
     $definition = array_intersect_key($definition, $expected);
diff --git a/core/lib/Drupal/Core/Menu/StaticMenuLinkOverridesInterface.php b/core/lib/Drupal/Core/Menu/StaticMenuLinkOverridesInterface.php
index 0ffb21a..43c4416 100644
--- a/core/lib/Drupal/Core/Menu/StaticMenuLinkOverridesInterface.php
+++ b/core/lib/Drupal/Core/Menu/StaticMenuLinkOverridesInterface.php
@@ -32,7 +32,7 @@ public function reload();
    *     - weight
    *     - menu_name
    *     - expanded
-   *     - hidden
+   *     - enabled
    *   or NULL if there is no override for the given ID.
    */
   public function loadOverride($id);
@@ -77,7 +77,7 @@ public function loadMultipleOverrides(array $ids);
    *   - parent
    *   - weight
    *   - expanded
-   *   - hidden
+   *   - enabled
    *
    * @return array
    *   A list of properties which got saved.
diff --git a/core/lib/Drupal/Core/Render/Annotation/FormElement.php b/core/lib/Drupal/Core/Render/Annotation/FormElement.php
new file mode 100644
index 0000000..4d4b593
--- /dev/null
+++ b/core/lib/Drupal/Core/Render/Annotation/FormElement.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Render\Annotation\FormElement.
+ */
+
+namespace Drupal\Core\Render\Annotation;
+
+/**
+ * Defines a form element plugin annotation object.
+ *
+ * See \Drupal\Core\Render\Element\FormElementInterface for more information
+ * about form element plugins.
+ *
+ * Plugin Namespace: Element
+ *
+ * For a working example, see \Drupal\Core\Render\Element\Textfield.
+ *
+ * @see \Drupal\Core\Render\ElementInfoManager
+ * @see \Drupal\Core\Render\Element\FormElementInterface
+ * @see \Drupal\Core\Render\Element\FormElement
+ * @see \Drupal\Core\Render\Annotation\RenderElement
+ * @see plugin_api
+ *
+ * @ingroup theme_render
+ *
+ * @Annotation
+ */
+class FormElement extends RenderElement {
+
+}
diff --git a/core/lib/Drupal/Core/Render/Annotation/RenderElement.php b/core/lib/Drupal/Core/Render/Annotation/RenderElement.php
new file mode 100644
index 0000000..fc36b32
--- /dev/null
+++ b/core/lib/Drupal/Core/Render/Annotation/RenderElement.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Render\Annotation\RenderElement.
+ */
+
+namespace Drupal\Core\Render\Annotation;
+
+use Drupal\Component\Annotation\PluginID;
+
+/**
+ * Defines a render element plugin annotation object.
+ *
+ * See \Drupal\Core\Render\Element\ElementInterface for more information
+ * about render element plugins.
+ *
+ * Plugin Namespace: Element
+ *
+ * For a working example, see \Drupal\Core\Render\Element\Link.
+ *
+ * @see \Drupal\Core\Render\ElementInfoManager
+ * @see \Drupal\Core\Render\Element\ElementInterface
+ * @see \Drupal\Core\Render\Element\RenderElement
+ * @see \Drupal\Core\Render\Annotation\FormElement
+ * @see plugin_api
+ *
+ * @ingroup theme_render
+ *
+ * @Annotation
+ */
+class RenderElement extends PluginID {
+
+}
diff --git a/core/lib/Drupal/Core/Render/Element.php b/core/lib/Drupal/Core/Render/Element.php
index 501f2de..eed5c30 100644
--- a/core/lib/Drupal/Core/Render/Element.php
+++ b/core/lib/Drupal/Core/Render/Element.php
@@ -10,7 +10,11 @@
 use Drupal\Component\Utility\String;
 
 /**
- * Deals with drupal render elements.
+ * Provides helper methods for Drupal render elements.
+ *
+ * @see \Drupal\Core\Render\Element\ElementInterface
+ *
+ * @ingroup theme_render
  */
 class Element {
 
@@ -47,7 +51,7 @@ public static function properties(array $element) {
    *   The key to check.
    *
    * @return bool
-   *    TRUE if the element is a child, FALSE otherwise.
+   *   TRUE if the element is a child, FALSE otherwise.
    */
   public static function child($key) {
     return !isset($key[0]) || $key[0] != '#';
@@ -143,11 +147,11 @@ public static function getVisibleChildren(array $elements) {
    * @param array $element
    *   The renderable element to process. Passed by reference.
    * @param array $map
-   *   An associative array whose keys are element property names and whose values
-   *   are the HTML attribute names to set for corresponding the property; e.g.,
-   *   array('#propertyname' => 'attributename'). If both names are identical
-   *   except for the leading '#', then an attribute name value is sufficient and
-   *   no property name needs to be specified.
+   *   An associative array whose keys are element property names and whose
+   *   values are the HTML attribute names to set on the corresponding
+   *   property; e.g., array('#propertyname' => 'attributename'). If both names
+   *   are identical except for the leading '#', then an attribute name value is
+   *   sufficient and no property name needs to be specified.
    */
   public static function setAttributes(array &$element, array $map) {
     foreach ($map as $property => $attribute) {
diff --git a/core/lib/Drupal/Core/Render/Element/ElementInterface.php b/core/lib/Drupal/Core/Render/Element/ElementInterface.php
new file mode 100644
index 0000000..a1035f7
--- /dev/null
+++ b/core/lib/Drupal/Core/Render/Element/ElementInterface.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Render\Element\ElementInterface.
+ */
+
+namespace Drupal\Core\Render\Element;
+
+use Drupal\Component\Plugin\PluginInspectionInterface;
+
+/**
+ * Provides an interface for element plugins.
+ *
+ * Render element plugins allow modules to declare their own Render API element
+ * types and specify the default values for the properties. The values returned
+ * by the getInfo() method of the element plugin will be merged with the
+ * properties specified in render arrays. Thus, you can specify defaults for any
+ * Render API keys, in addition to those explicitly documented by
+ * \Drupal\Core\Render\ElementInfoManagerInterface::getInfo().
+ *
+ * Some render elements are specifically form input elements; see
+ * \Drupal\Core\Render\Element\FormElementInterface for more information.
+ *
+ * @see \Drupal\Core\Render\ElementInfoManager
+ * @see \Drupal\Core\Render\Annotation\RenderElement
+ * @see \Drupal\Core\Render\Element\RenderElement
+ * @see plugin_api
+ *
+ * @ingroup theme_render
+ */
+interface ElementInterface extends PluginInspectionInterface {
+
+  /**
+   * Returns the element properties for this element.
+   *
+   * @return array
+   *   An array of element properties. See
+   *   \Drupal\Core\Render\ElementInfoManagerInterface::getInfo() for
+   *   documentation of the standard properties of all elements, and the
+   *   return value format.
+   */
+  public function getInfo();
+
+}
diff --git a/core/lib/Drupal/Core/Render/Element/FormElement.php b/core/lib/Drupal/Core/Render/Element/FormElement.php
new file mode 100644
index 0000000..d66cc89
--- /dev/null
+++ b/core/lib/Drupal/Core/Render/Element/FormElement.php
@@ -0,0 +1,162 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Render\Element\FormElement.
+ */
+
+namespace Drupal\Core\Render\Element;
+
+use Drupal\Core\Form\FormStateInterface;
+
+/**
+ * Provides a base class for form render plugins.
+ *
+ * @see \Drupal\Core\Render\Annotation\FormElement
+ * @see \Drupal\Core\Render\Element\FormElementInterface
+ * @see \Drupal\Core\Render\ElementInfoManager
+ * @see plugin_api
+ *
+ * @ingroup theme_render
+ */
+abstract class FormElement extends RenderElement implements FormElementInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function valueCallback(&$element, $input, FormStateInterface $form_state) {
+    return NULL;
+  }
+
+  /**
+   * Form element processing handler for the #ajax form property.
+   *
+   * @param array $element
+   *   An associative array containing the properties of the element.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   * @param array $complete_form
+   *   The complete form structure.
+   *
+   * @return array
+   *   The processed element.
+   *
+   * @see ajax_pre_render_element()
+   */
+  public static function processAjaxForm(&$element, FormStateInterface $form_state, &$complete_form) {
+    $element = ajax_pre_render_element($element);
+    if (!empty($element['#ajax_processed'])) {
+      $form_state['cache'] = TRUE;
+    }
+    return $element;
+  }
+
+  /**
+   * Arranges elements into groups.
+   *
+   * @param array $element
+   *   An associative array containing the properties and children of the
+   *   element. Note that $element must be taken by reference here, so processed
+   *   child elements are taken over into $form_state.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   * @param array $complete_form
+   *   The complete form structure.
+   *
+   * @return array
+   *   The processed element.
+   */
+  public static function processGroup(&$element, FormStateInterface $form_state, &$complete_form) {
+    $parents = implode('][', $element['#parents']);
+
+    // Each details element forms a new group. The #type 'vertical_tabs' basically
+    // only injects a new details element.
+    $form_state['groups'][$parents]['#group_exists'] = TRUE;
+    $element['#groups'] = &$form_state['groups'];
+
+    // Process vertical tabs group member details elements.
+    if (isset($element['#group'])) {
+      // Add this details element to the defined group (by reference).
+      $group = $element['#group'];
+      $form_state['groups'][$group][] = &$element;
+    }
+
+    return $element;
+  }
+
+  /**
+   * #process callback for #pattern form element property.
+   *
+   * @param array $element
+   *   An associative array containing the properties and children of the
+   *   generic input element.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   * @param array $complete_form
+   *   The complete form structure.
+   *
+   * @return array
+   *   The processed element.
+   *
+   * @see form_validate_pattern()
+   */
+  public static function processPattern(&$element, FormStateInterface $form_state, &$complete_form) {
+    if (isset($element['#pattern']) && !isset($element['#attributes']['pattern'])) {
+      $element['#attributes']['pattern'] = $element['#pattern'];
+      $element['#element_validate'][] = 'form_validate_pattern';
+    }
+
+    return $element;
+  }
+
+  /**
+   * Adds autocomplete functionality to elements.
+   *
+   * This sets up autocomplete functionality for elements with an
+   * #autocomplete_route_name property, using the #autocomplete_route_parameters
+   * property if present.
+   *
+   * For example, suppose your autocomplete route name is
+   * 'mymodule.autocomplete' and its path is
+   * '/mymodule/autocomplete/{a}/{b}'. In a form array, you would create a text
+   * field with properties:
+   * @code
+   * '#autocomplete_route_name' => 'mymodule.autocomplete',
+   * '#autocomplete_route_parameters' => array('a' => $some_key, 'b' => $some_id),
+   * @endcode
+   * If the user types "keywords" in that field, the full path called would be:
+   * 'mymodule_autocomplete/$some_key/$some_id?q=keywords'
+   *
+   * @param array $element
+   *   The form element to process. Properties used:
+   *   - #autocomplete_route_name: A route to be used as callback URL by the
+   *     autocomplete JavaScript library.
+   *   - #autocomplete_route_parameters: The parameters to be used in
+   *     conjunction with the route name.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   * @param array $complete_form
+   *   The complete form structure.
+   *
+   * @return array
+   *   The form element.
+   */
+  public static function processAutocomplete(&$element, FormStateInterface $form_state, &$complete_form) {
+    $access = FALSE;
+    if (!empty($element['#autocomplete_route_name'])) {
+      $parameters = isset($element['#autocomplete_route_parameters']) ? $element['#autocomplete_route_parameters'] : array();
+
+      $path = \Drupal::urlGenerator()->generate($element['#autocomplete_route_name'], $parameters);
+      $access = \Drupal::service('access_manager')->checkNamedRoute($element['#autocomplete_route_name'], $parameters, \Drupal::currentUser());
+    }
+    if ($access) {
+      $element['#attributes']['class'][] = 'form-autocomplete';
+      $element['#attached']['library'][] = 'core/drupal.autocomplete';
+      // Provide a data attribute for the JavaScript behavior to bind to.
+      $element['#attributes']['data-autocomplete-path'] = $path;
+    }
+
+    return $element;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Render/Element/FormElementInterface.php b/core/lib/Drupal/Core/Render/Element/FormElementInterface.php
new file mode 100644
index 0000000..2bbbde8
--- /dev/null
+++ b/core/lib/Drupal/Core/Render/Element/FormElementInterface.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Render\Element\FormElementInterface.
+ */
+
+namespace Drupal\Core\Render\Element;
+
+use Drupal\Core\Form\FormStateInterface;
+
+/**
+ * Provides an interface for form element plugins.
+ *
+ * Form element plugins are a subset of render elements, specifically
+ * representing HTML elements that take input as part of a form. Form element
+ * plugins are discovered via the same mechanism as regular render element
+ * plugins. See \Drupal\Core\Render\Element\ElementInterface for general
+ * information about render element plugins.
+ *
+ * @see \Drupal\Core\Render\ElementInfoManager
+ * @see \Drupal\Core\Render\Element\FormElement
+ * @see \Drupal\Core\Render\Annotation\FormElement
+ * @see plugin_api
+ *
+ * @ingroup theme_render
+ */
+interface FormElementInterface extends ElementInterface {
+
+  /**
+   * Determines how user input is mapped to an element's #value property.
+   *
+   * @param array $element
+   *   An associative array containing the properties of the element.
+   * @param mixed $input
+   *   The incoming input to populate the form element. If this is FALSE,
+   *   the element's default value should be returned.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   *
+   * @return mixed
+   *   The value to assign to the element.
+   */
+  public static function valueCallback(&$element, $input, FormStateInterface $form_state);
+
+}
diff --git a/core/lib/Drupal/Core/Render/Element/Link.php b/core/lib/Drupal/Core/Render/Element/Link.php
new file mode 100644
index 0000000..2a06eb6
--- /dev/null
+++ b/core/lib/Drupal/Core/Render/Element/Link.php
@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Render\Element\Link.
+ */
+
+namespace Drupal\Core\Render\Element;
+
+/**
+ * Provides a link render element.
+ *
+ * @RenderElement("link")
+ */
+class Link extends RenderElement {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getInfo() {
+    $class = get_class($this);
+    return array(
+      '#pre_render' => array(
+        array($class, 'preRenderLink'),
+      ),
+    );
+  }
+
+  /**
+   * Pre-render callback: Renders a link into #markup.
+   *
+   * Doing so during pre_render gives modules a chance to alter the link parts.
+   *
+   * @param array $element
+   *   A structured array whose keys form the arguments to l():
+   *   - #title: The link text to pass as argument to l().
+   *   - One of the following
+   *     - #route_name and (optionally) a #route_parameters array; The route
+   *       name and route parameters which will be passed into the link
+   *       generator.
+   *     - #href: The system path or URL to pass as argument to l().
+   *   - #options: (optional) An array of options to pass to l() or the link
+   *     generator.
+   *
+   * @return array
+   *   The passed-in element containing a rendered link in '#markup'.
+   */
+  public static function preRenderLink($element) {
+    // By default, link options to pass to l() are normally set in #options.
+    $element += array('#options' => array());
+    // However, within the scope of renderable elements, #attributes is a valid
+    // way to specify attributes, too. Take them into account, but do not override
+    // attributes from #options.
+    if (isset($element['#attributes'])) {
+      $element['#options'] += array('attributes' => array());
+      $element['#options']['attributes'] += $element['#attributes'];
+    }
+
+    // This #pre_render callback can be invoked from inside or outside of a Form
+    // API context, and depending on that, a HTML ID may be already set in
+    // different locations. #options should have precedence over Form API's #id.
+    // #attributes have been taken over into #options above already.
+    if (isset($element['#options']['attributes']['id'])) {
+      $element['#id'] = $element['#options']['attributes']['id'];
+    }
+    elseif (isset($element['#id'])) {
+      $element['#options']['attributes']['id'] = $element['#id'];
+    }
+
+    // Conditionally invoke ajax_pre_render_element(), if #ajax is set.
+    if (isset($element['#ajax']) && !isset($element['#ajax_processed'])) {
+      // If no HTML ID was found above, automatically create one.
+      if (!isset($element['#id'])) {
+        $element['#id'] = $element['#options']['attributes']['id'] = drupal_html_id('ajax-link');
+      }
+      // If #ajax['path] was not specified, use the href as Ajax request URL.
+      if (!isset($element['#ajax']['path'])) {
+        $element['#ajax']['path'] = $element['#href'];
+        $element['#ajax']['options'] = $element['#options'];
+      }
+      $element = ajax_pre_render_element($element);
+    }
+
+    if (isset($element['#route_name'])) {
+      $element['#route_parameters'] = empty($element['#route_parameters']) ? array() : $element['#route_parameters'];
+      $element['#markup'] = \Drupal::linkGenerator()->generate($element['#title'], $element['#route_name'], $element['#route_parameters'], $element['#options']);
+    }
+    else {
+      $element['#markup'] = l($element['#title'], $element['#href'], $element['#options']);
+    }
+    return $element;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Render/Element/MachineName.php b/core/lib/Drupal/Core/Render/Element/MachineName.php
new file mode 100644
index 0000000..6301f35
--- /dev/null
+++ b/core/lib/Drupal/Core/Render/Element/MachineName.php
@@ -0,0 +1,226 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Render\Element\MachineName.
+ */
+
+namespace Drupal\Core\Render\Element;
+
+use Drupal\Component\Utility\NestedArray;
+use Drupal\Component\Utility\SafeMarkup;
+use Drupal\Core\Form\FormStateInterface;
+
+/**
+ * Provides a machine name render element.
+ *
+ * Provides a form element to enter a machine name, which is validated to ensure
+ * that the name is unique and does not contain disallowed characters. All
+ * disallowed characters are replaced with a replacement character via
+ * JavaScript.
+ *
+ * @FormElement("machine_name")
+ */
+class MachineName extends Textfield {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getInfo() {
+    $class = get_class($this);
+    return array(
+      '#input' => TRUE,
+      '#default_value' => NULL,
+      '#required' => TRUE,
+      '#maxlength' => 64,
+      '#size' => 60,
+      '#autocomplete_route_name' => FALSE,
+      '#process' => array(
+        array($class, 'processMachineName'),
+        array($class, 'processAutocomplete'),
+        array($class, 'processAjaxForm'),
+      ),
+      '#element_validate' => array(
+        array($class, 'validateMachineName'),
+      ),
+      '#pre_render' => array(
+        array($class, 'preRenderTextfield'),
+      ),
+      '#theme' => 'input__textfield',
+      '#theme_wrappers' => array('form_element'),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function valueCallback(&$element, $input, FormStateInterface $form_state) {
+    return NULL;
+  }
+
+  /**
+   * Processes a machine-readable name form element.
+   *
+   * @param array $element
+   *   The form element to process. Properties used:
+   *   - #machine_name: An associative array containing:
+   *     - exists: A callable to invoke for checking whether a submitted machine
+   *       name value already exists. The submitted value is passed as an
+   *       argument. In most cases, an existing API or menu argument loader
+   *       function can be re-used. The callback is only invoked if the
+   *       submitted value differs from the element's #default_value.
+   *     - source: (optional) The #array_parents of the form element containing
+   *       the human-readable name (i.e., as contained in the $form structure)
+   *       to use as source for the machine name. Defaults to array('label').
+   *     - label: (optional) Text to display as label for the machine name value
+   *       after the human-readable name form element. Defaults to "Machine
+   *       name".
+   *     - replace_pattern: (optional) A regular expression (without delimiters)
+   *       matching disallowed characters in the machine name. Defaults to
+   *       '[^a-z0-9_]+'.
+   *     - replace: (optional) A character to replace disallowed characters in
+   *       the machine name via JavaScript. Defaults to '_' (underscore). When
+   *       using a different character, 'replace_pattern' needs to be set
+   *       accordingly.
+   *     - error: (optional) A custom form error message string to show, if the
+   *       machine name contains disallowed characters.
+   *     - standalone: (optional) Whether the live preview should stay in its
+   *       own form element rather than in the suffix of the source
+   *       element. Defaults to FALSE.
+   *   - #maxlength: (optional) Maximum allowed length of the machine name.
+   *     Defaults to 64.
+   *   - #disabled: (optional) Should be set to TRUE if an existing machine
+   *     name must not be changed after initial creation.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   * @param array $complete_form
+   *   The complete form structure.
+   *
+   * @return array
+   *   The processed element.
+   */
+  public static function processMachineName(&$element, FormStateInterface $form_state, &$complete_form) {
+    // We need to pass the langcode to the client.
+    $language = \Drupal::languageManager()->getCurrentLanguage();
+
+    // Apply default form element properties.
+    $element += array(
+      '#title' => t('Machine-readable name'),
+      '#description' => t('A unique machine-readable name. Can only contain lowercase letters, numbers, and underscores.'),
+      '#machine_name' => array(),
+      '#field_prefix' => '',
+      '#field_suffix' => '',
+      '#suffix' => '',
+    );
+    // A form element that only wants to set one #machine_name property (usually
+    // 'source' only) would leave all other properties undefined, if the defaults
+    // were defined in hook_element_info(). Therefore, we apply the defaults here.
+    $element['#machine_name'] += array(
+      'source' => array('label'),
+      'target' => '#' . $element['#id'],
+      'label' => t('Machine name'),
+      'replace_pattern' => '[^a-z0-9_]+',
+      'replace' => '_',
+      'standalone' => FALSE,
+      'field_prefix' => $element['#field_prefix'],
+      'field_suffix' => $element['#field_suffix'],
+    );
+
+    // By default, machine names are restricted to Latin alphanumeric characters.
+    // So, default to LTR directionality.
+    if (!isset($element['#attributes'])) {
+      $element['#attributes'] = array();
+    }
+    $element['#attributes'] += array('dir' => 'ltr');
+
+    // The source element defaults to array('name'), but may have been overidden.
+    if (empty($element['#machine_name']['source'])) {
+      return $element;
+    }
+
+    // Retrieve the form element containing the human-readable name from the
+    // complete form in $form_state. By reference, because we may need to append
+    // a #field_suffix that will hold the live preview.
+    $key_exists = NULL;
+    $source = NestedArray::getValue($form_state['complete_form'], $element['#machine_name']['source'], $key_exists);
+    if (!$key_exists) {
+      return $element;
+    }
+
+    $suffix_id = $source['#id'] . '-machine-name-suffix';
+    $element['#machine_name']['suffix'] = '#' . $suffix_id;
+
+    if ($element['#machine_name']['standalone']) {
+      $element['#suffix'] = SafeMarkup::set($element['#suffix'] . ' <small id="' . $suffix_id . '">&nbsp;</small>');
+    }
+    else {
+      // Append a field suffix to the source form element, which will contain
+      // the live preview of the machine name.
+      $source += array('#field_suffix' => '');
+      $source['#field_suffix'] = SafeMarkup::set($source['#field_suffix'] . ' <small id="' . $suffix_id . '">&nbsp;</small>');
+
+      $parents = array_merge($element['#machine_name']['source'], array('#field_suffix'));
+      NestedArray::setValue($form_state['complete_form'], $parents, $source['#field_suffix']);
+    }
+
+    $js_settings = array(
+      'type' => 'setting',
+      'data' => array(
+        'machineName' => array(
+          '#' . $source['#id'] => $element['#machine_name'],
+        ),
+        'langcode' => $language->id,
+      ),
+    );
+    $element['#attached']['library'][] = 'core/drupal.machine-name';
+    $element['#attached']['js'][] = $js_settings;
+
+    return $element;
+  }
+
+  /**
+   * Form element validation handler for machine_name elements.
+   *
+   * Note that #maxlength is validated by _form_validate() already.
+   *
+   * This checks that the submitted value:
+   * - Does not contain the replacement character only.
+   * - Does not contain disallowed characters.
+   * - Is unique; i.e., does not already exist.
+   * - Does not exceed the maximum length (via #maxlength).
+   * - Cannot be changed after creation (via #disabled).
+   */
+  public static function validateMachineName(&$element, FormStateInterface $form_state, &$complete_form) {
+    // Verify that the machine name not only consists of replacement tokens.
+    if (preg_match('@^' . $element['#machine_name']['replace'] . '+$@', $element['#value'])) {
+      form_error($element, $form_state, t('The machine-readable name must contain unique characters.'));
+    }
+
+    // Verify that the machine name contains no disallowed characters.
+    if (preg_match('@' . $element['#machine_name']['replace_pattern'] . '@', $element['#value'])) {
+      if (!isset($element['#machine_name']['error'])) {
+        // Since a hyphen is the most common alternative replacement character,
+        // a corresponding validation error message is supported here.
+        if ($element['#machine_name']['replace'] == '-') {
+          form_error($element, $form_state, t('The machine-readable name must contain only lowercase letters, numbers, and hyphens.'));
+        }
+        // Otherwise, we assume the default (underscore).
+        else {
+          form_error($element, $form_state, t('The machine-readable name must contain only lowercase letters, numbers, and underscores.'));
+        }
+      }
+      else {
+        form_error($element, $form_state, $element['#machine_name']['error']);
+      }
+    }
+
+    // Verify that the machine name is unique.
+    if ($element['#default_value'] !== $element['#value']) {
+      $function = $element['#machine_name']['exists'];
+      if (call_user_func($function, $element['#value'], $element, $form_state)) {
+        form_error($element, $form_state, t('The machine-readable name is already in use. It must be unique.'));
+      }
+    }
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Render/Element/RenderElement.php b/core/lib/Drupal/Core/Render/Element/RenderElement.php
new file mode 100644
index 0000000..cf4d454
--- /dev/null
+++ b/core/lib/Drupal/Core/Render/Element/RenderElement.php
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Render\Element\RenderElement.
+ */
+
+namespace Drupal\Core\Render\Element;
+
+use Drupal\Core\Plugin\PluginBase;
+use Drupal\Core\Render\Element;
+
+/**
+ * Provides a base class for element render plugins.
+ *
+ * @see \Drupal\Core\Render\Annotation\RenderElement
+ * @see \Drupal\Core\Render\ElementInterface
+ * @see \Drupal\Core\Render\ElementInfoManager
+ * @see plugin_api
+ *
+ * @ingroup theme_render
+ */
+abstract class RenderElement extends PluginBase implements ElementInterface {
+
+  /**
+   * Adds members of this group as actual elements for rendering.
+   *
+   * @param array $element
+   *   An associative array containing the properties and children of the
+   *   element.
+   *
+   * @return array
+   *   The modified element with all group members.
+   */
+  public static function preRenderGroup($element) {
+    // The element may be rendered outside of a Form API context.
+    if (!isset($element['#parents']) || !isset($element['#groups'])) {
+      return $element;
+    }
+
+    // Inject group member elements belonging to this group.
+    $parents = implode('][', $element['#parents']);
+    $children = Element::children($element['#groups'][$parents]);
+    if (!empty($children)) {
+      foreach ($children as $key) {
+        // Break references and indicate that the element should be rendered as
+        // group member.
+        $child = (array) $element['#groups'][$parents][$key];
+        $child['#group_details'] = TRUE;
+        // Inject the element as new child element.
+        $element[] = $child;
+
+        $sort = TRUE;
+      }
+      // Re-sort the element's children if we injected group member elements.
+      if (isset($sort)) {
+        $element['#sorted'] = FALSE;
+      }
+    }
+
+    if (isset($element['#group'])) {
+      // Contains form element summary functionalities.
+      $element['#attached']['library'][] = 'core/drupal.form';
+
+      $group = $element['#group'];
+      // If this element belongs to a group, but the group-holding element does
+      // not exist, we need to render it (at its original location).
+      if (!isset($element['#groups'][$group]['#group_exists'])) {
+        // Intentionally empty to clarify the flow; we simply return $element.
+      }
+      // If we injected this element into the group, then we want to render it.
+      elseif (!empty($element['#group_details'])) {
+        // Intentionally empty to clarify the flow; we simply return $element.
+      }
+      // Otherwise, this element belongs to a group and the group exists, so we do
+      // not render it.
+      elseif (Element::children($element['#groups'][$group])) {
+        $element['#printed'] = TRUE;
+      }
+    }
+
+    return $element;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Render/Element/Textfield.php b/core/lib/Drupal/Core/Render/Element/Textfield.php
new file mode 100644
index 0000000..d687a2c
--- /dev/null
+++ b/core/lib/Drupal/Core/Render/Element/Textfield.php
@@ -0,0 +1,75 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Render\Element\Textfield.
+ */
+
+namespace Drupal\Core\Render\Element;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element;
+
+/**
+ * Provides a one-line text field form element.
+ *
+ * @FormElement("textfield")
+ */
+class Textfield extends FormElement {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getInfo() {
+    $class = get_class($this);
+    return array(
+      '#input' => TRUE,
+      '#size' => 60,
+      '#maxlength' => 128,
+      '#autocomplete_route_name' => FALSE,
+      '#process' => array(
+        array($class, 'processAutocomplete'),
+        array($class, 'processAjaxForm'),
+        array($class, 'processPattern'),
+        array($class, 'processGroup'),
+      ),
+      '#pre_render' => array(
+        array($class, 'preRenderTextfield'),
+        array($class, 'preRenderGroup'),
+      ),
+      '#theme' => 'input__textfield',
+      '#theme_wrappers' => array('form_element'),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function valueCallback(&$element, $input, FormStateInterface $form_state) {
+    if ($input !== FALSE && $input !== NULL) {
+      // Equate $input to the form value to ensure it's marked for
+      // validation.
+      return str_replace(array("\r", "\n"), '', $input);
+    }
+  }
+
+  /**
+   * Prepares a #type 'textfield' render element for theme_input().
+   *
+   * @param array $element
+   *   An associative array containing the properties of the element.
+   *   Properties used: #title, #value, #description, #size, #maxlength,
+   *   #placeholder, #required, #attributes.
+   *
+   * @return array
+   *   The $element with prepared variables ready for theme_input().
+   */
+  public static function preRenderTextfield($element) {
+    $element['#attributes']['type'] = 'text';
+    Element::setAttributes($element, array('id', 'name', 'value', 'size', 'maxlength', 'placeholder'));
+    _form_set_attributes($element, array('form-text'));
+
+    return $element;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Render/ElementInfo.php b/core/lib/Drupal/Core/Render/ElementInfo.php
deleted file mode 100644
index 8d6a3f2..0000000
--- a/core/lib/Drupal/Core/Render/ElementInfo.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Render\ElementInfo.
- */
-
-namespace Drupal\Core\Render;
-
-use Drupal\Core\Extension\ModuleHandlerInterface;
-
-/**
- * Provides the default element info implementation.
- */
-class ElementInfo implements ElementInfoInterface {
-
-  /**
-   * The module handler.
-   *
-   * @var \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
-   */
-  protected $moduleHandler;
-
-  /**
-   * Stores the available element information
-   *
-   * @var array
-   */
-  protected $elementInfo;
-
-  /**
-   * Constructs a new ElementInfo instance.
-   *
-   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
-   *   The module handler.
-   */
-  public function __construct(ModuleHandlerInterface $module_handler) {
-    $this->moduleHandler = $module_handler;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getInfo($type) {
-    if (!isset($this->elementInfo)) {
-      $this->elementInfo = $this->buildInfo();
-    }
-    return isset($this->elementInfo[$type]) ? $this->elementInfo[$type] : array();
-  }
-
-  /**
-   * Builds up all element information.
-   */
-  protected function buildInfo() {
-    $info = $this->moduleHandler->invokeAll('element_info');
-    foreach ($info as $element_type => $element) {
-      $info[$element_type]['#type'] = $element_type;
-    }
-    // Allow modules to alter the element type defaults.
-    $this->moduleHandler->alter('element_info', $info);
-
-    return $info;
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Render/ElementInfoInterface.php b/core/lib/Drupal/Core/Render/ElementInfoInterface.php
deleted file mode 100644
index ad05aeb..0000000
--- a/core/lib/Drupal/Core/Render/ElementInfoInterface.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Render\ElementInfoInterface.
- */
-
-namespace Drupal\Core\Render;
-
-/**
- * Defines available render array element types.
- */
-interface ElementInfoInterface {
-
-  /**
-   * Retrieves the default properties for the defined element type.
-   *
-   * Each of the form element types defined by this hook is assumed to have
-   * a matching theme function, e.g. theme_elementtype(), which should be
-   * registered with hook_theme() as normal.
-   *
-   * For more information about custom element types see the explanation at
-   * http://drupal.org/node/169815.
-   *
-   * @param string $type
-   *   An element type as defined by hook_element_info().
-   *
-   * @return array
-   *  An associative array describing the element types being defined. The array
-   *  contains a sub-array for each element type, with the machine-readable type
-   *  name as the key. Each sub-array has a number of possible attributes:
-   *  - "#input": boolean indicating whether or not this element carries a value
-   *    (even if it's hidden).
-   *  - "#process": array of callback functions taking $element, $form_state,
-   *    and $complete_form.
-   *  - "#after_build": array of callables taking $element and $form_state.
-   *  - "#validate": array of callback functions taking $form and $form_state.
-   *  - "#element_validate": array of callback functions taking $element and
-   *    $form_state.
-   *  - "#pre_render": array of callables taking $element.
-   *  - "#post_render": array of callables taking $children and $element.
-   *  - "#submit": array of callback functions taking $form and $form_state.
-   *  - "#title_display": optional string indicating if and how #title should be
-   *    displayed, see the form-element template and theme_form_element_label().
-   *
-   * @see hook_element_info()
-   * @see hook_element_info_alter()
-   */
-  public function getInfo($type);
-
-}
diff --git a/core/lib/Drupal/Core/Render/ElementInfoManager.php b/core/lib/Drupal/Core/Render/ElementInfoManager.php
new file mode 100644
index 0000000..1dd2be4
--- /dev/null
+++ b/core/lib/Drupal/Core/Render/ElementInfoManager.php
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Render\ElementInfoManager.
+ */
+
+namespace Drupal\Core\Render;
+
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Plugin\DefaultPluginManager;
+use Drupal\Core\Render\Element\FormElementInterface;
+
+/**
+ * Provides a plugin manager for element plugins.
+ *
+ * @see \Drupal\Core\Render\Annotation\RenderElement
+ * @see \Drupal\Core\Render\Annotation\FormElement
+ * @see \Drupal\Core\Render\Element\RenderElement
+ * @see \Drupal\Core\Render\Element\FormElement
+ * @see \Drupal\Core\Render\Element\ElementInterface
+ * @see \Drupal\Core\Render\Element\FormElementInterface
+ * @see plugin_api
+ */
+class ElementInfoManager extends DefaultPluginManager implements ElementInfoManagerInterface {
+
+  /**
+   * Stores the available element information.
+   *
+   * @var array
+   */
+  protected $elementInfo;
+
+  /**
+   * Constructs a ElementInfoManager object.
+   *
+   * @param \Traversable $namespaces
+   *   An object that implements \Traversable which contains the root paths
+   *   keyed by the corresponding namespace to look for plugin implementations.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
+   *   Cache backend instance to use.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler to invoke the alter hook with.
+   */
+  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
+    $this->setCacheBackend($cache_backend, 'element_info');
+
+    parent::__construct('Element', $namespaces, $module_handler, 'Drupal\Core\Render\Annotation\RenderElement');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getInfo($type) {
+    if (!isset($this->elementInfo)) {
+      $this->elementInfo = $this->buildInfo();
+    }
+    return isset($this->elementInfo[$type]) ? $this->elementInfo[$type] : array();
+  }
+
+  /**
+   * Builds up all element information.
+   */
+  protected function buildInfo() {
+    // @todo Remove this hook once all elements are converted to plugins in
+    //   https://www.drupal.org/node/2311393.
+    $info = $this->moduleHandler->invokeAll('element_info');
+
+    foreach ($this->getDefinitions() as $element_type => $definition) {
+      $element = $this->createInstance($element_type);
+      $element_info = $element->getInfo();
+
+      // If this is element is to be used exclusively in a form, denote that it
+      // will receive input, and assign the value callback.
+      if ($element instanceof FormElementInterface) {
+        $element_info['#input'] = TRUE;
+        $element_info['#value_callback'] = array($definition['class'], 'valueCallback');
+      }
+      $info[$element_type] = $element_info;
+    }
+    foreach ($info as $element_type => $element) {
+      $info[$element_type]['#type'] = $element_type;
+    }
+    // Allow modules to alter the element type defaults.
+    $this->moduleHandler->alter('element_info', $info);
+
+    return $info;
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @return \Drupal\Core\Render\Element\ElementInterface
+   */
+  public function createInstance($plugin_id, array $configuration = array()) {
+    return parent::createInstance($plugin_id, $configuration);
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Render/ElementInfoManagerInterface.php b/core/lib/Drupal/Core/Render/ElementInfoManagerInterface.php
new file mode 100644
index 0000000..d32acd6
--- /dev/null
+++ b/core/lib/Drupal/Core/Render/ElementInfoManagerInterface.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Render\ElementInfoManagerInterface.
+ */
+
+namespace Drupal\Core\Render;
+
+/**
+ * Collects available render array element types.
+ */
+interface ElementInfoManagerInterface {
+
+  /**
+   * Retrieves the default properties for the defined element type.
+   *
+   * Each of the form element types defined by this hook is assumed to have
+   * a matching theme hook, which should be registered with hook_theme() as
+   * normal.
+   *
+   * For more information about custom element types see the explanation at
+   * http://drupal.org/node/169815.
+   *
+   * @param string $type
+   *   An element type as defined by hook_element_info() or the machine name
+   *   of an element type plugin.
+   *
+   * @return array
+   *   An associative array describing the element types being defined. The
+   *   array contains a sub-array for each element type, with the
+   *   machine-readable type name as the key. Each sub-array has a number of
+   *   possible attributes:
+   *   - #input: boolean indicating whether or not this element carries a value
+   *     (even if it's hidden).
+   *   - #process: array of callback functions taking $element, $form_state,
+   *     and $complete_form.
+   *   - #after_build: array of callables taking $element and $form_state.
+   *   - #validate: array of callback functions taking $form and $form_state.
+   *   - #element_validate: array of callback functions taking $element and
+   *     $form_state.
+   *   - #pre_render: array of callables taking $element.
+   *   - #post_render: array of callables taking $children and $element.
+   *   - #submit: array of callback functions taking $form and $form_state.
+   *   - #title_display: optional string indicating if and how #title should be
+   *     displayed (see form-element.html.twig).
+   *
+   * @see hook_element_info()
+   * @see hook_element_info_alter()
+   * @see \Drupal\Core\Render\Element\ElementInterface
+   * @see \Drupal\Core\Render\Element\ElementInterface::getInfo()
+   */
+  public function getInfo($type);
+
+}
diff --git a/core/lib/Drupal/Core/Render/Plugin/README.txt b/core/lib/Drupal/Core/Render/Plugin/README.txt
new file mode 100644
index 0000000..f761e01
--- /dev/null
+++ b/core/lib/Drupal/Core/Render/Plugin/README.txt
@@ -0,0 +1,4 @@
+@todo This must be here because DrupalKernel will only allow namespaces to
+  provide plugins if there is a Plugin subdirectory, and git does not allow
+  empty subdirectories. This file should be removed once
+  https://www.drupal.org/node/2309889 is fixed.
diff --git a/core/lib/Drupal/Core/Routing/RouteProvider.php b/core/lib/Drupal/Core/Routing/RouteProvider.php
index 0fca7f8..22b8177 100644
--- a/core/lib/Drupal/Core/Routing/RouteProvider.php
+++ b/core/lib/Drupal/Core/Routing/RouteProvider.php
@@ -134,9 +134,6 @@ public function getRouteCollectionForRequest(Request $request) {
    *
    * @param string $name
    *   The route name to fetch
-   * @param array $parameters
-   *   The parameters as they are passed to the UrlGeneratorInterface::generate
-   *   call.
    *
    * @return \Symfony\Component\Routing\Route
    *   The found route.
@@ -144,8 +141,8 @@ public function getRouteCollectionForRequest(Request $request) {
    * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException
    *   Thrown if there is no route with that name in this repository.
    */
-  public function getRouteByName($name, $parameters = array()) {
-    $routes = $this->getRoutesByNames(array($name), $parameters);
+  public function getRouteByName($name) {
+    $routes = $this->getRoutesByNames(array($name));
     if (empty($routes)) {
       throw new RouteNotFoundException(sprintf('Route "%s" does not exist.', $name));
     }
@@ -165,14 +162,11 @@ public function getRouteByName($name, $parameters = array()) {
    *
    * @param array $names
    *   The list of names to retrieve.
-   * @param array $parameters
-   *   The parameters as they are passed to the UrlGeneratorInterface::generate
-   *   call. (Only one array, not one for each entry in $names).
    *
    * @return \Symfony\Component\Routing\Route[]
    *   Iterable thing with the keys the names of the $names argument.
    */
-  public function getRoutesByNames($names, $parameters = array()) {
+  public function getRoutesByNames($names) {
 
     if (empty($names)) {
       throw new \InvalidArgumentException('You must specify the route names to load');
diff --git a/core/modules/book/book.admin.inc b/core/modules/book/book.admin.inc
index 6a3edc1..469267c 100644
--- a/core/modules/book/book.admin.inc
+++ b/core/modules/book/book.admin.inc
@@ -29,7 +29,7 @@ function theme_book_admin_table($variables) {
   $access = \Drupal::currentUser()->hasPermission('administer nodes');
   foreach (Element::children($form) as $key) {
     $nid = $form[$key]['nid']['#value'];
-    $href = \Drupal::url('node.view', array('node' => $nid));
+    $href = \Drupal::url('entity.node.canonical', array('node' => $nid));
 
     // Add special classes to be used with tabledrag.js.
     $form[$key]['pid']['#attributes']['class'] = array('book-pid');
@@ -50,13 +50,13 @@ function theme_book_admin_table($variables) {
     if ($access) {
       $links['edit'] = array(
         'title' => t('Edit'),
-        'route_name' => 'node.page_edit',
+        'route_name' => 'entity.node.edit_form',
         'route_parameters' => array('node' => $nid),
         'query' => $destination,
       );
       $links['delete'] = array(
         'title' => t('Delete'),
-        'route_name' => 'node.delete_confirm',
+        'route_name' => 'entity.node.delete_form',
         'route_parameters' => array('node' => $nid),
         'query' => $destination,
       );
diff --git a/core/modules/book/book.links.menu.yml b/core/modules/book/book.links.menu.yml
index f7dbc18..0833dbd 100644
--- a/core/modules/book/book.links.menu.yml
+++ b/core/modules/book/book.links.menu.yml
@@ -6,4 +6,4 @@ book.admin:
 book.render:
   title: Books
   route_name: book.render
-  hidden: 1
+  enabled: 0
diff --git a/core/modules/book/book.links.task.yml b/core/modules/book/book.links.task.yml
index 796c5fd..2ce18c6 100644
--- a/core/modules/book/book.links.task.yml
+++ b/core/modules/book/book.links.task.yml
@@ -10,6 +10,6 @@ book.settings:
 
 book.outline:
   route_name: book.outline
-  base_route: node.view
+  base_route: entity.node.canonical
   title: Outline
   weight: 2
diff --git a/core/modules/book/book.module b/core/modules/book/book.module
index 3fe7f33..ab0a5fe 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -406,7 +406,7 @@ function template_preprocess_book_navigation(&$variables) {
   // Provide extra variables for themers. Not needed by default.
   $variables['book_id'] = $book_link['bid'];
   $variables['book_title'] = String::checkPlain($book_link['link_title']);
-  $variables['book_url'] = \Drupal::url('node.view', array('node' => $book_link['bid']));
+  $variables['book_url'] = \Drupal::url('entity.node.canonical', array('node' => $book_link['bid']));
   $variables['current_depth'] = $book_link['depth'];
   $variables['tree'] = '';
 
@@ -419,7 +419,7 @@ function template_preprocess_book_navigation(&$variables) {
     $build = array();
 
     if ($prev = $book_outline->prevLink($book_link)) {
-      $prev_href = \Drupal::url('node.view', array('node' => $prev['nid']));
+      $prev_href = \Drupal::url('entity.node.canonical', array('node' => $prev['nid']));
       $build['#attached']['drupal_add_html_head_link'][][] = array(
         'rel' => 'prev',
         'href' => $prev_href,
@@ -431,7 +431,7 @@ function template_preprocess_book_navigation(&$variables) {
     /** @var \Drupal\book\BookManagerInterface $book_manager */
     $book_manager = \Drupal::service('book.manager');
     if ($book_link['pid'] && $parent = $book_manager->loadBookLink($book_link['pid'])) {
-      $parent_href = \Drupal::url('node.view', array('node' => $book_link['pid']));
+      $parent_href = \Drupal::url('entity.node.canonical', array('node' => $book_link['pid']));
       $build['#attached']['drupal_add_html_head_link'][][] = array(
         'rel' => 'up',
         'href' => $parent_href,
@@ -441,7 +441,7 @@ function template_preprocess_book_navigation(&$variables) {
     }
 
     if ($next = $book_outline->nextLink($book_link)) {
-      $next_href = \Drupal::url('node.view', array('node' => $next['nid']));
+      $next_href = \Drupal::url('entity.node.canonical', array('node' => $next['nid']));
       $build['#attached']['drupal_add_html_head_link'][][] = array(
         'rel' => 'next',
         'href' => $next_href,
diff --git a/core/modules/book/src/BookBreadcrumbBuilder.php b/core/modules/book/src/BookBreadcrumbBuilder.php
index bcdb593..9708b3d 100644
--- a/core/modules/book/src/BookBreadcrumbBuilder.php
+++ b/core/modules/book/src/BookBreadcrumbBuilder.php
@@ -87,7 +87,7 @@ public function build(RouteMatchInterface $route_match) {
       while (!empty($book['p' . ($depth + 1)])) {
         if (!empty($parent_books[$book['p' . $depth]]) && ($parent_book = $parent_books[$book['p' . $depth]])) {
           if ($parent_book->access('view', $this->account)) {
-            $links[] = $this->l($parent_book->label(), 'node.view', array('node' => $parent_book->id()));
+            $links[] = $this->l($parent_book->label(), 'entity.node.canonical', array('node' => $parent_book->id()));
           }
         }
         $depth++;
diff --git a/core/modules/book/src/Form/BookOutlineForm.php b/core/modules/book/src/Form/BookOutlineForm.php
index 8530fab..93140dd 100644
--- a/core/modules/book/src/Form/BookOutlineForm.php
+++ b/core/modules/book/src/Form/BookOutlineForm.php
@@ -103,7 +103,7 @@ protected function actions(array $form, FormStateInterface $form_state) {
    */
   public function submit(array $form, FormStateInterface $form_state) {
     $form_state->setRedirect(
-      'node.view',
+      'entity.node.canonical',
       array('node' => $this->entity->id())
     );
     $book_link = $form_state->getValue('book');
diff --git a/core/modules/book/tests/src/Menu/BookLocalTasksTest.php b/core/modules/book/tests/src/Menu/BookLocalTasksTest.php
index fd92757..8f585fa 100644
--- a/core/modules/book/tests/src/Menu/BookLocalTasksTest.php
+++ b/core/modules/book/tests/src/Menu/BookLocalTasksTest.php
@@ -53,7 +53,7 @@ public function getBookAdminRoutes() {
    */
   public function testBookNodeLocalTasks($route) {
     $this->assertLocalTasks($route, array(
-      0 => array('book.outline', 'node.view', 'node.page_edit', 'node.delete_confirm', 'node.revision_overview',),
+      0 => array('book.outline', 'entity.node.canonical', 'entity.node.edit_form', 'entity.node.delete_form', 'entity.node.version_history',),
     ));
   }
 
@@ -62,7 +62,7 @@ public function testBookNodeLocalTasks($route) {
    */
   public function getBookNodeRoutes() {
     return array(
-      array('node.view'),
+      array('entity.node.canonical'),
       array('book.outline'),
     );
   }
diff --git a/core/modules/comment/comment.install b/core/modules/comment/comment.install
index 4ce2b37..64aa6bd 100644
--- a/core/modules/comment/comment.install
+++ b/core/modules/comment/comment.install
@@ -27,7 +27,7 @@ function comment_uninstall() {
  */
 function comment_install() {
   // By default, maintain entity statistics for comments.
-  // @see \Drupal\comment\CommentStorage::updateEntityStatistics().
+  // @see \Drupal\comment\CommentStatisticsInterface
   \Drupal::state()->set('comment.maintain_entity_statistics', TRUE);
 }
 
diff --git a/core/modules/comment/src/CommentForm.php b/core/modules/comment/src/CommentForm.php
index 7ea6653..3ba804d 100644
--- a/core/modules/comment/src/CommentForm.php
+++ b/core/modules/comment/src/CommentForm.php
@@ -114,7 +114,7 @@ public function form(array $form, FormStateInterface $form_state) {
     // Prepare default values for form elements.
     if ($is_admin) {
       $author = $comment->getAuthorName();
-      $status = $comment->isPublished();
+      $status = $comment->getStatus();
       if (empty($form_state['comment_preview'])) {
         $form['#title'] = $this->t('Edit comment %title', array(
           '%title' => $comment->getSubject(),
diff --git a/core/modules/comment/src/CommentInterface.php b/core/modules/comment/src/CommentInterface.php
index d2fd09a..e7a4ee9 100644
--- a/core/modules/comment/src/CommentInterface.php
+++ b/core/modules/comment/src/CommentInterface.php
@@ -213,6 +213,14 @@ public function getChangedTime();
   public function isPublished();
 
   /**
+   * Returns the comment's status.
+   *
+   * @return int
+   *   One of CommentInterface::PUBLISHED or CommentInterface::NOT_PUBLISHED
+   */
+  public function getStatus();
+
+  /**
    * Sets the published status of the comment entity.
    *
    * @param bool $status
diff --git a/core/modules/comment/src/CommentStatistics.php b/core/modules/comment/src/CommentStatistics.php
index 164e8aa..0f2e936 100644
--- a/core/modules/comment/src/CommentStatistics.php
+++ b/core/modules/comment/src/CommentStatistics.php
@@ -68,8 +68,9 @@ public function __construct(Connection $database, AccountInterface $current_user
   /**
    * {@inheritdoc}
    */
-  public function read($entities, $entity_type) {
-    $stats = $this->database->select('comment_entity_statistics', 'ces')
+  public function read($entities, $entity_type, $accurate = TRUE) {
+    $options = $accurate ? array() : array('target' => 'replica');
+    $stats =  $this->database->select('comment_entity_statistics', 'ces', $options)
       ->fields('ces')
       ->condition('ces.entity_id', array_keys($entities))
       ->condition('ces.entity_type', $entity_type)
diff --git a/core/modules/comment/src/CommentStatisticsInterface.php b/core/modules/comment/src/CommentStatisticsInterface.php
index 92a0b7a..5e54a16 100644
--- a/core/modules/comment/src/CommentStatisticsInterface.php
+++ b/core/modules/comment/src/CommentStatisticsInterface.php
@@ -32,11 +32,14 @@ public function getRankingInfo();
    *   Array of entities on which commenting is enabled, keyed by id
    * @param string $entity_type
    *   The entity type of the passed entities.
+   * @param boolean $accurate
+   *   (optional) Indicates if results must be completely up to date. If set to
+   *   FALSE, a replica database will used if available. Defaults to TRUE.
    *
    * @return object[]
    *   Array of statistics records.
    */
-  public function read($entities, $entity_type);
+  public function read($entities, $entity_type, $accurate = TRUE);
 
   /**
    * Delete comment statistics records for an entity.
diff --git a/core/modules/comment/src/CommentStorage.php b/core/modules/comment/src/CommentStorage.php
index 2d5541e..9639d59 100644
--- a/core/modules/comment/src/CommentStorage.php
+++ b/core/modules/comment/src/CommentStorage.php
@@ -26,13 +26,6 @@
 class CommentStorage extends ContentEntityDatabaseStorage implements CommentStorageInterface {
 
   /**
-   * The comment statistics service.
-   *
-   * @var \Drupal\comment\CommentStatisticsInterface
-   */
-  protected $statistics;
-
-  /**
    * The current user.
    *
    * @var \Drupal\Core\Session\AccountInterface
@@ -50,14 +43,11 @@ class CommentStorage extends ContentEntityDatabaseStorage implements CommentStor
    *   The entity manager.
    * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
    *   Cache backend instance to use.
-   * @param \Drupal\comment\CommentStatisticsInterface $comment_statistics
-   *   The comment statistics service.
    * @param \Drupal\Core\Session\AccountInterface $current_user
    *   The current user.
    */
-  public function __construct(EntityTypeInterface $entity_info, Connection $database, EntityManagerInterface $entity_manager, CommentStatisticsInterface $comment_statistics, AccountInterface $current_user, CacheBackendInterface $cache) {
+  public function __construct(EntityTypeInterface $entity_info, Connection $database, EntityManagerInterface $entity_manager, AccountInterface $current_user, CacheBackendInterface $cache) {
     parent::__construct($entity_info, $database, $entity_manager, $cache);
-    $this->statistics = $comment_statistics;
     $this->currentUser = $current_user;
   }
 
@@ -69,7 +59,6 @@ public static function createInstance(ContainerInterface $container, EntityTypeI
       $entity_info,
       $container->get('database'),
       $container->get('entity.manager'),
-      $container->get('comment.statistics'),
       $container->get('current_user'),
       $container->get('cache.entity')
     );
@@ -78,13 +67,6 @@ public static function createInstance(ContainerInterface $container, EntityTypeI
   /**
    * {@inheritdoc}
    */
-  public function updateEntityStatistics(CommentInterface $comment) {
-    $this->statistics->update($comment);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getMaxThread(CommentInterface $comment) {
     $query = $this->database->select('comment_field_data', 'c')
       ->condition('entity_id', $comment->getCommentedEntityId())
diff --git a/core/modules/comment/src/CommentStorageInterface.php b/core/modules/comment/src/CommentStorageInterface.php
index 9087e5c..9eb4a66 100644
--- a/core/modules/comment/src/CommentStorageInterface.php
+++ b/core/modules/comment/src/CommentStorageInterface.php
@@ -108,24 +108,6 @@ public function getChildCids(array $comments);
   public function loadThread(EntityInterface $entity, $field_name, $mode, $comments_per_page = 0, $pager_id = 0);
 
   /**
-   * Updates the comment statistics for a given node.
-   *
-   * The {comment_entity_statistics} table has the following fields:
-   * - last_comment_timestamp: The timestamp of the last comment for the entity,
-   *   or the entity created timestamp if no comments exist for the entity.
-   * - last_comment_name: The name of the anonymous poster for the last comment.
-   * - last_comment_uid: The user ID of the poster for the last comment for
-   *   this entity, or the entity author's user ID if no comments exist for the
-   *   entity.
-   * - comment_count: The total number of approved/published comments on this
-   *   entity.
-   *
-   * @param \Drupal\comment\CommentInterface $comment
-   *   The comment being saved.
-   */
-  public function updateEntityStatistics(CommentInterface $comment);
-
-  /**
    * Returns the number of unapproved comments.
    *
    * @return int
diff --git a/core/modules/comment/src/Entity/Comment.php b/core/modules/comment/src/Entity/Comment.php
index 1bb7ef0..8efdb4d 100644
--- a/core/modules/comment/src/Entity/Comment.php
+++ b/core/modules/comment/src/Entity/Comment.php
@@ -76,9 +76,9 @@ public function preSave(EntityStorageInterface $storage) {
       $thread = $this->getThread();
       if (empty($thread)) {
         if ($this->threadLock) {
-          // As preSave() is protected, this can only happen when this class
-          // is extended in a faulty manner.
-          throw new \LogicException('preSave is called again without calling postSave() or releaseThreadLock()');
+          // Thread lock was not released after being set previously.
+          // This suggests there's a bug in code using this class.
+          throw new \LogicException('preSave() is called again without calling postSave() or releaseThreadLock()');
         }
         if (!$this->hasParentComment()) {
           // This is a comment with no parent comment (depth 0): we start
@@ -146,7 +146,7 @@ public function postSave(EntityStorageInterface $storage, $update = TRUE) {
 
     $this->releaseThreadLock();
     // Update the {comment_entity_statistics} table prior to executing the hook.
-    $storage->updateEntityStatistics($this);
+    \Drupal::service('comment.statistics')->update($this);
   }
 
   /**
@@ -169,7 +169,7 @@ public static function postDelete(EntityStorageInterface $storage, array $entiti
     entity_delete_multiple('comment', $child_cids);
 
     foreach ($entities as $id => $entity) {
-      $storage->updateEntityStatistics($entity);
+      \Drupal::service('comment.statistics')->update($entity);
     }
   }
 
@@ -474,6 +474,13 @@ public function isPublished() {
   /**
    * {@inheritdoc}
    */
+  public function getStatus() {
+    return $this->get('status')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function setPublished($status) {
     $this->set('status', $status ? CommentInterface::PUBLISHED : CommentInterface::NOT_PUBLISHED);
     return $this;
diff --git a/core/modules/comment/src/Tests/CommentAdminTest.php b/core/modules/comment/src/Tests/CommentAdminTest.php
index 0ca8f2e..811dfde 100644
--- a/core/modules/comment/src/Tests/CommentAdminTest.php
+++ b/core/modules/comment/src/Tests/CommentAdminTest.php
@@ -136,6 +136,8 @@ function testApprovalNodeInterface() {
     $this->assertResponse(403, 'Forged comment approval was denied.');
     $this->drupalGet('comment/1/approve', array('query' => array('token' => 'forged')));
     $this->assertResponse(403, 'Forged comment approval was denied.');
+    $this->drupalGet('comment/1/edit');
+    $this->assertFieldChecked('edit-status-0');
     $this->drupalGet('node/' . $this->node->id());
     $this->clickLink(t('Approve'));
     $this->drupalLogout();
diff --git a/core/modules/comment/tests/src/Entity/CommentLockTest.php b/core/modules/comment/tests/src/Entity/CommentLockTest.php
index a9a04f4..af6a7f7 100644
--- a/core/modules/comment/tests/src/Entity/CommentLockTest.php
+++ b/core/modules/comment/tests/src/Entity/CommentLockTest.php
@@ -27,6 +27,7 @@ public function testLocks() {
     $container->set('module_handler', $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface'));
     $container->set('current_user', $this->getMock('Drupal\Core\Session\AccountInterface'));
     $container->set('cache.test', $this->getMock('Drupal\Core\Cache\CacheBackendInterface'));
+    $container->set('comment.statistics', $this->getMock('Drupal\comment\CommentStatisticsInterface'));
     $request_stack = new RequestStack();
     $request_stack->push(Request::create('/'));
     $container->set('request_stack', $request_stack);
@@ -85,7 +86,10 @@ public function testLocks() {
       ->method('getListCacheTags')
       ->will($this->returnValue(array('comments' => TRUE)));
     $storage = $this->getMock('Drupal\comment\CommentStorageInterface');
+
+    // preSave() should acquire the lock. (This is what's really being tested.)
     $comment->preSave($storage);
+    // Release the acquired lock before exiting the test.
     $comment->postSave($storage);
   }
 
diff --git a/core/modules/contact/contact.links.menu.yml b/core/modules/contact/contact.links.menu.yml
index 683be63..8091f1f 100644
--- a/core/modules/contact/contact.links.menu.yml
+++ b/core/modules/contact/contact.links.menu.yml
@@ -7,4 +7,4 @@ contact.site_page:
   title: Contact
   route_name: contact.site_page
   menu_name: footer
-  hidden: 1
+  enabled: 0
diff --git a/core/modules/content_translation/tests/src/Menu/ContentTranslationLocalTasksTest.php b/core/modules/content_translation/tests/src/Menu/ContentTranslationLocalTasksTest.php
index 7df4e30..2f13405 100644
--- a/core/modules/content_translation/tests/src/Menu/ContentTranslationLocalTasksTest.php
+++ b/core/modules/content_translation/tests/src/Menu/ContentTranslationLocalTasksTest.php
@@ -27,7 +27,7 @@ public function setUp() {
     $entity_type->expects($this->any())
       ->method('getLinkTemplate')
       ->will($this->returnValueMap(array(
-        array('canonical', 'node.view'),
+        array('canonical', 'entity.node.canonical'),
         array('drupal:content-translation-overview', 'content_translation.translation_overview_node'),
       )));
     $content_translation_manager = $this->getMock('Drupal\content_translation\ContentTranslationManagerInterface');
@@ -53,19 +53,19 @@ public function testBlockAdminDisplay($route, $expected) {
    */
   public function providerTestBlockAdminDisplay() {
     return array(
-      array('node.view', array(array(
+      array('entity.node.canonical', array(array(
         'content_translation.local_tasks:content_translation.translation_overview_node',
-        'node.view',
-        'node.page_edit',
-        'node.delete_confirm',
-        'node.revision_overview',
+        'entity.node.canonical',
+        'entity.node.edit_form',
+        'entity.node.delete_form',
+        'entity.node.version_history',
       ))),
       array('content_translation.translation_overview_node', array(array(
         'content_translation.local_tasks:content_translation.translation_overview_node',
-        'node.view',
-        'node.page_edit',
-        'node.delete_confirm',
-        'node.revision_overview',
+        'entity.node.canonical',
+        'entity.node.edit_form',
+        'entity.node.delete_form',
+        'entity.node.version_history',
       ))),
     );
   }
diff --git a/core/modules/contextual/src/Tests/ContextualDynamicContextTest.php b/core/modules/contextual/src/Tests/ContextualDynamicContextTest.php
index af16592..e107398 100644
--- a/core/modules/contextual/src/Tests/ContextualDynamicContextTest.php
+++ b/core/modules/contextual/src/Tests/ContextualDynamicContextTest.php
@@ -74,9 +74,9 @@ function testDifferentPermissions() {
     $response = $this->renderContextualLinks($ids, 'node');
     $this->assertResponse(200);
     $json = Json::decode($response);
-    $this->assertIdentical($json[$ids[0]], '<ul class="contextual-links"><li class="nodepage-edit"><a href="' . base_path() . 'node/1/edit">Edit</a></li></ul>');
+    $this->assertIdentical($json[$ids[0]], '<ul class="contextual-links"><li class="entitynodeedit-form"><a href="' . base_path() . 'node/1/edit">Edit</a></li></ul>');
     $this->assertIdentical($json[$ids[1]], '');
-    $this->assertIdentical($json[$ids[2]], '<ul class="contextual-links"><li class="nodepage-edit"><a href="' . base_path() . 'node/3/edit">Edit</a></li></ul>');
+    $this->assertIdentical($json[$ids[2]], '<ul class="contextual-links"><li class="entitynodeedit-form"><a href="' . base_path() . 'node/3/edit">Edit</a></li></ul>');
     $this->assertIdentical($json[$ids[3]], '');
 
     // Authenticated user: can access contextual links, cannot edit articles.
diff --git a/core/modules/entity/src/EntityDisplayModeListBuilder.php b/core/modules/entity/src/EntityDisplayModeListBuilder.php
index 05c241a..ccf5635 100644
--- a/core/modules/entity/src/EntityDisplayModeListBuilder.php
+++ b/core/modules/entity/src/EntityDisplayModeListBuilder.php
@@ -59,7 +59,7 @@ public static function createInstance(ContainerInterface $container, EntityTypeI
    * {@inheritdoc}
    */
   public function buildHeader() {
-    $header['label'] = t('Label');
+    $header['label'] = t('Name');
     return $header + parent::buildHeader();
   }
 
diff --git a/core/modules/entity/src/Form/EntityDisplayModeFormBase.php b/core/modules/entity/src/Form/EntityDisplayModeFormBase.php
index 11b39e5..abd8e77 100644
--- a/core/modules/entity/src/Form/EntityDisplayModeFormBase.php
+++ b/core/modules/entity/src/Form/EntityDisplayModeFormBase.php
@@ -76,7 +76,7 @@ protected function init(FormStateInterface $form_state) {
   public function form(array $form, FormStateInterface $form_state) {
     $form['label'] = array(
       '#type' => 'textfield',
-      '#title' => t('Label'),
+      '#title' => t('Name'),
       '#maxlength' => 100,
       '#default_value' => $this->entity->label(),
     );
diff --git a/core/modules/field/src/Tests/FormatterPluginManagerTest.php b/core/modules/field/src/Tests/FormatterPluginManagerTest.php
new file mode 100644
index 0000000..bc1c635
--- /dev/null
+++ b/core/modules/field/src/Tests/FormatterPluginManagerTest.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\field\Tests\FormatterPluginManagerTest.
+ */
+
+namespace Drupal\field\Tests;
+use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\Core\Field\FormatterPluginManager;
+
+/**
+ * Tests the field formatter plugin manager.
+ *
+ * @group field
+ */
+class FormatterPluginManagerTest extends FieldUnitTestBase {
+
+  /**
+   * Tests that getInstance falls back on default if current is not applicable.
+   *
+   * @see \Drupal\field\Tests\WidgetPluginManagerTest::testNotApplicableFallback()
+   */
+  public function testNotApplicableFallback() {
+    /** @var FormatterPluginManager $formatter_plugin_manager */
+    $formatter_plugin_manager = \Drupal::service('plugin.manager.field.formatter');
+
+    $base_field_definition = BaseFieldDefinition::create('test_field')
+      // Set a name that will make isApplicable() return TRUE.
+      ->setName('field_test_field');
+
+    $formatter_options = array(
+      'field_definition' => $base_field_definition,
+      'view_mode' => 'default',
+      'configuration' => array(
+        'type' => 'field_test_applicable',
+      ),
+    );
+
+    $instance = $formatter_plugin_manager->getInstance($formatter_options);
+    $this->assertEqual($instance->getPluginId(), 'field_test_applicable');
+
+    // Now set name to something that makes isApplicable() return FALSE.
+    $base_field_definition->setName('deny_applicable');
+    $instance = $formatter_plugin_manager->getInstance($formatter_options);
+
+    // Instance should be default widget.
+    $this->assertNotEqual($instance->getPluginId(), 'field_test_applicable');
+    $this->assertEqual($instance->getPluginId(), 'field_test_default');
+  }
+
+}
diff --git a/core/modules/field/src/Tests/WidgetPluginManagerTest.php b/core/modules/field/src/Tests/WidgetPluginManagerTest.php
index 2ac557f..d475541 100644
--- a/core/modules/field/src/Tests/WidgetPluginManagerTest.php
+++ b/core/modules/field/src/Tests/WidgetPluginManagerTest.php
@@ -2,10 +2,12 @@
 
 /**
  * @file
- * Contains \Drupal\field\Tests\WidgetManagerTest.
+ * Contains \Drupal\field\Tests\WidgetPluginManagerTest.
  */
 
 namespace Drupal\field\Tests;
+use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\Core\Field\WidgetPluginManager;
 
 /**
  * Tests the field widget manager.
@@ -20,8 +22,42 @@ class WidgetPluginManagerTest extends FieldUnitTestBase {
   function testWidgetDefinitionAlter() {
     $widget_definition = \Drupal::service('plugin.manager.field.widget')->getDefinition('test_field_widget_multiple');
 
-    // Test if hook_field_widget_info_alter is beïng called.
+    // Test if hook_field_widget_info_alter is being called.
     $this->assertTrue(in_array('test_field', $widget_definition['field_types']), "The 'test_field_widget_multiple' widget is enabled for the 'test_field' field type in field_test_field_widget_info_alter().");
   }
 
+  /**
+   * Tests that getInstance falls back on default if current is not applicable.
+   *
+   * @see \Drupal\field\Tests\FormatterPluginManagerTest::testNotApplicableFallback()
+   */
+  public function testNotApplicableFallback() {
+    /** @var WidgetPluginManager $widget_plugin_manager */
+    $widget_plugin_manager = \Drupal::service('plugin.manager.field.widget');
+
+    $base_field_definition = BaseFieldDefinition::create('test_field')
+      // Set a name that will make isApplicable() return TRUE.
+      ->setName('field_multiwidgetfield');
+
+    $widget_options = array(
+      'field_definition' => $base_field_definition,
+      'form_mode' => 'default',
+      'configuration' => array(
+        'type' => 'test_field_widget_multiple',
+      ),
+    );
+
+    $instance = $widget_plugin_manager->getInstance($widget_options);
+    $this->assertEqual($instance->getPluginId(), 'test_field_widget_multiple');
+
+    // Now do the same but with machine name field_onewidgetfield, because that
+    // makes isApplicable() return FALSE.
+    $base_field_definition->setName('field_onewidgetfield');
+    $instance = $widget_plugin_manager->getInstance($widget_options);
+
+    // Instance should be default widget.
+    $this->assertNotEqual($instance->getPluginId(), 'test_field_widget_multiple');
+    $this->assertEqual($instance->getPluginId(), 'test_field_widget');
+  }
+
 }
diff --git a/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldFormatter/TestFieldApplicableFormatter.php b/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldFormatter/TestFieldApplicableFormatter.php
new file mode 100644
index 0000000..24704e1
--- /dev/null
+++ b/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldFormatter/TestFieldApplicableFormatter.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\field_test\Plugin\Field\FieldFormatter\TestFieldApplicableFormatter.
+ */
+
+namespace Drupal\field_test\Plugin\Field\FieldFormatter;
+use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Field\FormatterBase;
+
+
+/**
+ * Plugin implementation of the 'field_test_applicable' formatter.
+ *
+ * It is applicable to test_field fields unless their name is 'deny_applicable'.
+ *
+ * @FieldFormatter(
+ *   id = "field_test_applicable",
+ *   label = @Translation("Applicable"),
+ *   description = @Translation("Applicable formatter"),
+ *   field_types = {
+ *     "test_field"
+ *   },
+ *   weight = 15,
+ * )
+ */
+class TestFieldApplicableFormatter extends FormatterBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function isApplicable(FieldDefinitionInterface $field_definition) {
+    return $field_definition->getName() != 'deny_applicable';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewElements(FieldItemListInterface $items) {
+    return array('#markup' => 'Nothing to see here');
+  }
+}
diff --git a/core/modules/field_ui/src/Tests/ManageDisplayTest.php b/core/modules/field_ui/src/Tests/ManageDisplayTest.php
index 81b8e1b..24ccc7d 100644
--- a/core/modules/field_ui/src/Tests/ManageDisplayTest.php
+++ b/core/modules/field_ui/src/Tests/ManageDisplayTest.php
@@ -66,6 +66,7 @@ function testFormatterUI() {
       'field_test_default',
       'field_test_multiple',
       'field_test_with_prepare_view',
+      'field_test_applicable',
       'hidden',
     );
     $this->assertEqual($options, $expected_options, 'The expected formatter ordering is respected.');
diff --git a/core/modules/filter/filter.links.menu.yml b/core/modules/filter/filter.links.menu.yml
index e71db50..f689b2f 100644
--- a/core/modules/filter/filter.links.menu.yml
+++ b/core/modules/filter/filter.links.menu.yml
@@ -1,6 +1,6 @@
 filter.tips_all:
   title: 'Compose tips'
-  hidden: 1
+  enabled: 0
   route_name: filter.tips_all
 filter.admin_overview:
   title: 'Text formats'
diff --git a/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php b/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php
index b4134d8..48d2b38 100644
--- a/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php
+++ b/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php
@@ -18,7 +18,7 @@ class ForumNodeBreadcrumbBuilder extends ForumBreadcrumbBuilderBase {
    * {@inheritdoc}
    */
   public function applies(RouteMatchInterface $route_match) {
-    return $route_match->getRouteName() == 'node.view'
+    return $route_match->getRouteName() == 'entity.node.canonical'
       && $route_match->getParameter('node')
       && $this->forumManager->checkNodeType($route_match->getParameter('node'));
   }
diff --git a/core/modules/forum/tests/src/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php b/core/modules/forum/tests/src/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php
index 2cacbb0..86cad8e 100644
--- a/core/modules/forum/tests/src/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php
+++ b/core/modules/forum/tests/src/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php
@@ -84,20 +84,20 @@ public function providerTestApplies() {
       ),
       array(
         FALSE,
-        'NOT.node.view',
+        'NOT.entity.node.canonical',
       ),
       array(
         FALSE,
-        'node.view',
+        'entity.node.canonical',
       ),
       array(
         FALSE,
-        'node.view',
+        'entity.node.canonical',
         array(array('node', NULL)),
       ),
       array(
         TRUE,
-        'node.view',
+        'entity.node.canonical',
         array(array('node', $mock_node)),
       ),
     );
diff --git a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
index 162fd51..11f1d12 100644
--- a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
+++ b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
@@ -157,8 +157,8 @@ public function getPluginId() {
   /**
    * {@inheritdoc}
    */
-  public function isHidden() {
-    return (bool) $this->get('hidden')->value;
+  public function isEnabled() {
+    return (bool) $this->get('enabled')->value;
   }
 
   /**
@@ -204,7 +204,7 @@ protected function getPluginDefinition() {
     $definition['id'] = $this->getPluginId();
     $definition['metadata'] = array('entity_id' => $this->id());
     $definition['form_class'] = '\Drupal\menu_link_content\Form\MenuLinkContentForm';
-    $definition['hidden'] = $this->isHidden() ? 1 : 0;
+    $definition['enabled'] = $this->isEnabled() ? 1 : 0;
     $definition['expanded'] = $this->isExpanded() ? 1 : 0;
     $definition['provider'] = 'menu_link_content';
     $definition['discovered'] = 0;
@@ -366,13 +366,19 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         'weight' => 0,
       ));
 
-    // @todo We manually create a form element for this, since the form logic is
-    // is inverted to show enabled. Flip this to a status field and use the
-    // normal entity Boolean widget. https://www.drupal.org/node/2305707
-    $fields['hidden'] = BaseFieldDefinition::create('boolean')
-      ->setLabel(t('Hidden'))
-      ->setDescription(t('A flag for whether the link should be hidden in menus or rendered normally.'))
-      ->setSetting('default_value', FALSE);
+    $fields['enabled'] = BaseFieldDefinition::create('boolean')
+      ->setLabel(t('Enabled'))
+      ->setDescription(t('A flag for whether the link should be enabled in menus or hidden.'))
+      ->setSetting('default_value', TRUE)
+      ->setDisplayOptions('view', array(
+        'label' => 'hidden',
+        'type' => 'boolean',
+        'weight' => 0,
+      ))
+      ->setDisplayOptions('form', array(
+        'settings' => array('display_label' => TRUE),
+        'weight' => 0,
+      ));
 
     $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
diff --git a/core/modules/menu_link_content/src/Form/MenuLinkContentForm.php b/core/modules/menu_link_content/src/Form/MenuLinkContentForm.php
index 35f6d8e..ce2d81d 100644
--- a/core/modules/menu_link_content/src/Form/MenuLinkContentForm.php
+++ b/core/modules/menu_link_content/src/Form/MenuLinkContentForm.php
@@ -213,7 +213,7 @@ protected function extractUrl($url) {
   public function extractFormValues(array &$form, FormStateInterface $form_state) {
     $new_definition = array();
     $new_definition['expanded'] = !$form_state->isValueEmpty(array('expanded', 'value')) ? 1 : 0;
-    $new_definition['hidden'] = $form_state->isValueEmpty('enabled') ? 1 : 0;
+    $new_definition['enabled'] = !$form_state->isValueEmpty(array('enabled', 'value')) ? 1 : 0;
     list($menu_name, $parent) = explode(':', $form_state->getValue('menu_parent'), 2);
     if (!empty($menu_name)) {
       $new_definition['menu_name'] = $menu_name;
@@ -294,14 +294,6 @@ public function form(array $form, FormStateInterface $form_state) {
       '#access' => !empty($language_configuration['language_show']),
     );
 
-    $form['enabled'] = array(
-      '#type' => 'checkbox',
-      '#title' => $this->t('Enable menu link'),
-      '#description' => $this->t('Menu links that are not enabled will not be listed in any menu.'),
-      '#default_value' => !$this->entity->isHidden(),
-      '#weight' => 0,
-    );
-
     $default = $this->entity->getMenuName() . ':' . $this->entity->getParentId();
     $form['menu_parent'] = $this->menuParentSelector->parentSelectElement($default, $this->entity->getPluginId());
     $form['menu_parent']['#weight'] = 10;
@@ -342,7 +334,7 @@ public function buildEntity(array $form, FormStateInterface $form_state) {
 
     $entity->parent->value = $new_definition['parent'];
     $entity->menu_name->value = $new_definition['menu_name'];
-    $entity->hidden->value = (bool) $new_definition['hidden'];
+    $entity->enabled->value = (bool) $new_definition['enabled'];
     $entity->expanded->value = $new_definition['expanded'];
 
     $entity->url->value = $new_definition['url'];
diff --git a/core/modules/menu_link_content/src/MenuLinkContentInterface.php b/core/modules/menu_link_content/src/MenuLinkContentInterface.php
index 1f56715..98922e9 100644
--- a/core/modules/menu_link_content/src/MenuLinkContentInterface.php
+++ b/core/modules/menu_link_content/src/MenuLinkContentInterface.php
@@ -48,8 +48,8 @@ public function getRouteParameters();
    *
    * @param array $route_parameters
    *   The route parameters, usually derived from the path entered by the
-   *   administrator. For example, for a link to a node with route 'node.view'
-   *   the route needs the node ID as a parameter:
+   *   administrator. For example, for a link to a node with route
+   *   'entity.node.canonical' the route needs the node ID as a parameter:
    *   @code
    *     array('node' => 2)
    *   @endcode
@@ -118,12 +118,12 @@ public function getDescription();
   public function getPluginId();
 
   /**
-   * Returns whether the menu link is marked as hidden.
+   * Returns whether the menu link is marked as enabled.
    *
    * @return bool
-   *   TRUE if is not enabled, otherwise FALSE.
+   *   TRUE if is enabled, otherwise FALSE.
    */
-  public function isHidden();
+  public function isEnabled();
 
   /**
    * Returns whether the menu link is marked as always expanded.
diff --git a/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php b/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php
index 9522841..ea47019 100644
--- a/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php
+++ b/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php
@@ -37,7 +37,7 @@ class MenuLinkContent extends MenuLinkBase implements ContainerFactoryPluginInte
     'parent' => 1,
     'weight' => 1,
     'expanded' => 1,
-    'hidden' => 1,
+    'enabled' => 1,
     'title' => 1,
     'description' => 1,
     'route_name' => 1,
diff --git a/core/modules/menu_ui/menu_ui.module b/core/modules/menu_ui/menu_ui.module
index 83528b5..07fcb81 100644
--- a/core/modules/menu_ui/menu_ui.module
+++ b/core/modules/menu_ui/menu_ui.module
@@ -197,7 +197,7 @@ function menu_ui_node_save(EntityInterface $node) {
     if (trim($definition['title'])) {
       if (!empty($definition['entity_id'])) {
         $entity = entity_load('menu_link_content', $definition['entity_id']);
-        $entity->hidden->value = 0;
+        $entity->enabled->value = 1;
         $entity->title->value = trim($definition['title']);
         $entity->description->value = trim($definition['description']);
         $entity->menu_name->value = $definition['menu_name'];
@@ -209,12 +209,12 @@ function menu_ui_node_save(EntityInterface $node) {
         $entity = entity_create('menu_link_content', array(
           'title' => trim($definition['title']),
           'description' => trim($definition['description']),
-          'route_name' => 'node.view',
+          'route_name' => 'entity.node.canonical',
           'route_parameters' => array('node' => $node->id()),
           'menu_name' => $definition['menu_name'],
           'parent' => $definition['parent'],
           'weight' => isset($definition['weight']) ? $definition['weight'] : 0,
-          'hidden' => 0,
+          'enabled' => 1,
           'bundle' => 'menu_link_content',
           'langcode' => $node->getUntranslated()->language()->id,
         ));
@@ -233,7 +233,7 @@ function menu_ui_node_predelete(EntityInterface $node) {
   // Delete all MenuLinkContent links that point to this node.
   /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */
   $menu_link_manager = \Drupal::service('plugin.manager.menu.link');
-  $result = $menu_link_manager->loadLinksByRoute('node.view', array('node' => $node->id()));
+  $result = $menu_link_manager->loadLinksByRoute('entity.node.canonical', array('node' => $node->id()));
 
   if (!empty($result)) {
     foreach ($result as $id => $instance) {
@@ -259,7 +259,7 @@ function menu_ui_node_prepare_form(NodeInterface $node, $operation, FormStateInt
       $type_menus = $node_type_config->get('available_menus');
       if (in_array($menu_name, $type_menus)) {
         $query = \Drupal::entityQuery('menu_link_content')
-          ->condition('route_name', 'node.view')
+          ->condition('route_name', 'entity.node.canonical')
           ->condition('route_parameters', serialize(array('node' => $node->id())))
           ->condition('menu_name', $menu_name)
           ->sort('id', 'ASC')
@@ -271,7 +271,7 @@ function menu_ui_node_prepare_form(NodeInterface $node, $operation, FormStateInt
       // Check all allowed menus if a link does not exist in the default menu.
       if (!$id && !empty($type_menus)) {
         $query = \Drupal::entityQuery('menu_link_content')
-          ->condition('route_name', 'node.view')
+          ->condition('route_name', 'entity.node.canonical')
           ->condition('route_parameters', serialize(array('node' => $node->id())))
           ->condition('menu_name', array_values($type_menus), 'IN')
           ->sort('id', 'ASC')
diff --git a/core/modules/menu_ui/src/MenuForm.php b/core/modules/menu_ui/src/MenuForm.php
index 302a9e2..2b3758f 100644
--- a/core/modules/menu_ui/src/MenuForm.php
+++ b/core/modules/menu_ui/src/MenuForm.php
@@ -265,9 +265,9 @@ protected function buildOverviewTreeForm($tree, $delta) {
       if ($link) {
         $id = 'menu_plugin_id:' . $link->getPluginId();
         $form[$id]['#item'] = $element;
-        $form[$id]['#attributes'] = $link->isHidden() ? array('class' => array('menu-disabled')) : array('class' => array('menu-enabled'));
+        $form[$id]['#attributes'] = $link->isEnabled() ? array('class' => array('menu-enabled')) : array('class' => array('menu-disabled'));
         $form[$id]['title']['#markup'] = $this->linkGenerator->generateFromUrl($link->getTitle(), $link->getUrlObject(), $link->getOptions());
-        if ($link->isHidden()) {
+        if (!$link->isEnabled()) {
           $form[$id]['title']['#markup'] .= ' (' . $this->t('disabled') . ')';
         }
         elseif (($url = $link->getUrlObject()) && !$url->isExternal() && $url->getRouteName() == 'user.page') {
@@ -278,7 +278,7 @@ protected function buildOverviewTreeForm($tree, $delta) {
           '#type' => 'checkbox',
           '#title' => $this->t('Enable @title menu link', array('@title' => $link->getTitle())),
           '#title_display' => 'invisible',
-          '#default_value' => !$link->isHidden(),
+          '#default_value' => $link->isEnabled(),
         );
         $form[$id]['weight'] = array(
           '#type' => 'weight',
@@ -378,13 +378,7 @@ protected function submitOverviewForm(array $complete_form, FormStateInterface $
         // Update any fields that have changed in this menu item.
         foreach ($fields as $field) {
           if ($element[$field]['#value'] != $element[$field]['#default_value']) {
-            // Hidden is a special case, the form value needs to be reversed.
-            if ($field == 'enabled') {
-              $updated_values['hidden'] = $element['enabled']['#value'] ? 0 : 1;
-            }
-            else {
-              $updated_values[$field] = $element[$field]['#value'];
-            }
+            $updated_values[$field] = $element[$field]['#value'];
           }
         }
         if ($updated_values) {
diff --git a/core/modules/menu_ui/src/Tests/MenuNodeTest.php b/core/modules/menu_ui/src/Tests/MenuNodeTest.php
index 9629b2e..e08e1a8 100644
--- a/core/modules/menu_ui/src/Tests/MenuNodeTest.php
+++ b/core/modules/menu_ui/src/Tests/MenuNodeTest.php
@@ -126,7 +126,7 @@ function testMenuNodeFormWidget() {
 
     // Add a menu link to the Administration menu.
     $item = entity_create('menu_link_content', array(
-      'route_name' => 'node.view',
+      'route_name' => 'entity.node.canonical',
       'route_parameters' => array('node' => $node->id()),
       'title' => $this->randomMachineName(16),
       'menu_name' => 'admin',
@@ -150,7 +150,7 @@ function testMenuNodeFormWidget() {
     $child_node = $this->drupalCreateNode(array('type' => 'article'));
     // Assign a menu link to the second node, being a child of the first one.
     $child_item = entity_create('menu_link_content', array(
-      'route_name' => 'node.view',
+      'route_name' => 'entity.node.canonical',
       'route_parameters' => array('node' => $child_node->id()),
       'title' => $this->randomMachineName(16),
       'parent' => $item->getPluginId(),
diff --git a/core/modules/menu_ui/src/Tests/MenuTest.php b/core/modules/menu_ui/src/Tests/MenuTest.php
index 7065506..a97b8ab 100644
--- a/core/modules/menu_ui/src/Tests/MenuTest.php
+++ b/core/modules/menu_ui/src/Tests/MenuTest.php
@@ -318,7 +318,7 @@ function doMenuTests() {
     $this->assertMenuLink($item6->getPluginId(), array(
       'children' => array(),
       'parents' => array($item6->getPluginId(), $item4->getPluginId()),
-      'route_name' => 'node.view',
+      'route_name' => 'entity.node.canonical',
       'route_parameters' => array('node' => $node5->id()),
       'url' => '',
       // See above.
@@ -400,7 +400,7 @@ function doMenuTests() {
     $item5->save();
 
     // Verify in the database.
-    $this->assertMenuLink($item1->getPluginId(), array('hidden' => 0));
+    $this->assertMenuLink($item1->getPluginId(), array('enabled' => 1));
 
     // Add an external link.
     $item7 = $this->addMenuLink('', 'http://drupal.org', $menu_name);
@@ -529,7 +529,7 @@ function addMenuLink($parent = '', $path = '<front>', $menu_name = 'tools', $exp
       'url' => $path,
       'title[0][value]' => $title,
       'description[0][value]' => '',
-      'enabled' => 1,
+      'enabled[value]' => 1,
       'expanded[value]' => $expanded,
       'menu_parent' =>  $menu_name . ':' . $parent,
       'weight[0][value]' => $weight,
@@ -711,12 +711,12 @@ function toggleMenuLink(MenuLinkContent $item) {
    */
   function disableMenuLink(MenuLinkContent $item) {
     $mlid = $item->id();
-    $edit['enabled'] = FALSE;
+    $edit['enabled[value]'] = FALSE;
     $this->drupalPostForm("admin/structure/menu/item/$mlid/edit", $edit, t('Save'));
 
     // Unlike most other modules, there is no confirmation message displayed.
     // Verify in the database.
-    $this->assertMenuLink($item->getPluginId(), array('hidden' => 1));
+    $this->assertMenuLink($item->getPluginId(), array('enabled' => 0));
   }
 
   /**
@@ -727,11 +727,11 @@ function disableMenuLink(MenuLinkContent $item) {
    */
   function enableMenuLink(MenuLinkContent $item) {
     $mlid = $item->id();
-    $edit['enabled'] = TRUE;
+    $edit['enabled[value]'] = TRUE;
     $this->drupalPostForm("admin/structure/menu/item/$mlid/edit", $edit, t('Save'));
 
     // Verify in the database.
-    $this->assertMenuLink($item->getPluginId(), array('hidden' => 0));
+    $this->assertMenuLink($item->getPluginId(), array('enabled' => 1));
   }
 
   /**
diff --git a/core/modules/menu_ui/src/Tests/MenuWebTestBase.php b/core/modules/menu_ui/src/Tests/MenuWebTestBase.php
index 6069197..38fb799 100644
--- a/core/modules/menu_ui/src/Tests/MenuWebTestBase.php
+++ b/core/modules/menu_ui/src/Tests/MenuWebTestBase.php
@@ -68,6 +68,11 @@ function assertMenuLink($menu_plugin_id, array $expected_item) {
       unset($expected_item['langcode']);
     }
 
+    if (isset($expected_item['enabled']) && $entity) {
+      $this->assertEqual($entity->enabled->value, $expected_item['enabled']);
+      unset($expected_item['enabled']);
+    }
+
     foreach ($expected_item as $key => $value) {
       $this->assertTrue(isset($definition[$key]));
       $this->assertEqual($definition[$key], $value);
diff --git a/core/modules/migrate/src/Row.php b/core/modules/migrate/src/Row.php
index 00452ad..4be9712 100644
--- a/core/modules/migrate/src/Row.php
+++ b/core/modules/migrate/src/Row.php
@@ -224,7 +224,7 @@ public function getDestination() {
    * @code
    * $this->destination['foo']['bar'] = 'baz';
    * $this->rawDestination['foo/bar'] = 'baz';
-   * @encode
+   * @endcode
    *
    * @return array
    *   The raw destination values.
diff --git a/core/modules/node/node.links.contextual.yml b/core/modules/node/node.links.contextual.yml
index 91159bd..f1d8a9e 100644
--- a/core/modules/node/node.links.contextual.yml
+++ b/core/modules/node/node.links.contextual.yml
@@ -1,10 +1,10 @@
-node.page_edit:
-  route_name: node.page_edit
+entity.node.edit_form:
+  route_name: entity.node.edit_form
   group: node
   title: Edit
 
-node.delete_confirm:
-  route_name: node.delete_confirm
+entity.node.delete_form:
+  route_name: entity.node.delete_form
   group: node
   title: Delete
   weight: 10
diff --git a/core/modules/node/node.links.task.yml b/core/modules/node/node.links.task.yml
index c61ad90..88271e8 100644
--- a/core/modules/node/node.links.task.yml
+++ b/core/modules/node/node.links.task.yml
@@ -1,25 +1,25 @@
-node.view:
-  route_name: node.view
-  base_route: node.view
+entity.node.canonical:
+  route_name: entity.node.canonical
+  base_route: entity.node.canonical
   title: 'View'
-node.page_edit:
-  route_name: node.page_edit
-  base_route: node.view
+entity.node.edit_form:
+  route_name: entity.node.edit_form
+  base_route: entity.node.canonical
   title: Edit
-node.delete_confirm:
-  route_name: node.delete_confirm
-  base_route: node.view
+entity.node.delete_form:
+  route_name: entity.node.delete_form
+  base_route: entity.node.canonical
   title: Delete
   weight: 10
-node.revision_overview:
-  route_name: node.revision_overview
-  base_route: node.view
+entity.node.version_history:
+  route_name: entity.node.version_history
+  base_route: entity.node.canonical
   title: 'Revisions'
   weight: 20
-node.type_edit:
+entity.node_type.edit_form:
   title: 'Edit'
-  route_name: node.type_edit
-  base_route: node.type_edit
+  route_name: entity.node_type.edit_form
+  base_route: entity.node_type.edit_form
 node.overview_types:
   title: List
   route_name: node.overview_types
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index ba529e0..fefd6d5 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -138,10 +138,10 @@ function node_help($route_name, RouteMatchInterface $route_match) {
       return '<p>' . t('Content items can be displayed using different view modes: Teaser, Full content, Print, RSS, etc. <em>Teaser</em> is a short format that is typically used in lists of multiple content items. <em>Full content</em> is typically used when the content is displayed on its own page.') . '</p>' .
         '<p>' . t('Here, you can define which fields are shown and hidden when %type content is displayed in each view mode, and define how the fields are displayed in each view mode.', array('%type' => $type->label())) . '</p>';
 
-    case 'node.revision_overview':
+    case 'entity.node.version_history':
       return '<p>' . t('Revisions allow you to track differences between multiple versions of your content, and revert back to older versions.') . '</p>';
 
-    case 'node.page_edit':
+    case 'entity.node.edit_form':
       $node = $route_match->getParameter('node');
       $type = $node->getType();
       return (!empty($type->help) ? Xss::filterAdmin($type->help) : '');
@@ -545,7 +545,7 @@ function node_revision_delete($revision_id) {
  */
 function node_is_page(NodeInterface $node) {
   $route_match = \Drupal::routeMatch();
-  if ($route_match->getRouteName() == 'node.view') {
+  if ($route_match->getRouteName() == 'entity.node.canonical') {
     $page_node = $route_match->getParameter('node');
   }
   return (!empty($page_node) ? $page_node->id() == $node->id() : FALSE);
diff --git a/core/modules/node/node.routing.yml b/core/modules/node/node.routing.yml
index 86278f2..f9523d4 100644
--- a/core/modules/node/node.routing.yml
+++ b/core/modules/node/node.routing.yml
@@ -6,7 +6,7 @@ node.multiple_delete_confirm:
   requirements:
     _permission: 'administer nodes'
 
-node.page_edit:
+entity.node.edit_form:
   path: '/node/{node}/edit'
   defaults:
     _entity_form: 'node.edit'
@@ -37,7 +37,7 @@ node.add:
   options:
     _node_operation_route: TRUE
 
-node.view:
+entity.node.canonical:
   path: '/node/{node}'
   defaults:
     _content: '\Drupal\node\Controller\NodeViewController::view'
@@ -45,7 +45,7 @@ node.view:
   requirements:
     _entity_access: 'node.view'
 
-node.delete_confirm:
+entity.node.delete_form:
   path: '/node/{node}/delete'
   defaults:
     _entity_form: 'node.delete'
@@ -55,7 +55,7 @@ node.delete_confirm:
   options:
     _node_operation_route: TRUE
 
-node.revision_overview:
+entity.node.version_history:
   path: '/node/{node}/revisions'
   defaults:
     _title: 'Revisions'
@@ -110,14 +110,14 @@ node.type_add:
   requirements:
     _permission: 'administer content types'
 
-node.type_edit:
+entity.node_type.edit_form:
   path: '/admin/structure/types/manage/{node_type}'
   defaults:
     _entity_form: 'node_type.edit'
   requirements:
     _permission: 'administer content types'
 
-node.type_delete_confirm:
+entity.node_type.delete_form:
   path: '/admin/structure/types/manage/{node_type}/delete'
   defaults:
     _entity_form: 'node_type.delete'
diff --git a/core/modules/node/src/Controller/NodeController.php b/core/modules/node/src/Controller/NodeController.php
index e40cf7e..e983eee 100644
--- a/core/modules/node/src/Controller/NodeController.php
+++ b/core/modules/node/src/Controller/NodeController.php
@@ -173,7 +173,7 @@ public function revisionOverview(NodeInterface $node) {
             '#theme' => 'username',
             '#account' => $revision_author,
           );
-          $row[] = array('data' => $this->t('!date by !username', array('!date' => $this->l($this->dateFormatter->format($revision->revision_timestamp->value, 'short'), 'node.view', array('node' => $node->id())), '!username' => drupal_render($username)))
+          $row[] = array('data' => $this->t('!date by !username', array('!date' => $this->l($this->dateFormatter->format($revision->revision_timestamp->value, 'short'), 'entity.node.canonical', array('node' => $node->id())), '!username' => drupal_render($username)))
             . (($revision->revision_log->value != '') ? '<p class="revision-log">' . Xss::filter($revision->revision_log->value) . '</p>' : ''),
             'class' => array('revision-current'));
           $row[] = array('data' => String::placeholder($this->t('current revision')), 'class' => array('revision-current'));
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index 1cdc5c0..928976b 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -51,11 +51,11 @@
  *   bundle_entity_type = "node_type",
  *   permission_granularity = "bundle",
  *   links = {
- *     "canonical" = "node.view",
- *     "delete-form" = "node.delete_confirm",
- *     "edit-form" = "node.page_edit",
- *     "version-history" = "node.revision_overview",
- *     "admin-form" = "node.type_edit"
+ *     "canonical" = "entity.node.canonical",
+ *     "delete-form" = "entity.node.delete_form",
+ *     "edit-form" = "entity.node.edit_form",
+ *     "version-history" = "entity.node.version_history",
+ *     "admin-form" = "entity.node_type.edit_form"
  *   }
  * )
  */
diff --git a/core/modules/node/src/Entity/NodeType.php b/core/modules/node/src/Entity/NodeType.php
index 91ce4f7..57fc6f6 100644
--- a/core/modules/node/src/Entity/NodeType.php
+++ b/core/modules/node/src/Entity/NodeType.php
@@ -35,9 +35,8 @@
  *     "label" = "name"
  *   },
  *   links = {
- *     "add-form" = "node.add",
- *     "edit-form" = "node.type_edit",
- *     "delete-form" = "node.type_delete_confirm"
+ *     "edit-form" = "entity.node_type.edit_form",
+ *     "delete-form" = "entity.node_type.delete_form"
  *   }
  * )
  */
diff --git a/core/modules/node/src/Form/NodeRevisionDeleteForm.php b/core/modules/node/src/Form/NodeRevisionDeleteForm.php
index dbbe550..352cef0 100644
--- a/core/modules/node/src/Form/NodeRevisionDeleteForm.php
+++ b/core/modules/node/src/Form/NodeRevisionDeleteForm.php
@@ -94,7 +94,7 @@ public function getQuestion() {
    * {@inheritdoc}
    */
   public function getCancelUrl() {
-    return new Url('node.revision_overview', array('node' => $this->revision->id()));
+    return new Url('entity.node.version_history', array('node' => $this->revision->id()));
   }
 
   /**
@@ -124,12 +124,12 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
     $node_type = $this->nodeTypeStorage->load($this->revision->bundle())->label();
     drupal_set_message(t('Revision from %revision-date of @type %title has been deleted.', array('%revision-date' => format_date($this->revision->getRevisionCreationTime()), '@type' => $node_type, '%title' => $this->revision->label())));
     $form_state->setRedirect(
-      'node.view',
+      'entity.node.canonical',
       array('node' => $this->revision->id())
     );
     if ($this->connection->query('SELECT COUNT(DISTINCT vid) FROM {node_field_revision} WHERE nid = :nid', array(':nid' => $this->revision->id()))->fetchField() > 1) {
       $form_state->setRedirect(
-        'node.revision_overview',
+        'entity.node.version_history',
         array('node' => $this->revision->id())
       );
     }
diff --git a/core/modules/node/src/Form/NodeRevisionRevertForm.php b/core/modules/node/src/Form/NodeRevisionRevertForm.php
index bc5a302..d6e748e 100644
--- a/core/modules/node/src/Form/NodeRevisionRevertForm.php
+++ b/core/modules/node/src/Form/NodeRevisionRevertForm.php
@@ -70,7 +70,7 @@ public function getQuestion() {
    * {@inheritdoc}
    */
   public function getCancelUrl() {
-    return new Url('node.revision_overview', array('node' => $this->revision->id()));
+    return new Url('entity.node.version_history', array('node' => $this->revision->id()));
   }
 
   /**
@@ -116,7 +116,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
     $this->logger('content')->notice('@type: reverted %title revision %revision.', array('@type' => $this->revision->bundle(), '%title' => $this->revision->label(), '%revision' => $this->revision->getRevisionId()));
     drupal_set_message(t('@type %title has been reverted back to the revision from %revision-date.', array('@type' => node_get_type_label($this->revision), '%title' => $this->revision->label(), '%revision-date' => format_date($original_revision_timestamp))));
     $form_state->setRedirect(
-      'node.revision_overview',
+      'entity.node.version_history',
       array('node' => $this->revision->id())
     );
   }
diff --git a/core/modules/node/src/NodeForm.php b/core/modules/node/src/NodeForm.php
index 0965b16..a2ec826 100644
--- a/core/modules/node/src/NodeForm.php
+++ b/core/modules/node/src/NodeForm.php
@@ -450,7 +450,7 @@ public function save(array $form, FormStateInterface $form_state) {
       $form_state['nid'] = $node->id();
       if ($node->access('view')) {
         $form_state->setRedirect(
-          'node.view',
+          'entity.node.canonical',
           array('node' => $node->id())
         );
       }
diff --git a/core/modules/search/search.links.menu.yml b/core/modules/search/search.links.menu.yml
index da872a9..2bb0a18 100644
--- a/core/modules/search/search.links.menu.yml
+++ b/core/modules/search/search.links.menu.yml
@@ -1,7 +1,7 @@
 search.view:
   title: Search
   route_name: search.view
-  hidden: 1
+  enabled: 0
 search.settings:
   title: 'Search pages'
   parent: system.admin_config_search
diff --git a/core/modules/system/entity.api.php b/core/modules/system/entity.api.php
index 734814e..dcfc314 100644
--- a/core/modules/system/entity.api.php
+++ b/core/modules/system/entity.api.php
@@ -319,7 +319,7 @@
  *   entity interface you have defined as its parameter, and returns routing
  *   information for the entity page; see node_uri() for an example. You will
  *   also need to add a corresponding route to your module's routing.yml file;
- *   see the node.view route in node.routing.yml for an example, and see
+ *   see the entity.node.canonical route in node.routing.yml for an example, and see
  *   @ref sec_routes below for some notes.
  * - Define routing and links for the various URLs associated with the entity.
  *   These go into the 'links' annotation, with the link type as the key, and
diff --git a/core/modules/system/src/Controller/SystemController.php b/core/modules/system/src/Controller/SystemController.php
index c811e85..605b0a9 100644
--- a/core/modules/system/src/Controller/SystemController.php
+++ b/core/modules/system/src/Controller/SystemController.php
@@ -120,7 +120,7 @@ public function overview($link_id) {
     }
     // Load all menu links below it.
     $parameters = new MenuTreeParameters();
-    $parameters->setRoot($link_id)->excludeRoot()->setTopLevelOnly()->excludeHiddenLinks();
+    $parameters->setRoot($link_id)->excludeRoot()->setTopLevelOnly()->onlyEnabledLinks();
     $tree = $this->menuLinkTree->load(NULL, $parameters);
     $manipulators = array(
       array('callable' => 'menu.default_tree_manipulators:checkAccess'),
diff --git a/core/modules/system/src/SystemManager.php b/core/modules/system/src/SystemManager.php
index 00f97aa..d8786b2 100644
--- a/core/modules/system/src/SystemManager.php
+++ b/core/modules/system/src/SystemManager.php
@@ -217,7 +217,7 @@ public function getAdminBlock(MenuLinkInterface $instance) {
     // Only find the children of this link.
     $link_id = $instance->getPluginId();
     $parameters = new MenuTreeParameters();
-    $parameters->setRoot($link_id)->excludeRoot()->setTopLevelOnly()->excludeHiddenLinks();
+    $parameters->setRoot($link_id)->excludeRoot()->setTopLevelOnly()->onlyEnabledLinks();
     $tree = $this->menuTree->load(NULL, $parameters);
     $manipulators = array(
       array('callable' => 'menu.default_tree_manipulators:checkAccess'),
diff --git a/core/modules/system/src/Tests/Menu/BreadcrumbTest.php b/core/modules/system/src/Tests/Menu/BreadcrumbTest.php
index 6661fb4..fe6a72e 100644
--- a/core/modules/system/src/Tests/Menu/BreadcrumbTest.php
+++ b/core/modules/system/src/Tests/Menu/BreadcrumbTest.php
@@ -170,7 +170,7 @@ function testBreadCrumbs() {
         'type' => $type,
         'title' => $title,
         'menu' => array(
-          'hidden' => 0,
+          'enabled' => 1,
           'title' => 'Parent ' . $title,
           'description' => '',
           'menu_name' => $menu,
@@ -243,6 +243,7 @@ function testBreadCrumbs() {
         'title[0][value]' => "$name link",
         'url' => "taxonomy/term/{$term->id()}",
         'menu_parent' => "$menu:{$parent_mlid}",
+        'enabled[value]' => 1,
       );
       $this->drupalPostForm("admin/structure/menu/manage/$menu/add", $edit, t('Save'));
       $menu_links = entity_load_multiple_by_properties('menu_link_content', array('title' => $edit['title[0][value]'], 'route_name' => 'taxonomy.term_page', 'route_parameters' => serialize(array('taxonomy_term' => $term->id()))));
diff --git a/core/modules/system/src/Tests/Menu/MenuTreeStorageTest.php b/core/modules/system/src/Tests/Menu/MenuTreeStorageTest.php
index b1ebda6..a923e9b 100644
--- a/core/modules/system/src/Tests/Menu/MenuTreeStorageTest.php
+++ b/core/modules/system/src/Tests/Menu/MenuTreeStorageTest.php
@@ -181,21 +181,21 @@ public function testMenuLinkMoving() {
   }
 
   /**
-   * Tests with hidden child links.
+   * Tests with disabled child links.
    */
-  public function testMenuHiddenChildLinks() {
+  public function testMenuDisabledChildLinks() {
     // Add some links with parent on the previous one and test some values.
     // <tools>
     // - test1
-    // -- test2 (hidden)
+    // -- test2 (disabled)
 
     $this->addMenuLink('test1', '');
     $this->assertMenuLink('test1', array('has_children' => 0, 'depth' => 1));
 
-    $this->addMenuLink('test2', 'test1', '<front>', array(), 'tools', array('hidden' => 1));
+    $this->addMenuLink('test2', 'test1', '<front>', array(), 'tools', array('enabled' => 0));
     // The 1st link does not have any visible children, so has_children is 0.
     $this->assertMenuLink('test1', array('has_children' => 0, 'depth' => 1));
-    $this->assertMenuLink('test2', array('has_children' => 0, 'depth' => 2, 'hidden' => 1), array('test1'));
+    $this->assertMenuLink('test2', array('has_children' => 0, 'depth' => 2, 'enabled' => 0), array('test1'));
 
     // Add more links with parent on the previous one.
     // <footer>
@@ -203,7 +203,7 @@ public function testMenuHiddenChildLinks() {
     // ===============
     // <tools>
     // - test1
-    // -- test2 (hidden)
+    // -- test2 (disabled)
     // --- test3
     // ---- test4
     // ----- test5
@@ -367,7 +367,7 @@ protected function moveMenuLink($id, $new_parent) {
    * @param array $parents
    *   An ordered array of the IDs of the menu links that are the parents.
    * @param array $children
-   *   Array of child IDs that are visible (hidden == 0).
+   *   Array of child IDs that are visible (enabled == 1).
    */
   protected function assertMenuLink($id, array $expected_properties, array $parents = array(), array $children = array()) {
     $query = $this->connection->select('menu_tree');
diff --git a/core/modules/system/src/Tests/Routing/MockRouteProvider.php b/core/modules/system/src/Tests/Routing/MockRouteProvider.php
index c011b6d..dce1b27 100644
--- a/core/modules/system/src/Tests/Routing/MockRouteProvider.php
+++ b/core/modules/system/src/Tests/Routing/MockRouteProvider.php
@@ -47,8 +47,8 @@ public function getRouteCollectionForRequest(Request $request) {
   /**
    * Implements \Symfony\Cmf\Component\Routing\RouteProviderInterface::getRouteByName().
    */
-  public function getRouteByName($name, $parameters = array()) {
-    $routes = $this->getRoutesByNames(array($name), $parameters);
+  public function getRouteByName($name) {
+    $routes = $this->getRoutesByNames(array($name));
     if (empty($routes)) {
       throw new RouteNotFoundException(sprintf('Route "%s" does not exist.', $name));
     }
@@ -59,7 +59,7 @@ public function getRouteByName($name, $parameters = array()) {
   /**
    * Implements \Symfony\Cmf\Component\Routing\RouteProviderInterface::getRoutesByName().
    */
-  public function getRoutesByNames($names, $parameters = array()) {
+  public function getRoutesByNames($names) {
     $routes = array();
     foreach ($names as $name) {
       $routes[] = $this->routes->get($name);
diff --git a/core/modules/system/src/Tests/System/AdminTest.php b/core/modules/system/src/Tests/System/AdminTest.php
index f5609c7..a52cffa 100644
--- a/core/modules/system/src/Tests/System/AdminTest.php
+++ b/core/modules/system/src/Tests/System/AdminTest.php
@@ -128,7 +128,7 @@ protected function getTopLevelMenuLinks() {
 
     // The system.admin link is normally the parent of all top-level admin links.
     $parameters = new MenuTreeParameters();
-    $parameters->setRoot('system.admin')->excludeRoot()->setTopLevelOnly()->excludeHiddenLinks();
+    $parameters->setRoot('system.admin')->excludeRoot()->setTopLevelOnly()->onlyEnabledLinks();
     $tree = $menu_tree->load(NULL, $parameters);
     $manipulators = array(
       array('callable' => 'menu.default_tree_manipulators:checkAccess'),
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 57a2e24..86336f6 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -193,11 +193,14 @@ function callback_queue_worker($queue_item_data) {
  * specify their default values. The values returned by this hook will be
  * merged with the elements returned by form constructor implementations and so
  * can return defaults for any Form APIs keys in addition to those explicitly
- * documented by \Drupal\Core\Render\ElementInfoInterface::getInfo().
+ * documented by \Drupal\Core\Render\ElementInfoManagerInterface::getInfo().
  *
  * @return array
  *   An associative array with structure identical to that of the return value
- *   of \Drupal\Core\Render\ElementInfoInterface::getInfo().
+ *   of \Drupal\Core\Render\ElementInfoManagerInterface::getInfo().
+ *
+ * @deprecated Use an annotated class instead, see
+ *   \Drupal\Core\Render\Element\ElementInterface.
  *
  * @see hook_element_info_alter()
  * @see system_element_info()
@@ -217,7 +220,7 @@ function hook_element_info() {
  *
  * @param array $types
  *   An associative array with structure identical to that of the return value
- *   of \Drupal\Core\Render\ElementInfoInterface::getInfo().
+ *   of \Drupal\Core\Render\ElementInfoManagerInterface::getInfo().
  *
  * @see hook_element_info()
  */
@@ -411,9 +414,10 @@ function hook_page_build(&$page) {
  *   patten is the route name followed by a dot and a unique suffix. For
  *   example, an additional logout link might have a machine name of
  *   user.logout.navigation, and default links provided to edit the article and
- *   page content types could use machine names node.type_edit.article and
- *   node.type_edit.page. Since the machine name may be arbitrary, you should
- *   never write code that assumes it is identical to the route name.
+ *   page content types could use machine names
+ *   entity.node_type.edit_form.article and entity.node_type.edit_form.page.
+ *   Since the machine name may be arbitrary, you should never write code that
+ *   assumes it is identical to the route name.
  *
  *   The value corresponding to each machine name key is an associative array
  *   that may contain the following key-value pairs:
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index cad83e5..10e291f 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -368,16 +368,6 @@ function system_element_info() {
     '#pre_render' => array('form_pre_render_image_button'),
     '#theme_wrappers' => array('input__image_button'),
   );
-  $types['textfield'] = array(
-    '#input' => TRUE,
-    '#size' => 60,
-    '#maxlength' => 128,
-    '#autocomplete_route_name' => FALSE,
-    '#process' => array('form_process_autocomplete', 'ajax_process_form', 'form_process_pattern', 'form_process_group'),
-    '#pre_render' => array('form_pre_render_textfield', 'form_pre_render_group'),
-    '#theme' => 'input__textfield',
-    '#theme_wrappers' => array('form_element'),
-  );
   $types['tel'] = array(
     '#input' => TRUE,
     '#size' => 30,
@@ -448,19 +438,6 @@ function system_element_info() {
     '#theme' => 'input__color',
     '#theme_wrappers' => array('form_element'),
   );
-  $types['machine_name'] = array(
-    '#input' => TRUE,
-    '#default_value' => NULL,
-    '#required' => TRUE,
-    '#maxlength' => 64,
-    '#size' => 60,
-    '#autocomplete_route_name' => FALSE,
-    '#process' => array('form_process_machine_name', 'form_process_autocomplete', 'ajax_process_form'),
-    '#element_validate' => array('form_validate_machine_name'),
-    '#pre_render' => array('form_pre_render_textfield'),
-    '#theme' => 'input__textfield',
-    '#theme_wrappers' => array('form_element'),
-  );
   $types['password'] = array(
     '#input' => TRUE,
     '#size' => 60,
@@ -586,9 +563,6 @@ function system_element_info() {
   $types['value'] = array(
     '#input' => TRUE,
   );
-  $types['link'] = array(
-    '#pre_render' => array('drupal_pre_render_link'),
-  );
   $types['fieldset'] = array(
     '#value' => NULL,
     '#process' => array('form_process_group', 'ajax_process_form'),
@@ -1474,7 +1448,7 @@ function system_get_module_admin_tasks($module, array $info) {
 
   if (!isset($tree)) {
     $parameters = new MenuTreeParameters();
-    $parameters->setRoot('system.admin')->excludeRoot()->excludeHiddenLinks();
+    $parameters->setRoot('system.admin')->excludeRoot()->onlyEnabledLinks();
     $tree = $menu_tree->load('system.admin', $parameters);
     $manipulators = array(
       array('callable' => 'menu.default_tree_manipulators:checkAccess'),
diff --git a/core/modules/system/theme.api.php b/core/modules/system/theme.api.php
index 85eb728..fabde88 100644
--- a/core/modules/system/theme.api.php
+++ b/core/modules/system/theme.api.php
@@ -163,11 +163,21 @@
  * requests and the CSS files used to style that markup. In order to ensure that
  * a theme can completely customize the markup, module developers should avoid
  * directly writing HTML markup for pages, blocks, and other user-visible output
- * in their modules, and instead return structured "render arrays" (described
- * below). Doing this also increases usability, by ensuring that the markup used
- * for similar functionality on different areas of the site is the same, which
- * gives users fewer user interface patterns to learn.
+ * in their modules, and instead return structured "render arrays" (see @ref
+ * arrays below). Doing this also increases usability, by ensuring that the
+ * markup used for similar functionality on different areas of the site is the
+ * same, which gives users fewer user interface patterns to learn.
  *
+ * For further information on the Theme and Render APIs, see:
+ * - https://drupal.org/documentation/theme
+ * - https://drupal.org/node/722174
+ * - https://drupal.org/node/933976
+ * - https://drupal.org/node/930760
+ *
+ * @todo Check these links. Some are for Drupal 7, and might need updates for
+ *   Drupal 8.
+ *
+ * @section arrays Render arrays
  * The core structure of the Render API is the render array, which is a
  * hierarchical associative array containing data to be rendered and properties
  * describing how the data should be rendered. A render array that is returned
@@ -194,11 +204,8 @@
  * - #type: Specifies that the array contains data and options for a particular
  *   type of "render element" (examples: 'form', for an HTML form; 'textfield',
  *   'submit', and other HTML form element types; 'table', for a table with
- *   rows, columns, and headers). Modules define render elements by implementing
- *   hook_element_info(), which specifies the properties that are used in render
- *   arrays to provide the data and options, and default values for these
- *   properties. Look through implementations of hook_element_info() to discover
- *   what render elements are available.
+ *   rows, columns, and headers). See @ref elements below for more on render
+ *   element types.
  * - #theme: Specifies that the array contains data to be themed by a particular
  *   theme hook. Modules define theme hooks by implementing hook_theme(), which
  *   specifies the input "variables" used to provide data and options; if a
@@ -214,15 +221,29 @@
  *   normally preferable to use #theme or #type instead, so that the theme can
  *   customize the markup.
  *
- * For further information on the Theme and Render APIs, see:
- * - https://drupal.org/documentation/theme
- * - https://drupal.org/developing/modules/8
- * - https://drupal.org/node/722174
- * - https://drupal.org/node/933976
- * - https://drupal.org/node/930760
+ * @section elements Render elements
+ * Render elements are defined by Drupal core and modules. The primary way to
+ * define a render element is to create a render element plugin. There are
+ * two types of render element plugins:
+ * - Generic elements: Generic render element plugins implement
+ *   \Drupal\Core\Render\Element\ElementInterface, are annotated with
+ *   \Drupal\Core\Render\Annotation\RenderElement annotation, go in plugin
+ *   namespace Element, and generally extend the
+ *   \Drupal\Core\Render\Element\RenderElement base class.
+ * - Form input elements: Render elements representing form input elements
+ *   implement \Drupal\Core\Render\Element\FormElementInterface, are annotated
+ *   with \Drupal\Core\Render\Annotation\FormElement annotation, go in plugin
+ *   namespace Element, and generally extend the
+ *   \Drupal\Core\Render\Element\FormElement base class.
+ * See the @link plugin_api Plugin API topic @endlink for general information
+ * on plugins, and look for classes with the RenderElement or FormElement
+ * annotation to discover what render elements are available.
+ *
+ * Modules can also currently define render elements by implementing
+ * hook_element_info(), although defining a plugin is preferred.
+ * properties. Look through implementations of hook_element_info() to discover
+ * elements defined this way.
  *
- * @todo Check these links. Some are for Drupal 7, and might need updates for
- *   Drupal 8.
  * @see themeable
  *
  * @}
diff --git a/core/modules/toolbar/toolbar.module b/core/modules/toolbar/toolbar.module
index e07e8f9..a667e08 100644
--- a/core/modules/toolbar/toolbar.module
+++ b/core/modules/toolbar/toolbar.module
@@ -417,7 +417,7 @@ function toolbar_prerender_toolbar_administration_tray(array $element) {
   $menu_tree = \Drupal::menuTree();
   // Render the top-level administration menu links.
   $parameters = new MenuTreeParameters();
-  $parameters->setRoot('system.admin')->excludeRoot()->setTopLevelOnly()->excludeHiddenLinks();
+  $parameters->setRoot('system.admin')->excludeRoot()->setTopLevelOnly()->onlyEnabledLinks();
   $tree = $menu_tree->load(NULL, $parameters);
   $manipulators = array(
     array('callable' => 'menu.default_tree_manipulators:checkAccess'),
@@ -475,7 +475,7 @@ function toolbar_menu_navigation_links(array $tree) {
 function toolbar_get_rendered_subtrees() {
   $menu_tree = \Drupal::menuTree();
   $parameters = new MenuTreeParameters();
-  $parameters->setRoot('system.admin')->excludeRoot()->setMaxDepth(3)->excludeHiddenLinks();
+  $parameters->setRoot('system.admin')->excludeRoot()->setMaxDepth(3)->onlyEnabledLinks();
   $tree = $menu_tree->load(NULL, $parameters);
   $manipulators = array(
     array('callable' => 'menu.default_tree_manipulators:checkAccess'),
diff --git a/core/modules/tracker/tracker.pages.inc b/core/modules/tracker/tracker.pages.inc
index 0aac664..a88b754 100644
--- a/core/modules/tracker/tracker.pages.inc
+++ b/core/modules/tracker/tracker.pages.inc
@@ -45,28 +45,24 @@ function tracker_page($account = NULL) {
 
   $rows = array();
   if (!empty($tracker_data)) {
-    $nids = array_keys($tracker_data);
-    $nodes = node_load_multiple($nids);
-    // @todo This should be actually filtering on the desired language and just
-    //   fall back to the default language.
-    $result = db_query("
-    SELECT
-      n.nid,
-      SUM(l.comment_count) AS comment_count
-    FROM {node_field_data} n
-      INNER JOIN {comment_entity_statistics} l
-        ON n.nid = l.entity_id AND l.entity_type = 'node'
-      INNER JOIN {users} u
-        ON n.uid = u.uid
-    WHERE n.nid IN (:nids)
-      AND n.default_langcode = 1
-    GROUP BY n.nid
-    ORDER BY n.changed DESC", array(
-      ':nids' => array_keys($nodes)
-    ), array('target' => 'replica'))->fetchAllKeyed();
-    foreach ($result as $nid => $comment_count) {
+    // Load nodes into an array with the same order as $tracker_data.
+    $nodes = entity_load_multiple('node', array_keys($tracker_data));
+
+    // Enrich the node data.
+    $result = \Drupal::service('comment.statistics')->read($nodes, 'node', FALSE);
+    foreach ($result as $statistics) {
+      // The node ID may not be unique; there can be multiple comment fields.
+      // Make comment_count the total of all comments.
+      $nid = $statistics->entity_id;
+      if (empty($nodes[$nid]->comment_count)
+          || !is_numeric($nodes[$nid]->comment_count)) {
+        $nodes[$nid]->comment_count = $statistics->comment_count;
+      }
+      else {
+        $nodes[$nid]->comment_count += $statistics->comment_count;
+      }
+
       $nodes[$nid]->last_activity = $tracker_data[$nid]->changed;
-      $nodes[$nid]->comment_count = $comment_count;
     }
 
     // Display the data.
diff --git a/core/modules/user/src/Entity/User.php b/core/modules/user/src/Entity/User.php
index 979694b..afaa840 100644
--- a/core/modules/user/src/Entity/User.php
+++ b/core/modules/user/src/Entity/User.php
@@ -431,6 +431,13 @@ public function setUsername($username) {
   /**
    * {@inheritdoc}
    */
+  public function getChangedTime() {
+    return $this->get('changed')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     $fields['uid'] = BaseFieldDefinition::create('integer')
       ->setLabel(t('User ID'))
@@ -500,6 +507,10 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setLabel(t('Created'))
       ->setDescription(t('The time that the user was created.'));
 
+    $fields['changed'] = BaseFieldDefinition::create('changed')
+      ->setLabel(t('Changed'))
+      ->setDescription(t('The time that the user was last edited.'));
+
     $fields['access'] = BaseFieldDefinition::create('timestamp')
       ->setLabel(t('Last access'))
       ->setDescription(t('The time that the user last accessed the site.'))
diff --git a/core/modules/user/src/Plugin/Menu/MyAccountMenuLink.php b/core/modules/user/src/Plugin/Menu/MyAccountMenuLink.php
index 91768cd..e7bba2e 100644
--- a/core/modules/user/src/Plugin/Menu/MyAccountMenuLink.php
+++ b/core/modules/user/src/Plugin/Menu/MyAccountMenuLink.php
@@ -17,14 +17,14 @@ class MyAccountMenuLink extends MenuLinkDefault {
   /**
    * {@inheritdoc}
    */
-  public function isHidden() {
+  public function isEnabled() {
     // The path 'user' must be accessible for anonymous users, but only visible
     // for authenticated users. Authenticated users should see "My account", but
     // anonymous users should not see it at all.
     // @todo Re-write this as a link to user.view with dynamic route parameters
     //   to affect access since hidden should not be dynamic.
     //   https://www.drupal.org/node/2306991
-    return $this->pluginDefinition['hidden'] || \Drupal::currentUser()->isAnonymous();
+    return $this->pluginDefinition['enabled'] && !\Drupal::currentUser()->isAnonymous();
   }
 
   /**
diff --git a/core/modules/user/src/Tests/UserAccountLinksTests.php b/core/modules/user/src/Tests/UserAccountLinksTests.php
index e602120..f972f72 100644
--- a/core/modules/user/src/Tests/UserAccountLinksTests.php
+++ b/core/modules/user/src/Tests/UserAccountLinksTests.php
@@ -70,7 +70,7 @@ function testSecondaryMenu() {
     $tree = $menu_tree->transform($tree, $manipulators);
     $this->assertEqual(count($tree), 1, 'The secondary links menu contains only one menu link.');
     $element = reset($tree);
-    $this->assertTrue($element->link->isHidden(), 'The menu link is hidden.');
+    $this->assertFalse($element->link->isEnabled(), 'The menu link is disabled.');
   }
 
   /**
diff --git a/core/modules/user/src/Tests/UserCreateTest.php b/core/modules/user/src/Tests/UserCreateTest.php
index 48c0705..4af2b40 100644
--- a/core/modules/user/src/Tests/UserCreateTest.php
+++ b/core/modules/user/src/Tests/UserCreateTest.php
@@ -31,6 +31,9 @@ protected function testUserAdd() {
     $user = $this->drupalCreateUser(array('administer users'));
     $this->drupalLogin($user);
 
+    $this->assertEqual($user->getCreatedTime(), REQUEST_TIME, 'Creating a user sets default "created" timestamp.');
+    $this->assertEqual($user->getChangedTime(), REQUEST_TIME, 'Creating a user sets default "changed" timestamp.');
+
     // Create a field and an instance.
     $field_name = 'test_field';
     entity_create('field_storage_config', array(
diff --git a/core/modules/user/src/Tests/UserEditTest.php b/core/modules/user/src/Tests/UserEditTest.php
index a468f4d..4ee1b18 100644
--- a/core/modules/user/src/Tests/UserEditTest.php
+++ b/core/modules/user/src/Tests/UserEditTest.php
@@ -65,6 +65,9 @@ function testUserEdit() {
     $this->drupalPostForm("user/" . $user1->id() . "/edit", $edit, t('Save'));
     $this->assertRaw(t("The changes have been saved."));
 
+    // Make sure the changed timestamp is updated.
+    $this->assertEqual($user1->getChangedTime(), REQUEST_TIME, 'Changing a user sets "changed" timestamp.');
+
     // Make sure the user can log in with their new password.
     $this->drupalLogout();
     $user1->pass_raw = $new_pass;
diff --git a/core/modules/user/src/Tests/Views/UserChangedTest.php b/core/modules/user/src/Tests/Views/UserChangedTest.php
new file mode 100644
index 0000000..290dabf
--- /dev/null
+++ b/core/modules/user/src/Tests/Views/UserChangedTest.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\user\Tests\Views\UserChangedTest.
+ */
+
+namespace Drupal\user\Tests\Views;
+
+use Drupal\views\Tests\ViewTestBase;
+use Drupal\views\Tests\ViewTestData;
+
+/**
+ * Tests the changed field.
+ *
+ * @group user
+ */
+class UserChangedTest extends ViewTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('views_ui', 'user_test_views');
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = array('test_user_changed');
+
+  protected function setUp() {
+    parent::setUp();
+
+    ViewTestData::createTestViews(get_class($this), array('user_test_views'));
+
+    $this->enableViewsTestModule();
+  }
+
+  /**
+   * Tests changed field.
+   */
+  public function testChangedField() {
+    $path = 'test_user_changed';
+
+    $options = array();
+
+    $this->drupalGet($path, $options);
+
+    $this->assertText(t('Updated date') . ': ' . date('Y-m-d', REQUEST_TIME));
+  }
+
+}
diff --git a/core/modules/user/src/UserInterface.php b/core/modules/user/src/UserInterface.php
index 8b89dd4..e2c44d0 100644
--- a/core/modules/user/src/UserInterface.php
+++ b/core/modules/user/src/UserInterface.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\user;
 
+use Drupal\Core\Entity\EntityChangedInterface;
 use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Session\AccountInterface;
 
@@ -15,7 +16,7 @@
  *
  * @ingroup user_api
  */
-interface UserInterface extends ContentEntityInterface, AccountInterface {
+interface UserInterface extends ContentEntityInterface, EntityChangedInterface, AccountInterface {
 
   /**
    * Whether a user has a certain role.
diff --git a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_changed.yml b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_changed.yml
new file mode 100644
index 0000000..e6ed73e
--- /dev/null
+++ b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_changed.yml
@@ -0,0 +1,46 @@
+base_table: users
+core: '8'
+description: ''
+status: '1'
+display:
+  default:
+    display_options:
+      access:
+        type: none
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      pager:
+        type: full
+      row:
+        type: fields
+      style:
+        type: default
+      fields:
+        name:
+          id: uid
+          table: users
+          field: uid
+          provider: user
+        changed:
+          id: changed
+          table: users
+          field: changed
+          provider: user
+          date_format: html_date
+      filters: { }
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: 0
+  page_1:
+    display_options:
+      path: test_user_changed
+    display_plugin: page
+    display_title: Page
+    id: page_1
+    position: 0
+label: ''
+id: test_user_changed
+tag: ''
diff --git a/core/modules/user/user.views.inc b/core/modules/user/user.views.inc
index b2e2773..c10892e 100644
--- a/core/modules/user/user.views.inc
+++ b/core/modules/user/user.views.inc
@@ -267,6 +267,74 @@ function user_views_data() {
     ),
   );
 
+  $data['users']['changed'] = array(
+    'title' => t('Updated date'),
+    'help' => t('The date the user was last updated.'),
+    'field' => array(
+      'id' => 'date',
+    ),
+    'sort' => array(
+      'id' => 'date'
+    ),
+    'filter' => array(
+      'id' => 'date',
+    ),
+  );
+
+  $data['users']['changed_fulldate'] = array(
+    'title' => t('Updated date'),
+    'help' => t('Date in the form of CCYYMMDD.'),
+    'argument' => array(
+      'field' => 'changed',
+      'id' => 'date_fulldate',
+    ),
+  );
+
+  $data['users']['changed_year_month'] = array(
+    'title' => t('Updated year + month'),
+    'help' => t('Date in the form of YYYYMM.'),
+    'argument' => array(
+      'field' => 'changed',
+      'id' => 'date_year_month',
+    ),
+  );
+
+  $data['users']['changed_year'] = array(
+    'title' => t('Updated year'),
+    'help' => t('Date in the form of YYYY.'),
+    'argument' => array(
+      'field' => 'changed',
+      'id' => 'date_year',
+    ),
+  );
+
+  $data['users']['changed_month'] = array(
+    'title' => t('Updated month'),
+    'help' => t('Date in the form of MM (01 - 12).'),
+    'argument' => array(
+      'field' => 'changed',
+      'id' => 'date_month',
+    ),
+  );
+
+  $data['users']['changed_day'] = array(
+    'title' => t('Updated day'),
+    'help' => t('Date in the form of DD (01 - 31).'),
+    'argument' => array(
+      'field' => 'changed',
+      'id' => 'date_day',
+    ),
+  );
+
+  $data['users']['changed_week'] = array(
+    'title' => t('Updated week'),
+    'help' => t('Date in the form of WW (01 - 53).'),
+    'argument' => array(
+      'field' => 'changed',
+      'id' => 'date_week',
+    ),
+  );
+
   if (\Drupal::moduleHandler()->moduleExists('filter')) {
     $data['users']['signature'] = array(
       'title' => t('Signature'),
diff --git a/core/modules/views/src/Plugin/Menu/ViewsMenuLink.php b/core/modules/views/src/Plugin/Menu/ViewsMenuLink.php
index 2d8cd90..a07862f 100644
--- a/core/modules/views/src/Plugin/Menu/ViewsMenuLink.php
+++ b/core/modules/views/src/Plugin/Menu/ViewsMenuLink.php
@@ -28,7 +28,7 @@ class ViewsMenuLink extends MenuLinkBase implements ContainerFactoryPluginInterf
     'parent' => 1,
     'weight' => 1,
     'expanded' => 1,
-    'hidden' => 1,
+    'enabled' => 1,
     'title' => 1,
     'description' => 1,
     'metadata' => 1,
diff --git a/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php b/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
index 6fe999b..1654cb3 100644
--- a/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
+++ b/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
@@ -370,73 +370,113 @@ public function buildForm(array $form, FormStateInterface $form_state) {
       );
     }
 
-    if (!\Drupal::moduleHandler()->moduleExists('block')) {
-      return $form;
-    }
-
-    $form['displays']['block'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Block settings'),
-      '#attributes' => array('class' => array('views-attachment', 'fieldset-no-legend')),
-      '#tree' => TRUE,
-    );
-    $form['displays']['block']['create'] = array(
-      '#title' => t('Create a block'),
-      '#type' => 'checkbox',
-      '#attributes' => array('class' => array('strong')),
-      '#id' => 'edit-block-create',
-    );
+    // Only offer the block settings if the module is enabled.
+    if (\Drupal::moduleHandler()->moduleExists('block')) {
+      $form['displays']['block'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('Block settings'),
+        '#attributes' => array('class' => array('views-attachment', 'fieldset-no-legend')),
+        '#tree' => TRUE,
+      );
+      $form['displays']['block']['create'] = array(
+        '#title' => t('Create a block'),
+        '#type' => 'checkbox',
+        '#attributes' => array('class' => array('strong')),
+        '#id' => 'edit-block-create',
+      );
 
-    // All options for the block display are included in this container so they
-    // can be hidden as a group when the "Create a page" checkbox is unchecked.
-    $form['displays']['block']['options'] = array(
-      '#type' => 'container',
-      '#attributes' => array('class' => array('options-set')),
-      '#states' => array(
-        'visible' => array(
-          ':input[name="block[create]"]' => array('checked' => TRUE),
+      // All options for the block display are included in this container so
+      // they can be hidden as a group when the "Create a block" checkbox is
+      // unchecked.
+      $form['displays']['block']['options'] = array(
+        '#type' => 'container',
+        '#attributes' => array('class' => array('options-set')),
+        '#states' => array(
+          'visible' => array(
+            ':input[name="block[create]"]' => array('checked' => TRUE),
+          ),
         ),
-      ),
-      '#prefix' => '<div id="edit-block-wrapper">',
-      '#suffix' => '</div>',
-      '#parents' => array('block'),
-    );
+        '#prefix' => '<div id="edit-block-wrapper">',
+        '#suffix' => '</div>',
+        '#parents' => array('block'),
+      );
 
-    $form['displays']['block']['options']['title'] = array(
-      '#title' => t('Block title'),
-      '#type' => 'textfield',
-      '#maxlength' => 255,
-    );
-    $form['displays']['block']['options']['style'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Block display settings'),
-      '#attributes' => array('class' => array('container-inline', 'fieldset-no-legend')),
-    );
+      $form['displays']['block']['options']['title'] = array(
+        '#title' => t('Block title'),
+        '#type' => 'textfield',
+        '#maxlength' => 255,
+      );
+      $form['displays']['block']['options']['style'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('Block display settings'),
+        '#attributes' => array('class' => array('container-inline', 'fieldset-no-legend')),
+      );
 
-    // Create the dropdown for choosing the display format.
-    $form['displays']['block']['options']['style']['style_plugin'] = array(
-      '#title' => t('Display format'),
-      '#type' => 'select',
-      '#options' => $style_options,
-    );
-    $style_form = &$form['displays']['block']['options']['style'];
-    $style_form['style_plugin']['#default_value'] = static::getSelected($form_state, array('block', 'style', 'style_plugin'), 'default', $style_form['style_plugin']);
-    // Changing this dropdown updates $form['displays']['block']['options'] via
-    // AJAX.
-    views_ui_add_ajax_trigger($style_form, 'style_plugin', array('displays', 'block', 'options'));
+      // Create the dropdown for choosing the display format.
+      $form['displays']['block']['options']['style']['style_plugin'] = array(
+        '#title' => t('Display format'),
+        '#type' => 'select',
+        '#options' => $style_options,
+      );
+      $style_form = &$form['displays']['block']['options']['style'];
+      $style_form['style_plugin']['#default_value'] = static::getSelected($form_state, array('block', 'style', 'style_plugin'), 'default', $style_form['style_plugin']);
+      // Changing this dropdown updates $form['displays']['block']['options']
+      // via AJAX.
+      views_ui_add_ajax_trigger($style_form, 'style_plugin', array('displays', 'block', 'options'));
+
+      $this->buildFormStyle($form, $form_state, 'block');
+      $form['displays']['block']['options']['items_per_page'] = array(
+        '#title' => t('Items per block'),
+        '#type' => 'number',
+        '#default_value' => 5,
+        '#min' => 0,
+      );
+      $form['displays']['block']['options']['pager'] = array(
+        '#title' => t('Use a pager'),
+        '#type' => 'checkbox',
+        '#default_value' => FALSE,
+      );
+    }
 
-    $this->buildFormStyle($form, $form_state, 'block');
-    $form['displays']['block']['options']['items_per_page'] = array(
-      '#title' => t('Items per block'),
-      '#type' => 'number',
-      '#default_value' => 5,
-      '#min' => 0,
-    );
-    $form['displays']['block']['options']['pager'] = array(
-      '#title' => t('Use a pager'),
-      '#type' => 'checkbox',
-      '#default_value' => FALSE,
-    );
+    // Only offer the REST export settings if the module is enabled.
+    if (\Drupal::moduleHandler()->moduleExists('rest')) {
+      $form['displays']['rest_export'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('REST export settings'),
+        '#attributes' => array('class' => array('views-attachment', 'fieldset-no-legend')),
+        '#tree' => TRUE,
+      );
+      $form['displays']['rest_export']['create'] = array(
+        '#title' => t('Provide a REST export'),
+        '#type' => 'checkbox',
+        '#attributes' => array('class' => array('strong')),
+        '#id' => 'edit-rest-export-create',
+      );
+
+      // All options for the REST export display are included in this container
+      // so they can be hidden as a group when the "Provide a REST export"
+      // checkbox is unchecked.
+      $form['displays']['rest_export']['options'] = array(
+        '#type' => 'container',
+        '#attributes' => array('class' => array('options-set')),
+        '#states' => array(
+          'visible' => array(
+            ':input[name="rest_export[create]"]' => array('checked' => TRUE),
+          ),
+        ),
+        '#prefix' => '<div id="edit-rest-export-wrapper">',
+        '#suffix' => '</div>',
+        '#parents' => array('rest_export'),
+      );
+
+      $form['displays']['rest_export']['options']['path'] = array(
+        '#title' => t('REST export path'),
+        '#type' => 'textfield',
+        '#field_prefix' => $path_prefix,
+        // Account for the leading backslash.
+        '#maxlength' => 254,
+      );
+    }
 
     return $form;
   }
@@ -699,6 +739,11 @@ protected function buildDisplayOptions($form, FormStateInterface $form_state) {
       $display_options['block'] = $this->blockDisplayOptions($form, $form_state);
     }
 
+    // Display: REST export.
+    if (!empty($form_state['values']['rest_export']['create'])) {
+      $display_options['rest_export'] = $this->restExportDisplayOptions($form, $form_state);
+    }
+
     return $display_options;
   }
 
@@ -755,6 +800,19 @@ protected function addDisplays(View $view, $display_options, $form, FormStateInt
       }
     }
 
+    // Display: REST export.
+    if (isset($display_options['rest_export'])) {
+      $display = $executable->newDisplay('rest_export', 'REST export', 'rest_export_1');
+      // If there is no page or block, the REST export display options should
+      // become the overall view defaults.
+      if (!isset($display_options['page']) && !isset($display_options['block'])) {
+        $this->setDefaultOptions($display_options['rest_export'], $display, $default_display);
+      }
+      else {
+        $this->setOverrideOptions($display_options['rest_export'], $display, $default_display);
+      }
+    }
+
     // Initialize displays and merge all plugin default values.
     $executable->mergeDefaults();
   }
@@ -1046,6 +1104,25 @@ protected function blockDisplayOptions(array $form, FormStateInterface $form_sta
   }
 
   /**
+   * Retrieves the REST export display options from the submitted form values.
+   *
+   * @param array $form
+   *   The full wizard form array.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the wizard form.
+   *
+   * @return array
+   *   Returns an array of display options.
+   */
+  protected function restExportDisplayOptions(array $form, FormStateInterface $form_state) {
+    $display_options = array();
+    $display_options['path'] = $form_state['values']['rest_export']['path'];
+    $display_options['style'] = array('type' => 'serializer');
+
+    return $display_options;
+  }
+
+  /**
    * Retrieves the feed display options.
    *
    * @param array $form
diff --git a/core/modules/views/src/Tests/Entity/RowEntityRenderersTest.php b/core/modules/views/src/Tests/Entity/RowEntityRenderersTest.php
index 8eb006d..c0f3a05 100644
--- a/core/modules/views/src/Tests/Entity/RowEntityRenderersTest.php
+++ b/core/modules/views/src/Tests/Entity/RowEntityRenderersTest.php
@@ -51,7 +51,7 @@ protected function setUp() {
     $this->installSchema('node', array('node_access'));
     $this->installConfig(array('node', 'language'));
 
-    // The node.view route must exist when nodes are rendered.
+    // The entity.node.canonical route must exist when nodes are rendered.
     $this->container->get('router.builder')->rebuild();
 
     $this->langcodes = array(\Drupal::languageManager()->getDefaultLanguage()->id);
diff --git a/core/modules/views/src/Tests/Wizard/BasicTest.php b/core/modules/views/src/Tests/Wizard/BasicTest.php
index 6c5fe34..09a36cb 100644
--- a/core/modules/views/src/Tests/Wizard/BasicTest.php
+++ b/core/modules/views/src/Tests/Wizard/BasicTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views\Tests\Wizard;
 
+use Drupal\Component\Serialization\Json;
 use Drupal\Component\Utility\String;
 use Drupal\views\Views;
 
@@ -40,6 +41,9 @@ function testViewsWizardAndListing() {
     $this->assertLinkByHref(url('admin/structure/views/view/' . $view1['id'] . '/delete'));
     $this->assertLinkByHref(url('admin/structure/views/view/' . $view1['id'] . '/duplicate'));
 
+    // The view should not have a REST export display.
+    $this->assertNoText('REST export', 'When no options are enabled in the wizard, the resulting view does not have a REST export display.');
+
     // This view should not have a block.
     $this->drupalGet('admin/structure/block');
     $this->assertNoText($view1['label']);
@@ -86,6 +90,9 @@ function testViewsWizardAndListing() {
     $this->assertText($view2['description']);
     $this->assertLinkByHref(url($view2['page[path]']));
 
+    // The view should not have a REST export display.
+    $this->assertNoText('REST export', 'If only the page option was enabled in the wizard, the resulting view does not have a REST export display.');
+
     // This view should not have a block.
     $this->drupalGet('admin/structure/block');
     $this->assertNoText('View: ' . $view2['label']);
@@ -118,6 +125,9 @@ function testViewsWizardAndListing() {
     $this->assertText($view3['description']);
     $this->assertLinkByHref(url($view3['page[path]']));
 
+    // The view should not have a REST export display.
+    $this->assertNoText('REST export', 'If only the page and block options were enabled in the wizard, the resulting view does not have a REST export display.');
+
     // Confirm that the block is available in the block administration UI.
     $this->drupalGet('admin/structure/block/list/' . \Drupal::config('system.theme')->get('default'));
     $this->assertText($view3['label']);
@@ -133,6 +143,25 @@ function testViewsWizardAndListing() {
 
     // Make sure the listing page doesn't show disabled default views.
     $this->assertNoText('tracker', 'Default tracker view does not show on the listing page.');
+
+    // Create a view with only a REST export.
+    $view4 = array();
+    $view4['label'] = $this->randomMachineName(16);
+    $view4['id'] = strtolower($this->randomMachineName(16));
+    $view4['description'] = $this->randomMachineName(16);
+    $view4['show[wizard_key]'] = 'node';
+    $view4['show[type]'] = 'page';
+    $view4['rest_export[create]'] = 1;
+    $view4['rest_export[path]'] = $this->randomMachineName(16);
+    $this->drupalPostForm('admin/structure/views/add', $view4, t('Save and edit'));
+
+    // Check that the REST export path works.
+    $this->drupalGet($view4['rest_export[path]']);
+    $this->assertResponse(200);
+    $data = Json::decode($this->content);
+    $this->assertEqual(count($data), 1, 'Only the node of type page is exported.');
+    $node = reset($data);
+    $this->assertEqual($node['nid'][0]['value'], $node1->id(), 'The node of type page is exported.');
   }
 
   /**
diff --git a/core/modules/views/src/Tests/Wizard/WizardTestBase.php b/core/modules/views/src/Tests/Wizard/WizardTestBase.php
index 1a8acd4..b153077 100644
--- a/core/modules/views/src/Tests/Wizard/WizardTestBase.php
+++ b/core/modules/views/src/Tests/Wizard/WizardTestBase.php
@@ -19,7 +19,7 @@
    *
    * @var array
    */
-  public static $modules = array('node', 'views_ui', 'block');
+  public static $modules = array('node', 'views_ui', 'block', 'rest');
 
   function setUp() {
     parent::setUp();
diff --git a/core/modules/views_ui/css/views_ui.admin.theme.css b/core/modules/views_ui/css/views_ui.admin.theme.css
index 22f3b08..de30d2e 100644
--- a/core/modules/views_ui/css/views_ui.admin.theme.css
+++ b/core/modules/views_ui/css/views_ui.admin.theme.css
@@ -337,7 +337,8 @@ th.views-ui-operations {
 }
 
 .form-item-page-create label,
-.form-item-block-create label {
+.form-item-block-create label,
+.form-item-rest-export-create label {
   font-weight: bold;
 }
 
diff --git a/core/modules/views_ui/src/Tests/WizardTest.php b/core/modules/views_ui/src/Tests/WizardTest.php
index 155dc16..3b63ef1 100644
--- a/core/modules/views_ui/src/Tests/WizardTest.php
+++ b/core/modules/views_ui/src/Tests/WizardTest.php
@@ -33,6 +33,8 @@ public function testWizardFieldLength() {
     $view['page[feed_properties][path]'] = $this->randomMachineName(255);
     $view['block[create]'] = TRUE;
     $view['block[title]'] = $this->randomMachineName(256);
+    $view['rest_export[create]'] = TRUE;
+    $view['rest_export[path]'] = $this->randomMachineName(255);
 
     $this->drupalPostForm('admin/structure/views/add', $view, t('Save and edit'));
 
@@ -42,6 +44,7 @@ public function testWizardFieldLength() {
     $this->assertText('View name cannot be longer than 255 characters but is currently 256 characters long.');
     $this->assertText('Feed path cannot be longer than 254 characters but is currently 255 characters long.');
     $this->assertText('Block title cannot be longer than 255 characters but is currently 256 characters long.');
+    $this->assertText('REST export path cannot be longer than 254 characters but is currently 255 characters long.');
 
     $view['label'] = $this->randomMachineName(255);
     $view['id'] = strtolower($this->randomMachineName(128));
@@ -52,6 +55,8 @@ public function testWizardFieldLength() {
     $view['page[feed_properties][path]'] = $this->randomMachineName(254);
     $view['block[create]'] = TRUE;
     $view['block[title]'] = $this->randomMachineName(255);
+    $view['rest_export[create]'] = TRUE;
+    $view['rest_export[path]'] = $this->randomMachineName(254);
 
     $this->drupalPostForm('admin/structure/views/add', $view, t('Save and edit'));
     $this->assertUrl('admin/structure/views/view/' . $view['id'], array(), 'Make sure the view saving was successful and the browser got redirected to the edit page.');
diff --git a/core/profiles/standard/standard.install b/core/profiles/standard/standard.install
index 673ddf7..6ea9c05 100644
--- a/core/profiles/standard/standard.install
+++ b/core/profiles/standard/standard.install
@@ -46,7 +46,7 @@ function standard_install() {
   // Enable the Contact link in the footer menu.
   /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */
   $menu_link_manager = \Drupal::service('plugin.manager.menu.link');
-  $menu_link_manager->updateDefinition('contact.site_page', array('hidden' => 0));
+  $menu_link_manager->updateDefinition('contact.site_page', array('enabled' => 1));
 
   user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access site-wide contact form'));
   user_role_grant_permissions(DRUPAL_AUTHENTICATED_RID, array('access site-wide contact form'));
diff --git a/core/tests/Drupal/Tests/Core/Menu/MenuTreeParametersTest.php b/core/tests/Drupal/Tests/Core/Menu/MenuTreeParametersTest.php
index 750cb93..4222541 100644
--- a/core/tests/Drupal/Tests/Core/Menu/MenuTreeParametersTest.php
+++ b/core/tests/Drupal/Tests/Core/Menu/MenuTreeParametersTest.php
@@ -115,14 +115,14 @@ public function testAddCondition() {
   }
 
   /**
-   * Tests excludeHiddenLinks().
+   * Tests onlyEnabledLinks().
    *
-   * @covers ::excludeHiddenLinks
+   * @covers ::onlyEnabledLinks
    */
-  public function testExcludeHiddenLinks() {
+  public function testOnlyEnabledLinks() {
     $parameters = new MenuTreeParameters();
-    $parameters->excludeHiddenLinks();
-    $this->assertEquals(0, $parameters->conditions['hidden']);
+    $parameters->onlyEnabledLinks();
+    $this->assertEquals(1, $parameters->conditions['enabled']);
   }
 
   /**
diff --git a/core/tests/Drupal/Tests/Core/Render/ElementInfoManagerTest.php b/core/tests/Drupal/Tests/Core/Render/ElementInfoManagerTest.php
new file mode 100644
index 0000000..fa9cbb3
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Render/ElementInfoManagerTest.php
@@ -0,0 +1,197 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Render\ElementInfoManagerTest.
+ */
+
+namespace Drupal\Tests\Core\Render;
+
+use Drupal\Core\Render\ElementInfoManager;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\Core\Render\ElementInfoManager
+ * @group Render
+ */
+class ElementInfoManagerTest extends UnitTestCase {
+
+  /**
+   * The class under test.
+   *
+   * @var \Drupal\Core\Render\ElementInfoManagerInterface
+   */
+  protected $elementInfo;
+
+  /**
+   * The cache backend to use.
+   *
+   * @var \Drupal\Core\Cache\CacheBackendInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $cache;
+
+  /**
+   * The mocked module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $moduleHandler;
+
+  /**
+   * {@inheritdoc}
+   *
+   * @covers ::__construct
+   */
+  protected function setUp() {
+    $this->cache = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
+    $this->moduleHandler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
+
+    $this->elementInfo = new ElementInfoManager(new \ArrayObject(), $this->cache, $this->moduleHandler);
+  }
+
+  /**
+   * Tests the getInfo method.
+   *
+   * @covers ::getInfo
+   * @covers ::buildInfo
+   *
+   * @dataProvider providerTestGetInfo
+   */
+  public function testGetInfo($type, $expected_info, $element_info, callable $alter_callback = NULL) {
+    $this->moduleHandler->expects($this->once())
+      ->method('invokeAll')
+      ->with('element_info')
+      ->will($this->returnValue($element_info));
+    $this->moduleHandler->expects($this->once())
+      ->method('alter')
+      ->with('element_info', $this->anything())
+      ->will($this->returnCallback($alter_callback ?: function($info) {
+        return $info;
+      }));
+
+    $this->assertEquals($expected_info, $this->elementInfo->getInfo($type));
+  }
+
+  /**
+   * Provides tests data for getInfo.
+   *
+   * @return array
+   */
+  public function providerTestGetInfo() {
+    $data = array();
+    // Provide an element and expect it is returned.
+    $data[] = array(
+      'page',
+      array(
+        '#type' => 'page',
+        '#show_messages' => TRUE,
+        '#theme' => 'page',
+      ),
+      array('page' => array(
+        '#show_messages' => TRUE,
+        '#theme' => 'page',
+      )),
+    );
+    // Provide an element but request an non existent one.
+    $data[] = array(
+      'form',
+      array(
+      ),
+      array('page' => array(
+        '#show_messages' => TRUE,
+        '#theme' => 'page',
+      )),
+    );
+    // Provide an element and alter it to ensure it is altered.
+    $data[] = array(
+      'page',
+      array(
+        '#type' => 'page',
+        '#show_messages' => TRUE,
+        '#theme' => 'page',
+        '#number' => 597219,
+      ),
+      array('page' => array(
+        '#show_messages' => TRUE,
+        '#theme' => 'page',
+      )),
+      function ($alter_name, array &$info) {
+        $info['page']['#number'] = 597219;
+      }
+    );
+    return $data;
+  }
+
+  /**
+   * Tests the getInfo() method when render element plugins are used.
+   *
+   * @covers ::getInfo
+   * @covers ::buildInfo
+   *
+   * @dataProvider providerTestGetInfoElementPlugin
+   */
+  public function testGetInfoElementPlugin($plugin_class, $expected_info) {
+    $this->moduleHandler->expects($this->once())
+      ->method('invokeAll')
+      ->with('element_info')
+      ->willReturn(array());
+    $this->moduleHandler->expects($this->once())
+      ->method('alter')
+      ->with('element_info', $this->anything())
+      ->will($this->returnArgument(0));
+
+    $plugin = $this->getMock($plugin_class);
+    $plugin->expects($this->once())
+      ->method('getInfo')
+      ->willReturn(array(
+        '#show_messages' => TRUE,
+        '#theme' => 'page',
+      ));
+
+    $element_info = $this->getMockBuilder('Drupal\Core\Render\ElementInfoManager')
+      ->setConstructorArgs(array(new \ArrayObject(), $this->cache, $this->moduleHandler))
+      ->setMethods(array('getDefinitions', 'createInstance'))
+      ->getMock();
+    $element_info->expects($this->once())
+      ->method('createInstance')
+      ->with('page')
+      ->willReturn($plugin);
+    $element_info->expects($this->once())
+      ->method('getDefinitions')
+      ->willReturn(array(
+        'page' => array('class' => 'TestElementPlugin'),
+      ));
+
+    $this->assertEquals($expected_info, $element_info->getInfo('page'));
+  }
+
+  /**
+   * Provides tests data for testGetInfoElementPlugin().
+   *
+   * @return array
+   */
+  public function providerTestGetInfoElementPlugin() {
+    $data = array();
+    $data[] = array(
+      'Drupal\Core\Render\Element\ElementInterface',
+      array(
+        '#type' => 'page',
+        '#show_messages' => TRUE,
+        '#theme' => 'page',
+      ),
+    );
+
+    $data[] = array(
+      'Drupal\Core\Render\Element\FormElementInterface',
+      array(
+        '#type' => 'page',
+        '#show_messages' => TRUE,
+        '#theme' => 'page',
+        '#input' => TRUE,
+        '#value_callback' => array('TestElementPlugin', 'valueCallback'),
+      ),
+    );
+    return $data;
+  }
+
+}
diff --git a/core/tests/Drupal/Tests/Core/Render/ElementInfoTest.php b/core/tests/Drupal/Tests/Core/Render/ElementInfoTest.php
deleted file mode 100644
index 86878f4..0000000
--- a/core/tests/Drupal/Tests/Core/Render/ElementInfoTest.php
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Tests\Core\Render\ElementInfoTest.
- */
-
-namespace Drupal\Tests\Core\Render;
-
-use Drupal\Core\Render\ElementInfo;
-use Drupal\Core\Render\ElementInfoInterface;
-use Drupal\Tests\UnitTestCase;
-
-/**
- * @coversDefaultClass \Drupal\Core\Render\ElementInfo
- * @group Render
- */
-class ElementInfoTest extends UnitTestCase {
-
-  /**
-   * The class under test.
-   *
-   * @var \Drupal\Core\Render\ElementInfoInterface
-   */
-  protected $elementInfo;
-
-  /**
-   * The mocked module handler.
-   *
-   * @var \Drupal\Core\Extension\ModuleHandlerInterface|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $moduleHandler;
-
-  /**
-   * {@inheritdoc}
-   *
-   * @covers ::__construct
-   */
-  protected function setUp() {
-    $this->moduleHandler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
-
-    $this->elementInfo = new ElementInfo($this->moduleHandler);
-  }
-
-  /**
-   * Tests the getInfo method.
-   *
-   * @covers ::getInfo
-   * @covers ::buildInfo
-   *
-   * @dataProvider providerTestGetInfo
-   */
-  public function testGetInfo($type, $expected_info, $element_info, callable $alter_callback = NULL) {
-    $this->moduleHandler->expects($this->once())
-      ->method('invokeAll')
-      ->with('element_info')
-      ->will($this->returnValue($element_info));
-    $this->moduleHandler->expects($this->once())
-      ->method('alter')
-      ->with('element_info', $this->anything())
-      ->will($this->returnCallback($alter_callback ?: function($info) {
-        return $info;
-      }));
-
-    $this->assertEquals($expected_info, $this->elementInfo->getInfo($type));
-  }
-
-  /**
-   * Provides tests data for getInfo.
-   *
-   * @return array
-   */
-  public function providerTestGetInfo() {
-    $data = array();
-    // Provide an element and expect it is returned.
-    $data[] = array(
-      'page',
-      array(
-        '#type' => 'page',
-        '#show_messages' => TRUE,
-        '#theme' => 'page',
-      ),
-      array('page' => array(
-        '#show_messages' => TRUE,
-        '#theme' => 'page',
-      )),
-    );
-    // Provide an element but request an non existent one.
-    $data[] = array(
-      'form',
-      array(
-      ),
-      array('page' => array(
-        '#show_messages' => TRUE,
-        '#theme' => 'page',
-      )),
-    );
-    // Provide an element and alter it to ensure it is altered.
-    $data[] = array(
-      'page',
-      array(
-        '#type' => 'page',
-        '#show_messages' => TRUE,
-        '#theme' => 'page',
-        '#number' => 597219,
-      ),
-      array('page' => array(
-        '#show_messages' => TRUE,
-        '#theme' => 'page',
-      )),
-      function ($alter_name, array &$info) {
-        $info['page']['#number'] = 597219;
-      }
-    );
-    return $data;
-  }
-
-}
diff --git a/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php b/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php
index 03b7b0f..b51e818 100644
--- a/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php
+++ b/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php
@@ -92,8 +92,8 @@ function setUp() {
       ),
     );
     foreach ($return_map_values as $values) {
-      $route_name_return_map[] = array($values['route_name'], array(), $values['return']);
-      $routes_names_return_map[] = array(array($values['route_name']), array(), $values['return']);
+      $route_name_return_map[] = array($values['route_name'], $values['return']);
+      $routes_names_return_map[] = array(array($values['route_name']), $values['return']);
     }
     $provider->expects($this->any())
       ->method('getRouteByName')
diff --git a/core/vendor/composer/installed.json b/core/vendor/composer/installed.json
index 77784eb..97c0fa4 100644
--- a/core/vendor/composer/installed.json
+++ b/core/vendor/composer/installed.json
@@ -712,66 +712,6 @@
         ]
     },
     {
-        "name": "symfony-cmf/routing",
-        "version": "1.1.0",
-        "version_normalized": "1.1.0.0",
-        "target-dir": "Symfony/Cmf/Component/Routing",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony-cmf/Routing.git",
-            "reference": "9f8607950cbf888ec678713a35f3d0088857c85f"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony-cmf/Routing/zipball/9f8607950cbf888ec678713a35f3d0088857c85f",
-            "reference": "9f8607950cbf888ec678713a35f3d0088857c85f",
-            "shasum": ""
-        },
-        "require": {
-            "php": ">=5.3.3",
-            "psr/log": "~1.0",
-            "symfony/http-kernel": "~2.2",
-            "symfony/routing": "~2.2"
-        },
-        "require-dev": {
-            "symfony/config": "~2.2",
-            "symfony/dependency-injection": "~2.0",
-            "symfony/event-dispatcher": "~2.1"
-        },
-        "suggest": {
-            "symfony/event-dispatcher": "DynamicRouter can optionally trigger an event at the start of matching. Minimal version ~2.1"
-        },
-        "time": "2013-10-14 15:32:46",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.1-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Cmf\\Component\\Routing": ""
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Symfony CMF Community",
-                "homepage": "https://github.com/symfony-cmf/Routing/contributors"
-            }
-        ],
-        "description": "Extends the Symfony2 routing component for dynamic routes and chaining several routers",
-        "homepage": "http://cmf.symfony.com",
-        "keywords": [
-            "database",
-            "routing"
-        ]
-    },
-    {
         "name": "doctrine/annotations",
         "version": "dev-master",
         "version_normalized": "9999999-dev",
@@ -2512,5 +2452,65 @@
             "rest",
             "web service"
         ]
+    },
+    {
+        "name": "symfony-cmf/routing",
+        "version": "1.2.0",
+        "version_normalized": "1.2.0.0",
+        "target-dir": "Symfony/Cmf/Component/Routing",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony-cmf/Routing.git",
+            "reference": "c67258b875eef3cb08009bf1428499d0f01ce5e7"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony-cmf/Routing/zipball/c67258b875eef3cb08009bf1428499d0f01ce5e7",
+            "reference": "c67258b875eef3cb08009bf1428499d0f01ce5e7",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3",
+            "psr/log": "~1.0",
+            "symfony/http-kernel": "~2.2",
+            "symfony/routing": "~2.2"
+        },
+        "require-dev": {
+            "symfony/config": "~2.2",
+            "symfony/dependency-injection": "~2.0",
+            "symfony/event-dispatcher": "~2.1"
+        },
+        "suggest": {
+            "symfony/event-dispatcher": "DynamicRouter can optionally trigger an event at the start of matching. Minimal version ~2.1"
+        },
+        "time": "2014-05-08 19:37:14",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.2-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Cmf\\Component\\Routing": ""
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Symfony CMF Community",
+                "homepage": "https://github.com/symfony-cmf/Routing/contributors"
+            }
+        ],
+        "description": "Extends the Symfony2 routing component for dynamic routes and chaining several routers",
+        "homepage": "http://cmf.symfony.com",
+        "keywords": [
+            "database",
+            "routing"
+        ]
     }
 ]
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/.travis.yml b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/.travis.yml
index 9a8b51a..8d4dde4 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/.travis.yml
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/.travis.yml
@@ -8,6 +8,7 @@ php:
 env:
   - SYMFONY_VERSION=2.2.*
   - SYMFONY_VERSION=2.3.*
+  - SYMFONY_VERSION=2.4.*
   - SYMFONY_VERSION=dev-master
 
 before_script:
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/CHANGELOG.md b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/CHANGELOG.md
index a8a0c79..3b0f7be 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/CHANGELOG.md
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/CHANGELOG.md
@@ -1,6 +1,23 @@
 Changelog
 =========
 
+1.2.0
+-----
+
+Release 1.2.0
+
+1.2.0-RC1
+---------
+
+* **2013-12-23**: add support for ChainRouter::getRouteCollection()
+* **2013-01-07**: Removed the deprecated $parameters argument in
+  RouteProviderInterface::getRouteByName and getRoutesByNames.
+
+1.1.0
+-----
+
+Release 1.1.0
+
 1.1.0-RC1
 ---------
 
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Candidates/Candidates.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Candidates/Candidates.php
new file mode 100644
index 0000000..84584f9
--- /dev/null
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Candidates/Candidates.php
@@ -0,0 +1,154 @@
+<?php
+
+/*
+ * This file is part of the Symfony CMF package.
+ *
+ * (c) 2011-2014 Symfony CMF
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Cmf\Component\Routing\Candidates;
+
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * A straightforward strategy that splits the URL on "/".
+ *
+ * If locales is set, additionally generates candidates removing the locale if
+ * it is one of the configured locales, for non-locale specific URLs.
+ *
+ * @author David Buchmann <mail@davidbu.ch>
+ */
+class Candidates implements CandidatesInterface
+{
+    /**
+     * @var array
+     */
+    protected $locales;
+
+    /**
+     * A limit to apply to the number of candidates generated.
+     *
+     * This is to prevent abusive requests with a lot of "/". The limit is per
+     * batch, that is if a locale matches you could get as many as 2 * $limit
+     * candidates if the URL has that many slashes.
+     *
+     * @var int
+     */
+    protected $limit;
+
+    /**
+     * @param array $locales The locales to support.
+     * @param int   $limit   A limit to apply to the candidates generated.
+     */
+    public function __construct(array $locales = array(), $limit = 20)
+    {
+        $this->setLocales($locales);
+        $this->limit = $limit;
+    }
+
+    /**
+     * Set the locales to support by this strategy.
+     *
+     * @param array $locales The locales to support.
+     */
+    public function setLocales(array $locales)
+    {
+        $this->locales = $locales;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * Always returns true.
+     */
+    public function isCandidate($name)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * Does nothing.
+     */
+    public function restrictQuery($queryBuilder)
+    {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getCandidates(Request $request)
+    {
+        $url = $request->getPathInfo();
+        $candidates = $this->getCandidatesFor($url);
+
+        $locale = $this->determineLocale($url);
+        if ($locale) {
+            $candidates = array_unique(array_merge($candidates, $this->getCandidatesFor(substr($url, strlen($locale) + 1))));
+        }
+
+        return $candidates;
+    }
+
+    /**
+     * Determine the locale of this URL.
+     *
+     * @param string $url The url to determine the locale from.
+     *
+     * @return string|boolean The locale if $url starts with one of the allowed locales.
+     */
+    protected function determineLocale($url)
+    {
+        if (!count($this->locales)) {
+            return false;
+        }
+
+        $matches = array();
+        if (preg_match('#(' . implode('|', $this->locales) . ')(/|$)#', $url, $matches)) {
+            return $matches[1];
+        }
+
+        return false;
+    }
+
+    /**
+     * Handle a possible format extension and split the $url on "/".
+     *
+     * $prefix is prepended to every candidate generated.
+     *
+     * @param string $url    The URL to split.
+     * @param string $prefix A prefix to prepend to every pattern.
+     *
+     * @return array Paths that could represent routes that match $url and are
+     *               child of $prefix.
+     */
+    protected function getCandidatesFor($url, $prefix = '')
+    {
+        $candidates = array();
+        if ('/' !== $url) {
+            // handle format extension, like .html or .json
+            if (preg_match('/(.+)\.[a-z]+$/i', $url, $matches)) {
+                $candidates[] = $prefix . $url;
+                $url = $matches[1];
+            }
+
+            $part = $url;
+            $count = 0;
+            while (false !== ($pos = strrpos($part, '/'))) {
+                if (++$count > $this->limit) {
+                    return $candidates;
+                }
+                $candidates[] = $prefix . $part;
+                $part = substr($url, 0, $pos);
+            }
+        }
+
+        $candidates[] = $prefix ?: '/';
+
+        return $candidates;
+    }
+}
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Candidates/CandidatesInterface.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Candidates/CandidatesInterface.php
new file mode 100644
index 0000000..54e6811
--- /dev/null
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Candidates/CandidatesInterface.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * This file is part of the Symfony CMF package.
+ *
+ * (c) 2011-2014 Symfony CMF
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Cmf\Component\Routing\Candidates;
+
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Candidates is a subsystem useful for the route provider. It separates the
+ * logic for determining possible static prefixes from the route provider.
+ *
+ * @author David Buchmann <mail@davidbu.ch>
+ */
+interface CandidatesInterface
+{
+    /**
+     * @param Request $request
+     *
+     * @return array a list of PHPCR-ODM ids
+     */
+    public function getCandidates(Request $request);
+
+    /**
+     * Determine if $name is a valid candidate, e.g. in getRouteByName.
+     *
+     * @param string $name
+     *
+     * @return boolean
+     */
+    public function isCandidate($name);
+
+    /**
+     * Provide a best effort query restriction to limit a query to only find
+     * routes that are supported.
+     *
+     * @param object $queryBuilder A query builder suited for the storage backend.
+     */
+    public function restrictQuery($queryBuilder);
+}
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ChainRouteCollection.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ChainRouteCollection.php
new file mode 100644
index 0000000..16c4859
--- /dev/null
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ChainRouteCollection.php
@@ -0,0 +1,272 @@
+<?php
+
+/*
+ * This file is part of the Symfony CMF package.
+ *
+ * (c) 2011-2014 Symfony CMF
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Cmf\Component\Routing;
+
+use Symfony\Component\Config\Resource\ResourceInterface;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+class ChainRouteCollection extends RouteCollection
+{
+    /**
+     * @var RouteCollection[]
+     */
+    private $routeCollections = array();
+
+    /**
+     * @var RouteCollection
+     */
+    private $routeCollection;
+
+    public function __clone()
+    {
+        foreach ($this->routeCollections as $routeCollection) {
+            $this->routeCollections[] = clone $routeCollection;
+        }
+    }
+
+    /**
+     * Gets the current RouteCollection as an Iterator that includes all routes.
+     *
+     * It implements \IteratorAggregate.
+     *
+     * @see all()
+     *
+     * @return \ArrayIterator An \ArrayIterator object for iterating over routes
+     */
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->all());
+    }
+
+    /**
+     * Gets the number of Routes in this collection.
+     *
+     * @return int The number of routes
+     */
+    public function count()
+    {
+        $count = 0;
+        foreach ($this->routeCollections as $routeCollection) {
+            $count+= $routeCollection->count();
+        }
+
+        return $count;
+    }
+
+    /**
+     * Adds a route.
+     *
+     * @param string $name  The route name
+     * @param Route  $route A Route instance
+     */
+    public function add($name, Route $route)
+    {
+        $this->createInternalCollection();
+        $this->routeCollection->add($name, $route);
+    }
+
+    /**
+     * Returns all routes in this collection.
+     *
+     * @return Route[] An array of routes
+     */
+    public function all()
+    {
+        $routeCollectionAll = new RouteCollection();
+        foreach ($this->routeCollections as $routeCollection) {
+            $routeCollectionAll->addCollection($routeCollection);
+        }
+
+        return $routeCollectionAll->all();
+    }
+
+    /**
+     * Gets a route by name.
+     *
+     * @param string $name The route name
+     *
+     * @return Route|null A Route instance or null when not found
+     */
+    public function get($name)
+    {
+        foreach ($this->routeCollections as $routeCollection) {
+            $route = $routeCollection->get($name);
+            if (null !== $route) {
+                return $route;
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Removes a route or an array of routes by name from the collection
+     *
+     * @param string|array $name The route name or an array of route names
+     */
+    public function remove($name)
+    {
+        foreach ($this->routeCollections as $routeCollection) {
+            $route = $routeCollection->get($name);
+            if (null !== $route) {
+                $routeCollection->remove($name);
+            }
+        }
+    }
+
+    /**
+     * Adds a route collection at the end of the current set by appending all
+     * routes of the added collection.
+     *
+     * @param RouteCollection $collection A RouteCollection instance
+     */
+    public function addCollection(RouteCollection $collection)
+    {
+        $this->routeCollections[] = $collection;
+    }
+
+    /**
+     * Adds a prefix to the path of all child routes.
+     *
+     * @param string $prefix       An optional prefix to add before each pattern of the route collection
+     * @param array  $defaults     An array of default values
+     * @param array  $requirements An array of requirements
+     */
+    public function addPrefix($prefix, array $defaults = array(), array $requirements = array())
+    {
+        $this->createInternalCollection();
+        foreach ($this->routeCollections as $routeCollection) {
+            $routeCollection->addPrefix($prefix, $defaults, $requirements);
+        }
+    }
+
+    /**
+     * Sets the host pattern on all routes.
+     *
+     * @param string $pattern      The pattern
+     * @param array  $defaults     An array of default values
+     * @param array  $requirements An array of requirements
+     */
+    public function setHost($pattern, array $defaults = array(), array $requirements = array())
+    {
+        $this->createInternalCollection();
+        foreach ($this->routeCollections as $routeCollection) {
+            $routeCollection->setHost($pattern, $defaults, $requirements);
+        }
+    }
+
+    /**
+     * Adds defaults to all routes.
+     *
+     * An existing default value under the same name in a route will be overridden.
+     *
+     * @param array $defaults An array of default values
+     */
+    public function addDefaults(array $defaults)
+    {
+        $this->createInternalCollection();
+        foreach ($this->routeCollections as $routeCollection) {
+            $routeCollection->addDefaults($defaults);
+        }
+    }
+
+    /**
+     * Adds requirements to all routes.
+     *
+     * An existing requirement under the same name in a route will be overridden.
+     *
+     * @param array $requirements An array of requirements
+     */
+    public function addRequirements(array $requirements)
+    {
+        $this->createInternalCollection();
+        foreach ($this->routeCollections as $routeCollection) {
+            $routeCollection->addRequirements($requirements);
+        }
+    }
+
+    /**
+     * Adds options to all routes.
+     *
+     * An existing option value under the same name in a route will be overridden.
+     *
+     * @param array $options An array of options
+     */
+    public function addOptions(array $options)
+    {
+        $this->createInternalCollection();
+        foreach ($this->routeCollections as $routeCollection) {
+            $routeCollection->addOptions($options);
+        }
+    }
+
+    /**
+     * Sets the schemes (e.g. 'https') all child routes are restricted to.
+     *
+     * @param string|array $schemes The scheme or an array of schemes
+     */
+    public function setSchemes($schemes)
+    {
+        $this->createInternalCollection();
+        foreach ($this->routeCollections as $routeCollection) {
+            $routeCollection->setSchemes($schemes);
+        }
+    }
+
+    /**
+     * Sets the HTTP methods (e.g. 'POST') all child routes are restricted to.
+     *
+     * @param string|array $methods The method or an array of methods
+     */
+    public function setMethods($methods)
+    {
+        $this->createInternalCollection();
+        foreach ($this->routeCollections as $routeCollection) {
+            $routeCollection->setMethods($methods);
+        }
+    }
+
+    /**
+     * Returns an array of resources loaded to build this collection.
+     *
+     * @return ResourceInterface[] An array of resources
+     */
+    public function getResources()
+    {
+        $resources = array();
+        foreach ($this->routeCollections as $routeCollection) {
+            $resources = array_merge($resources, $routeCollection->getResources());
+        }
+
+        return array_unique($resources);
+    }
+
+    /**
+     * Adds a resource for this collection.
+     *
+     * @param ResourceInterface $resource A resource instance
+     */
+    public function addResource(ResourceInterface $resource)
+    {
+        $this->createInternalCollection();
+        $this->routeCollection->addResource($resource);
+    }
+
+    private function createInternalCollection()
+    {
+        if (!$this->routeCollection instanceof RouteCollection) {
+            $this->routeCollection = new RouteCollection();
+            $this->routeCollections[] = $this->routeCollection;
+        }
+    }
+}
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ChainRouter.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ChainRouter.php
index f7452b2..44ca2ee 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ChainRouter.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ChainRouter.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing;
 
 use Symfony\Component\Routing\RouterInterface;
@@ -185,12 +184,12 @@ private function doMatch($url, Request $request = null)
                 return $router->match($url);
             } catch (ResourceNotFoundException $e) {
                 if ($this->logger) {
-                    $this->logger->info('Router '.get_class($router).' was not able to match, message "'.$e->getMessage().'"');
+                    $this->logger->debug('Router '.get_class($router).' was not able to match, message "'.$e->getMessage().'"');
                 }
                 // Needs special care
             } catch (MethodNotAllowedException $e) {
                 if ($this->logger) {
-                    $this->logger->info('Router '.get_class($router).' throws MethodNotAllowedException with message "'.$e->getMessage().'"');
+                    $this->logger->debug('Router '.get_class($router).' throws MethodNotAllowedException with message "'.$e->getMessage().'"');
                 }
                 $methodNotAllowed = $e;
             }
@@ -231,7 +230,7 @@ public function generate($name, $parameters = array(), $absolute = false)
                 $hint = $this->getErrorMessage($name, $router, $parameters);
                 $debug[] = $hint;
                 if ($this->logger) {
-                    $this->logger->info('Router '.get_class($router)." was unable to generate route. Reason: '$hint': ".$e->getMessage());
+                    $this->logger->debug('Router '.get_class($router)." was unable to generate route. Reason: '$hint': ".$e->getMessage());
                 }
             }
         }
@@ -296,7 +295,7 @@ public function warmUp($cacheDir)
     public function getRouteCollection()
     {
         if (!$this->routeCollection instanceof RouteCollection) {
-            $this->routeCollection = new RouteCollection();
+            $this->routeCollection = new ChainRouteCollection();
             foreach ($this->all() as $router) {
                 $this->routeCollection->addCollection($router->getRouteCollection());
             }
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ChainedRouterInterface.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ChainedRouterInterface.php
index ae2307e..b0c40ca 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ChainedRouterInterface.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ChainedRouterInterface.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing;
 
 use Symfony\Component\Routing\RouterInterface;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ContentAwareGenerator.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ContentAwareGenerator.php
index b1254bd..91643eb 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ContentAwareGenerator.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ContentAwareGenerator.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing;
 
 use Doctrine\Common\Collections\Collection;
@@ -58,10 +57,11 @@ public function setContentRepository(ContentRepositoryInterface $contentReposito
     /**
      * {@inheritDoc}
      *
-     * @param string $name       ignored
+     * @param string $name       ignored.
      * @param array  $parameters must either contain the field 'route' with a
-     *      RouteObjectInterface or the field 'content_id' with a document
-     *      id to get the route for (implementing RouteReferrersReadInterface)
+     *                           RouteObjectInterface or the field 'content_id'
+     *                           with the id of a document implementing
+     *                           RouteReferrersReadInterface.
      *
      * @throws RouteNotFoundException If there is no such route in the database
      */
@@ -97,7 +97,7 @@ public function generate($name, $parameters = array(), $absolute = false)
      */
     protected function getRouteByName($name, array $parameters)
     {
-        $route = $this->provider->getRouteByName($name, $parameters);
+        $route = $this->provider->getRouteByName($name);
         if (empty($route)) {
             throw new RouteNotFoundException('No route found for name: ' . $name);
         }
@@ -152,7 +152,7 @@ protected function getBestLocaleRoute(SymfonyRoute $route, $parameters)
      *
      * @param mixed $name
      * @param array $parameters which should contain a content field containing
-     *      a RouteReferrersReadInterface object
+     *                          a RouteReferrersReadInterface object
      *
      * @return SymfonyRoute the route instance
      *
@@ -225,8 +225,9 @@ protected function getRouteByLocale($routes, $locale)
      * @param SymfonyRoute $route
      * @param string       $locale
      *
-     * @return bool TRUE if there is either no $locale, no _locale requirement
-     *      on the route or if the requirement and the passed $locale match.
+     * @return bool true if there is either no $locale, no _locale requirement
+     *              on the route or if the requirement and the passed $locale
+     *              match.
      */
     private function checkLocaleRequirement(SymfonyRoute $route, $locale)
     {
@@ -242,8 +243,8 @@ private function checkLocaleRequirement(SymfonyRoute $route, $locale)
      * @param array $parameters the parameters determined by the route
      *
      * @return string the locale following of the parameters or any other
-     *  information the router has available. defaultLocale if no other locale
-     *  can be determined.
+     *                information the router has available. defaultLocale if no
+     *                other locale can be determined.
      */
     protected function getLocale($parameters)
     {
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ContentRepositoryInterface.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ContentRepositoryInterface.php
index 2f2c66d..31aea58 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ContentRepositoryInterface.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ContentRepositoryInterface.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing;
 
 /**
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/DependencyInjection/Compiler/RegisterRouteEnhancersPass.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/DependencyInjection/Compiler/RegisterRouteEnhancersPass.php
index 927651e..0c24224 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/DependencyInjection/Compiler/RegisterRouteEnhancersPass.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/DependencyInjection/Compiler/RegisterRouteEnhancersPass.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\DependencyInjection\Compiler;
 
 use Symfony\Component\DependencyInjection\ContainerBuilder;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/DependencyInjection/Compiler/RegisterRoutersPass.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/DependencyInjection/Compiler/RegisterRoutersPass.php
index 7e564f3..2d83765 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/DependencyInjection/Compiler/RegisterRoutersPass.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/DependencyInjection/Compiler/RegisterRoutersPass.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\DependencyInjection\Compiler;
 
 use Symfony\Component\DependencyInjection\ContainerBuilder;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/DynamicRouter.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/DynamicRouter.php
index 1ac34b2..03eaefa 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/DynamicRouter.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/DynamicRouter.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing;
 
 use Symfony\Component\HttpFoundation\Request;
@@ -77,36 +76,49 @@ class DynamicRouter implements RouterInterface, RequestMatcherInterface, Chained
     protected $context;
 
     /**
+     * @var RouteCollection
+     */
+    private $routeCollection;
+
+    /**
      * @param RequestContext                              $context
      * @param RequestMatcherInterface|UrlMatcherInterface $matcher
      * @param UrlGeneratorInterface                       $generator
      * @param string                                      $uriFilterRegexp
      * @param EventDispatcherInterface|null               $eventDispatcher
+     * @param RouteProviderInterface                      $provider
      */
     public function __construct(RequestContext $context,
                                 $matcher,
                                 UrlGeneratorInterface $generator,
                                 $uriFilterRegexp = '',
-                                EventDispatcherInterface $eventDispatcher = null
+                                EventDispatcherInterface $eventDispatcher = null,
+                                RouteProviderInterface $provider = null
     ) {
         $this->context = $context;
         if (! $matcher instanceof RequestMatcherInterface && ! $matcher instanceof UrlMatcherInterface) {
-            throw new \InvalidArgumentException('Invalid $matcher');
+            throw new \InvalidArgumentException('Matcher must implement either Symfony\Component\Routing\Matcher\RequestMatcherInterface or Symfony\Component\Routing\Matcher\UrlMatcherInterface');
         }
         $this->matcher = $matcher;
         $this->generator = $generator;
         $this->eventDispatcher = $eventDispatcher;
         $this->uriFilterRegexp = $uriFilterRegexp;
+        $this->provider = $provider;
 
         $this->generator->setContext($context);
     }
 
     /**
-     * Not implemented.
+     * {@inheritDoc}
      */
     public function getRouteCollection()
     {
-        return new RouteCollection();
+        if (!$this->routeCollection instanceof RouteCollection) {
+            $this->routeCollection = $this->provider
+                ? new LazyRouteCollection($this->provider) : new RouteCollection();
+        }
+
+        return $this->routeCollection;
     }
 
     /**
@@ -178,13 +190,13 @@ public function supports($name)
      * exceptions documented below.
      *
      * @param string $pathinfo The path info to be parsed (raw format, i.e. not
-     *      urldecoded)
+     *                         urldecoded)
      *
      * @return array An array of parameters
      *
      * @throws ResourceNotFoundException If the resource could not be found
      * @throws MethodNotAllowedException If the resource was found but the
-     *      request method is not allowed
+     *                                   request method is not allowed
      *
      * @api
      */
@@ -223,7 +235,7 @@ public function match($pathinfo)
      *
      * @throws ResourceNotFoundException If no matching resource could be found
      * @throws MethodNotAllowedException If a matching resource was found but
-     *      the request method is not allowed
+     *                                   the request method is not allowed
      */
     public function matchRequest(Request $request)
     {
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/FieldByClassEnhancer.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/FieldByClassEnhancer.php
index 52b70d5..f88b348 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/FieldByClassEnhancer.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/FieldByClassEnhancer.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Enhancer;
 
 use Symfony\Component\HttpFoundation\Request;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/FieldMapEnhancer.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/FieldMapEnhancer.php
index a5f3488..91adc66 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/FieldMapEnhancer.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/FieldMapEnhancer.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Enhancer;
 
 use Symfony\Component\HttpFoundation\Request;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/FieldPresenceEnhancer.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/FieldPresenceEnhancer.php
index 6dcb908..d2e35ad 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/FieldPresenceEnhancer.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/FieldPresenceEnhancer.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Enhancer;
 
 use Symfony\Component\HttpFoundation\Request;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/RouteContentEnhancer.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/RouteContentEnhancer.php
index 1c1d5e7..af63dfc 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/RouteContentEnhancer.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/RouteContentEnhancer.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Enhancer;
 
 use Symfony\Component\HttpFoundation\Request;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/RouteEnhancerInterface.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/RouteEnhancerInterface.php
index 19a9da9..85a77c5 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/RouteEnhancerInterface.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Enhancer/RouteEnhancerInterface.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Enhancer;
 
 use Symfony\Component\HttpFoundation\Request;
@@ -28,10 +27,11 @@
     /**
      * Update the defaults based on its own data and the request.
      *
-     * @param array $defaults the getRouteDefaults array.
+     * @param array   $defaults the getRouteDefaults array.
+     * @param Request $request  the Request instance.
      *
      * @return array the modified defaults. Each enhancer MUST return the
-     *      $defaults but may add or remove values.
+     *               $defaults but may add or remove values.
      */
     public function enhance(array $defaults, Request $request);
 }
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Event/Events.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Event/Events.php
index 9804f45..95c0326 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Event/Events.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Event/Events.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Event;
 
 final class Events
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Event/RouterMatchEvent.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Event/RouterMatchEvent.php
index 39ca607..7125972 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Event/RouterMatchEvent.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Event/RouterMatchEvent.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Event;
 
 use Symfony\Component\EventDispatcher\Event;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/LICENSE b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/LICENSE
index 32077a6..b068dfb 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/LICENSE
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/LICENSE
@@ -2,7 +2,7 @@ Routing
 
     The MIT License
 
-    Copyright (c) 2011-2013 Symfony2 CMF
+    Copyright (c) 2011-2014 Symfony2 CMF
 
     Permission is hereby granted, free of charge, to any person obtaining a copy
     of this software and associated documentation files (the "Software"), to deal
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/LazyRouteCollection.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/LazyRouteCollection.php
new file mode 100644
index 0000000..28b02ac
--- /dev/null
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/LazyRouteCollection.php
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of the Symfony CMF package.
+ *
+ * (c) 2011-2014 Symfony CMF
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Cmf\Component\Routing;
+
+use Symfony\Component\Routing\Exception\RouteNotFoundException;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\Route;
+
+class LazyRouteCollection extends RouteCollection
+{
+    /**
+     * The route provider for this generator.
+     *
+     * @var RouteProviderInterface
+     */
+    protected $provider;
+
+    public function __construct(RouteProviderInterface $provider)
+    {
+        $this->provider = $provider;
+    }
+
+    /**
+     * Gets the number of Routes in this collection.
+     *
+     * @return int The number of routes
+     */
+    public function count()
+    {
+        return count($this->all());
+    }
+
+    /**
+     * Returns all routes in this collection.
+     *
+     * @return Route[] An array of routes
+     */
+    public function all()
+    {
+        return $this->provider->getRoutesByNames(null);
+    }
+
+    /**
+     * Gets a route by name.
+     *
+     * @param string $name The route name
+     *
+     * @return Route|null A Route instance or null when not found
+     */
+    public function get($name)
+    {
+        try {
+            return $this->provider->getRouteByName($name);
+        } catch (RouteNotFoundException $e) {
+            return null;
+        }
+    }
+}
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/FinalMatcherInterface.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/FinalMatcherInterface.php
index 1d0417d..77cd649 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/FinalMatcherInterface.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/FinalMatcherInterface.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\NestedMatcher;
 
 use Symfony\Component\HttpFoundation\Request;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/NestedMatcher.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/NestedMatcher.php
index d283ff5..c136e1f 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/NestedMatcher.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/NestedMatcher.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\NestedMatcher;
 
 use Symfony\Component\HttpFoundation\Request;
@@ -66,7 +65,7 @@ class NestedMatcher implements RequestMatcherInterface
      *
      * @param RouteProviderInterface $provider The route provider this matcher
      *                                         should use
-     * @param FinalMatcherInterface $final The Final Matcher to match the
+     * @param FinalMatcherInterface  $final    The Final Matcher to match the
      *                                         routes
      */
     public function __construct(
@@ -84,8 +83,7 @@ public function __construct(
     /**
      * Sets the route provider for the matching plan.
      *
-     * @param RouteProviderInterface $provider A route provider. It is
-     *      responsible for its own configuration.
+     * @param RouteProviderInterface $provider A source of routes.
      *
      * @return NestedMatcher this object to have a fluent interface
      */
@@ -103,7 +101,8 @@ public function setRouteProvider(RouteProviderInterface $provider)
      *
      * @param RouteFilterInterface $filter
      * @param int                  $priority (optional) The priority of the
-     *      filter. Higher number filters will be used first. Default to 0.
+     *                                       filter. Higher number filters will
+     *                                       be used first. Defaults to 0.
      *
      * @return NestedMatcher this object to have a fluent interface
      */
@@ -123,7 +122,7 @@ public function addRouteFilter(RouteFilterInterface $filter, $priority = 0)
      * Sets the final matcher for the matching plan.
      *
      * @param FinalMatcherInterface $final The final matcher that will have to
-     *      pick the route that will be used.
+     *                                     pick the route that will be used.
      *
      * @return NestedMatcher this object to have a fluent interface
      */
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/RouteFilterInterface.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/RouteFilterInterface.php
index f094566..15ff74d 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/RouteFilterInterface.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/RouteFilterInterface.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\NestedMatcher;
 
 use Symfony\Component\Routing\RouteCollection;
@@ -39,8 +38,10 @@
      * @return RouteCollection A non-empty RouteCollection of matched routes.
      *
      * @throws ResourceNotFoundException if none of the routes in $collection
-     *      matches $request. This is a performance optimization to not continue
-     *      the match process when a match will no longer be possible.
+     *                                   matches $request. This is a performance
+     *                                   optimization to not continue the match
+     *                                   process when a match will no longer be
+     *                                   possible.
      */
     public function filter(RouteCollection $collection, Request $request);
 }
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/UrlMatcher.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/UrlMatcher.php
index 94b8ec9..8986d5b 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/UrlMatcher.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/NestedMatcher/UrlMatcher.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\NestedMatcher;
 
 use Symfony\Component\Routing\Route;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ProviderBasedGenerator.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ProviderBasedGenerator.php
index e3aef91..2696781 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ProviderBasedGenerator.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/ProviderBasedGenerator.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing;
 
 use Symfony\Component\Routing\Generator\UrlGenerator;
@@ -17,8 +16,6 @@
 use Symfony\Component\Routing\RequestContext;
 use Symfony\Component\Routing\Exception\RouteNotFoundException;
 
-use Symfony\Cmf\Component\Routing\RouteProviderInterface;
-
 use Psr\Log\LoggerInterface;
 
 /**
@@ -35,6 +32,10 @@ class ProviderBasedGenerator extends UrlGenerator implements VersatileGeneratorI
      */
     protected $provider;
 
+    /**
+     * @param RouteProviderInterface $provider
+     * @param LoggerInterface        $logger
+     */
     public function __construct(RouteProviderInterface $provider, LoggerInterface $logger = null)
     {
         $this->provider = $provider;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/README.md b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/README.md
index a9855cf..509d86b 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/README.md
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/README.md
@@ -1,6 +1,6 @@
 # Symfony CMF Routing Component
 
-[![Build Status](https://secure.travis-ci.org/symfony-cmf/Routing.png)](http://travis-ci.org/symfony-cmf/Routing)
+[![Build Status](https://secure.travis-ci.org/symfony-cmf/Routing.png?branch=master)](http://travis-ci.org/symfony-cmf/Routing)
 [![Latest Stable Version](https://poser.pugx.org/symfony-cmf/routing/version.png)](https://packagist.org/packages/symfony-cmf/routing)
 [![Total Downloads](https://poser.pugx.org/symfony-cmf/routing/d/total.png)](https://packagist.org/packages/symfony-cmf/routing)
 
@@ -32,7 +32,7 @@ and licensed under the [MIT License](LICENSE).
 
 For the install guide and reference, see:
 
-* [Routing component documentation](http://symfony.com/doc/master/cmf/components/routing.html)
+* [Routing component documentation](http://symfony.com/doc/master/cmf/components/routing/index.html)
 
 See also:
 
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RedirectRouteInterface.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RedirectRouteInterface.php
index 6f462f3..daa45d0 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RedirectRouteInterface.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RedirectRouteInterface.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing;
 
 /**
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteObjectInterface.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteObjectInterface.php
index 8287a93..2476dee 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteObjectInterface.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteObjectInterface.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing;
 
 /**
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteProviderInterface.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteProviderInterface.php
index 99d7964..6283e6f 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteProviderInterface.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteProviderInterface.php
@@ -3,16 +3,18 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing;
 
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Exception\RouteNotFoundException;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
 
 /**
  * Interface for the route provider the DynamicRouter is using.
@@ -41,25 +43,22 @@
      *
      * @param Request $request A request against which to match.
      *
-     * @return \Symfony\Component\Routing\RouteCollection with all Routes that
-     *      could potentially match $request. Empty collection if nothing can
-     *      match.
+     * @return RouteCollection with all Routes that could potentially match
+     *                         $request. Empty collection if nothing can match.
      */
     public function getRouteCollectionForRequest(Request $request);
 
     /**
      * Find the route using the provided route name.
      *
-     * @param string $name       the route name to fetch
-     * @param array  $parameters DEPRECATED the parameters as they are passed
-     *      to the UrlGeneratorInterface::generate call
+     * @param string $name The route name to fetch.
      *
-     * @return \Symfony\Component\Routing\Route
+     * @return Route
      *
-     * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException if
-     *      there is no route with that name in this repository
+     * @throws RouteNotFoundException If there is no route with that name in
+     *                                this repository
      */
-    public function getRouteByName($name, $parameters = array());
+    public function getRouteByName($name);
 
     /**
      * Find many routes by their names using the provided list of names.
@@ -72,13 +71,18 @@ public function getRouteByName($name, $parameters = array());
      * simple implementation could be to just repeatedly call
      * $this->getRouteByName() while catching and ignoring eventual exceptions.
      *
-     * @param array $names      the list of names to retrieve
-     * @param array $parameters DEPRECATED the parameters as they are passed to
-     *      the UrlGeneratorInterface::generate call. (Only one array, not one
-     *      for each entry in $names.
+     * If $names is null, this method SHOULD return a collection of all routes
+     * known to this provider. If there are many routes to be expected, usage of
+     * a lazy loading collection is recommended. A provider MAY only return a
+     * subset of routes to e.g. support paging or other concepts, but be aware
+     * that the DynamicRouter will only call this method once per
+     * DynamicRouter::getRouteCollection() call.
+     *
+     * @param array|null $names The list of names to retrieve, In case of null,
+     *                          the provider will determine what routes to return.
      *
-     * @return \Symfony\Component\Routing\Route[] iterable thing with the keys
-     *      the names of the $names argument.
+     * @return Route[] Iterable list with the keys being the names from the
+ *                     $names array.
      */
-    public function getRoutesByNames($names, $parameters = array());
+    public function getRoutesByNames($names);
 }
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteReferrersInterface.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteReferrersInterface.php
index 9cf1f0f..1c13cb6 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteReferrersInterface.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteReferrersInterface.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing;
 
 use Symfony\Component\Routing\Route;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteReferrersReadInterface.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteReferrersReadInterface.php
index 96691b2..d81b435 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteReferrersReadInterface.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/RouteReferrersReadInterface.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing;
 
 use Symfony\Component\Routing\Route;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Test/CmfUnitTestCase.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Test/CmfUnitTestCase.php
index 782a431..367c693 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Test/CmfUnitTestCase.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Test/CmfUnitTestCase.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Test;
 
 class CmfUnitTestCase extends \PHPUnit_Framework_TestCase
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Candidates/CandidatesTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Candidates/CandidatesTest.php
new file mode 100644
index 0000000..654711a
--- /dev/null
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Candidates/CandidatesTest.php
@@ -0,0 +1,106 @@
+<?php
+
+/*
+ * This file is part of the Symfony CMF package.
+ *
+ * (c) 2011-2013 Symfony CMF
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Cmf\Component\Routing\Tests\Candidates;
+
+use Symfony\Cmf\Component\Routing\Candidates\Candidates;
+use Symfony\Component\HttpFoundation\Request;
+
+class CandidatesTest extends \PHPUnit_Framework_Testcase
+{
+    /**
+     * Everything is a candidate
+     */
+    public function testIsCandidate()
+    {
+        $candidates = new Candidates();
+        $this->assertTrue($candidates->isCandidate('/routes'));
+        $this->assertTrue($candidates->isCandidate('/routes/my/path'));
+    }
+
+    /**
+     * Nothing should be called on the query builder
+     */
+    public function testRestrictQuery()
+    {
+        $candidates = new Candidates();
+        $candidates->restrictQuery(null);
+    }
+
+    public function testGetCandidates()
+    {
+        $request = Request::create('/my/path.html');
+
+        $candidates = new Candidates();
+        $paths = $candidates->getCandidates($request);
+
+        $this->assertEquals(
+            array(
+                '/my/path.html',
+                '/my/path',
+                '/my',
+                '/',
+            ),
+            $paths
+        );
+    }
+
+    public function testGetCandidatesLocales()
+    {
+        $candidates = new Candidates(array('de', 'fr'));
+
+        $request = Request::create('/fr/path.html');
+        $paths = $candidates->getCandidates($request);
+
+        $this->assertEquals(
+            array(
+                '/fr/path.html',
+                '/fr/path',
+                '/fr',
+                '/',
+                '/path.html',
+                '/path'
+            ),
+            $paths
+        );
+
+        $request = Request::create('/it/path.html');
+        $paths = $candidates->getCandidates($request);
+
+        $this->assertEquals(
+            array(
+                '/it/path.html',
+                '/it/path',
+                '/it',
+                '/',
+            ),
+            $paths
+        );
+    }
+
+    public function testGetCandidatesLimit()
+    {
+        $candidates = new Candidates(array(), 1);
+
+        $request = Request::create('/my/path/is/deep.html');
+
+        $paths = $candidates->getCandidates($request);
+
+        $this->assertEquals(
+            array(
+                '/my/path/is/deep.html',
+                '/my/path/is/deep',
+            ),
+            $paths
+        );
+
+    }
+}
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/DependencyInjection/Compiler/RegisterRouteEnhancersPassTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/DependencyInjection/Compiler/RegisterRouteEnhancersPassTest.php
index c05f797..0213885 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/DependencyInjection/Compiler/RegisterRouteEnhancersPassTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/DependencyInjection/Compiler/RegisterRouteEnhancersPassTest.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Tests\DependencyInjection\Compiler;
 
 use Symfony\Cmf\Component\Routing\DependencyInjection\Compiler\RegisterRouteEnhancersPass;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/DependencyInjection/Compiler/RegisterRoutersPassTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/DependencyInjection/Compiler/RegisterRoutersPassTest.php
index ebeb5b0..f66c2d8 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/DependencyInjection/Compiler/RegisterRoutersPassTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/DependencyInjection/Compiler/RegisterRoutersPassTest.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Routing\Tests\DependencyInjection\Compiler;
 
 use Symfony\Cmf\Component\Routing\DependencyInjection\Compiler\RegisterRoutersPass;
@@ -34,7 +33,7 @@ public function testValidRouters($name, $priority = null)
         $definition = $this->getMock('Symfony\Component\DependencyInjection\Definition');
         $definition->expects($this->atLeastOnce())
             ->method('addMethodCall')
-            ->with($this->equalTo('add'), $this->callback(function($arg) use ($name, $priority) {
+            ->with($this->equalTo('add'), $this->callback(function ($arg) use ($name, $priority) {
                 if (!$arg[0] instanceof Reference || $name !== $arg[0]->__toString()) {
                     return false;
                 }
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/FieldByClassEnhancerTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/FieldByClassEnhancerTest.php
index 9675f45..9dc80b0 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/FieldByClassEnhancerTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/FieldByClassEnhancerTest.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Tests\Enhancer;
 
 use Symfony\Component\HttpFoundation\Request;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/FieldMapEnhancerTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/FieldMapEnhancerTest.php
index 4fa5917..c7a902d 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/FieldMapEnhancerTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/FieldMapEnhancerTest.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Tests\Mapper;
 
 use Symfony\Component\HttpFoundation\Request;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/FieldPresenceEnhancerTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/FieldPresenceEnhancerTest.php
index 596780a..8a2b754 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/FieldPresenceEnhancerTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/FieldPresenceEnhancerTest.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Tests\Enhancer;
 
 use Symfony\Component\HttpFoundation\Request;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/RouteContentEnhancerTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/RouteContentEnhancerTest.php
index 6383fb3..06b0911 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/RouteContentEnhancerTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/RouteContentEnhancerTest.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Tests\Enhancer;
 
 use Symfony\Component\HttpFoundation\Request;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/RouteObject.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/RouteObject.php
index 5b0a737..752b8e0 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/RouteObject.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Enhancer/RouteObject.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Tests\Enhancer;
 
 use Symfony\Component\Routing\Route;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/NestedMatcherTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/NestedMatcherTest.php
index e7bf9ae..1f9f06c 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/NestedMatcherTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/NestedMatcherTest.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Tests\NestedMatcher;
 
 use Symfony\Component\HttpFoundation\Request;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/UrlMatcherTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/UrlMatcherTest.php
index 6dc4854..d5b5635 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/UrlMatcherTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/NestedMatcher/UrlMatcherTest.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Tests\NestedMatcher;
 
 use Symfony\Component\HttpFoundation\Request;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/ChainRouterTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/ChainRouterTest.php
index d99e4a7..63a1fbf 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/ChainRouterTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/ChainRouterTest.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Tests\Routing;
 
 use Symfony\Component\Routing\Exception\MethodNotAllowedException;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/ContentAwareGeneratorTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/ContentAwareGeneratorTest.php
index 58854e9..3d08974 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/ContentAwareGeneratorTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/ContentAwareGeneratorTest.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Tests\Routing;
 
 use Symfony\Cmf\Component\Routing\RouteReferrersReadInterface;
@@ -437,7 +436,7 @@ public function testGetRouteDebugMessage()
  */
 class TestableContentAwareGenerator extends ContentAwareGenerator
 {
-    protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $absolute, $hostTokens = null)
+    protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, array $requiredSchemes = array())
     {
         return 'result_url';
     }
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/DynamicRouterTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/DynamicRouterTest.php
index 0a817e0..f3e24e9 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/DynamicRouterTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/DynamicRouterTest.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Tests\Routing;
 
 use Symfony\Cmf\Component\Routing\Event\Events;
@@ -58,11 +57,19 @@ public function testContext()
         $this->assertSame($this->context, $this->router->getContext());
     }
 
-    public function testRouteCollection()
+    public function testRouteCollectionEmpty()
     {
         $collection = $this->router->getRouteCollection();
         $this->assertInstanceOf('Symfony\Component\Routing\RouteCollection', $collection);
-        // TODO: once this is implemented, check content of collection
+    }
+
+    public function testRouteCollectionLazy()
+    {
+        $provider = $this->getMock('Symfony\Cmf\Component\Routing\RouteProviderInterface');
+        $router = new DynamicRouter($this->context, $this->matcher, $this->generator, '', null, $provider);
+
+        $collection = $router->getRouteCollection();
+        $this->assertInstanceOf('Symfony\Cmf\Component\Routing\LazyRouteCollection', $collection);
     }
 
     /// generator tests ///
@@ -303,7 +310,7 @@ public function testEventHandlerRequest()
         $that = $this;
         $eventDispatcher->expects($this->once())
             ->method('dispatch')
-            ->with(Events::PRE_DYNAMIC_MATCH_REQUEST, $this->callback(function($event) use ($that) {
+            ->with(Events::PRE_DYNAMIC_MATCH_REQUEST, $this->callback(function ($event) use ($that) {
                 $that->assertInstanceOf('Symfony\Cmf\Component\Routing\Event\RouterMatchEvent', $event);
                 $that->assertEquals($that->request, $event->getRequest());
 
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/ProviderBasedGeneratorTest.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/ProviderBasedGeneratorTest.php
index 17a28f4..955f9fc 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/ProviderBasedGeneratorTest.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/ProviderBasedGeneratorTest.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Tests\Routing;
 
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
@@ -97,6 +96,7 @@ public function testGetRouteDebugMessage()
         $this->assertContains('/some/key', $this->generator->getRouteDebugMessage(new RouteObject()));
         $this->assertContains('/de/test', $this->generator->getRouteDebugMessage(new Route('/de/test')));
         $this->assertContains('/some/route', $this->generator->getRouteDebugMessage('/some/route'));
+        $this->assertContains('a:1:{s:10:"route_name";s:7:"example";}', $this->generator->getRouteDebugMessage(array('route_name' => 'example')));
     }
 
   /**
@@ -129,7 +129,7 @@ public function testGenerateByRoute()
  */
 class TestableProviderBasedGenerator extends ProviderBasedGenerator
 {
-    protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $absolute, $hostTokens = null)
+    protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, array $requiredSchemes = array())
     {
         return 'result_url';
     }
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/RouteMock.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/RouteMock.php
index b8da84f..7b1440a 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/RouteMock.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/Routing/RouteMock.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing\Tests\Routing;
 
 use Symfony\Component\Routing\Route as SymfonyRoute;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/bootstrap.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/bootstrap.php
index ae7e2d7..157e59f 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/bootstrap.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/Tests/bootstrap.php
@@ -7,7 +7,7 @@
 
 require_once $file;
 
-spl_autoload_register(function($class) {
+spl_autoload_register(function ($class) {
     if (0 === strpos($class, 'Symfony\Cmf\Component\Routing\\')) {
         $path = __DIR__.'/../'.implode('/', array_slice(explode('\\', $class), 4)).'.php';
         if (!stream_resolve_include_path($path)) {
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/VersatileGeneratorInterface.php b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/VersatileGeneratorInterface.php
index cf011c2..d58ab7a 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/VersatileGeneratorInterface.php
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/VersatileGeneratorInterface.php
@@ -3,13 +3,12 @@
 /*
  * This file is part of the Symfony CMF package.
  *
- * (c) 2011-2013 Symfony CMF
+ * (c) 2011-2014 Symfony CMF
  *
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
-
 namespace Symfony\Cmf\Component\Routing;
 
 use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
diff --git a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/composer.json b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/composer.json
index f2220d3..768a7a1 100644
--- a/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/composer.json
+++ b/core/vendor/symfony-cmf/routing/Symfony/Cmf/Component/Routing/composer.json
@@ -32,7 +32,7 @@
     "target-dir": "Symfony/Cmf/Component/Routing",
     "extra": {
         "branch-alias": {
-            "dev-master": "1.1-dev"
+            "dev-master": "1.2-dev"
         }
     }
 }
