diff --git a/core/modules/aggregator/aggregator.admin.inc b/core/modules/aggregator/aggregator.admin.inc
index 09da1cf..c17e02c 100644
--- a/core/modules/aggregator/aggregator.admin.inc
+++ b/core/modules/aggregator/aggregator.admin.inc
@@ -424,7 +424,7 @@ function aggregator_admin_form($form, $form_state) {
     '#title' => t('Allowed HTML tags'),
     '#size' => 80,
     '#maxlength' => 255,
-    '#default_value' => variable_get('aggregator_allowed_html_tags', '<a> <b> <br> <dd> <dl> <dt> <em> <i> <li> <ol> <p> <strong> <u> <ul>'),
+    '#default_value' => config('aggregator.admin')->get('aggregator_allowed_html_tags'),
     '#description' => t('A space-separated list of HTML tags allowed in the content of feed items. Disallowed tags are stripped from the content.'),
   );
 
@@ -478,7 +478,7 @@ function aggregator_admin_form($form, $form_state) {
       '#title' => t('Fetcher'),
       '#description' => t('Fetchers download data from an external source. Choose a fetcher suitable for the external source you would like to download from.'),
       '#options' => $fetchers,
-      '#default_value' => variable_get('aggregator_fetcher', 'aggregator'),
+      '#default_value' => config('aggregator.admin')->get('aggregator_fetcher'),
     );
   }
   if (count($parsers) > 1) {
@@ -487,7 +487,7 @@ function aggregator_admin_form($form, $form_state) {
       '#title' => t('Parser'),
       '#description' => t('Parsers transform downloaded data into standard structures. Choose a parser suitable for the type of feeds you would like to aggregate.'),
       '#options' => $parsers,
-      '#default_value' => variable_get('aggregator_parser', 'aggregator'),
+      '#default_value' => config('aggregator.admin')->get('aggregator_fetcher'),
     );
   }
   if (count($processors) > 1) {
@@ -496,7 +496,7 @@ function aggregator_admin_form($form, $form_state) {
       '#title' => t('Processors'),
       '#description' => t('Processors act on parsed feed data, for example they store feed items. Choose the processors suitable for your task.'),
       '#options' => $processors,
-      '#default_value' => variable_get('aggregator_processors', array('aggregator')),
+      '#default_value' => config('aggregator.admin')->get('aggregator_processors'),
     );
   }
   if (count($basic_conf)) {
@@ -526,10 +526,26 @@ function aggregator_admin_form($form, $form_state) {
  * Form submission handler for aggregator_admin_form().
  */
 function aggregator_admin_form_submit($form, &$form_state) {
+  $config = config('aggregator.admin');
+  $config
+    ->set('aggregator_allowed_html_tags', $form_state['values']['aggregator_allowed_html_tags'])
+    ->set('aggregator_summary_items', $form_state['values']['aggregator_summary_items'])
+    ->set('aggregator_clear', $form_state['values']['aggregator_clear'])
+    ->set('aggregator_category_selector', $form_state['values']['aggregator_category_selector'])
+    ->set('aggregator_teaser_length', $form_state['values']['aggregator_teaser_length']);
+
+  if (isset($form_state['values']['aggregator_fetcher'])) {
+    $config->set('aggregator_fetcher', $form_state['values']['aggregator_fetcher']);
+  }
+  if (isset($form_state['values']['aggregator_parser'])) {
+    $config->set('aggregator_parser', $form_state['values']['aggregator_parser']);
+  }
   if (isset($form_state['values']['aggregator_processors'])) {
-    $form_state['values']['aggregator_processors'] = array_filter($form_state['values']['aggregator_processors']);
+    $config->set('aggregator_processors', array_filter($form_state['values']['aggregator_processors']));
   }
-  system_settings_form_submit($form, $form_state);
+
+  $config->save();
+  drupal_set_message(t('The configuration options have been saved.'));
 }
 
 /**
diff --git a/core/modules/aggregator/aggregator.install b/core/modules/aggregator/aggregator.install
index ac4fce8..b78ba7f 100644
--- a/core/modules/aggregator/aggregator.install
+++ b/core/modules/aggregator/aggregator.install
@@ -9,14 +9,9 @@
  * Implements hook_uninstall().
  */
 function aggregator_uninstall() {
-  variable_del('aggregator_allowed_html_tags');
-  variable_del('aggregator_summary_items');
-  variable_del('aggregator_clear');
-  variable_del('aggregator_category_selector');
-  variable_del('aggregator_fetcher');
-  variable_del('aggregator_parser');
-  variable_del('aggregator_processors');
-  variable_del('aggregator_teaser_length');
+  $config = config('aggregator.admin');
+  $config->delete();
+  $config->save();
 }
 
 /**
@@ -271,3 +266,10 @@ function aggregator_schema() {
 
   return $schema;
 }
+
+/**
+ * Moves aggregator settings from variable to config.
+ */
+function aggregrator_update_8000() {
+  update_variables_to_config('aggregator.admin');
+}
diff --git a/core/modules/aggregator/aggregator.module b/core/modules/aggregator/aggregator.module
index 0626f72..f5dc4b2 100644
--- a/core/modules/aggregator/aggregator.module
+++ b/core/modules/aggregator/aggregator.module
@@ -595,15 +595,16 @@ function aggregator_remove($feed) {
  */
 function _aggregator_get_variables() {
   // Fetch the feed.
-  $fetcher = variable_get('aggregator_fetcher', 'aggregator');
+  $config = config('aggregator.admin');
+  $fetcher = $config->get('aggregator_fetcher');
   if ($fetcher == 'aggregator') {
     include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'aggregator') . '/aggregator.fetcher.inc';
   }
-  $parser = variable_get('aggregator_parser', 'aggregator');
+  $parser = $config->get('aggregator_parser');
   if ($parser == 'aggregator') {
     include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'aggregator') . '/aggregator.parser.inc';
   }
-  $processors = variable_get('aggregator_processors', array('aggregator'));
+  $processors = $config->get('aggregator_processors');
   if (in_array('aggregator', $processors)) {
     include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'aggregator') . '/aggregator.processor.inc';
   }
@@ -739,7 +740,8 @@ function theme_aggregator_block_item($variables) {
  *   The filtered content.
  */
 function aggregator_filter_xss($value) {
-  return filter_xss($value, preg_split('/\s+|<|>/', variable_get('aggregator_allowed_html_tags', '<a> <b> <br> <dd> <dl> <dt> <em> <i> <li> <ol> <p> <strong> <u> <ul>'), -1, PREG_SPLIT_NO_EMPTY));
+  $config = config('aggregator.admin');
+  return filter_xss($value, preg_split('/\s+|<|>/', $config->get('aggregator_allowed_html_tags'), -1, PREG_SPLIT_NO_EMPTY));
 }
 
 /**
@@ -767,9 +769,12 @@ function aggregator_sanitize_configuration() {
     }
   }
   if ($reset) {
-    variable_del('aggregator_fetcher');
-    variable_del('aggregator_parser');
-    variable_del('aggregator_processors');
+    // Reset aggregator config if necessary using the module defaults.
+    config('aggregator.admin')
+      ->set('aggregator_fetcher', 'aggregator')
+      ->set('aggregator_parser', 'aggregator')
+      ->set('aggregator_processors', array('aggregator' => 'aggregator'))
+      ->save();
     return TRUE;
   }
   return FALSE;
diff --git a/core/modules/aggregator/aggregator.pages.inc b/core/modules/aggregator/aggregator.pages.inc
index 7f82077..f7e0172 100644
--- a/core/modules/aggregator/aggregator.pages.inc
+++ b/core/modules/aggregator/aggregator.pages.inc
@@ -218,8 +218,10 @@ function aggregator_categorize_items($items, $feed_source = '') {
       }
     }
     $done = TRUE;
+
+    $config = config('aggregator.admin');
     $form['categories'][$item->iid] = array(
-      '#type' => variable_get('aggregator_category_selector', 'checkboxes'),
+      '#type' => $config->get('aggregator_category_selector'),
       '#default_value' => $selected,
       '#options' => $categories,
       '#size' => 10,
@@ -356,8 +358,9 @@ function aggregator_page_sources() {
   foreach ($result as $feed) {
     // Most recent items:
     $summary_items = array();
-    if (variable_get('aggregator_summary_items', 3)) {
-      $items = db_query_range('SELECT i.title, i.timestamp, i.link FROM {aggregator_item} i WHERE i.fid = :fid ORDER BY i.timestamp DESC', 0, variable_get('aggregator_summary_items', 3), array(':fid' => $feed->fid));
+    $config = config('aggregator.admin');
+    if ($config->get('aggregator_summary_items')) {
+      $items = db_query_range('SELECT i.title, i.timestamp, i.link FROM {aggregator_item} i WHERE i.fid = :fid ORDER BY i.timestamp DESC', 0, $config->get('aggregator_summary_items'), array(':fid' => $feed->fid));
       foreach ($items as $item) {
         $summary_items[] = theme('aggregator_summary_item', array('item' => $item));
       }
@@ -380,9 +383,10 @@ function aggregator_page_categories() {
 
   $output = '';
   foreach ($result as $category) {
-    if (variable_get('aggregator_summary_items', 3)) {
+    $config = config('aggregator.admin');
+    if ($config->get('aggregator_summary_items')) {
       $summary_items = array();
-      $items = db_query_range('SELECT i.title, i.timestamp, i.link, f.title as feed_title, f.link as feed_link FROM {aggregator_category_item} ci LEFT JOIN {aggregator_item} i ON i.iid = ci.iid LEFT JOIN {aggregator_feed} f ON i.fid = f.fid WHERE ci.cid = :cid ORDER BY i.timestamp DESC', 0, variable_get('aggregator_summary_items', 3), array(':cid' => $category->cid));
+      $items = db_query_range('SELECT i.title, i.timestamp, i.link, f.title as feed_title, f.link as feed_link FROM {aggregator_category_item} ci LEFT JOIN {aggregator_item} i ON i.iid = ci.iid LEFT JOIN {aggregator_feed} f ON i.fid = f.fid WHERE ci.cid = :cid ORDER BY i.timestamp DESC', 0, $config->get('aggregator_summary_items'), array(':cid' => $category->cid));
       foreach ($items as $item) {
         $summary_items[] = theme('aggregator_summary_item', array('item' => $item));
       }
@@ -439,7 +443,8 @@ function theme_aggregator_page_rss($variables) {
   foreach ($feeds as $feed) {
     switch ($feed_length) {
       case 'teaser':
-        $summary = text_summary($feed->description, NULL, variable_get('aggregator_teaser_length', 600));
+        $config = config('aggregator.admin');
+        $summary = text_summary($feed->description, NULL, $config->get('aggregator_teaser_length'));
         if ($summary != $feed->description) {
           $summary .= '<p><a href="' . check_url($feed->link) . '">' . t('read more') . "</a></p>\n";
         }
diff --git a/core/modules/aggregator/aggregator.processor.inc b/core/modules/aggregator/aggregator.processor.inc
index 7fa86a9..0d55e8d 100644
--- a/core/modules/aggregator/aggregator.processor.inc
+++ b/core/modules/aggregator/aggregator.processor.inc
@@ -70,7 +70,9 @@ function aggregator_aggregator_remove($feed) {
  * separate from aggregator API functionality.
  */
 function aggregator_form_aggregator_admin_form_alter(&$form, $form_state) {
-  if (in_array('aggregator', variable_get('aggregator_processors', array('aggregator')))) {
+  $config = config('aggregator.admin');
+  $aggregator_processors = $config->get('aggregator_processors');
+  if (in_array('aggregator', $aggregator_processors)) {
     $info = module_invoke('aggregator', 'aggregator_process', 'info');
     $items = drupal_map_assoc(array(3, 5, 10, 15, 20, 25), '_aggregator_items');
     $period = drupal_map_assoc(array(3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800, 1209600, 2419200, 4838400, 9676800), 'format_interval');
@@ -83,7 +85,7 @@ function aggregator_form_aggregator_admin_form_alter(&$form, $form_state) {
         '#title' => t('Default processor settings'),
         '#description' => $info['description'],
         '#collapsible' => TRUE,
-        '#collapsed' => !in_array('aggregator', variable_get('aggregator_processors', array('aggregator'))),
+        '#collapsed' => !in_array('aggregator', $aggregator_processors),
       );
     }
     else {
@@ -93,7 +95,7 @@ function aggregator_form_aggregator_admin_form_alter(&$form, $form_state) {
     $form['modules']['aggregator']['aggregator_summary_items'] = array(
       '#type' => 'select',
       '#title' => t('Number of items shown in listing pages'),
-      '#default_value' => variable_get('aggregator_summary_items', 3),
+      '#default_value' => $config->get('aggregator_summary_items'),
       '#empty_value' => 0,
       '#options' => $items,
     );
@@ -101,7 +103,7 @@ function aggregator_form_aggregator_admin_form_alter(&$form, $form_state) {
     $form['modules']['aggregator']['aggregator_clear'] = array(
       '#type' => 'select',
       '#title' => t('Discard items older than'),
-      '#default_value' => variable_get('aggregator_clear', 9676800),
+      '#default_value' => $config->get('aggregator_clear'),
       '#options' => $period,
       '#description' => t('Requires a correctly configured <a href="@cron">cron maintenance task</a>.', array('@cron' => url('admin/reports/status'))),
     );
@@ -109,7 +111,7 @@ function aggregator_form_aggregator_admin_form_alter(&$form, $form_state) {
     $form['modules']['aggregator']['aggregator_category_selector'] = array(
       '#type' => 'radios',
       '#title' => t('Select categories using'),
-      '#default_value' => variable_get('aggregator_category_selector', 'checkboxes'),
+      '#default_value' => $config->get('aggregator_category_selector'),
       '#options' => array('checkboxes' => t('checkboxes'),
       'select' => t('multiple selector')),
       '#description' => t('For a small number of categories, checkboxes are easier to use, while a multiple selector works well with large numbers of categories.'),
@@ -117,7 +119,7 @@ function aggregator_form_aggregator_admin_form_alter(&$form, $form_state) {
     $form['modules']['aggregator']['aggregator_teaser_length'] = array(
       '#type' => 'select',
       '#title' => t('Length of trimmed description'),
-      '#default_value' => variable_get('aggregator_teaser_length', 600),
+      '#default_value' => $config->get('aggregator_teaser_length'),
       '#options' => drupal_map_assoc(array(0, 200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000), '_aggregator_characters'),
       '#description' => t("The maximum number of characters used in the trimmed version of content.")
     );
@@ -184,7 +186,8 @@ function aggregator_save_item($edit) {
  *   Object describing feed.
  */
 function aggregator_expire($feed) {
-  $aggregator_clear = variable_get('aggregator_clear', 9676800);
+  $config = config('aggregator.admin');
+  $aggregator_clear = $config->get('aggregator_clear');
 
   if ($aggregator_clear != AGGREGATOR_CLEAR_NEVER) {
     // Remove all items that are older than flush item timer.
diff --git a/core/modules/aggregator/aggregator.test b/core/modules/aggregator/aggregator.test
index 8639389..7c981b3 100644
--- a/core/modules/aggregator/aggregator.test
+++ b/core/modules/aggregator/aggregator.test
@@ -944,7 +944,8 @@ class FeedParserTestCase extends AggregatorTestCase {
     // Do not remove old aggregator items during these tests, since our sample
     // feeds have hardcoded dates in them (which may be expired when this test
     // is run).
-    variable_set('aggregator_clear', AGGREGATOR_CLEAR_NEVER);
+    $config = config('aggregator.admin');
+    $config->set('aggregator_clear', AGGREGATOR_CLEAR_NEVER);
   }
 
   /**
diff --git a/core/modules/aggregator/config/aggregator.admin.yml b/core/modules/aggregator/config/aggregator.admin.yml
new file mode 100644
index 0000000..f5387ac
--- /dev/null
+++ b/core/modules/aggregator/config/aggregator.admin.yml
@@ -0,0 +1,9 @@
+aggregator_allowed_html_tags: <a> <b> <br> <dd> <dl> <dt> <em> <i> <li> <ol> <p> <strong> <u> <ul>
+aggregator_fetcher: aggregator
+aggregator_parser: aggregator
+aggregator_processors:
+    aggregator: aggregator
+aggregator_summary_items: '3'
+aggregator_clear: '9676800'
+aggregator_teaser_length: '600'
+aggregator_category_selector: checkboxes
