diff --git a/core/core.services.yml b/core/core.services.yml
index 7d56112..d3210f2 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -316,6 +316,11 @@ services:
     tags:
       - { name: paramconverter }
     arguments: ['@entity.manager']
+  route_subscriber.module:
+    class: Drupal\Core\EventSubscriber\ModuleRouteSubscriber
+    tags:
+      - { name: event_subscriber }
+    arguments: ['@module_handler']
   route_subscriber.entity:
     class: Drupal\Core\EventSubscriber\EntityRouteAlterSubscriber
     tags:
diff --git a/core/lib/Drupal/Core/EventSubscriber/ModuleRouteSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ModuleRouteSubscriber.php
new file mode 100644
index 0000000..df8a5f7
--- /dev/null
+++ b/core/lib/Drupal/Core/EventSubscriber/ModuleRouteSubscriber.php
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\EventSubscriber\ModuleRouteSubscriber.
+ */
+
+namespace Drupal\Core\EventSubscriber;
+
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Routing\RouteBuildEvent;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Drupal\Core\Routing\RoutingEvents;
+
+/**
+ * A route subscriber to remove routes that depend on modules being enabled.
+ */
+class ModuleRouteSubscriber implements EventSubscriberInterface {
+
+  /**
+   * The module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * Constructs a ModuleRouteSubscriber object.
+   *
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler.
+   */
+  public function __construct(ModuleHandlerInterface $module_handler) {
+    $this->moduleHandler = $module_handler;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    $events[RoutingEvents::ALTER] = 'removeRoutes';
+    return $events;
+  }
+
+  /**
+   * Removes any routes that have an unmet module dependency.
+   *
+   * @param \Drupal\Core\Routing\RouteBuildEvent $event
+   *   The route building event.
+   */
+  public function removeRoutes(RouteBuildEvent $event) {
+    $collection = $event->getRouteCollection();
+    foreach ($collection as $name => $route) {
+      if ($route->hasOption('_module_dependency')) {
+        foreach ((array) $route->getOption('_module_dependency') as $module) {
+          if (!$this->moduleHandler->moduleExists($module)) {
+            $collection->remove($name);
+            break;
+          }
+        }
+      }
+    }
+  }
+
+}
diff --git a/core/modules/dblog/dblog.routing.yml b/core/modules/dblog/dblog.routing.yml
index 31f1b1c..ea66200 100644
--- a/core/modules/dblog/dblog.routing.yml
+++ b/core/modules/dblog/dblog.routing.yml
@@ -27,3 +27,13 @@ dblog.access_denied:
     _content: '\Drupal\dblog\Controller\DbLogController::accessDenied'
   requirements:
     _permission: 'access site reports'
+
+dblog.search:
+  path: '/admin/reports/search'
+  defaults:
+    _content: '\Drupal\dblog\Controller\DbLogController::search'
+    _title: 'Top search phrases'
+  options:
+    _module_dependency: ['search']
+  requirements:
+    _permission: 'access site reports'
diff --git a/core/modules/dblog/dblog.services.yml b/core/modules/dblog/dblog.services.yml
deleted file mode 100644
index 815734c..0000000
--- a/core/modules/dblog/dblog.services.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-services:
-  dblog.route_subscriber:
-    class: Drupal\dblog\Routing\RouteSubscriber
-    arguments: ['@module_handler']
-    tags:
-      - { name: event_subscriber}
diff --git a/core/modules/dblog/lib/Drupal/dblog/Routing/RouteSubscriber.php b/core/modules/dblog/lib/Drupal/dblog/Routing/RouteSubscriber.php
deleted file mode 100644
index f04492e..0000000
--- a/core/modules/dblog/lib/Drupal/dblog/Routing/RouteSubscriber.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\dblog\Routing\RouteSubscriber.
- */
-
-namespace Drupal\dblog\Routing;
-
-use Drupal\Core\Extension\ModuleHandlerInterface;
-use Drupal\Core\Routing\RouteBuildEvent;
-use Drupal\Core\Routing\RoutingEvents;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
-use Symfony\Component\Routing\Route;
-
-/**
- * Provides dynamic routes for dblog.
- */
-class RouteSubscriber implements EventSubscriberInterface {
-
-  /**
-   * The module handler.
-   *
-   * @var \Drupal\Core\Extension\ModuleHandlerInterface
-   */
-  protected $moduleHandler;
-
-  /**
-   * Creates a new RouteSubscriber.
-   *
-   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
-   *   The module handler.
-   */
-  public function __construct(ModuleHandlerInterface $module_handler) {
-    $this->moduleHandler = $module_handler;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function getSubscribedEvents() {
-    $events[RoutingEvents::DYNAMIC] = 'routes';
-    return $events;
-  }
-
-  /**
-   * Generate dynamic routes for various dblog pages.
-   *
-   * @param \Drupal\Core\Routing\RouteBuildEvent $event
-   *   The route building event.
-   *
-   * @return \Symfony\Component\Routing\RouteCollection
-   *   The route collection that contains the new dynamic route.
-   */
-  public function routes(RouteBuildEvent $event) {
-    $collection = $event->getRouteCollection();
-    if ($this->moduleHandler->moduleExists('search')) {
-      // The block entity listing page.
-      $route = new Route(
-        'admin/reports/search',
-        array(
-          '_content' => '\Drupal\dblog\Controller\DbLogController::search',
-          '_title' => 'Top search phrases',
-        ),
-        array(
-          '_permission' => 'access site reports',
-        )
-      );
-      $collection->add('dblog.search', $route);
-    }
-  }
-
-}
diff --git a/core/tests/Drupal/Tests/Core/EventSubscriber/ModuleRouteSubscriberTest.php b/core/tests/Drupal/Tests/Core/EventSubscriber/ModuleRouteSubscriberTest.php
new file mode 100644
index 0000000..501363d
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/EventSubscriber/ModuleRouteSubscriberTest.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\EventSubscriber\ModuleRouteSubscriberTest.
+ */
+
+namespace Drupal\Tests\Core\EventSubscriber;
+
+use Drupal\Core\Routing\RouteBuildEvent;
+use Drupal\Tests\UnitTestCase;
+use Drupal\Core\EventSubscriber\ModuleRouteSubscriber;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\Route;
+
+/**
+ * Tests the ModuleRouteSubscriber class.
+ *
+ * @see \Drupal\Core\EventSubscriber\ModuleRouteSubscriber
+ */
+class ModuleRouteSubscriberTest extends UnitTestCase {
+
+  /**
+   * The mock module handler.
+   *
+   * @var Drupal\Core\Extension\ModuleHandlerInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $moduleHandler;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Module route subscriber',
+      'description' => 'Unit test the \Drupal\Core\EventSubscriber\ModuleRouteSubscriber class.',
+      'group' => 'System'
+    );
+  }
+
+  /**
+   * Tests that removeRoute() removes routes when the module is not enabled.
+   */
+  public function testRemoveRoute() {
+    $module_handler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
+
+    $value_map = array(
+      array('enabled', TRUE),
+      array('disabled', FALSE),
+    );
+
+    $module_handler->expects($this->any())
+      ->method('moduleExists')
+      ->will($this->returnValueMap($value_map));
+
+    $collection = new RouteCollection();
+    $route_1 = new Route('', array(), array(), array('_module_dependency' => array('enabled')));
+    $collection->add('enabled', $route_1);
+    $route_2 = new Route('module_disabled', array(), array(), array('_module_dependency' => array('disabled')));
+    $collection->add('disabled', $route_2);
+    $route_3 = new Route('module_disabled_first', array(), array(), array('_module_dependency' => array('disabled', 'enabled')));
+    $collection->add('disabled_first', $route_3);
+    $route_4 = new Route('module_disabled_second', array(), array(), array('_module_dependency' => array('enabled', 'disabled')));
+    $collection->add('disabled_second', $route_4);
+    $route_5 = new Route('no_module_dependency', array(), array(), array());
+    $collection->add('no_module_dependency', $route_5);
+
+    $event = new RouteBuildEvent($collection, 'test');
+    $route_subscriber = new ModuleRouteSubscriber($module_handler);
+    $route_subscriber->removeRoutes($event);
+
+    $this->assertInstanceOf('Symfony\Component\Routing\Route', $collection->get('enabled'));
+    $this->assertNull($collection->get('disabled'));
+    $this->assertNull($collection->get('disabled_first'));
+    $this->assertNull($collection->get('disabled_second'));
+    $this->assertInstanceOf('Symfony\Component\Routing\Route', $collection->get('no_module_dependency'));
+  }
+
+}
