diff --git a/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageController.php b/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageController.php
index 299113c..0922531 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageController.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageController.php
@@ -98,4 +98,31 @@ public function isUnique($title, $cid = NULL) {
     return (empty($rows));
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function loadByItem($item_id) {
+    return $this->database->query('SELECT c.cid, c.title, ci.iid FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid AND ci.iid = :iid', array(':iid' => $item_id));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function updateItem($iid, array $cids) {
+    // Remove all existing category items.
+    $this->database->delete('aggregator_category_item')
+      ->condition('iid', $iid)
+      ->execute();
+
+    // Insert new category items.
+    if (!empty($cids)) {
+      $insert = $this->database->insert('aggregator_category_item')
+        ->fields(array('iid', 'cid'));
+      foreach ($cids as $cid) {
+        $insert->values(array('iid' => $iid, 'cid' => $cid));
+      }
+      $insert->execute();
+    }
+  }
+
 }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageControllerInterface.php b/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageControllerInterface.php
index a4ab4db..0494415 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageControllerInterface.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageControllerInterface.php
@@ -66,5 +66,26 @@ public function delete($cid);
    */
   public function isUnique($title, $cid = NULL);
 
+  /**
+   * Loads aggregator categories for an aggregator item.
+   *
+   * @param int $item_id
+   *   The aggregator item ID.
+   *
+   * @return array
+   *   An array of objects containing item ID, category ID and title.
+   */
+  public function loadByItem($item_id);
+
+  /**
+   * Updates the categories for an aggregator item.
+   *
+   * @param int $iid
+   *   The aggregator item ID.
+   * @param array $cids
+   *   The category IDs.
+   */
+  public function updateItem($iid, array $cids);
+
 }
 
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Form/AggregatorCategorizeFormBase.php b/core/modules/aggregator/lib/Drupal/aggregator/Form/AggregatorCategorizeFormBase.php
index 794dcce..9fe81cd 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Form/AggregatorCategorizeFormBase.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Form/AggregatorCategorizeFormBase.php
@@ -7,10 +7,10 @@
 
 namespace Drupal\aggregator\Form;
 
+use Drupal\aggregator\CategoryStorageControllerInterface;
 use Drupal\aggregator\FeedInterface;
 use Drupal\aggregator\ItemStorageControllerInterface;
 use Drupal\Component\Utility\String;
-use Drupal\Core\Database\Connection;
 use Drupal\Core\Entity\EntityRenderControllerInterface;
 use Drupal\Core\Form\FormBase;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -35,18 +35,18 @@
   protected $config;
 
   /**
-   * The database connection.
+   * The aggregator item storage controller.
    *
-   * @var \Drupal\Core\Database\Connection;
+   * @var \Drupal\aggregator\ItemStorageControllerInterface
    */
-  protected $database;
+  protected $aggregatorItemStorage;
 
   /**
-   * The aggregator item storage controller.
+   * The aggregator category storage controller.
    *
-   * @var \Drupal\aggregator\ItemStorageControllerInterface
+   * @var \Drupal\aggregator\CategoryStorageControllerInterface
    */
-  protected $aggregatorItemStorage;
+  protected $categoryStorage;
 
   /**
    * The feed to use.
@@ -60,16 +60,16 @@
    *
    * @param \Drupal\Core\Entity\EntityRenderControllerInterface $aggregator_item_renderer
    *   The item render controller.
-   * @param \Drupal\Core\Database\Connection $database
-   *   The database connection.
    * @param \Drupal\aggregator\ItemStorageControllerInterface $aggregator_item_storage
    *   The aggregator item storage controller.
+   * @param \Drupal\aggregator\CategoryStorageControllerInterface $category_storage
+   *   The category storage controller.
    */
-  public function __construct(EntityRenderControllerInterface $aggregator_item_renderer, Connection $database, ItemStorageControllerInterface $aggregator_item_storage) {
+  public function __construct(EntityRenderControllerInterface $aggregator_item_renderer, ItemStorageControllerInterface $aggregator_item_storage, CategoryStorageControllerInterface $category_storage) {
     $this->aggregatorItemRenderer = $aggregator_item_renderer;
-    $this->database = $database;
     $this->config = $this->config('aggregator.settings');
     $this->aggregatorItemStorage = $aggregator_item_storage;
+    $this->categoryStorage = $category_storage;
   }
 
   /**
@@ -78,8 +78,8 @@ public function __construct(EntityRenderControllerInterface $aggregator_item_ren
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('plugin.manager.entity')->getRenderController('aggregator_item'),
-      $container->get('database'),
-      $container->get('plugin.manager.entity')->getStorageController('aggregator_item')
+      $container->get('plugin.manager.entity')->getStorageController('aggregator_item'),
+      $container->get('aggregator.category.storage')
     );
   }
 
@@ -100,7 +100,7 @@ public function buildForm(array $form, array &$form_state, array $items = NULL)
     );
     if ($items && ($form_items = $this->aggregatorItemRenderer->viewMultiple($items, 'default'))) {
       foreach (element_children($form_items) as $iid) {
-        $categories_result = $this->database->query('SELECT c.cid, c.title, ci.iid FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid AND ci.iid = :iid', array(':iid' => $iid));
+        $categories_result = $this->categoryStorage->loadByItem($iid);
 
         $selected = array();
         foreach ($categories_result as $category) {
@@ -140,25 +140,8 @@ public function buildForm(array $form, array &$form_state, array $items = NULL)
    */
   public function submitForm(array &$form, array &$form_state) {
     if (!empty($form_state['values']['categories'])) {
-      foreach ($form_state['values']['categories'] as $iid => $selection) {
-        $this->database->delete('aggregator_category_item')
-          ->condition('iid', $iid)
-          ->execute();
-        $insert = $this->database->insert('aggregator_category_item')
-          ->fields(array('iid', 'cid'));
-        $has_values = FALSE;
-        foreach ($selection as $cid) {
-          if ($cid && $iid) {
-            $has_values = TRUE;
-            $insert->values(array(
-              'iid' => $iid,
-              'cid' => $cid,
-            ));
-          }
-        }
-        if ($has_values) {
-          $insert->execute();
-        }
+      foreach ($form_state['values']['categories'] as $iid => $cids) {
+        $this->categoryStorage->updateItem($iid, $cids);
       }
     }
     drupal_set_message($this->t('The categories have been saved.'));
