diff --git a/core/modules/aggregator/aggregator.pages.inc b/core/modules/aggregator/aggregator.pages.inc
index ca8ecad..2a1e2e3 100644
--- a/core/modules/aggregator/aggregator.pages.inc
+++ b/core/modules/aggregator/aggregator.pages.inc
@@ -88,13 +88,13 @@ function aggregator_page_category_form($form, $form_state, $category) {
 /**
  * Loads and optionally filters feed items.
  *
- * @param $type
+ * @param string $type
  *   The type of filter for the items. Possible values are:
  *   - sum: No filtering.
  *   - source: Filter the feed items, limiting the result to items from a
  *     single source.
  *   - category: Filter the feed items by category.
- * @param $data
+ * @param mixed $data
  *   Feed or category data used for filtering. The type and value of $data
  *   depends on $type:
  *   - source: $data is an object with $data->fid identifying the feed used to
@@ -102,43 +102,27 @@ function aggregator_page_category_form($form, $form_state, $category) {
  *   - category: $data is an array with $data['cid'] being the category id to
  *     filter on.
  *   The $data parameter is not used when $type is 'sum'.
+ * @param int $limit
+ *   (optional) The number of records to return. Defaults to 20.
  *
- * @return
+ * @deprecated Use \Drupal\aggregator\ItemStorageController::loadFeedItems()
+ *   instead.
+ *
+ * @return \Drupal\aggregator\ItemInterface[]
  *   An array of the feed items.
  */
 function aggregator_load_feed_items($type, $data = NULL, $limit = 20) {
-  $items = array();
+  $storage_controller = Drupal::entityManager()->getStorageController('aggregator_item');
   switch ($type) {
     case 'sum':
-      $query = db_select('aggregator_item', 'i');
-      $query->join('aggregator_feed', 'f', 'i.fid = f.fid');
-      $query->fields('i', array('iid'));
-      break;
+      return $storage_controller->loadFeedItems($limit);
+
     case 'source':
-      $query = db_select('aggregator_item', 'i');
-      $query
-        ->fields('i', array('iid'))
-        ->condition('i.fid', $data->id());
-      break;
+      return $storage_controller->loadFeedItemsBySource($data->id(), $limit);
+
     case 'category':
-      $query = db_select('aggregator_category_item', 'c');
-      $query->leftJoin('aggregator_item', 'i', 'c.iid = i.iid');
-      $query->leftJoin('aggregator_feed', 'f', 'i.fid = f.fid');
-      $query
-        ->fields('i', array('iid'))
-        ->condition('cid', $data->cid);
-      break;
+      return $storage_controller->loadFeedItemsByCategory($data->cid, $limit);
   }
-
-  $result = $query
-    ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
-    ->limit($limit)
-    ->orderBy('i.timestamp', 'DESC')
-    ->orderBy('i.iid', 'DESC')
-    ->execute();
-
-  $items = entity_load_multiple('aggregator_item', $result->fetchCol());
-  return $items;
 }
 
 /**
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageController.php b/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageController.php
index 016e8ae..cd264b6 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageController.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageController.php
@@ -7,9 +7,10 @@
 
 namespace Drupal\aggregator;
 
-use Drupal\Core\Entity\DatabaseStorageControllerNG;
 use Drupal\aggregator\Plugin\Core\Entity\Item;
-use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Database\Query\PagerSelectExtender;
+use Drupal\Core\Database\Query\SelectInterface;
+use Drupal\Core\Entity\DatabaseStorageControllerNG;
 
 /**
  * Controller class for aggregators items.
@@ -112,4 +113,61 @@ public function saveCategories(Item $item) {
         ->execute();
     }
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function loadFeedItems($limit = 20) {
+    $query = $this->database->select('aggregator_item', 'i');
+    $query->join('aggregator_feed', 'f', 'i.fid = f.fid');
+    $query->fields('i', array('iid'));
+    return $this->executeFeedItemQuery($query, $limit);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function loadFeedItemsBySource($fid, $limit = 20) {
+    $query = $this->database->select('aggregator_item', 'i');
+    $query
+      ->fields('i', array('iid'))
+      ->condition('i.fid', $fid);
+    return $this->executeFeedItemQuery($query, $limit);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function loadFeedItemsByCategory($cid, $limit = 20) {
+    $query = $this->database->select('aggregator_category_item', 'c');
+    $query->leftJoin('aggregator_item', 'i', 'c.iid = i.iid');
+    $query->leftJoin('aggregator_feed', 'f', 'i.fid = f.fid');
+    $query
+      ->fields('i', array('iid'))
+      ->condition('cid', $cid);
+    return $this->executeFeedItemQuery($query, $limit);
+  }
+
+  /**
+   * Helper method to execute an item query.
+   *
+   * @param SelectInterface $query
+   *   The query to execute.
+   * @param int $limit
+   *   (optional) The number of items to return. Defaults to 20.
+   *
+   * @return \Drupal\aggregator\ItemInterface[]
+   *   An array of the feed items.
+   */
+  protected function executeFeedItemQuery(SelectInterface $query, $limit) {
+    $result = $query
+      ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
+      ->limit($limit)
+      ->orderBy('i.timestamp', 'DESC')
+      ->orderBy('i.iid', 'DESC')
+      ->execute();
+
+    return $this->loadMultiple($result->fetchCol());
+  }
+
 }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageControllerInterface.php b/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageControllerInterface.php
index 5c00345..f9fa154 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageControllerInterface.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageControllerInterface.php
@@ -41,4 +41,42 @@ public function deleteCategories(array $entities);
    *   The storage backend should save the categories of this item.
    */
   public function saveCategories(Item $item);
+
+  /**
+   * Loads feed items from all feeds.
+   *
+   * @param int $limit
+   *   (optional) The number of items to return. Defaults to 20.
+   *
+   * @return \Drupal\aggregator\ItemInterface[]
+   *   An array of the feed items.
+   */
+  public function loadFeedItems($limit = 20);
+
+  /**
+   * Loads feed items filtered by a feed.
+   *
+   * @param int $fid
+   *   The feed ID to filter by.
+   * @param int $limit
+   *   (optional) The number of items to return. Defaults to 20.
+   *
+   * @return \Drupal\aggregator\ItemInterface[]
+   *   An array of the feed items.
+   */
+  public function loadFeedItemsBySource($fid, $limit = 20);
+
+  /**
+   * Loads feed items from all feeds.
+   *
+   * @param int $cid
+   *   The category ID to filter by.
+   * @param int $limit
+   *   (optional) The number of items to return. Defaults to 20.
+   *
+   * @return \Drupal\aggregator\ItemInterface[]
+   *   An array of the feed items.
+   */
+  public function loadFeedItemsByCategory($cid, $limit = 20);
+
 }
