diff --git a/core/lib/Drupal/Core/EventSubscriber/ModuleRouteSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ModuleRouteSubscriber.php
index 49f1a12..65caac6 100644
--- a/core/lib/Drupal/Core/EventSubscriber/ModuleRouteSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/ModuleRouteSubscriber.php
@@ -36,7 +36,7 @@ public function __construct(ModuleHandlerInterface $module_handler) {
   /**
    * {@inheritdoc}
    */
-  protected function alterRoutes(RouteCollection $collection, $module) {
+  protected function alterRoutes(RouteCollection $collection) {
     foreach ($collection as $name => $route) {
       if ($route->hasRequirement('_module_dependencies')) {
         $modules = $route->getRequirement('_module_dependencies');
diff --git a/core/lib/Drupal/Core/EventSubscriber/SpecialAttributesRouteSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/SpecialAttributesRouteSubscriber.php
index c9f3e7d..8556561 100644
--- a/core/lib/Drupal/Core/EventSubscriber/SpecialAttributesRouteSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/SpecialAttributesRouteSubscriber.php
@@ -21,7 +21,7 @@ class SpecialAttributesRouteSubscriber extends RouteSubscriberBase {
   /**
    * {@inheritdoc}
    */
-  protected function alterRoutes(RouteCollection $collection, $module) {
+  protected function alterRoutes(RouteCollection $collection) {
     $special_variables = array(
       'system_path',
       '_maintenance',
@@ -57,7 +57,7 @@ protected function alterRoutes(RouteCollection $collection, $module) {
    */
   public function onAlterRoutes(RouteBuildEvent $event) {
     $collection = $event->getRouteCollection();
-    return $this->alterRoutes($collection, $event->getProvider());
+    return $this->alterRoutes($collection);
   }
 
 }
diff --git a/core/lib/Drupal/Core/Routing/MatcherDumper.php b/core/lib/Drupal/Core/Routing/MatcherDumper.php
index 889b691..5ff73f9 100644
--- a/core/lib/Drupal/Core/Routing/MatcherDumper.php
+++ b/core/lib/Drupal/Core/Routing/MatcherDumper.php
@@ -76,14 +76,10 @@ public function addRoutes(RouteCollection $routes) {
    *   An array of options.
    */
   public function dump(array $options = array()) {
-    $options += array(
-      'provider' => '',
-    );
     // If there are no new routes, just delete any previously existing of this
     // provider.
     if (empty($this->routes) || !count($this->routes)) {
       $this->connection->delete($this->tableName)
-        ->condition('provider', $options['provider'])
         ->execute();
     }
     // Convert all of the routes into database records.
@@ -104,7 +100,7 @@ public function dump(array $options = array()) {
         $names[] = $name;
         $values = array(
           'name' => $name,
-          'provider' => $options['provider'],
+          'provider' => isset($options['provider']) ? $options['provider'] : 'provider',
           'fit' => $compiled->getFit(),
           'path' => $compiled->getPath(),
           'pattern_outline' => $compiled->getPatternOutline(),
@@ -124,7 +120,6 @@ public function dump(array $options = array()) {
         // old records of this provider (which may no longer exist).
         $delete = $this->connection->delete($this->tableName);
         $or = $delete->orConditionGroup()
-          ->condition('provider', $options['provider'])
           ->condition('name', $names);
         $delete->condition($or);
         $delete->execute();
diff --git a/core/lib/Drupal/Core/Routing/RouteBuildEvent.php b/core/lib/Drupal/Core/Routing/RouteBuildEvent.php
index 502318d..c3f36ee 100644
--- a/core/lib/Drupal/Core/Routing/RouteBuildEvent.php
+++ b/core/lib/Drupal/Core/Routing/RouteBuildEvent.php
@@ -23,18 +23,13 @@ class RouteBuildEvent extends Event {
   protected $routeCollection;
 
   /**
-   * The provider of this route collection.
-   *
-   * @var string
-   */
-  protected $provider;
-
-  /**
    * Constructs a RouteBuildEvent object.
+   *
+   * @param \Symfony\Component\Routing\RouteCollection $route_collection
+   *   The route collection.
    */
-  public function __construct(RouteCollection $route_collection, $provider) {
+  public function __construct(RouteCollection $route_collection) {
     $this->routeCollection = $route_collection;
-    $this->provider = $provider;
   }
 
   /**
@@ -44,11 +39,4 @@ public function getRouteCollection() {
     return $this->routeCollection;
   }
 
-  /**
-   * Gets the provider for this route collection.
-   */
-  public function getProvider() {
-    return $this->provider;
-  }
-
 }
diff --git a/core/lib/Drupal/Core/Routing/RouteBuilder.php b/core/lib/Drupal/Core/Routing/RouteBuilder.php
index 8df9f67..c77f02e 100644
--- a/core/lib/Drupal/Core/Routing/RouteBuilder.php
+++ b/core/lib/Drupal/Core/Routing/RouteBuilder.php
@@ -20,16 +20,13 @@
 
 /**
  * Managing class for rebuilding the router table.
- *
- * Because this class makes use of the modules system, it cannot currently
- * be unit tested.
  */
 class RouteBuilder implements RouteBuilderInterface {
 
   /**
    * The dumper to which we should send collected routes.
    *
-   * @var \Symfony\Component\Routing\Matcher\Dumper\MatcherDumperInterface
+   * @var \Drupal\Core\Routing\MatcherDumperInterface
    */
   protected $dumper;
 
@@ -103,8 +100,8 @@ public function rebuild() {
       return FALSE;
     }
 
+    $collection = new RouteCollection();
     foreach ($this->getRouteDefinitions() as $provider => $routes) {
-      $collection = new RouteCollection();
 
       // The top-level 'routes_callback' is a list of methods in controller
       // syntax, see \Drupal\Core\Controller\ControllerResolver. These methods
@@ -142,17 +139,19 @@ public function rebuild() {
         $collection->add($name, $route);
       }
 
-      $this->dispatcher->dispatch(RoutingEvents::ALTER, new RouteBuildEvent($collection, $provider));
-      $this->dumper->addRoutes($collection);
-      $this->dumper->dump(array('provider' => $provider));
     }
 
-    // Now allow modules to register additional, dynamic routes.
-    // @todo Either remove this alter or the per-provider alter.
-    $collection = new RouteCollection();
-    $this->dispatcher->dispatch(RoutingEvents::ALTER, new RouteBuildEvent($collection, 'dynamic_routes'));
+    // DYNAMIC is supposed to be used to add new routes based upon all the
+    // static defined ones.
+    $this->dispatcher->dispatch(RoutingEvents::DYNAMIC, new RouteBuildEvent($collection));
+
+    // ALTER is the final step to alter all the existing routes. We cannot stop
+    // people from adding new routes here, but we define two separate steps to
+    // make it clear.
+    $this->dispatcher->dispatch(RoutingEvents::ALTER, new RouteBuildEvent($collection));
+
     $this->dumper->addRoutes($collection);
-    $this->dumper->dump(array('provider' => 'dynamic_routes'));
+    $this->dumper->dump();
 
     $this->state->delete(static::REBUILD_NEEDED);
     $this->lock->release('router_rebuild');
diff --git a/core/lib/Drupal/Core/Routing/RouteSubscriberBase.php b/core/lib/Drupal/Core/Routing/RouteSubscriberBase.php
index f7cf537..c935fa5 100644
--- a/core/lib/Drupal/Core/Routing/RouteSubscriberBase.php
+++ b/core/lib/Drupal/Core/Routing/RouteSubscriberBase.php
@@ -21,11 +21,8 @@
    *
    * @param \Symfony\Component\Routing\RouteCollection $collection
    *   The route collection for adding routes.
-   * @param string $provider
-   *   The provider these routes belong to. For dynamically added routes, the
-   *   provider name will be 'dynamic_routes'.
    */
-  abstract protected function alterRoutes(RouteCollection $collection, $provider);
+  abstract protected function alterRoutes(RouteCollection $collection);
 
   /**
    * {@inheritdoc}
@@ -43,7 +40,7 @@ public static function getSubscribedEvents() {
    */
   public function onAlterRoutes(RouteBuildEvent $event) {
     $collection = $event->getRouteCollection();
-    $this->alterRoutes($collection, $event->getProvider());
+    $this->alterRoutes($collection);
   }
 
 }
diff --git a/core/lib/Drupal/Core/Routing/RoutingEvents.php b/core/lib/Drupal/Core/Routing/RoutingEvents.php
index b5ee212..8df9698 100644
--- a/core/lib/Drupal/Core/Routing/RoutingEvents.php
+++ b/core/lib/Drupal/Core/Routing/RoutingEvents.php
@@ -13,13 +13,16 @@
 final class RoutingEvents {
 
   /**
+   * THE DYNAMIC event is fired on a route collection to allow new routes.
+   *
+   * This event is used to add new routes based upon existing routes.
+   */
+  const DYNAMIC = 'routing.route_dynamic';
+
+  /**
    * The ALTER event is fired on a route collection to allow changes to routes.
    *
    * This event is used to process new routes before they get saved.
-   *
-   * @see \Drupal\Core\Routing\RouteBuildEvent
-   *
-   * @var string
    */
   const ALTER = 'routing.route_alter';
 
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Routing/RouteSubscriber.php b/core/modules/config_translation/lib/Drupal/config_translation/Routing/RouteSubscriber.php
index 335faa5..8c56325 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/Routing/RouteSubscriber.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/Routing/RouteSubscriber.php
@@ -36,14 +36,7 @@ public function __construct(ConfigMapperManagerInterface $mapper_manager) {
   /**
    * {@inheritdoc}
    */
-  protected function alterRoutes(RouteCollection $collection, $provider) {
-    // @todo \Drupal\config_translation\ConfigNamesMapper uses the route
-    //   provider directly, which is unsafe during rebuild. This currently only
-    //   works by coincidence; fix in https://drupal.org/node/2158571.
-    if ($provider != 'dynamic_routes') {
-      return;
-    }
-
+  protected function alterRoutes(RouteCollection $collection) {
     $mappers = $this->mapperManager->getMappers();
     foreach ($mappers as $mapper) {
       $collection->add($mapper->getOverviewRouteName(), $mapper->getOverviewRoute());
diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Routing/ContentTranslationRouteSubscriber.php b/core/modules/content_translation/lib/Drupal/content_translation/Routing/ContentTranslationRouteSubscriber.php
index cab9ac4..8b89d27 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/Routing/ContentTranslationRouteSubscriber.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/Routing/ContentTranslationRouteSubscriber.php
@@ -38,7 +38,7 @@ public function __construct(ContentTranslationManagerInterface $content_translat
   /**
    * {@inheritdoc}
    */
-  protected function alterRoutes(RouteCollection $collection, $provider) {
+  protected function alterRoutes(RouteCollection $collection) {
     foreach ($this->contentTranslationManager->getSupportedEntityTypes() as $entity_type_id => $entity_type) {
       // Try to get the route from the current collection.
       if (!$entity_route = $collection->get($entity_type->getLinkTemplate('canonical'))) {
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Routing/RouteSubscriber.php b/core/modules/field_ui/lib/Drupal/field_ui/Routing/RouteSubscriber.php
index 14b1b6b..e7dbc00 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Routing/RouteSubscriber.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Routing/RouteSubscriber.php
@@ -38,7 +38,7 @@ public function __construct(EntityManagerInterface $manager) {
   /**
    * {@inheritdoc}
    */
-  protected function alterRoutes(RouteCollection $collection, $provider) {
+  protected function alterRoutes(RouteCollection $collection) {
     foreach ($this->manager->getDefinitions() as $entity_type_id => $entity_type) {
       $defaults = array();
       if ($entity_type->isFieldable() && $entity_type->hasLinkTemplate('admin-form')) {
diff --git a/core/modules/node/lib/Drupal/node/EventSubscriber/NodeAdminRouteSubscriber.php b/core/modules/node/lib/Drupal/node/EventSubscriber/NodeAdminRouteSubscriber.php
index 45cfa3d..4b5fcb0 100644
--- a/core/modules/node/lib/Drupal/node/EventSubscriber/NodeAdminRouteSubscriber.php
+++ b/core/modules/node/lib/Drupal/node/EventSubscriber/NodeAdminRouteSubscriber.php
@@ -36,7 +36,7 @@ public function __construct(ConfigFactoryInterface $config_factory) {
   /**
    * {@inheritdoc}
    */
-  protected function alterRoutes(RouteCollection $collection, $provider) {
+  protected function alterRoutes(RouteCollection $collection) {
     if ($this->configFactory->get('node.settings')->get('use_admin_theme')) {
       foreach ($collection->all() as $route) {
         if ($route->hasOption('_node_operation_route')) {
diff --git a/core/modules/system/lib/Drupal/system/EventSubscriber/AdminRouteSubscriber.php b/core/modules/system/lib/Drupal/system/EventSubscriber/AdminRouteSubscriber.php
index ef70321..eef05e1 100644
--- a/core/modules/system/lib/Drupal/system/EventSubscriber/AdminRouteSubscriber.php
+++ b/core/modules/system/lib/Drupal/system/EventSubscriber/AdminRouteSubscriber.php
@@ -19,7 +19,7 @@ class AdminRouteSubscriber extends RouteSubscriberBase {
   /**
    * {@inheritdoc}
    */
-  protected function alterRoutes(RouteCollection $collection, $provider) {
+  protected function alterRoutes(RouteCollection $collection) {
     foreach ($collection->all() as $route) {
       if (strpos($route->getPath(), '/admin') === 0 && !$route->hasOption('_admin_route')) {
         $route->setOption('_admin_route', TRUE);
diff --git a/core/modules/system/tests/modules/router_test_directory/lib/Drupal/router_test/RouteTestSubscriber.php b/core/modules/system/tests/modules/router_test_directory/lib/Drupal/router_test/RouteTestSubscriber.php
index 39fa645..a2fcad0 100644
--- a/core/modules/system/tests/modules/router_test_directory/lib/Drupal/router_test/RouteTestSubscriber.php
+++ b/core/modules/system/tests/modules/router_test_directory/lib/Drupal/router_test/RouteTestSubscriber.php
@@ -17,12 +17,10 @@ class RouteTestSubscriber extends RouteSubscriberBase {
   /**
    * {@inheritdoc}
    */
-  protected function alterRoutes(RouteCollection $collection, $provider) {
-    if ($provider == 'router_test') {
-      $route = $collection->get('router_test.6');
-      // Change controller method from test1 to test5.
-      $route->setDefault('_content', '\Drupal\router_test\TestControllers::test5');
-    }
+  protected function alterRoutes(RouteCollection $collection) {
+    $route = $collection->get('router_test.6');
+    // Change controller method from test1 to test5.
+    $route->setDefault('_content', '\Drupal\router_test\TestControllers::test5');
   }
 
 }
diff --git a/core/modules/views/lib/Drupal/views/EventSubscriber/RouteSubscriber.php b/core/modules/views/lib/Drupal/views/EventSubscriber/RouteSubscriber.php
index 773c09a..7b8097b 100644
--- a/core/modules/views/lib/Drupal/views/EventSubscriber/RouteSubscriber.php
+++ b/core/modules/views/lib/Drupal/views/EventSubscriber/RouteSubscriber.php
@@ -155,7 +155,7 @@ public function routes() {
   /**
    * {@inheritdoc}
    */
-  protected function alterRoutes(RouteCollection $collection, $provider) {
+  protected function alterRoutes(RouteCollection $collection) {
     foreach ($this->getViewsDisplayIDsWithRoute() as $pair) {
       list($view_id, $display_id) = explode('.', $pair);
       $view = $this->viewStorage->load($view_id);
