diff --git a/core/core.services.yml b/core/core.services.yml
index 76088786cd..90374ddb1a 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -823,16 +823,6 @@ services:
     tags:
       - { name: service_collector, tag: non_lazy_route_filter, call: addRouteFilter }
     deprecated: The "%service_id%" service is deprecated. You should use the 'router.no_access_checks' service instead.
-  route_filter.lazy_collector:
-    class: Drupal\Core\Routing\LazyRouteFilter
-    tags:
-      - { name: non_lazy_route_filter }
-    parent: container.trait
-  route_filter_subscriber:
-    class: Drupal\Core\EventSubscriber\RouteFilterSubscriber
-    arguments: ['@route_filter.lazy_collector']
-    tags:
-      - { name: event_subscriber }
   url_generator.non_bubbling:
     class: Drupal\Core\Routing\UrlGenerator
     arguments: ['@router.route_provider', '@path_processor_manager', '@route_processor_manager', '@request_stack', '%filter_protocols%']
@@ -864,10 +854,12 @@ services:
     deprecated: The "%service_id%" service is deprecated. You should use the 'router.no_access_checks' service instead.
   router.no_access_checks:
     class: \Drupal\Core\Routing\Router
-    arguments: ['@router.route_provider', '@path.current', '@url_generator']
+    arguments: ['@router.route_provider', '@path.current', '@url_generator', '@class_resolver']
     tags:
       - { name: service_collector, tag: non_lazy_route_enhancer, call: addRouteEnhancer }
+      - { name: service_collector, tag: route_enhancer, call: addRouteEnhancer  }
       - { name: service_collector, tag: non_lazy_route_filter, call: addRouteFilter }
+      - { name: service_collector, tag: route_filter, call: addRouteFilter }
     calls:
       - [setContext, ['@router.request_context']]
   router.path_roots_subscriber:
@@ -997,21 +989,11 @@ services:
     arguments: ['@form_ajax_response_builder', '@string_translation']
     tags:
       - { name: event_subscriber }
-  route_enhancer.lazy_collector:
-    class: Drupal\Core\Routing\LazyRouteEnhancer
-    tags:
-      - { name: non_lazy_route_enhancer, priority: 5000 }
-    parent: container.trait
-  route_enhancer_subscriber:
-    class: Drupal\Core\EventSubscriber\RouteEnhancerSubscriber
-    arguments: ['@route_enhancer.lazy_collector']
-    tags:
-      - { name: event_subscriber }
   route_enhancer.param_conversion:
     class: Drupal\Core\Routing\Enhancer\ParamConversionEnhancer
     arguments: ['@paramconverter_manager']
     tags:
-      - { name: route_enhancer }
+      - { name: route_enhancer, priority: 5000 }
       - { name: event_subscriber }
   route_enhancer.form:
     class: Drupal\Core\Routing\Enhancer\FormRouteEnhancer
diff --git a/core/lib/Drupal/Core/CoreServiceProvider.php b/core/lib/Drupal/Core/CoreServiceProvider.php
index 8a22bc50d4..e07046ae0a 100644
--- a/core/lib/Drupal/Core/CoreServiceProvider.php
+++ b/core/lib/Drupal/Core/CoreServiceProvider.php
@@ -10,8 +10,6 @@
 use Drupal\Core\DependencyInjection\Compiler\GuzzleMiddlewarePass;
 use Drupal\Core\DependencyInjection\Compiler\ContextProvidersPass;
 use Drupal\Core\DependencyInjection\Compiler\ProxyServicesPass;
-use Drupal\Core\DependencyInjection\Compiler\RegisterLazyRouteEnhancers;
-use Drupal\Core\DependencyInjection\Compiler\RegisterLazyRouteFilters;
 use Drupal\Core\DependencyInjection\Compiler\DependencySerializationTraitPass;
 use Drupal\Core\DependencyInjection\Compiler\StackedKernelPass;
 use Drupal\Core\DependencyInjection\Compiler\StackedSessionHandlerPass;
@@ -84,8 +82,6 @@ public function register(ContainerBuilder $container) {
     $container->addCompilerPass(new RegisterEventSubscribersPass(), PassConfig::TYPE_AFTER_REMOVING);
 
     $container->addCompilerPass(new RegisterAccessChecksPass());
-    $container->addCompilerPass(new RegisterLazyRouteEnhancers());
-    $container->addCompilerPass(new RegisterLazyRouteFilters());
 
     // Add a compiler pass for registering services needing destruction.
     $container->addCompilerPass(new RegisterServicesForDestructionPass());
diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterLazyRouteEnhancers.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterLazyRouteEnhancers.php
deleted file mode 100644
index 8e2929b860..0000000000
--- a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterLazyRouteEnhancers.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace Drupal\Core\DependencyInjection\Compiler;
-
-use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-
-/**
- * Registers all lazy route enhancers onto the lazy route enhancers.
- */
-class RegisterLazyRouteEnhancers implements CompilerPassInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function process(ContainerBuilder $container) {
-    if (!$container->hasDefinition('route_enhancer.lazy_collector')) {
-      return;
-    }
-
-    $service_ids = [];
-
-    foreach ($container->findTaggedServiceIds('route_enhancer') as $id => $attributes) {
-      $service_ids[$id] = $id;
-    }
-
-    $container
-      ->getDefinition('route_enhancer.lazy_collector')
-      ->addArgument($service_ids);
-  }
-
-}
diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterLazyRouteFilters.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterLazyRouteFilters.php
deleted file mode 100644
index d77477921b..0000000000
--- a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterLazyRouteFilters.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace Drupal\Core\DependencyInjection\Compiler;
-
-use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-
-/**
- * Registers all lazy route filters onto the lazy route filter.
- */
-class RegisterLazyRouteFilters implements CompilerPassInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function process(ContainerBuilder $container) {
-    if (!$container->hasDefinition('route_filter.lazy_collector')) {
-      return;
-    }
-
-    $service_ids = [];
-
-    foreach ($container->findTaggedServiceIds('route_filter') as $id => $attributes) {
-      $service_ids[$id] = $id;
-    }
-
-    $container
-      ->getDefinition('route_filter.lazy_collector')
-      ->addArgument($service_ids);
-  }
-
-}
diff --git a/core/lib/Drupal/Core/EventSubscriber/RouteEnhancerSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/RouteEnhancerSubscriber.php
deleted file mode 100644
index 8763842b58..0000000000
--- a/core/lib/Drupal/Core/EventSubscriber/RouteEnhancerSubscriber.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-namespace Drupal\Core\EventSubscriber;
-
-use Drupal\Core\Routing\LazyRouteEnhancer;
-use Drupal\Core\Routing\RouteBuildEvent;
-use Drupal\Core\Routing\RoutingEvents;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
-
-/**
- * Listens to the new routes before they get saved.
- */
-class RouteEnhancerSubscriber implements EventSubscriberInterface {
-
-  /**
-   * @var \Drupal\Core\Routing\LazyRouteEnhancer
-   */
-  protected $routeEnhancer;
-
-  /**
-   * Constructs the RouteEnhancerSubscriber object.
-   *
-   * @param \Drupal\Core\Routing\LazyRouteEnhancer $route_enhancer
-   *   The lazy route enhancer.
-   */
-  public function __construct(LazyRouteEnhancer $route_enhancer) {
-    $this->routeEnhancer = $route_enhancer;
-  }
-
-  /**
-   * Adds the route_enhancer object to the route collection.
-   *
-   * @param \Drupal\Core\Routing\RouteBuildEvent $event
-   *   The route build event.
-   */
-  public function onRouteAlter(RouteBuildEvent $event) {
-    $this->routeEnhancer->setEnhancers($event->getRouteCollection());
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function getSubscribedEvents() {
-    $events[RoutingEvents::ALTER][] = ['onRouteAlter', -300];
-    return $events;
-  }
-
-}
diff --git a/core/lib/Drupal/Core/EventSubscriber/RouteFilterSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/RouteFilterSubscriber.php
deleted file mode 100644
index f64b8db514..0000000000
--- a/core/lib/Drupal/Core/EventSubscriber/RouteFilterSubscriber.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-namespace Drupal\Core\EventSubscriber;
-
-use Drupal\Core\Routing\LazyRouteFilter;
-use Drupal\Core\Routing\RouteBuildEvent;
-use Drupal\Core\Routing\RoutingEvents;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
-
-/**
- * Listens to the filtered collection of route instances.
- */
-class RouteFilterSubscriber implements EventSubscriberInterface {
-
-  /**
-   * The lazy route filter.
-   *
-   * @var \Drupal\Core\Routing\LazyRouteFilter
-   */
-  protected $routeFilter;
-
-  /**
-   * Constructs the RouteFilterSubscriber object.
-   *
-   * @param \Drupal\Core\Routing\LazyRouteFilter $route_filter
-   *   The lazy route filter.
-   */
-  public function __construct(LazyRouteFilter $route_filter) {
-    $this->routeFilter = $route_filter;
-  }
-
-  /**
-   * Get the Response object from filtered route collection.
-   *
-   * @param \Drupal\Core\Routing\RouteBuildEvent $event
-   *   The route build event.
-   */
-  public function onRouteAlter(RouteBuildEvent $event) {
-    $this->routeFilter->setFilters($event->getRouteCollection());
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function getSubscribedEvents() {
-    $events[RoutingEvents::ALTER][] = ['onRouteAlter', -300];
-    return $events;
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Routing/Enhancer/RouteEnhancerInterface.php b/core/lib/Drupal/Core/Routing/Enhancer/RouteEnhancerInterface.php
index d6be823b5e..df1e96f4ee 100644
--- a/core/lib/Drupal/Core/Routing/Enhancer/RouteEnhancerInterface.php
+++ b/core/lib/Drupal/Core/Routing/Enhancer/RouteEnhancerInterface.php
@@ -7,6 +7,8 @@
 
 /**
  * A route enhance service to determine route enhance rules.
+ *
+ * @deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0.
  */
 interface RouteEnhancerInterface extends BaseRouteEnhancerInterface {
 
diff --git a/core/lib/Drupal/Core/Routing/LazyRouteEnhancer.php b/core/lib/Drupal/Core/Routing/LazyRouteEnhancer.php
deleted file mode 100644
index 356fe3e6fa..0000000000
--- a/core/lib/Drupal/Core/Routing/LazyRouteEnhancer.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-
-namespace Drupal\Core\Routing;
-
-use Drupal\Core\Routing\Enhancer\RouteEnhancerInterface;
-use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface as BaseRouteEnhancerInterface;
-use Symfony\Cmf\Component\Routing\RouteObjectInterface;
-use Symfony\Component\DependencyInjection\ContainerAwareInterface;
-use Symfony\Component\DependencyInjection\ContainerAwareTrait;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\Routing\RouteCollection;
-
-/**
- * A route enhancer which lazily loads route enhancers, depending on the route.
- *
- * We lazy initialize route enhancers, because otherwise all dependencies of
- * all route enhancers are initialized on every request, which is slow. However,
- * with the use of lazy loading, dependencies are instantiated only when used.
- */
-class LazyRouteEnhancer implements BaseRouteEnhancerInterface, ContainerAwareInterface {
-
-  use ContainerAwareTrait;
-
-  /**
-   * Array of enhancers service IDs.
-   *
-   * @var array
-   */
-  protected $serviceIds = [];
-
-  /**
-   * The initialized route enhancers.
-   *
-   * @var \Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface[]|\Drupal\Core\Routing\Enhancer\RouteEnhancerInterface[]
-   */
-  protected $enhancers = NULL;
-
-  /**
-   * Constructs the LazyRouteEnhancer object.
-   *
-   * @param $service_ids
-   *   Array of enhancers service IDs.
-   */
-  public function __construct($service_ids) {
-    $this->serviceIds = $service_ids;
-  }
-
-  /**
-   * For each route, saves a list of applicable enhancers to the route.
-   *
-   * @param \Symfony\Component\Routing\RouteCollection $route_collection
-   *   A collection of routes to apply enhancer checks to.
-   */
-  public function setEnhancers(RouteCollection $route_collection) {
-    /** @var \Symfony\Component\Routing\Route $route **/
-    foreach ($route_collection as $route_name => $route) {
-      $service_ids = [];
-      foreach ($this->getEnhancers() as $service_id => $enhancer) {
-        if ((!$enhancer instanceof RouteEnhancerInterface) || $enhancer->applies($route)) {
-          $service_ids[] = $service_id;
-        }
-      }
-      if ($service_ids) {
-        $route->setOption('_route_enhancers', array_unique($service_ids));
-      }
-    }
-  }
-
-  /**
-   * For each route, gets a list of applicable enhancer to the route.
-   *
-   * @return \Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface[]|\Drupal\Core\Routing\Enhancer\RouteEnhancerInterface[]
-   */
-  protected function getEnhancers() {
-    if (!isset($this->enhancers)) {
-      foreach ($this->serviceIds as $service_id) {
-        $this->enhancers[$service_id] = $this->container->get($service_id);
-      }
-    }
-    return $this->enhancers;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function enhance(array $defaults, Request $request) {
-    /** @var \Symfony\Component\Routing\Route $route */
-    $route = $defaults[RouteObjectInterface::ROUTE_OBJECT];
-
-    $enhancer_ids = $route->getOption('_route_enhancers');
-
-    if (isset($enhancer_ids)) {
-      foreach ($enhancer_ids as $enhancer_id) {
-        $defaults = $this->container->get($enhancer_id)->enhance($defaults, $request);
-      }
-    }
-
-    return $defaults;
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Routing/LazyRouteFilter.php b/core/lib/Drupal/Core/Routing/LazyRouteFilter.php
deleted file mode 100644
index 10f3d517be..0000000000
--- a/core/lib/Drupal/Core/Routing/LazyRouteFilter.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-namespace Drupal\Core\Routing;
-
-use Symfony\Cmf\Component\Routing\NestedMatcher\RouteFilterInterface as BaseRouteFilterInterface;
-use Symfony\Component\DependencyInjection\ContainerAwareInterface;
-use Symfony\Component\DependencyInjection\ContainerAwareTrait;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\Routing\RouteCollection;
-
-/**
- * A route filter which lazily loads route filters, depending on the route.
- *
- * We lazy initialize route filters, because otherwise all dependencies of all
- * route filters are initialized on every request, which is slow. However, with
- * the use of lazy loading, dependencies are instantiated only when used.
- */
-class LazyRouteFilter implements BaseRouteFilterInterface, ContainerAwareInterface {
-
-  use ContainerAwareTrait;
-
-  /**
-   * Array of route filter service IDs.
-   *
-   * @var array
-   */
-  protected $serviceIds = [];
-
-  /**
-   * The initialized route filters.
-   *
-   * @var \Drupal\Core\Routing\RouteFilterInterface[]
-   */
-  protected $filters = NULL;
-
-  /**
-   * Constructs the LazyRouteEnhancer object.
-   *
-   * @param $service_ids
-   *   Array of route filter service IDs.
-   */
-  public function __construct($service_ids) {
-    $this->serviceIds = $service_ids;
-  }
-
-  /**
-   * For each route, filter down the route collection.
-   *
-   * @param \Symfony\Component\Routing\RouteCollection $route_collection
-   *   A collection of routes to apply filter checks to.
-   */
-  public function setFilters(RouteCollection $route_collection) {
-    /** @var \Symfony\Component\Routing\Route $route **/
-    foreach ($route_collection as $route) {
-      $service_ids = [];
-      foreach ($this->getFilters() as $service_id => $filter) {
-        if ($filter instanceof RouteFilterInterface && $filter->applies($route)) {
-          $service_ids[] = $service_id;
-        }
-      }
-      if ($service_ids) {
-        $route->setOption('_route_filters', array_unique($service_ids));
-      }
-    }
-  }
-
-  /**
-   * For each route, gets a list of applicable enhancers to the route.
-   *
-   * @return \Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface[]|\Drupal\Core\Routing\Enhancer\RouteEnhancerInterface[]
-   */
-  protected function getFilters() {
-    if (!isset($this->filters)) {
-      foreach ($this->serviceIds as $service_id) {
-        $this->filters[$service_id] = $this->container->get($service_id);
-      }
-    }
-    return $this->filters;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function filter(RouteCollection $collection, Request $request) {
-    $filter_ids = [];
-    foreach ($collection->all() as $route) {
-      $filter_ids = array_merge($filter_ids, $route->getOption('_route_filters') ?: []);
-    }
-    $filter_ids = array_unique($filter_ids);
-
-    if (isset($filter_ids)) {
-      foreach ($filter_ids as $filter_id) {
-        if ($filter = $this->container->get($filter_id, ContainerInterface::NULL_ON_INVALID_REFERENCE)) {
-          $collection = $filter->filter($collection, $request);
-        }
-      }
-    }
-    return $collection;
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Routing/RouteFilterInterface.php b/core/lib/Drupal/Core/Routing/RouteFilterInterface.php
index a3ccb4486f..8bbe2fbe54 100644
--- a/core/lib/Drupal/Core/Routing/RouteFilterInterface.php
+++ b/core/lib/Drupal/Core/Routing/RouteFilterInterface.php
@@ -7,6 +7,8 @@
 
 /**
  * A route filter service to filter down the collection of route instances.
+ *
+ * @deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0.
  */
 interface RouteFilterInterface extends BaseRouteFilterInterface {
 
diff --git a/core/lib/Drupal/Core/Routing/Router.php b/core/lib/Drupal/Core/Routing/Router.php
index e949c5efb8..373c368764 100644
--- a/core/lib/Drupal/Core/Routing/Router.php
+++ b/core/lib/Drupal/Core/Routing/Router.php
@@ -2,10 +2,11 @@
 
 namespace Drupal\Core\Routing;
 
+use Drupal\Core\DependencyInjection\ClassResolverInterface;
 use Drupal\Core\Path\CurrentPathStack;
-use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface as BaseRouteEnhancerInterface;
+use Drupal\Core\Routing\Enhancer\RouteEnhancerInterface;
 use Symfony\Cmf\Component\Routing\LazyRouteCollection;
-use Symfony\Cmf\Component\Routing\NestedMatcher\RouteFilterInterface as BaseRouteFilterInterface;
+use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Cmf\Component\Routing\RouteProviderInterface as BaseRouteProviderInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\Routing\Exception\MethodNotAllowedException;
@@ -58,13 +59,6 @@ class Router extends UrlMatcher implements RequestMatcherInterface, RouterInterf
   protected $enhancers = [];
 
   /**
-   * Cached sorted list of enhancers.
-   *
-   * @var \Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface[]
-   */
-  protected $sortedEnhancers;
-
-  /**
    * The list of available route filters.
    *
    * @var \Symfony\Cmf\Component\Routing\NestedMatcher\RouteFilterInterface[]
@@ -72,13 +66,6 @@ class Router extends UrlMatcher implements RequestMatcherInterface, RouterInterf
   protected $filters = [];
 
   /**
-   * Cached sorted list route filters.
-   *
-   * @var \Symfony\Cmf\Component\Routing\NestedMatcher\RouteFilterInterface[]
-   */
-  protected $sortedFilters;
-
-  /**
    * The URL generator.
    *
    * @var \Symfony\Component\Routing\Generator\UrlGeneratorInterface
@@ -102,36 +89,23 @@ public function __construct(BaseRouteProviderInterface $route_provider, CurrentP
   }
 
   /**
-   * Adds a route enhancer to the list of used route enhancers.
-   *
-   * @param \Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface $route_enhancer
-   *   A route enhancer.
-   * @param int $priority
-   *   (optional) The priority of the enhancer. Higher number enhancers will be
-   *   used first.
+   * Adds a route filter.
    *
-   * @return $this
+   * @param \Drupal\Core\Routing\RouteFilterInterface $route_filter
+   *   The route filter.
    */
-  public function addRouteEnhancer(BaseRouteEnhancerInterface $route_enhancer, $priority = 0) {
-    $this->enhancers[$priority][] = $route_enhancer;
-    return $this;
+  public function addRouteFilter(RouteFilterInterface $route_filter) {
+    $this->filters[] = $route_filter;
   }
 
   /**
-   * Adds a route filter to the list of used route filters.
-   *
-   * @param \Symfony\Cmf\Component\Routing\NestedMatcher\RouteFilterInterface $route_filter
-   *   A route filter.
-   * @param int $priority
-   *   (optional) The priority of the filter. Higher number filters will be used
-   *   first.
+   * Adds a route enhancer.
    *
-   * @return $this
+   * @param \Drupal\Core\Routing\Enhancer\RouteEnhancerInterface $route_enhancer
+   *   The route enhancer.
    */
-  public function addRouteFilter(BaseRouteFilterInterface $route_filter, $priority = 0) {
-    $this->filters[$priority][] = $route_filter;
-
-    return $this;
+  public function addRouteEnhancer(RouteEnhancerInterface $route_enhancer) {
+    $this->enhancers[] = $route_enhancer;
   }
 
   /**
@@ -148,6 +122,9 @@ public function match($pathinfo) {
    */
   public function matchRequest(Request $request) {
     $collection = $this->getInitialRouteCollection($request);
+    if ($collection->count() === 0) {
+      throw new ResourceNotFoundException(sprintf('No routes found for "%s".', $this->currentPath->getPath()));
+    }
     $collection = $this->applyRouteFilters($collection, $request);
 
     if ($ret = $this->matchCollection(rawurldecode($this->currentPath->getPath($request)), $collection)) {
@@ -276,47 +253,16 @@ protected function getInitialRouteCollection(Request $request) {
    *   from route enhancers.
    */
   protected function applyRouteEnhancers($defaults, Request $request) {
-    foreach ($this->getRouteEnhancers() as $enhancer) {
-      $defaults = $enhancer->enhance($defaults, $request);
+    foreach ($this->enhancers as $enhancer) {
+      if (!$enhancer instanceof RouteEnhancerInterface || $enhancer->applies($defaults[RouteObjectInterface::ROUTE_OBJECT])) {
+        $defaults = $enhancer->enhance($defaults, $request);
+      }
     }
 
     return $defaults;
   }
 
   /**
-   * Sorts the enhancers and flattens them.
-   *
-   * @return \Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface[]
-   *   The enhancers ordered by priority.
-   */
-  public function getRouteEnhancers() {
-    if (!isset($this->sortedEnhancers)) {
-      $this->sortedEnhancers = $this->sortRouteEnhancers();
-    }
-
-    return $this->sortedEnhancers;
-  }
-
-  /**
-   * Sort enhancers by priority.
-   *
-   * The highest priority number is the highest priority (reverse sorting).
-   *
-   * @return \Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface[]
-   *   The sorted enhancers.
-   */
-  protected function sortRouteEnhancers() {
-    $sortedEnhancers = [];
-    krsort($this->enhancers);
-
-    foreach ($this->enhancers as $enhancers) {
-      $sortedEnhancers = array_merge($sortedEnhancers, $enhancers);
-    }
-
-    return $sortedEnhancers;
-  }
-
-  /**
    * Applies all route filters to a given route collection.
    *
    * This method reduces the sets of routes further down, for example by
@@ -333,7 +279,8 @@ protected function sortRouteEnhancers() {
   protected function applyRouteFilters(RouteCollection $collection, Request $request) {
     // Route filters are expected to throw an exception themselves if they
     // end up filtering the list down to 0.
-    foreach ($this->getRouteFilters() as $filter) {
+    foreach ($this->filters as $filter) {
+      // @todo should we respect ::applies()? The problem is that we can't, because no route has been matched yet. So we should probably remove \Drupal\Core\Routing\RouteFilterInterface?
       $collection = $filter->filter($collection, $request);
     }
 
@@ -341,39 +288,6 @@ protected function applyRouteFilters(RouteCollection $collection, Request $reque
   }
 
   /**
-   * Sorts the filters and flattens them.
-   *
-   * @return \Symfony\Cmf\Component\Routing\NestedMatcher\RouteFilterInterface[]
-   *   The filters ordered by priority
-   */
-  public function getRouteFilters() {
-    if (!isset($this->sortedFilters)) {
-      $this->sortedFilters = $this->sortFilters();
-    }
-
-    return $this->sortedFilters;
-  }
-
-  /**
-   * Sort filters by priority.
-   *
-   * The highest priority number is the highest priority (reverse sorting).
-   *
-   * @return \Symfony\Cmf\Component\Routing\NestedMatcher\RouteFilterInterface[]
-   *   The sorted filters.
-   */
-  protected function sortFilters() {
-    $sortedFilters = [];
-    krsort($this->filters);
-
-    foreach ($this->filters as $filters) {
-      $sortedFilters = array_merge($sortedFilters, $filters);
-    }
-
-    return $sortedFilters;
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function getRouteCollection() {
