diff --git a/core/lib/Drupal/Core/Routing/LazyUnserializingRouteCollection.php b/core/lib/Drupal/Core/Routing/LazyUnserializingRouteCollection.php
new file mode 100644
index 0000000..18335c5
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/LazyUnserializingRouteCollection.php
@@ -0,0 +1,177 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Routing\LazyUnserializingRouteCollection.
+ */
+
+namespace Drupal\Core\Routing;
+
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * Provides a route collection which gets serialized strings,
+ *
+ * and just unserializes them, in case needed.
+ */
+class LazyUnserializingRouteCollection extends RouteCollection {
+
+  /**
+   * The unserialized or serialized routes.
+   *
+   * @var string[]|\Symfony\Component\Routing\Route[]
+   */
+  protected $routes = [];
+
+  /**
+   * Constructs a new LazyUnserializingRouteCollection.
+   *
+   * @param string[]|\Symfony\Component\Routing\Route[] $routes
+   *   The unserialized or serialized routes.
+   */
+  public function __construct(array $routes) {
+    $this->routes = $routes;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __clone() {
+    foreach ($this->routes as $name => $route) {
+      $this->routes[$name] = clone $route;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIterator() {
+    $this->loadAllRoutes();
+    return new \ArrayIterator($this->routes);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function count() {
+    return count($this->routes);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function add($name, Route $route) {
+    unset($this->routes[$name]);
+
+    $this->routes[$name] = $route;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function all() {
+    $this->loadAllRoutes();
+
+    return $this->routes;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function get($name) {
+    if (isset($this->routes[$name])) {
+      if (is_string($this->routes[$name])) {
+        $this->routes[$name] = unserialize($this->routes[$name]);
+      }
+      return $this->routes[$name];
+    }
+
+    return NULL;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function remove($name) {
+    foreach ((array) $name as $n) {
+      unset($this->routes[$n]);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function addPrefix($prefix, array $defaults = array(), array $requirements = array()) {
+    $this->loadAllRoutes();
+    return $this->addPrefix($prefix, $defaults, $requirements);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setHost($pattern, array $defaults = array(), array $requirements = array()) {
+    $this->loadAllRoutes();
+    return $this->setHost($pattern, $defaults, $requirements);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setCondition($condition) {
+    $this->loadAllRoutes();
+    return $this->setCondition($condition);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function addDefaults(array $defaults) {
+    $this->loadAllRoutes();
+    return $this->addDefaults($defaults);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function addRequirements(array $requirements) {
+    $this->loadAllRoutes();
+    return $this->addRequirements($requirements);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function addOptions(array $options) {
+    $this->loadAllRoutes();
+    return $this->addOptions($options);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setSchemes($schemes) {
+    $this->loadAllRoutes();
+    return $this->setSchemes($schemes);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setMethods($methods) {
+    $this->loadAllRoutes();
+    return $this->setMethods($methods);
+  }
+
+  /**
+   * Unserializes all given routes, if needed.
+   */
+  protected function loadAllRoutes() {
+    foreach ($this->routes as $name => $route) {
+      if (is_string($route)) {
+        $this->routes[$name] = unserialize($route);
+      }
+    }
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Routing/RoutePreloader.php b/core/lib/Drupal/Core/Routing/RoutePreloader.php
index 7952d17..7a45a7d 100644
--- a/core/lib/Drupal/Core/Routing/RoutePreloader.php
+++ b/core/lib/Drupal/Core/Routing/RoutePreloader.php
@@ -85,7 +85,7 @@ public function onRequest(KernelEvent $event) {
    */
   protected function loadNonAdminRoutes() {
     if ($routes = $this->state->get('routing.non_admin_routes', array())) {
-      $this->routeProvider->getRoutesByNames($routes);
+      $this->routeProvider->getRoutesByNameAsCollection($routes);
     }
   }
 
diff --git a/core/lib/Drupal/Core/Routing/RouteProvider.php b/core/lib/Drupal/Core/Routing/RouteProvider.php
index da9dc1b..d7b4e36 100644
--- a/core/lib/Drupal/Core/Routing/RouteProvider.php
+++ b/core/lib/Drupal/Core/Routing/RouteProvider.php
@@ -165,10 +165,13 @@ public function getRouteByName($name) {
    * @param array $names
    *   The list of names to retrieve.
    *
-   * @return \Symfony\Component\Routing\Route[]
+   * @param bool $unserialize
+   *   (optional) Determines whether the routes should be unserialized.
+   *
+   * @return string[]\Symfony\Component\Routing\Route[]
    *   Iterable thing with the keys the names of the $names argument.
    */
-  public function getRoutesByNames($names) {
+  public function getRoutesByNames($names, $unserialize = TRUE) {
 
     if (empty($names)) {
       throw new \InvalidArgumentException('You must specify the route names to load');
@@ -181,11 +184,14 @@ public function getRoutesByNames($names) {
       $result = $this->connection->query('SELECT name, route FROM {' . $this->connection->escapeTable($this->tableName) . '} WHERE name IN (:names)', array(':names' => $routes_to_load));
       $routes = $result->fetchAllKeyed();
 
-      foreach ($routes as $name => $route) {
-        $this->routes[$name] = unserialize($route);
-      }
+      $this->routes += $routes;
     }
 
+    if ($unserialize ) {
+      foreach ($names as $name) {
+        $this->routes[$name] = is_string($this->routes[$name]) ? unserialize($this->routes[$name]) : $this->routes[$name];
+      }
+    }
     return array_intersect_key($this->routes, array_flip($names));
   }
 
@@ -354,4 +360,13 @@ public function getRoutesCount() {
     return $this->connection->query("SELECT COUNT(*) FROM {" . $this->connection->escapeTable($this->tableName) . "}")->fetchField();
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getRoutesByNameAsCollection($names) {
+    $route_strings = $this->getRoutesByNames($names, FALSE);
+
+    return new LazyUnserializingRouteCollection($route_strings);
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Routing/RouteProviderInterface.php b/core/lib/Drupal/Core/Routing/RouteProviderInterface.php
index 8c8e356..6f146db 100644
--- a/core/lib/Drupal/Core/Routing/RouteProviderInterface.php
+++ b/core/lib/Drupal/Core/Routing/RouteProviderInterface.php
@@ -45,4 +45,14 @@ public function getAllRoutes();
    */
   public function reset();
 
+  /**
+   * Gets a route collection containing a bunch of route names.
+   *
+   * @param string[] $names
+   *   The route names.
+   *
+   * @return \Symfony\Component\Routing\RouteCollection
+   */
+  public function getRoutesByNameAsCollection($names);
+
 }
diff --git a/core/modules/system/src/Tests/Routing/MockRouteProvider.php b/core/modules/system/src/Tests/Routing/MockRouteProvider.php
index dce1b27..0c0eaa0 100644
--- a/core/modules/system/src/Tests/Routing/MockRouteProvider.php
+++ b/core/modules/system/src/Tests/Routing/MockRouteProvider.php
@@ -89,4 +89,16 @@ public function reset() {
     $this->routes = array();
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getRoutesByNameAsCollection($names) {
+    $routes = $this->getRoutesByNames($names);
+    $collection = new RouteCollection();
+    foreach ($routes as $name => $route) {
+      $collection->add($name, $route);
+    }
+    return $collection;
+  }
+
 }
diff --git a/core/tests/Drupal/Tests/Core/Routing/RoutePreloaderTest.php b/core/tests/Drupal/Tests/Core/Routing/RoutePreloaderTest.php
index 109a3f2..5b2d094 100644
--- a/core/tests/Drupal/Tests/Core/Routing/RoutePreloaderTest.php
+++ b/core/tests/Drupal/Tests/Core/Routing/RoutePreloaderTest.php
@@ -144,7 +144,7 @@ public function testOnRequestNonHtml() {
       ->will($this->returnValue('non-html'));
 
     $this->routeProvider->expects($this->never())
-      ->method('getRoutesByNames');
+      ->method('getRoutesByNameAsCollection');
     $this->state->expects($this->never())
       ->method('get');
 
@@ -167,7 +167,7 @@ public function testOnRequestOnHtml() {
       ->will($this->returnValue('html'));
 
     $this->routeProvider->expects($this->once())
-      ->method('getRoutesByNames')
+      ->method('getRoutesByNameAsCollection')
       ->with(array('test2'));
     $this->state->expects($this->once())
       ->method('get')
