diff --git a/core/core.services.yml b/core/core.services.yml
index 328acd8..36f811f 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -502,7 +502,17 @@ services:
     calls:
       - [setFinalMatcher, ['@router.matcher.final_matcher']]
     tags:
-      - { name: service_collector, tag: route_filter, call: addRouteFilter }
+      - { name: lazy_route_filter, call: addRouteFilter }
+  lazy_route_filter:
+    class: Drupal\Core\Routing\LazyRouteFilter
+    arguments:
+    tags:
+      - { name: route_filter, call: addRouteFilter }
+  route_filter_subscriber:
+       class: Drupal\Core\EventSubscriber\RouteFilterSubscriber
+       arguments: ['@route_filter']
+       tags:
+         - { name: event_subscriber }
   url_generator:
     class: Drupal\Core\Routing\UrlGenerator
     arguments: ['@router.route_provider', '@path_processor_manager', '@route_processor_manager', '@config.factory', '@logger.channel.default', '@request_stack']
@@ -521,7 +531,7 @@ services:
     class: Symfony\Cmf\Component\Routing\DynamicRouter
     arguments: ['@router.request_context', '@router.matcher', '@url_generator']
     tags:
-      - { name: service_collector, tag: route_enhancer, call: addRouteEnhancer }
+      - { name: lazy_route_enhancer, call: addRouteEnhancer }
   router.no_access_checks:
     class: Symfony\Cmf\Component\Routing\ChainRouter
     calls:
@@ -594,11 +604,11 @@ services:
     class: Drupal\Core\Routing\AcceptHeaderMatcher
     arguments: ['@content_negotiation']
     tags:
-      - { name: route_filter }
+      - { name: lazy_route_filter }
   content_type_header_matcher:
     class: Drupal\Core\Routing\ContentTypeHeaderMatcher
     tags:
-      - { name: route_filter }
+      - { name: lazy_route_filter }
   paramconverter_manager:
     class: Drupal\Core\ParamConverter\ParamConverterManager
     tags:
@@ -636,21 +646,31 @@ services:
     class: Drupal\Core\EventSubscriber\AjaxSubscriber
     tags:
       - { name: event_subscriber }
+  lazy_route_enhancer:
+    class: Drupal\Core\Routing\LazyRouteEnhancer
+    arguments:
+    tags:
+      - { name: route_enhancer, priority: 5000 }
+  route_enhancer_subscriber:
+       class: Drupal\Core\EventSubscriber\RouteEnhancerSubscriber
+       arguments: ['@route_enhancer']
+       tags:
+         - { name: event_subscriber }
   route_enhancer.param_conversion:
     class: Drupal\Core\Routing\Enhancer\ParamConversionEnhancer
     arguments: ['@paramconverter_manager']
     tags:
-      - { name: route_enhancer }
+      - { name: lazy_route_enhancer }
       - { name: event_subscriber }
   route_enhancer.authentication:
     class: Drupal\Core\Routing\Enhancer\AuthenticationEnhancer
     tags:
-      - { name: route_enhancer, priority: 1000 }
+      - { name: lazy_route_enhancer, priority: 1000 }
     arguments: ['@authentication', '@current_user']
   route_enhancer.entity:
     class: Drupal\Core\Entity\Enhancer\EntityRouteEnhancer
     tags:
-      - { name: route_enhancer, priority: 20 }
+      - { name: lazy_route_enhancer, priority: 20 }
   route_content_controller_subscriber:
     class: Drupal\Core\EventSubscriber\ContentControllerSubscriber
     arguments: ['@content_negotiation']
diff --git a/core/lib/Drupal/Core/Entity/Enhancer/EntityRouteEnhancer.php b/core/lib/Drupal/Core/Entity/Enhancer/EntityRouteEnhancer.php
index 7d1c643..c330d3a 100644
--- a/core/lib/Drupal/Core/Entity/Enhancer/EntityRouteEnhancer.php
+++ b/core/lib/Drupal/Core/Entity/Enhancer/EntityRouteEnhancer.php
@@ -7,8 +7,9 @@
 
 namespace Drupal\Core\Entity\Enhancer;
 
+use Drupal\Core\Routing\Enhancer\RouteEnhancerInterface;
 use Symfony\Component\HttpFoundation\Request;
-use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface;
+use Symfony\Component\Routing\Route;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 
 /**
@@ -80,4 +81,15 @@ public function enhance(array $defaults, Request $request) {
     return $defaults;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function applies(Route $route) {
+    return !$route->hasDefault('_controller') &&
+      ($route->hasDefault('_entity_form')
+        || $route->hasDefault('_entity_list')
+        || $route->hasDefault('_entity_view')
+      );
+  }
+
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/RouteEnhancerSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/RouteEnhancerSubscriber.php
new file mode 100644
index 0000000..1fe9f90
--- /dev/null
+++ b/core/lib/Drupal/Core/EventSubscriber/RouteEnhancerSubscriber.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\EventSubscriber\RouteEnhancerSubscriber.
+ */
+
+namespace \Drupal\Core\EventSubscriber;
+
+use Drupal\Core\Routing\Enhancer\RouteEnhancerInterface;
+use Drupal\Core\Routing\RoutingEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+
+/**
+ * Listens to the new routes before they get saved.
+ */
+class RouteEnhancerSubscriber implements EventSubscriberInterface {
+
+  /**
+   * @var Drupal\Core\Routing\Enhancer\RouteEnhancerInterface
+   */
+  protected $routeEnhancer;
+
+  /**
+   * Constructs the RouteEnhancerSubscriber object.
+   *
+   * @param Drupal\Core\Routing\Enhancer\RouteEnhancerInterface $route_enhancer
+   *   The route enhancer.
+   */
+  public function __construct(RouteEnhancerInterface $route_enhancer) {
+    $this->routeEnhancer = $route_enhancer;
+  }
+
+  /**
+   * Get the response object from a collection of routes.
+   *
+   * @param Symfony\Component\HttpKernel\Event\GetResponseEvent $event
+   *   The Event to process.
+   */
+  public function onRequest(GetResponseEvent $event) {
+    $this->routeEnhaner->setEnhancers($event->getRouteCollection());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  static function getSubscribedEvents() {
+    $events[RoutingEvents::ALTER][] = array('onRequest', 200);
+    return $events;
+  }
+
+}
\ No newline at end of file
diff --git a/core/lib/Drupal/Core/EventSubscriber/RouteFilterSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/RouteFilterSubscriber.php
new file mode 100644
index 0000000..a59ffe3
--- /dev/null
+++ b/core/lib/Drupal/Core/EventSubscriber/RouteFilterSubscriber.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\EventSubscriber\RouteFilterSubscriber.
+ */
+
+namespace \Drupal\Core\EventSubscriber;
+
+use Drupal\Core\Routing\RouteFilterInterface;
+use Drupal\Core\Routing\RoutingEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+
+/**
+ * Listens to the filtered collection of route instances.
+ */
+class RouteFilterSubscriber implements EventSubscriberInterface {
+
+  /**
+   * @var Drupal\Core\Routing\RouteFilterInterface
+   */
+  protected $routeFilter;
+
+  /**
+   * Constructs the RouteFilterSubscriber object.
+   *
+   * @param Drupal\Core\Routing\RouteFilterInterface $route_filter
+   *   The route filter.
+   */
+  public function __construct(RouteFilterInterface $route_filter) {
+    $this->routeFilter = $route_filter;
+  }
+
+  /**
+   * Get the Response object from filtered route collection.
+   *
+   * @param Symfony\Component\HttpKernel\Event\GetResponseEvent $event
+   *   The Event to process.
+   */
+  public function onRequest(GetResponseEvent $event) {
+    $this->routeFilter->setFilters($event->getRouteCollection());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  static function getSubscribedEvents() {
+    $events[RoutingEvents::ALTER][] = array('onRequest', 200);
+    return $events;
+  }
+
+}
\ No newline at end of file
diff --git a/core/lib/Drupal/Core/Routing/AcceptHeaderMatcher.php b/core/lib/Drupal/Core/Routing/AcceptHeaderMatcher.php
index 1218fa6..a663bf4 100644
--- a/core/lib/Drupal/Core/Routing/AcceptHeaderMatcher.php
+++ b/core/lib/Drupal/Core/Routing/AcceptHeaderMatcher.php
@@ -9,9 +9,10 @@
 
 use Drupal\Component\Utility\String;
 use Drupal\Core\ContentNegotiation;
-use Symfony\Cmf\Component\Routing\NestedMatcher\RouteFilterInterface;
+use Drupal\Core\Routing\RouteFilterInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpKernel\Exception\NotAcceptableHttpException;
+use Symfony\Component\Routing\Route;
 use Symfony\Component\Routing\RouteCollection;
 
 /**
@@ -82,4 +83,11 @@ public function filter(RouteCollection $collection, Request $request) {
     throw new NotAcceptableHttpException(String::format('No route found for the specified formats @formats.', array('@formats' => implode(' ', $acceptable_mime_types))));
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function applies(Route $route) {
+    return TRUE;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Routing/ContentTypeHeaderMatcher.php b/core/lib/Drupal/Core/Routing/ContentTypeHeaderMatcher.php
index c76036d..69875d8 100644
--- a/core/lib/Drupal/Core/Routing/ContentTypeHeaderMatcher.php
+++ b/core/lib/Drupal/Core/Routing/ContentTypeHeaderMatcher.php
@@ -7,9 +7,9 @@
 
 namespace Drupal\Core\Routing;
 
-use Symfony\Cmf\Component\Routing\NestedMatcher\RouteFilterInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpKernel\Exception\UnsupportedMediaTypeHttpException;
+use Symfony\Component\Routing\Route;
 use Symfony\Component\Routing\RouteCollection;
 
 /**
@@ -50,4 +50,11 @@ public function filter(RouteCollection $collection, Request $request) {
     throw new UnsupportedMediaTypeHttpException('No route found that matches the Content-Type header.');
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function applies(Route $route) {
+    return TRUE;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Routing/Enhancer/AuthenticationEnhancer.php b/core/lib/Drupal/Core/Routing/Enhancer/AuthenticationEnhancer.php
index 0436b44..e032ab1 100644
--- a/core/lib/Drupal/Core/Routing/Enhancer/AuthenticationEnhancer.php
+++ b/core/lib/Drupal/Core/Routing/Enhancer/AuthenticationEnhancer.php
@@ -10,8 +10,8 @@
 use Drupal\Core\Authentication\AuthenticationManagerInterface;
 use Drupal\Core\Session\AccountProxyInterface;
 use Drupal\Core\Session\AnonymousUserSession;
-use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Route;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 
 /**
@@ -75,4 +75,12 @@ public function enhance(array $defaults, Request $request) {
     }
     return $defaults;
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function applies(Route $route) {
+    return TRUE;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Routing/Enhancer/ParamConversionEnhancer.php b/core/lib/Drupal/Core/Routing/Enhancer/ParamConversionEnhancer.php
index a8c1159..5df4672 100644
--- a/core/lib/Drupal/Core/Routing/Enhancer/ParamConversionEnhancer.php
+++ b/core/lib/Drupal/Core/Routing/Enhancer/ParamConversionEnhancer.php
@@ -9,7 +9,6 @@
 
 use Drupal\Core\ParamConverter\ParamConverterManagerInterface;
 use Drupal\Core\ParamConverter\ParamNotConvertedException;
-use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpFoundation\ParameterBag;
@@ -17,6 +16,7 @@
 use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\Routing\Route;
 
 /**
  * Provides a route enhancer that handles parameter conversion.
@@ -90,4 +90,11 @@ public static function getSubscribedEvents() {
     return $events;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function applies(Route $route) {
+    return $route->hasOption('parameters');
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Routing/Enhancer/RouteEnhancerInterface.php b/core/lib/Drupal/Core/Routing/Enhancer/RouteEnhancerInterface.php
new file mode 100644
index 0000000..53039b1
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/Enhancer/RouteEnhancerInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Routing\Enhancer\RouteEnhancerInterface.
+ */
+
+namespace Drupal\Core\Routing\Enhancer;
+
+use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface as BaseRouteEnhancerInterface;
+use Symfony\Component\Routing\Route;
+
+/**
+ * A route enhance service to determine route enhance rules.
+ */
+interface RouteEnhancerInterface extends BaseRouteEnhancerInterface {
+
+  /**
+   * 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);
+
+}
diff --git a/core/lib/Drupal/Core/Routing/LazyRouteEnhancer.php b/core/lib/Drupal/Core/Routing/LazyRouteEnhancer.php
new file mode 100644
index 0000000..41a5aaf
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/LazyRouteEnhancer.php
@@ -0,0 +1,111 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Routing\LazyRouteEnhancer.
+ */
+
+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;
+
+/**
+ * LazyRouteEnhancer for route.
+ *
+ * For any route request, route listener service takes long response time as
+ * all the associated dependencies are instantiated with service resulting in
+ * poor performance. However, with the use of lazy loading, dependencies are
+ * instantiated only when used.
+ */
+// @todo Add some simple integration test, which checks some of the _entity_form
+//   routes to include the expected options.
+class LazyRouteEnhancer implements BaseRouteEnhancerInterface, ContainerAwareInterface {
+
+  use ContainerAwareTrait;
+
+  /**
+   * Array of enhancers keyed by service id.
+   *
+   * @var array
+   */
+  protected $serviceIds = [];
+
+  /**
+   * The initialized route enhancers.
+   *
+   * @var \Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface[]|\Drupal\Core\Routing\Enhancer\RouteEnhancerInterface[]
+   */
+  protected $enhancers = [];
+
+  /**
+   * Registers a new service ID by Enhancer.
+   *
+   * @param string $enhancer
+   *   The enhancer in the container that provides a check.
+   *
+   * @return $this
+   */
+  public function addEnhancer($enhancer) {
+    $this->serviceIds[$enhancer] = $enhancer;
+
+    return $this;
+  }
+
+  /**
+   * 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) {
+      $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 = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT);
+
+    $enhancer_ids = $route->getOption('_route_enhancers');
+
+    if (isset($enhancer_ids)) {
+      foreach ($enhancer_ids as $enhancer_id) {
+        $this->container->get($enhancer_id)->enhance($defaults, $request);
+      }
+    }
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Routing/LazyRouteFilter.php b/core/lib/Drupal/Core/Routing/LazyRouteFilter.php
new file mode 100644
index 0000000..0613d4d
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/LazyRouteFilter.php
@@ -0,0 +1,108 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Routing\LazyRouteFilter.
+ */
+
+namespace Drupal\Core\Routing;
+
+use Symfony\Cmf\Component\Routing\NestedMatcher\RouteFilterInterface as BaseRouteFilterInterface;
+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;
+
+/**
+ * Class LazyRouteFilter
+ *
+ * @package Drupal\Core\Routing
+ *
+ *
+ */
+class LazyRouteFilter implements BaseRouteFilterInterface, ContainerAwareInterface {
+
+  use ContainerAwareTrait;
+
+  /**
+   * Array of filter keyed by service id.
+   *
+   * @var array
+   */
+  protected $serviceIds = [];
+
+  /**
+   * The initialized route filters.
+   *
+   * @var Symfony\Cmf\Component\Routing\NestedMatcher[]|Drupal\Core\Routing\RouteFilterInterface[]
+   */
+  protected $filters = [];
+
+  /**
+   * Registers a new service ID by Filter.
+   *
+   * @param string $filter
+   *   The filter in the container that provides a check.
+   *
+   * @return $this
+   */
+  public function addFilter($filter) {
+    $this->serviceIds[$filter] = $filter;
+
+    return $this;
+  }
+
+  /**
+   * 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) {
+    /** @var \Symfony\Component\Routing\Route $route */
+    $route = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT);
+
+    $filter_ids = $route->getOption('_route_enhancers');
+
+    if (isset($filter_ids)) {
+      foreach ($filter_ids as $filter_id) {
+        $this->container->get($filter_id)->filter($collection, $request);
+      }
+    }
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Routing/RouteFilterInterface.php b/core/lib/Drupal/Core/Routing/RouteFilterInterface.php
new file mode 100644
index 0000000..f671a2e
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/RouteFilterInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Routing\RouteFilterInterface.
+ */
+
+namespace Drupal\Core\Routing;
+
+use Symfony\Cmf\Component\Routing\NestedMatcher\RouteFilterInterface as BaseRouteFilterInterface;
+use Symfony\Component\Routing\Route;
+
+/**
+ * A route filter service to filter down the collection of route instances.
+ */
+interface RouteFilterInterface extends BaseRouteFilterInterface {
+
+  /**
+   * Declaresif the route filter 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);
+
+}
