diff --git a/core/core.services.yml b/core/core.services.yml
index 1aadb75..f44aba3 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -822,6 +822,9 @@ services:
     lazy: true
     tags:
       - { name: needs_destruction }
+  route_manager:
+    class: Drupal\Core\Routing\RouteManager
+    arguments: ['@container.namespaces', '@cache.discovery', '@module_handler', '@class_resolver']
   menu.rebuild_subscriber:
     class: Drupal\Core\EventSubscriber\MenuRouterRebuildSubscriber
     arguments: ['@lock', '@plugin.manager.menu.link']
@@ -890,6 +893,11 @@ services:
     tags:
       - { name: event_subscriber }
     arguments: ['@resolver_manager.entity']
+  route_subscriber.plugin:
+    class: Drupal\Core\EventSubscriber\PluginRouteAlterSubscriber
+    tags:
+      - { name: event_subscriber }
+    arguments: ['@route_manager']
   ajax_response.subscriber:
     class: Drupal\Core\EventSubscriber\AjaxResponseSubscriber
     arguments: ['@ajax_response.attachments_processor']
@@ -910,12 +918,17 @@ services:
     arguments: ['@route_enhancer.lazy_collector']
     tags:
       - { name: event_subscriber }
-  route_enhancer.param_conversion:
-    class: Drupal\Core\Routing\Enhancer\ParamConversionEnhancer
-    arguments: ['@paramconverter_manager']
+#  route_enhancer.param_conversion:
+#    class: Drupal\Core\Routing\Enhancer\ParamConversionEnhancer
+#    arguments: ['@paramconverter_manager']
+#    tags:
+#      - { name: route_enhancer }
+#      - { name: event_subscriber }
+  route_enhancer.plugins:
+    class: Drupal\Core\Routing\Enhancer\PluginConversionEnhancer
+    arguments: ['@route_manager']
     tags:
       - { name: route_enhancer }
-      - { name: event_subscriber }
   route_enhancer.entity:
     class: Drupal\Core\Entity\Enhancer\EntityRouteEnhancer
     tags:
diff --git a/core/lib/Drupal/Component/Plugin/Mapper/MapperInterface.php b/core/lib/Drupal/Component/Plugin/Mapper/MapperInterface.php
index 67f091d..45b8437 100644
--- a/core/lib/Drupal/Component/Plugin/Mapper/MapperInterface.php
+++ b/core/lib/Drupal/Component/Plugin/Mapper/MapperInterface.php
@@ -30,5 +30,4 @@
    *   will be returned.
    */
   public function getInstance(array $options);
-
 }
diff --git a/core/lib/Drupal/Core/Annotation/Route.php b/core/lib/Drupal/Core/Annotation/Route.php
new file mode 100644
index 0000000..53a81bf
--- /dev/null
+++ b/core/lib/Drupal/Core/Annotation/Route.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Annotation\Route.
+ */
+
+
+namespace Drupal\Core\Annotation;
+use Doctrine\Common\Annotations\Annotation;
+use Drupal\Component\Annotation\Plugin;
+
+
+/**
+ * Defines a Route annotation object.
+ *
+ * Plugin Namespace: Plugin\Route
+ *
+ * For a working example, see \Drupal\Core\Routing\Plugin\Route\Entity
+ *
+ * @see \Drupal\Core\*\*Interface
+ * @see \Drupal\Core\Routing\RouteManager
+ * @see plugin_api
+ *
+ * @Annotation
+ */
+class Route extends Plugin {
+
+  /**
+   * The plugin ID.
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * The human-readable name of the route plugin.
+   *
+   * @var \Drupal\Core\Annotation\Translation
+   *
+   * @ingroup plugin_translatable
+   */
+  public $label;
+
+  /**
+   * A short description of the route plugin.
+   *
+   * @var \Drupal\Core\Annotation\Translation
+   *
+   * @ingroup plugin_translatable
+   */
+  public $description;
+
+}
diff --git a/core/lib/Drupal/Core/EventSubscriber/PluginRouteAlterSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/PluginRouteAlterSubscriber.php
new file mode 100644
index 0000000..799307c
--- /dev/null
+++ b/core/lib/Drupal/Core/EventSubscriber/PluginRouteAlterSubscriber.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\EventSubscriber\PluginRouteAlterSubscriber.
+ */
+
+
+namespace Drupal\Core\EventSubscriber;
+
+
+use Drupal\Core\Routing\RouteBuildEvent;
+use Drupal\Core\Routing\RouteManager;
+use Drupal\Core\Routing\RoutingEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+class PluginRouteAlterSubscriber implements EventSubscriberInterface {
+
+  public function __construct(RouteManager $route_manager) {
+    $this->routeManager = $route_manager;
+  }
+
+  public function onRoutingRouteAlterSetPluginId(RouteBuildEvent $event) {
+    foreach ($event->getRouteCollection() as $route) {
+      $this->routeManager->setRouteOptions($route);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  static function getSubscribedEvents() {
+    $events[RoutingEvents::ALTER][] = array('onRoutingRouteAlterSetPluginId', -150);
+    return $events;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Path/PathMatcher.php b/core/lib/Drupal/Core/Path/PathMatcher.php
index 1f7b88c..a75af67 100644
--- a/core/lib/Drupal/Core/Path/PathMatcher.php
+++ b/core/lib/Drupal/Core/Path/PathMatcher.php
@@ -94,6 +94,7 @@ public function matchPath($path, $patterns) {
    * {@inheritdoc}
    */
   public function isFrontPage() {
+    return FALSE;
     // Cache the result as this is called often.
     if (!isset($this->isCurrentFrontPage)) {
       $this->isCurrentFrontPage = FALSE;
diff --git a/core/lib/Drupal/Core/Routing/Enhancer/PluginConversionEnhancer.php b/core/lib/Drupal/Core/Routing/Enhancer/PluginConversionEnhancer.php
new file mode 100644
index 0000000..fdddd90
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/Enhancer/PluginConversionEnhancer.php
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Routing\Enhancer\PluginConversionEnhancer.
+ */
+
+
+namespace Drupal\Core\Routing\Enhancer;
+
+
+use Drupal\Core\Routing\RouteManager;
+use Symfony\Cmf\Component\Routing\RouteObjectInterface;
+use Symfony\Component\HttpFoundation\ParameterBag;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Route;
+
+class PluginConversionEnhancer implements RouteEnhancerInterface {
+
+  public function __construct(RouteManager $route_manager) {
+    $this->routeManager = $route_manager;
+  }
+
+  /**
+   * Declares if the route enhancer applies to the given route.
+   *
+   * @param \Symfony\Component\Routing\Route $route
+   *  The route to consider attaching to.
+   *
+   * @return bool
+   *   TRUE if the check applies to the passed route, False otherwise.
+   */
+  public function applies(Route $route) {
+    return TRUE;
+  }
+
+  /**
+   * Update the defaults based on its own data and the request.
+   *
+   * @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.
+   */
+  public function enhance(array $defaults, Request $request) {
+    $defaults['_raw_variables'] = $this->copyRawVariables($defaults);
+    return $this->routeManager->apply($defaults, $request);
+  }
+
+  /**
+   * Store a backup of the raw values that corresponding to the route pattern.
+   *
+   * @param array $defaults
+   *   The route defaults array.
+   *
+   * @return \Symfony\Component\HttpFoundation\ParameterBag
+   */
+  protected function copyRawVariables(array $defaults) {
+    /** @var $route \Symfony\Component\Routing\Route */
+    $route = $defaults[RouteObjectInterface::ROUTE_OBJECT];
+    $variables = array_flip($route->compile()->getVariables());
+    // Foreach will copy the values from the array it iterates. Even if they
+    // are references, use it to break them. This avoids any scenarios where raw
+    // variables also get replaced with converted values.
+    $raw_variables = array();
+    foreach (array_intersect_key($defaults, $variables) as $key => $value) {
+      $raw_variables[$key] = $value;
+    }
+    return new ParameterBag($raw_variables);
+  }
+}
diff --git a/core/lib/Drupal/Core/Routing/Plugin/Route/Entity.php b/core/lib/Drupal/Core/Routing/Plugin/Route/Entity.php
new file mode 100644
index 0000000..ece4951
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/Plugin/Route/Entity.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Routing\Plugin\Route\Entity.
+ */
+
+
+namespace Drupal\Core\Routing\Plugin\Route;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\Plugin\PluginBase;
+use Drupal\Core\Routing\RoutePluginInterface;
+use Drupal\Core\TypedData\TranslatableInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * @Route(
+ *   id = "entity",
+ *   label = @Translation("Entity"),
+ *   deriver = "Drupal\Core\Routing\Plugin\Route\EntityDeriver"
+ * )
+ */
+class Entity extends PluginBase implements RoutePluginInterface, ContainerFactoryPluginInterface {
+
+  /**
+   * @var EntityManagerInterface
+   */
+  protected $entityManager;
+
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityManagerInterface $entity_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->entityManager = $entity_manager;
+  }
+
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity.manager')
+    );
+  }
+
+  public function convert($value) {
+    $entity_type_id = $this->getDerivativeId();
+    if ($storage = $this->entityManager->getStorage($entity_type_id)) {
+      $entity = $storage->load($value);
+      if ($entity instanceof EntityInterface && $entity instanceof TranslatableInterface) {
+        $entity = $this->entityManager->getTranslationFromContext($entity, NULL, array('operation' => 'entity_upcast'));
+      }
+      return $entity;
+    }
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Routing/Plugin/Route/EntityDeriver.php b/core/lib/Drupal/Core/Routing/Plugin/Route/EntityDeriver.php
new file mode 100644
index 0000000..39d0879
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/Plugin/Route/EntityDeriver.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Routing\Plugin\Route\EntityDeriver.
+ */
+
+
+namespace Drupal\Core\Routing\Plugin\Route;
+
+use Drupal\Component\Plugin\Derivative\DeriverBase;
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides a resource plugin definition for every entity type.
+ *
+ * @see \Drupal\rest\Plugin\rest\resource\EntityResource
+ */
+class EntityDeriver extends DeriverBase implements ContainerDeriverInterface {
+
+  /**
+   * List of derivative definitions.
+   *
+   * @var array
+   */
+  protected $derivatives;
+
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
+  /**
+   * Constructs an EntityDerivative object.
+   *
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
+   */
+  public function __construct(EntityManagerInterface $entity_manager) {
+    $this->entityManager = $entity_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, $base_plugin_id) {
+    return new static(
+      $container->get('entity.manager')
+    );
+  }
+
+  /**
+   * Implements DerivativeInterface::getDerivativeDefinitions().
+   */
+  public function getDerivativeDefinitions($base_plugin_definition) {
+    if (!isset($this->derivatives)) {
+      // Add in the default plugin configuration and the resource type.
+      foreach ($this->entityManager->getDefinitions() as $entity_type_id => $entity_type) {
+        $this->derivatives[$entity_type_id] = array(
+          'id' => 'entity:' . $entity_type_id,
+          'entity_type' => $entity_type_id,
+          'parameter_class' => $entity_type->getClass(),
+          'label' => $entity_type->getLabel(),
+        ) + $base_plugin_definition;
+      }
+    }
+    return $this->derivatives;
+  }
+}
diff --git a/core/lib/Drupal/Core/Routing/RouteManager.php b/core/lib/Drupal/Core/Routing/RouteManager.php
new file mode 100644
index 0000000..c437007
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/RouteManager.php
@@ -0,0 +1,171 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Routing\RouteManager.
+ */
+
+
+namespace Drupal\Core\Routing;
+
+
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\DependencyInjection\ClassResolverInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Plugin\DefaultPluginManager;
+use Symfony\Cmf\Component\Routing\RouteObjectInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Route;
+
+class RouteManager extends DefaultPluginManager {
+
+  protected $classResolver = [];
+  protected $parameterClasses;
+
+  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler, ClassResolverInterface $class_resolver) {
+    parent::__construct('Plugin/Route', $namespaces, $module_handler, 'Drupal\Core\Routing\RoutePluginInterface', 'Drupal\Core\Annotation\Route');
+    $this->alterInfo('route_plugin_info');
+    $this->setCacheBackend($cache_backend, 'route_plugins');
+    $this->classResolver = $class_resolver;
+  }
+
+  public function apply(array $defaults, Request $request) {
+    /** @var $route \Symfony\Component\Routing\Route */
+    $route = $defaults[RouteObjectInterface::ROUTE_OBJECT];
+    $route_parameter_definitions = $route->getOption('parameters') ?: array();
+    foreach ($defaults as $id => $value) {
+      $plugin_id = $id;
+      if (isset($route_parameter_definitions[$id])) {
+        $route_parameter_definition = $route_parameter_definitions[$id];
+        if (isset($route_parameter_definition['plugin_id'])) {
+          $plugin_id = $route_parameter_definitions[$id]['plugin_id'];
+        }
+        // Backwards-compatibility.
+        elseif (isset($route_parameter_definition['type'])) {
+          $plugin_id = $route_parameter_definition['type'];
+        }
+      }
+      if ($this->hasDefinition($plugin_id)) {
+        $defaults[$id] = $this->createInstance($plugin_id)->convert($value);
+      }
+    }
+    return $defaults;
+  }
+
+  public function setRouteOptions(Route $route) {
+    if ($controller = $this->getControllerClass($route->getDefaults())) {
+      // Try to use reflection.
+      $this->setParametersFromReflection($controller, $route);
+    }
+  }
+
+  public function setParametersFromReflection($controller, Route $route) {
+    $route_parameter_definitions = $route->getOption('parameters') ?: array();
+    if (is_array($controller)) {
+      list($instance, $method) = $controller;
+      $reflection = new \ReflectionMethod($instance, $method);
+    }
+    else {
+      $reflection = new \ReflectionFunction($controller);
+    }
+    foreach ($reflection->getParameters() as $parameter) {
+      $plugin_id = FALSE;
+      $reflection_parameter_name = $parameter->getName();
+      if ($this->hasDefinition($reflection_parameter_name)) {
+        $plugin_id = $reflection_parameter_name;
+      }
+      elseif ($this->hasDefinition("entity:$reflection_parameter_name")) {
+        $plugin_id = "entity:$reflection_parameter_name";
+      }
+      if ($plugin_id) {
+        $plugin_definition = $this->getDefinition($plugin_id);
+        $parameter_class = $parameter->getClass();
+        // If there's a parameter class defined and this parameter won't
+        // accept it then do not apply a plugin.
+        if (isset($plugin_definition['parameter_class']) && (!$parameter_class || !is_subclass_of($plugin_definition['parameter_class'], $parameter_class->getName(), TRUE))) {
+          $plugin_id = FALSE;
+        }
+        $route_parameter_definitions += array($reflection_parameter_name => array());
+        $route_parameter_definitions[$reflection_parameter_name] += array(
+          'plugin_id' => $plugin_id,
+        );
+      }
+    }
+    if (!empty($route_parameter_definitions)) {
+      $route->setOption('parameters', $route_parameter_definitions);
+    }
+  }
+
+  protected function getParameterClasses() {
+    if (!$this->parameterClasses) {
+      foreach ($this->getDefinitions() as $plugin_id => $plugin_definition) {
+        if (isset($plugin_definition['parameter_class'])) {
+          $this->parameterClasses[$plugin_id] = $plugin_definition['parameter_class'];
+        }
+      }
+    }
+    return $this->parameterClasses;
+  }
+
+  /**
+   * Gets the controller class using route defaults.
+   *
+   * By design we cannot support all possible routes, but just the ones which
+   * use the defaults provided by core, which are _controller and _form.
+   *
+   * Rather than creating an instance of every controller determine the class
+   * and method that would be used. This is not possible for the service:method
+   * notation as the runtime container does not allow static introspection.
+   *
+   * @see \Drupal\Core\Controller\ControllerResolver::getControllerFromDefinition()
+   * @see \Drupal\Core\Controller\ClassResolver::getInstanceFromDefinition()
+   *
+   * @param array $defaults
+   *   The default values provided by the route.
+   *
+   * @return string|null
+   *   Returns the controller class, otherwise NULL.
+   */
+  protected function getControllerClass(array $defaults) {
+    $controller = NULL;
+    if (isset($defaults['_controller'])) {
+      $controller = $defaults['_controller'];
+    }
+
+    if (isset($defaults['_form'])) {
+      $controller = $defaults['_form'];
+      // Check if the class exists and if so use the buildForm() method from the
+      // interface.
+      if (class_exists($controller)) {
+        return array($controller, 'buildForm');
+      }
+    }
+
+    if (strpos($controller, ':') === FALSE) {
+      if (method_exists($controller, '__invoke')) {
+        return array($controller, '__invoke');
+      }
+      if (function_exists($controller)) {
+        return $controller;
+      }
+      return NULL;
+    }
+
+    $count = substr_count($controller, ':');
+    if ($count == 1) {
+      // Controller in the service:method notation. Get the information from the
+      // service. This is dangerous as the controller could depend on services
+      // that could not exist at this point. There is however no other way to
+      // do it, as the container does not allow static introspection.
+      list($class_or_service, $method) = explode(':', $controller, 2);
+      return array($this->classResolver->getInstanceFromDefinition($class_or_service), $method);
+    }
+    elseif (strpos($controller, '::') !== FALSE) {
+      // Controller in the class::method notation.
+      return explode('::', $controller, 2);
+    }
+
+    return NULL;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Routing/RoutePluginInterface.php b/core/lib/Drupal/Core/Routing/RoutePluginInterface.php
new file mode 100644
index 0000000..6993008
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/RoutePluginInterface.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * @file
+ * Contains
+ */
+
+namespace Drupal\Core\Routing;
+
+
+interface RoutePluginInterface {
+
+   public function convert($value);
+}
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 865e101..4f4ddd8 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -245,6 +245,7 @@ function system_hook_info() {
  * Implements hook_theme_suggestions_HOOK().
  */
 function system_theme_suggestions_html(array $variables) {
+  return [];
   if (\Drupal::service('path.matcher')->isFrontPage()) {
     $path_args = [''];
   }
@@ -258,6 +259,7 @@ function system_theme_suggestions_html(array $variables) {
  * Implements hook_theme_suggestions_HOOK().
  */
 function system_theme_suggestions_page(array $variables) {
+  return [];
   if (\Drupal::service('path.matcher')->isFrontPage()) {
     $path_args = [''];
   }
@@ -649,6 +651,7 @@ function system_js_settings_build(&$settings, AttachedAssetsInterface $assets) {
  * as well as theme_token ajax state.
  */
 function system_js_settings_alter(&$settings, AttachedAssetsInterface $assets) {
+  return;
   $request = \Drupal::request();
   $current_query = $request->query->all();
 
