diff --git a/core/modules/aggregator/aggregator.module b/core/modules/aggregator/aggregator.module
index b544908..daa5b87 100644
--- a/core/modules/aggregator/aggregator.module
+++ b/core/modules/aggregator/aggregator.module
@@ -149,9 +149,7 @@ function aggregator_menu() {
   );
   $items['aggregator/sources'] = array(
     'title' => 'Sources',
-    'page callback' => 'aggregator_page_sources',
-    'access arguments' => array('access news feeds'),
-    'file' => 'aggregator.pages.inc',
+    'route_name' => 'aggregator_sources',
   );
   $items['aggregator/categories'] = array(
     'title' => 'Categories',
diff --git a/core/modules/aggregator/aggregator.pages.inc b/core/modules/aggregator/aggregator.pages.inc
index 6248012..9f5fe67 100644
--- a/core/modules/aggregator/aggregator.pages.inc
+++ b/core/modules/aggregator/aggregator.pages.inc
@@ -328,46 +328,6 @@ function template_preprocess_aggregator_item(&$variables) {
 }
 
 /**
- * Page callback: Displays all the feeds used by the Aggregator module.
- *
- * @return string
- *   An HTML-formatted string.
- *
- * @see aggregator_menu()
- */
-function aggregator_page_sources() {
-  $feeds = entity_load_multiple('aggregator_feed');
-
-  $build = array(
-    '#type' => 'container',
-    '#attributes' => array('class' => array('aggregator-wrapper')),
-    '#sorted' => TRUE,
-  );
-  foreach ($feeds as $feed) {
-    // Most recent items:
-    $summary_items = array();
-    $aggregator_summary_items = config('aggregator.settings')->get('source.list_max');
-    if ($aggregator_summary_items) {
-      if ($items = aggregator_load_feed_items('source', $feed, $aggregator_summary_items)) {
-        $summary_items = entity_view_multiple($items, 'summary');
-      }
-    }
-    $feed->url = url('aggregator/sources/' . $feed->id());
-    $build[$feed->id()] = array(
-      '#theme' => 'aggregator_summary_items',
-      '#summary_items' => $summary_items,
-      '#source' => $feed,
-    );
-  }
-  $build['feed_icon'] = array(
-    '#theme' => 'feed_icon',
-    '#url' => 'aggregator/opml',
-    '#title' => t('OPML feed'),
-  );
-  return $build;
-}
-
-/**
  * Page callback: Displays all the categories used by the Aggregator module.
  *
  * @return string
diff --git a/core/modules/aggregator/aggregator.routing.yml b/core/modules/aggregator/aggregator.routing.yml
index bf02d5c..bf140d8 100644
--- a/core/modules/aggregator/aggregator.routing.yml
+++ b/core/modules/aggregator/aggregator.routing.yml
@@ -25,3 +25,10 @@ aggregator_feed_add:
     _controller: '\Drupal\aggregator\Routing\AggregatorController::feedAdd'
   requirements:
     _permission: 'administer news feeds'
+
+aggregator_sources:
+  pattern: 'aggregator/sources'
+  defaults:
+    _controller: '\Drupal\aggregator\Routing\AggregatorController::sources'
+  requirements:
+    _permission: 'access news feeds'
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Routing/AggregatorController.php b/core/modules/aggregator/lib/Drupal/aggregator/Routing/AggregatorController.php
index 66f1fbd..fc0a926 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Routing/AggregatorController.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Routing/AggregatorController.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\aggregator\Routing;
 
+use Drupal\Core\Config\ConfigFactory;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Drupal\Core\ControllerInterface;
 use Drupal\Core\Entity\EntityManager;
@@ -24,20 +25,33 @@ class AggregatorController implements ControllerInterface {
   protected $entityManager;
 
   /**
+   * The config factory to get aggregator settings.
+   *
+   * @var \Drupal\Core\Config\ConfigFactory
+   */
+  protected $configFactory;
+
+  /**
    * Constructs a \Drupal\aggregator\Routing\AggregatorController object.
    *
    * @param \Drupal\Core\Entity\EntityManager $entity_manager
    *   The Entity manager.
+   * @param \Drupal\Core\Config\ConfigFactory $config_factory
+   *   The config factory.
    */
-  public function __construct(EntityManager $entity_manager) {
+  public function __construct(EntityManager $entity_manager, ConfigFactory $config_factory) {
     $this->entityManager = $entity_manager;
+    $this->configFactory = $config_factory;
   }
 
   /**
    * {inheritdoc}
    */
   public static function create(ContainerInterface $container) {
-    return new static($container->get('plugin.manager.entity'));
+    return new static(
+      $container->get('plugin.manager.entity'),
+      $container->get('config.factory')
+    );
   }
 
   /**
@@ -56,4 +70,50 @@ public function feedAdd() {
     return entity_get_form($feed);
   }
 
+  /**
+   * Displays all the feeds used by the Aggregator module.
+   *
+   * @return string
+   *   An HTML-formatted string.
+   */
+  public function sources() {
+
+    $feeds = $this->entityManager->getStorageController('aggregator_feed')->load();
+
+    // TODO move included functions to controller.
+    module_load_include('inc', 'aggregator', 'aggregator.pages');
+
+    $build = array(
+      '#type' => 'container',
+      '#attributes' => array('class' => array('aggregator-wrapper')),
+      '#sorted' => TRUE,
+    );
+    foreach ($feeds as $feed) {
+      // Most recent items:
+      $summary_items = array();
+      $aggregator_summary_items = $this->configFactory
+                                       ->get('aggregator.settings')
+                                       ->get('source.list_max');
+      if ($aggregator_summary_items) {
+        if ($items = aggregator_load_feed_items('source', $feed, $aggregator_summary_items)) {
+          $summary_items = $this->entityManager
+                                ->getRenderController('aggregator_item')
+                                ->viewMultiple($items, 'summary');
+        }
+      }
+      $feed->url = url('aggregator/sources/' . $feed->id());
+      $build[$feed->id()] = array(
+        '#theme' => 'aggregator_summary_items',
+        '#summary_items' => $summary_items,
+        '#source' => $feed,
+      );
+    }
+    $build['feed_icon'] = array(
+      '#theme' => 'feed_icon',
+      '#url' => 'aggregator/opml',
+      '#title' => t('OPML feed'),
+    );
+    return $build;
+  }
+
 }
