diff --git a/core/modules/aggregator/aggregator.module b/core/modules/aggregator/aggregator.module
index c44828536c6f49ca3e928b93f46672db2dd46f3a..fcb28e4f61930e74d681105f7d5bcba5b411a1f6 100644
--- a/core/modules/aggregator/aggregator.module
+++ b/core/modules/aggregator/aggregator.module
@@ -135,12 +135,10 @@ function aggregator_permission() {
  * Queues news feeds for updates once their refresh interval has elapsed.
  */
 function aggregator_cron() {
-  $result = db_query('SELECT fid FROM {aggregator_feed} WHERE queued = 0 AND checked + refresh < :time AND refresh <> :never', array(
-    ':time' => REQUEST_TIME,
-    ':never' => AGGREGATOR_CLEAR_NEVER
-  ));
   $queue = \Drupal::queue('aggregator_feeds');
-  foreach ($result->fetchCol() as $fid) {
+
+  $result = \Drupal::entityManager()->getStorageController('aggregator_feed')->getFeedIdsToRefresh();
+  foreach ($result as $fid) {
     $feed = aggregator_feed_load($fid);
     if ($queue->createItem($feed)) {
       // Add timestamp to avoid queueing item more than once.
@@ -150,10 +148,17 @@ function aggregator_cron() {
   }
 
   // Delete queued timestamp after 6 hours assuming the update has failed.
-  db_update('aggregator_feed')
-    ->fields(array('queued' => 0))
+  $result = \Drupal::entityQuery('aggregator_feed')
     ->condition('queued', REQUEST_TIME - (3600 * 6), '<')
     ->execute();
+
+  if ($result) {
+    $feeds = entity_load_multiple('aggregator_feed', $result);
+    foreach ($feeds as $feed) {
+      $feed->setQueuedTime(0);
+      $feed->save();
+    }
+  }
 }
 
 /**
diff --git a/core/modules/aggregator/aggregator.theme.inc b/core/modules/aggregator/aggregator.theme.inc
index 84e0d1e092235acd2afe3fba147f18e0af1ccaa8..3163d05fdd164eaedaef2f605a07cc5f4ad40810 100644
--- a/core/modules/aggregator/aggregator.theme.inc
+++ b/core/modules/aggregator/aggregator.theme.inc
@@ -5,7 +5,6 @@
  * Preprocessors and theme functions of Aggregator module.
  */
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Component\Utility\String;
 
 /**
@@ -65,7 +64,7 @@ function theme_aggregator_page_opml($variables) {
   $output .= "</head>\n";
   $output .= "<body>\n";
   foreach ($feeds as $feed) {
-    $output .= '<outline text="' . String::checkPlain($feed->title) . '" xmlUrl="' . check_url($feed->url) . "\" />\n";
+    $output .= '<outline text="' . String::checkPlain($feed->label()) . '" xmlUrl="' . check_url($feed->getUrl()) . "\" />\n";
   }
   $output .= "</body>\n";
   $output .= "</opml>\n";
@@ -85,7 +84,7 @@ function theme_aggregator_page_opml($variables) {
  *   - summary_items: An array of feed items.
  */
 function template_preprocess_aggregator_summary_items(&$variables) {
-  $variables['title'] = String::checkPlain($variables['source'] instanceof EntityInterface ? $variables['source']->label() : $variables['source']->title);
+  $variables['title'] = String::checkPlain($variables['source']->label());
   $summary_items = array();
   foreach (element_children($variables['summary_items']) as $key) {
     $summary_items[] = $variables['summary_items'][$key];
@@ -94,7 +93,7 @@ function template_preprocess_aggregator_summary_items(&$variables) {
     '#theme' => 'item_list',
     '#items' => $summary_items,
   );
-  $variables['source_url'] = $variables['source'] instanceof EntityInterface ? $variables['source']->url->value : $variables['source']->url;
+  $variables['source_url'] = $variables['source']->getUrl();
 }
 
 /**
@@ -186,6 +185,7 @@ function template_preprocess_aggregator_feed_source(&$variables) {
  */
 function template_preprocess_aggregator_block_item(&$variables) {
   // Display the external link to the item.
-  $variables['url'] = check_url($variables['item']->link);
-  $variables['title'] = String::checkPlain($variables['item']->title);
+  $item = $variables['item'];
+  $variables['url'] = check_url($item->getLink());
+  $variables['title'] = String::checkPlain($item->label());
 }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php b/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php
index bd3001d84ae6df07351182bcdaf13595913ccebf..b3baf9b244bf183f33e15d502ff338fba8927b0f 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php
@@ -10,44 +10,14 @@
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\aggregator\FeedInterface;
-use Drupal\aggregator\ItemInterface;
-use Drupal\Core\Database\Connection;
-use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 
 /**
  * Returns responses for aggregator module routes.
  */
 class AggregatorController extends ControllerBase {
 
-  /**
-   * The database connection.
-   *
-   * @var \Drupal\Core\Database\Connection;
-   */
-  protected $database;
-
-  /**
-   * Constructs a \Drupal\aggregator\Controller\AggregatorController object.
-   *
-   * @param \Drupal\Core\Database\Connection $database
-   *   The database connection.
-   */
-  public function __construct(Connection $database) {
-    $this->database = $database;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container) {
-    return new static(
-      $container->get('database')
-    );
-  }
-
   /**
    * Presents the aggregator feed creation form.
    *
@@ -76,7 +46,7 @@ public function viewFeed(FeedInterface $aggregator_feed) {
     $feed_source = $entity_manager->getViewBuilder('aggregator_feed')
       ->view($aggregator_feed, 'default');
     // Load aggregator feed item for the particular feed id.
-    $items = $entity_manager->getStorageController('aggregator_item')->loadByFeed($aggregator_feed->id());
+    $items = $entity_manager->getStorageController('aggregator_item')->loadByFeed($aggregator_feed->id(), 20);
     // Print the feed items.
     $build = $this->buildPageList($items, $feed_source);
     return $build;
@@ -135,36 +105,39 @@ public function feedRefresh(FeedInterface $aggregator_feed) {
    *   A render array as expected by drupal_render().
    */
   public function adminOverview() {
-    $result = $this->database->query('SELECT f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.hash, f.etag, f.modified, f.image, COUNT(i.iid) AS items FROM {aggregator_feed} f LEFT JOIN {aggregator_item} i ON f.fid = i.fid GROUP BY f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.hash, f.etag, f.modified, f.image ORDER BY f.title');
+    $entity_manager = $this->entityManager();
+    $feeds = $entity_manager->getStorageController('aggregator_feed')
+      ->loadMultiple();
 
     $header = array($this->t('Title'), $this->t('Items'), $this->t('Last update'), $this->t('Next update'), $this->t('Operations'));
     $rows = array();
-    foreach ($result as $feed) {
+    foreach ($feeds as $feed) {
       $row = array();
-      $row[] = l($feed->title, "aggregator/sources/$feed->fid");
-      $row[] = format_plural($feed->items, '1 item', '@count items');
-      $row[] = ($feed->checked ? $this->t('@time ago', array('@time' => format_interval(REQUEST_TIME - $feed->checked))) : $this->t('never'));
-      $row[] = ($feed->checked && $feed->refresh ? $this->t('%time left', array('%time' => format_interval($feed->checked + $feed->refresh - REQUEST_TIME))) : $this->t('never'));
-      $links = array();
+      $row[] = l($feed->label(), "aggregator/sources/" . $feed->id());
+      $row[] = format_plural($entity_manager->getStorageController('aggregator_item')->getItemCount($feed), '1 item', '@count items');
+      $last_checked = $feed->getLastCheckedTime();
+      $refresh_rate = $feed->getRefreshRate();
+      $row[] = ($last_checked ? $this->t('@time ago', array('@time' => format_interval(REQUEST_TIME - $last_checked))) : $this->t('never'));
+      $row[] = ($last_checked && $refresh_rate ? $this->t('%time left', array('%time' => format_interval($last_checked + $refresh_rate - REQUEST_TIME))) : $this->t('never'));
       $links['edit'] = array(
         'title' => $this->t('Edit'),
         'route_name' => 'aggregator.feed_configure',
-        'route_parameters' => array('aggregator_feed' => $feed->fid),
+        'route_parameters' => array('aggregator_feed' => $feed->id()),
       );
       $links['delete'] = array(
         'title' => $this->t('Delete'),
         'route_name' => 'aggregator.feed_delete',
-        'route_parameters' => array('aggregator_feed' => $feed->fid),
+        'route_parameters' => array('aggregator_feed' => $feed->id()),
       );
       $links['delete_items'] = array(
         'title' => $this->t('Delete items'),
         'route_name' => 'aggregator.feed_items_delete',
-        'route_parameters' => array('aggregator_feed' => $feed->fid),
+        'route_parameters' => array('aggregator_feed' => $feed->id()),
       );
       $links['update'] = array(
         'title' => $this->t('Update items'),
         'route_name' => 'aggregator.feed_refresh',
-        'route_parameters' => array('aggregator_feed' => $feed->fid),
+        'route_parameters' => array('aggregator_feed' => $feed->id()),
       );
       $row[] = array(
         'data' => array(
@@ -192,7 +165,7 @@ public function adminOverview() {
    *   The rendered list of items for the feed.
    */
   public function pageLast() {
-    $items = $this->entityManager()->getStorageController('aggregator_item')->loadAll();
+    $items = $this->entityManager()->getStorageController('aggregator_item')->loadAll(20);
     $build = $this->buildPageList($items);
     $build['#attached']['drupal_add_feed'][] = array('aggregator/rss', $this->config('system.site')->get('name') . ' ' . $this->t('aggregator'));
     return $build;
@@ -222,7 +195,7 @@ public function sources() {
         ->get('source.list_max');
       if ($aggregator_summary_items) {
         $items = $entity_manager->getStorageController('aggregator_item')
-          ->loadByFeed($feed->id());
+          ->loadByFeed($feed->id(), 20);
         if ($items) {
           $summary_items = $entity_manager->getViewBuilder('aggregator_item')
             ->viewMultiple($items, 'summary');
@@ -250,7 +223,9 @@ public function sources() {
    *   The response containing the OPML.
    */
   public function opmlPage() {
-    $result = $this->database->query('SELECT * FROM {aggregator_feed} ORDER BY title');
+     $feeds = $this->entityManager()
+      ->getStorageController('aggregator_feed')
+      ->loadMultiple();
 
     $feeds = $result->fetchAll();
     $aggregator_page_opml = array(
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php b/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php
index 2edb0f012a2691667e1cce251ccd4eb1633bd4b2..301ee256c28f3f2f1ef636e8d47aadc9c2eb52d9 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php
@@ -70,10 +70,10 @@ public function validate(array $form, array &$form_state) {
     $feed_storage_controller = $this->entityManager->getStorageController('aggregator_feed');
     $result = $feed_storage_controller->getFeedDuplicates($feed);
     foreach ($result as $item) {
-      if (strcasecmp($item->title, $feed->label()) == 0) {
+      if (strcasecmp($item->label(), $feed->label()) == 0) {
         $this->setFormError('title', $form_state, $this->t('A feed named %feed already exists. Enter a unique title.', array('%feed' => $feed->label())));
       }
-      if (strcasecmp($item->url, $feed->getUrl()) == 0) {
+      if (strcasecmp($item->getUrl(), $feed->getUrl()) == 0) {
         $this->setFormError('url', $form_state, $this->t('A feed with this URL %url already exists. Enter a unique URL.', array('%url' => $feed->getUrl())));
       }
     }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/FeedStorageController.php b/core/modules/aggregator/lib/Drupal/aggregator/FeedStorageController.php
index 475863303a118f6b2ef6b72b5cc2921a6b2468ff..9e1ecb2efad2fcca6f530a6ea7990f540e8addf5 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/FeedStorageController.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/FeedStorageController.php
@@ -22,14 +22,28 @@ class FeedStorageController extends FieldableDatabaseStorageController implement
    * {@inheritdoc}
    */
   public function getFeedDuplicates(FeedInterface $feed) {
+    $query = \Drupal::entityQuery('aggregator_feed');
+
+    $or_condition = $query->orConditionGroup()
+      ->condition('title', $feed->label())
+      ->condition('url', $feed->getUrl());
+    $query->condition($or_condition);
+
     if ($feed->id()) {
-      $query = $this->database->query("SELECT title, url FROM {aggregator_feed} WHERE (title = :title OR url = :url) AND fid <> :fid", array(':title' => $feed->label(), ':url' => $feed->url->value, ':fid' => $feed->id()));
-    }
-    else {
-      $query = $this->database->query("SELECT title, url FROM {aggregator_feed} WHERE title = :title OR url = :url", array(':title' => $feed->label(), ':url' => $feed->url->value));
+      $query->condition('fid', $feed->id(), '<>');
     }
 
-    return $query->fetchAll();
+    return $this->loadMultiple($query->execute());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFeedIdsToRefresh() {
+    return $this->database->query('SELECT fid FROM {aggregator_feed} WHERE queued = 0 AND checked + refresh < :time AND refresh <> :never', array(
+      ':time' => REQUEST_TIME,
+      ':never' => AGGREGATOR_CLEAR_NEVER
+    ))->fetchCol();
   }
 
 }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/FeedStorageControllerInterface.php b/core/modules/aggregator/lib/Drupal/aggregator/FeedStorageControllerInterface.php
index aade8b955f690dcdb03cddd6d4155faeec022e6a..c62280625ad0aa12f31c6aad0541b07dabf3deec 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/FeedStorageControllerInterface.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/FeedStorageControllerInterface.php
@@ -26,4 +26,12 @@ interface FeedStorageControllerInterface extends EntityStorageControllerInterfac
    */
   public function getFeedDuplicates(FeedInterface $feed);
 
+  /**
+   * Returns the fids of feeds that need to be refreshed.
+   *
+   *  @return array
+   *    A list of feed ids to be refreshed.
+   */
+  public function getFeedIdsToRefresh();
+
 }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageController.php b/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageController.php
index a755c21ef24e8967cccd1d7b2293375e9cddb522..3900f73672889b99ae201540777f18c1566b5b1c 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageController.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageController.php
@@ -8,8 +8,7 @@
 namespace Drupal\aggregator;
 
 use Drupal\aggregator\Entity\Item;
-use Drupal\Core\Database\Query\PagerSelectExtender;
-use Drupal\Core\Database\Query\SelectInterface;
+use Drupal\Core\Entity\Query\QueryInterface;
 use Drupal\Core\Entity\FieldableDatabaseStorageController;
 
 /**
@@ -23,44 +22,50 @@ class ItemStorageController extends FieldableDatabaseStorageController implement
   /**
    * {@inheritdoc}
    */
-  public function loadAll($limit = 20) {
-    $query = $this->database->select('aggregator_item', 'i');
-    $query->join('aggregator_feed', 'f', 'i.fid = f.fid');
-    $query->fields('i', array('iid'));
+  public function getItemCount(FeedInterface $feed) {
+    $query = \Drupal::entityQuery('aggregator_item')
+      ->condition('fid', $feed->id())
+      ->count();
+
+    return $query->execute();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function loadAll($limit = NULL) {
+    $query = \Drupal::entityQuery('aggregator_item');
     return $this->executeFeedItemQuery($query, $limit);
   }
 
   /**
    * {@inheritdoc}
    */
-  public function loadByFeed($fid, $limit = 20) {
-    $query = $this->database->select('aggregator_item', 'i');
-    $query
-      ->fields('i', array('iid'))
-      ->condition('i.fid', $fid);
+  public function loadByFeed($fid, $limit = NULL) {
+    $query = \Drupal::entityQuery('aggregator_item')
+      ->condition('fid', $fid);
     return $this->executeFeedItemQuery($query, $limit);
   }
 
   /**
    * Helper method to execute an item query.
    *
-   * @param SelectInterface $query
+   * @param \Drupal\Core\Entity\Query\QueryInterface $query
    *   The query to execute.
    * @param int $limit
-   *   (optional) The number of items to return. Defaults to 20.
+   *   (optional) The number of items to return.
    *
    * @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();
+  protected function executeFeedItemQuery(QueryInterface $query, $limit) {
+    $query->sort('timestamp', 'DESC')
+      ->sort('iid', 'DESC');
+    if (!empty($limit)) {
+      $query->pager($limit);
+    }
 
-    return $this->loadMultiple($result->fetchCol());
+    return $this->loadMultiple($query->execute());
   }
 
 }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageControllerInterface.php b/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageControllerInterface.php
index a1913523d20f882a4548ad3c3df5c86ec82feae3..55f7d2d52f2a13e0624749060cc46ba756cbcecd 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageControllerInterface.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/ItemStorageControllerInterface.php
@@ -15,16 +15,27 @@
  */
 interface ItemStorageControllerInterface extends EntityStorageControllerInterface {
 
+  /**
+   * Returns the count of the items in a feed.
+   *
+   * @param \Drupal\aggregator\FeedInterface $feed
+   *   The feed entity.
+   *
+   * @return int
+   *   The count of items associated with a feed.
+   */
+  public function getItemCount(FeedInterface $feed);
+
   /**
    * Loads feed items from all feeds.
    *
    * @param int $limit
-   *   (optional) The number of items to return. Defaults to 20.
+   *   (optional) The number of items to return. Defaults to unlimited.
    *
    * @return \Drupal\aggregator\ItemInterface[]
    *   An array of the feed items.
    */
-  public function loadAll($limit = 20);
+  public function loadAll($limit = NULL);
 
   /**
    * Loads feed items filtered by a feed.
@@ -32,11 +43,11 @@ public function loadAll($limit = 20);
    * @param int $fid
    *   The feed ID to filter by.
    * @param int $limit
-   *   (optional) The number of items to return. Defaults to 20.
+   *   (optional) The number of items to return. Defaults to unlimited.
    *
    * @return \Drupal\aggregator\ItemInterface[]
    *   An array of the feed items.
    */
-  public function loadByFeed($fid, $limit = 20);
+  public function loadByFeed($fid, $limit = NULL);
 
 }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Block/AggregatorFeedBlock.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Block/AggregatorFeedBlock.php
index 45475275a3a094a027b76127a54035184ed94322..4c5827aa279f974d8454b603a4491d07e72330c2 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Block/AggregatorFeedBlock.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Block/AggregatorFeedBlock.php
@@ -7,9 +7,10 @@
 
 namespace Drupal\aggregator\Plugin\Block;
 
+use Drupal\aggregator\FeedStorageControllerInterface;
+use Drupal\aggregator\ItemStorageControllerInterface;
 use Drupal\block\BlockBase;
-use Drupal\Core\Database\Connection;
-use Drupal\Core\Entity\EntityStorageControllerInterface;
+use Drupal\Core\Entity\Query\QueryInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Session\AccountInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -28,16 +29,23 @@ class AggregatorFeedBlock extends BlockBase implements ContainerFactoryPluginInt
   /**
    * The entity storage controller for feeds.
    *
-   * @var \Drupal\Core\Entity\EntityStorageControllerInterface
+   * @var \Drupal\aggregator\FeedStorageControllerInterface
    */
-  protected $storageController;
+  protected $feedStorage;
 
   /**
-   * The database connection.
+   * The entity storage controller for items.
    *
-   * @var \Drupal\Core\Database\Connection
+   * @var \Drupal\aggregator\ItemStorageControllerInterface
    */
-  protected $connection;
+  protected $itemStorage;
+
+  /**
+   * The entity query object for feed items.
+   *
+   * @var \Drupal\Core\Entity\Query\QueryInterface
+   */
+  protected $itemQuery;
 
   /**
    * Constructs an AggregatorFeedBlock object.
@@ -48,15 +56,18 @@ class AggregatorFeedBlock extends BlockBase implements ContainerFactoryPluginInt
    *   The plugin_id for the plugin instance.
    * @param array $plugin_definition
    *   The plugin implementation definition.
-   * @param \Drupal\Core\Entity\EntityStorageControllerInterface $storage_controller
+   * @param \Drupal\aggregator\FeedStorageControllerInterface $feed_storage
    *   The entity storage controller for feeds.
-   * @param \Drupal\Core\Database\Connection $connection
-   *   The database connection.
+   * @param \Drupal\aggregator\ItemStorageControllerInterface $item_storage
+   *   The entity storage controller for feed items.
+   * @param \Drupal\Core\Entity\Query\QueryInterface $item_query
+   *   The entity query object for feed items.
    */
-  public function __construct(array $configuration, $plugin_id, array $plugin_definition, EntityStorageControllerInterface $storage_controller, Connection $connection) {
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition, FeedStorageControllerInterface $feed_storage, ItemStorageControllerInterface $item_storage, QueryInterface $item_query) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->storageController = $storage_controller;
-    $this->connection = $connection;
+    $this->feedStorage = $feed_storage;
+    $this->itemStorage = $item_storage;
+    $this->itemQuery = $item_query;
   }
 
 
@@ -69,7 +80,8 @@ public static function create(ContainerInterface $container, array $configuratio
       $plugin_id,
       $plugin_definition,
       $container->get('entity.manager')->getStorageController('aggregator_feed'),
-      $container->get('database')
+      $container->get('entity.manager')->getStorageController('aggregator_item'),
+      $container->get('entity.query')->get('aggregator_item')
     );
   }
 
@@ -97,7 +109,7 @@ public function access(AccountInterface $account) {
    * Overrides \Drupal\block\BlockBase::blockForm().
    */
   public function blockForm($form, &$form_state) {
-    $feeds = $this->storageController->loadMultiple();
+    $feeds = $this->feedStorage->loadMultiple();
     $options = array();
     foreach ($feeds as $feed) {
       $options[$feed->id()] = $feed->label();
@@ -131,27 +143,35 @@ public function blockSubmit($form, &$form_state) {
    */
   public function build() {
     // Load the selected feed.
-    if ($feed = $this->storageController->load($this->configuration['feed'])) {
-      $result = $this->connection->queryRange("SELECT * FROM {aggregator_item} WHERE fid = :fid ORDER BY timestamp DESC, iid DESC", 0, $this->configuration['block_count'], array(':fid' => $feed->id()));
+    if ($feed = $this->feedStorage->load($this->configuration['feed'])) {
+      $result = $this->itemQuery
+        ->condition('fid', $feed->id())
+        ->range(0, $this->configuration['block_count'])
+        ->sort('timestamp', 'DESC')
+        ->sort('iid', 'DESC')
+        ->execute();
+
+      $items = $this->itemStorage->loadMultiple($result);
+
       $more_link = array(
         '#theme' => 'more_link',
         '#url' => 'aggregator/sources/' . $feed->id(),
         '#title' => t("View this feed's recent news."),
       );
       $read_more = drupal_render($more_link);
-      $items = array();
-      foreach ($result as $item) {
+      $rendered_items = array();
+      foreach ($items as $item) {
         $aggregator_block_item = array(
           '#theme' => 'aggregator_block_item',
           '#item' => $item,
         );
-        $items[] = drupal_render($aggregator_block_item);
+        $rendered_items[] = drupal_render($aggregator_block_item);
       }
       // Only display the block if there are items to show.
-      if (count($items) > 0) {
+      if (count($rendered_items) > 0) {
         $item_list = array(
           '#theme' => 'item_list',
-          '#items' => $items,
+          '#items' => $rendered_items,
         );
         return array(
           '#children' => drupal_render($item_list) . $read_more,
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/processor/DefaultProcessor.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/processor/DefaultProcessor.php
index 23ca3be348fc0f3c36cf22b5e70413eeda276fa3..f5f4ebc904d8c5163cdee603e4c003c26207fac2 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/processor/DefaultProcessor.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/processor/DefaultProcessor.php
@@ -7,11 +7,13 @@
 
 namespace Drupal\aggregator\Plugin\aggregator\processor;
 
+use Drupal\aggregator\ItemStorageControllerInterface;
 use Drupal\aggregator\Plugin\AggregatorPluginSettingsBase;
 use Drupal\aggregator\Plugin\ProcessorInterface;
 use Drupal\aggregator\FeedInterface;
 use Drupal\Core\Database\Database;
 use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Entity\Query\QueryInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -35,6 +37,20 @@ class DefaultProcessor extends AggregatorPluginSettingsBase implements Processor
    */
   protected $configFactory;
 
+  /**
+   * The entity query object for feed items.
+   *
+   * @var \Drupal\Core\Entity\Query\QueryInterface
+   */
+  protected $itemQuery;
+
+  /**
+   * The entity storage controller for items.
+   *
+   * @var \Drupal\aggregator\ItemStorageControllerInterface
+   */
+  protected $itemStorage;
+
   /**
    * Constructs a DefaultProcessor object.
    *
@@ -46,9 +62,15 @@ class DefaultProcessor extends AggregatorPluginSettingsBase implements Processor
    *   The plugin implementation definition.
    * @param \Drupal\Core\Config\ConfigFactoryInterface $config
    *   The configuration factory object.
+   * @param \Drupal\Core\Entity\Query\QueryInterface $item_query
+   *   The entity query object for feed items.
+   * @param \Drupal\aggregator\ItemStorageControllerInterface $item_storage
+   *   The entity storage controller for feed items.
    */
-  public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConfigFactoryInterface $config) {
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConfigFactoryInterface $config, QueryInterface $item_query, ItemStorageControllerInterface $item_storage) {
     $this->configFactory = $config;
+    $this->itemStorage = $item_storage;
+    $this->itemQuery = $item_query;
     // @todo Refactor aggregator plugins to ConfigEntity so merging
     //   the configuration here is not needed.
     parent::__construct($configuration + $this->getConfiguration(), $plugin_id, $plugin_definition);
@@ -62,7 +84,9 @@ public static function create(ContainerInterface $container, array $configuratio
       $configuration,
       $plugin_id,
       $plugin_definition,
-      $container->get('config.factory')
+      $container->get('config.factory'),
+      $container->get('entity.query')->get('aggregator_item'),
+      $container->get('entity.manager')->getStorageController('aggregator_item')
     );
   }
 
@@ -194,9 +218,8 @@ public function process(FeedInterface $feed) {
    * {@inheritdoc}
    */
   public function delete(FeedInterface $feed) {
-    $iids = Database::getConnection()->query('SELECT iid FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->id()))->fetchCol();
-    if ($iids) {
-      entity_delete_multiple('aggregator_item', $iids);
+    if ($items = $this->itemStorage->loadByFeed($feed->id())) {
+      $this->itemStorage->delete($items);
     }
     // @todo This should be moved out to caller with a different message maybe.
     drupal_set_message(t('The news items from %site have been deleted.', array('%site' => $feed->label())));
@@ -213,13 +236,13 @@ public function postProcess(FeedInterface $feed) {
     if ($aggregator_clear != AGGREGATOR_CLEAR_NEVER) {
       // Delete all items that are older than flush item timer.
       $age = REQUEST_TIME - $aggregator_clear;
-      $iids = Database::getConnection()->query('SELECT iid FROM {aggregator_item} WHERE fid = :fid AND timestamp < :timestamp', array(
-        ':fid' => $feed->id(),
-        ':timestamp' => $age,
-      ))
-      ->fetchCol();
-      if ($iids) {
-        entity_delete_multiple('aggregator_item', $iids);
+      $result = $this->itemQuery
+        ->condition('fid', $feed->id())
+        ->condition('timestamp', $age, '<')
+        ->execute();
+      if ($result) {
+        $entities = $this->itemStorage->loadMultiple($result);
+        $this->itemStorage->delete($entities);
       }
     }
   }