diff --git a/core/modules/aggregator/aggregator.admin.inc b/core/modules/aggregator/aggregator.admin.inc
index e7e2300..f716d91 100644
--- a/core/modules/aggregator/aggregator.admin.inc
+++ b/core/modules/aggregator/aggregator.admin.inc
@@ -268,27 +268,6 @@ function _aggregator_parse_opml($opml) {
 }
 
 /**
- * Page callback: Refreshes a feed, then redirects to the overview page.
- *
- * @param \Drupal\aggregator\Plugin\Core\Entity\Feed $feed
- *   An object describing the feed to be refreshed.
- *
- * @see aggregator_menu()
- */
-function aggregator_admin_refresh_feed(Feed $feed) {
-  // @todo CSRF tokens are validated in page callbacks rather than access
-  //   callbacks, because access callbacks are also invoked during menu link
-  //   generation. Add token support to routing: http://drupal.org/node/755584.
-  $token = drupal_container()->get('request')->query->get('token');
-  if (!isset($token) || !drupal_valid_token($token, 'aggregator/update/' . $feed->id())) {
-    throw new AccessDeniedHttpException();
-  }
-
-  aggregator_refresh($feed);
-  drupal_goto('admin/config/services/aggregator');
-}
-
-/**
  * Form constructor to add/edit/delete aggregator categories.
  *
  * @param $edit
diff --git a/core/modules/aggregator/aggregator.module b/core/modules/aggregator/aggregator.module
index b544908..aec7998 100644
--- a/core/modules/aggregator/aggregator.module
+++ b/core/modules/aggregator/aggregator.module
@@ -124,10 +124,7 @@ function aggregator_menu() {
   );
   $items['admin/config/services/aggregator/update/%aggregator_feed'] = array(
     'title' => 'Update items',
-    'page callback' => 'aggregator_admin_refresh_feed',
-    'page arguments' => array(5),
-    'access arguments' => array('administer news feeds'),
-    'file' => 'aggregator.admin.inc',
+    'route_name' => 'aggregator_admin_refresh_feed',
   );
   $items['admin/config/services/aggregator/list'] = array(
     'title' => 'List',
diff --git a/core/modules/aggregator/aggregator.routing.yml b/core/modules/aggregator/aggregator.routing.yml
index bf02d5c..e9047d8 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_admin_refresh_feed:
+  pattern: '/admin/config/services/aggregator/update/{aggregator_feed}'
+  defaults:
+    _controller: '\Drupal\aggregator\Routing\AggregatorController::feedRefresh'
+  requirements:
+    _permission: 'administer 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..6b3a679 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Routing/AggregatorController.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Routing/AggregatorController.php
@@ -8,8 +8,11 @@
 namespace Drupal\aggregator\Routing;
 
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Request;
 use Drupal\Core\ControllerInterface;
+use Drupal\aggregator\Plugin\Core\Entity\Feed;
 use Drupal\Core\Entity\EntityManager;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 
 /**
  * Returns responses for aggregator module routes.
@@ -24,20 +27,30 @@ class AggregatorController implements ControllerInterface {
   protected $entityManager;
 
   /**
+   * Stores the Entity manager.
+   *
+   * @var \Symfony\Component\HttpFoundation\Request
+   */
+  protected $request;
+
+  /**
    * Constructs a \Drupal\aggregator\Routing\AggregatorController object.
    *
    * @param \Drupal\Core\Entity\EntityManager $entity_manager
    *   The Entity manager.
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request object containing the search string.
    */
-  public function __construct(EntityManager $entity_manager) {
+  public function __construct(EntityManager $entity_manager, Request $request) {
     $this->entityManager = $entity_manager;
+    $this->request = $request;
   }
 
   /**
    * {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('request'));
   }
 
   /**
@@ -56,4 +69,23 @@ public function feedAdd() {
     return entity_get_form($feed);
   }
 
+  /**
+   * Refreshes a feed, then redirects to the overview page.
+   *
+   * @param \Drupal\aggregator\Plugin\Core\Entity\Feed $aggregator_feed
+   *   An object describing the feed to be refreshed.
+   */
+  public function feedRefresh(Feed $aggregator_feed) {
+    // @todo CSRF tokens are validated in page callbacks rather than access
+    //   callbacks, because access callbacks are also invoked during menu link
+    //   generation. Add token support to routing: http://drupal.org/node/755584.
+    $token = $this->request->query->get('token');
+    if (!isset($token) || !drupal_valid_token($token, 'aggregator/update/' . $aggregator_feed->id())) {
+      throw new AccessDeniedHttpException();
+    }
+
+    aggregator_refresh($aggregator_feed);
+    drupal_goto('admin/config/services/aggregator');
+  }
+
 }
