diff --git a/core/modules/aggregator/aggregator.module b/core/modules/aggregator/aggregator.module
index 2fd5929..abfbaad 100644
--- a/core/modules/aggregator/aggregator.module
+++ b/core/modules/aggregator/aggregator.module
@@ -51,10 +51,20 @@ function aggregator_help($path, $arg) {
  */
 function aggregator_theme() {
   return array(
-    'aggregator_wrapper' => array(
-      'variables' => array('content' => NULL),
+    'aggregator' => array(
+      'variables' => array('items' => NULL),
       'file' => 'aggregator.pages.inc',
-      'template' => 'aggregator-wrapper',
+      'template' => 'aggregator',
+    ),
+    'aggregator_page_sources' => array(
+      'variables' => array('sources' => NULL, 'icons' => NULL),
+      'file' => 'aggregator.pages.inc',
+      'template' => 'aggregator-page-sources',
+    ),
+    'aggregator_page_categories' => array(
+      'variables' => array('categories' => NULL, 'icons' => NULL),
+      'file' => 'aggregator.pages.inc',
+      'template' => 'aggregator-page-categories',
     ),
     'aggregator_categorize_items' => array(
       'render element' => 'form',
@@ -77,11 +87,6 @@ function aggregator_theme() {
       'variables' => array('item' => NULL),
       'file' => 'aggregator.pages.inc',
     ),
-    'aggregator_item' => array(
-      'variables' => array('item' => NULL),
-      'file' => 'aggregator.pages.inc',
-      'template' => 'aggregator-item',
-    ),
     'aggregator_page_opml' => array(
       'variables' => array('feeds' => NULL),
       'file' => 'aggregator.pages.inc',
diff --git a/core/modules/aggregator/aggregator.pages.inc b/core/modules/aggregator/aggregator.pages.inc
index a49a666..f588046 100644
--- a/core/modules/aggregator/aggregator.pages.inc
+++ b/core/modules/aggregator/aggregator.pages.inc
@@ -186,11 +186,7 @@ function _aggregator_page_list($items, $op, $feed_source = '') {
   }
   else {
     // Assemble themed output.
-    $output = $feed_source;
-    foreach ($items as $item) {
-      $output .= theme('aggregator_item', array('item' => $item));
-    }
-    $output = theme('aggregator_wrapper', array('content' => $output));
+    $output = theme('aggregator', array('items' => $items));
   }
 
   return $output;
@@ -280,6 +276,16 @@ function aggregator_categorize_items_submit($form, &$form_state) {
 }
 
 /**
+ * Preprocessor to prepare additional time variables for an aggregator item.
+ */
+function _aggregator_prepare_item_times(&$item) {
+  $item->source_date_stamp = date_iso8601($item->timestamp);
+  $item->source_date = format_date($item->timestamp, 'medium');
+  $item->show_age = (date('Ymd', $item->timestamp) == date('Ymd'));
+  $item->age = t('%ago old', array('%ago' => format_interval(REQUEST_TIME - $item->timestamp)));
+}
+
+/**
  * Returns HTML for the aggregator page list form for assigning categories.
  *
  * @param $variables
@@ -301,66 +307,40 @@ function theme_aggregator_categorize_items($variables) {
       );
     }
   }
-  $output .= theme('table', array('header' => array('', t('Categorize')), 'rows' => $rows));
+  $output .= theme('table', array('header' => array('', t('Categorize')), 'rows' => $rows), array('class' => array('aggregator-categorize-items')));
   $output .= drupal_render($form['submit']);
   $output .= drupal_render_children($form);
 
-  return theme('aggregator_wrapper', array('content' => $output));
-}
-
-/**
- * Default theme implementation to present a linked feed item for summaries.
- *
- * @param $variables
- *   An associative array containing:
- *   - item_link: Link to item.
- *   - item_age: Age of the item.
- *
- * @see template_preprocess()
- * @see template_preprocess_aggregator_summary_item()
- */
-function theme_aggregator_summary_item($variables) {
-  return $variables['item_url'] . ' ' . $variables['item_age'];
+  return $output;
 }
 
 /**
- * Processes variables for aggregator-wrapper.tpl.php.
+ * Processes variables for aggregator.html.twig.
  *
- * @see aggregator-wrapper.tpl.php
+ * @see aggregator.html.twig
  */
-function template_preprocess_aggregator_wrapper(&$variables) {
+function template_preprocess_aggregator(&$variables) {
   drupal_add_css(drupal_get_path('module', 'aggregator') . '/aggregator.theme.css');
   $variables['pager'] = theme('pager');
-}
-
-/**
- * Processes variables for aggregator-item.tpl.php.
- *
- * @see aggregator-item.tpl.php
- */
-function template_preprocess_aggregator_item(&$variables) {
-  $item = $variables['item'];
-
-  $variables['feed_url'] = check_url($item->link);
-  $variables['feed_title'] = check_plain($item->title);
-  $variables['content'] = aggregator_filter_xss($item->description);
-
-  $variables['source_url'] = '';
-  $variables['source_title'] = '';
-  if (isset($item->ftitle) && isset($item->fid)) {
-    $variables['source_url'] = url("aggregator/sources/$item->fid");
-    $variables['source_title'] = check_plain($item->ftitle);
-  }
-  if (date('Ymd', $item->timestamp) == date('Ymd')) {
-    $variables['source_date'] = t('%ago ago', array('%ago' => format_interval(REQUEST_TIME - $item->timestamp)));
-  }
-  else {
-    $variables['source_date'] = format_date($item->timestamp, 'medium');
-  }
-
-  $variables['categories'] = array();
-  foreach ($item->categories as $category) {
-    $variables['categories'][$category->cid] = l($category->title, 'aggregator/categories/' . $category->cid);
+  
+  foreach ($variables['items'] as &$item) {
+    $item->feed_url = check_url($item->link);
+    $item->feed_title = check_plain($item->title);
+    $item->content = aggregator_filter_xss($item->description);
+  
+    $item->source_url = '';
+    $item->source_title = '';
+    if (isset($item->ftitle) && isset($item->fid)) {
+      $item->source_url = url("aggregator/sources/$item->fid");
+      $item->source_title = check_plain($item->ftitle);
+    }
+    
+    $item->category_links = array();
+    foreach ($item->categories as $category) {
+      $item->category_links[$category->cid] = l($category->title, 'aggregator/categories/' . $category->cid);
+    }
+    
+    _aggregator_prepare_item_times($item);
   }
 }
 
@@ -373,25 +353,49 @@ function template_preprocess_aggregator_item(&$variables) {
  * @see aggregator_menu()
  */
 function aggregator_page_sources() {
+  $sources = array();
   $result = db_query('SELECT f.fid, f.title, f.description, f.image, MAX(i.timestamp) AS last FROM {aggregator_feed} f LEFT JOIN {aggregator_item} i ON f.fid = i.fid GROUP BY f.fid, f.title, f.description, f.image ORDER BY last DESC, f.title');
-
-  $output = '';
+  
   foreach ($result as $feed) {
+    $source = array(
+      'title'       => $feed->title,
+      'url'         => url('aggregator/sources/' . $feed->fid), 
+      'description' => $feed->description,
+      'image'       => $feed->image,
+      'last_fetch'  => $feed->last,
+      'items'       => array(),
+    );
+    
     // Most recent items:
     $summary_items = array();
     $aggregator_summary_items = config('aggregator.settings')->get('source.list_max');
     if ($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, $aggregator_summary_items, array(':fid' => $feed->fid));
       foreach ($items as $item) {
-        $summary_items[] = theme('aggregator_summary_item', array('item' => $item));
+        $source['items'][] = $item;
       }
     }
-    $feed->url = url('aggregator/sources/' . $feed->fid);
-    $output .= theme('aggregator_summary_items', array('summary_items' => $summary_items, 'source' => $feed));
+    
+    $sources[$feed->fid] = $source;
   }
-  $output .= theme('feed_icon', array('url' => 'aggregator/opml', 'title' => t('OPML feed')));
+  
+  $icons = array();
+  $icons['opml'] = theme('feed_icon', array('url' => 'aggregator/opml', 'title' => t('OPML feed')));
 
-  return theme('aggregator_wrapper', array('content' => $output));
+  return theme('aggregator_page_sources', array('sources' => $sources, 'icons' => $icons));
+}
+
+/**
+ * Processes variables for aggregator-page-sources.html.twig.
+ *
+ * @see aggregator-page-sources.html.twig
+ */
+function template_preprocess_aggregator_page_sources(&$variables) {
+  foreach ($variables['sources'] as &$source) {
+    foreach ($source['items'] as &$item) {
+      _aggregator_prepare_item_times($item);
+    }
+  }
 }
 
 /**
@@ -405,21 +409,42 @@ function aggregator_page_sources() {
 function aggregator_page_categories() {
   $result = db_query('SELECT c.cid, c.title, c.description FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid LEFT JOIN {aggregator_item} i ON ci.iid = i.iid GROUP BY c.cid, c.title, c.description');
 
-  $output = '';
+  $categories = array();
   foreach ($result as $category) {
+    $built_category = array(
+      'cid'           => $category->cid,
+      'title'         => $category->title,
+      'url'           => url('aggregator/categories/' . $category->cid),
+      'description'   => $category->description,
+      'items'         => array(),
+    );
+    
     $aggregator_summary_items = config('aggregator.settings')->get('source.list_max');
     if ($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, $aggregator_summary_items, array(':cid' => $category->cid));
       foreach ($items as $item) {
-        $summary_items[] = theme('aggregator_summary_item', array('item' => $item));
+        $built_category['items'][] = $item;
       }
     }
-    $category->url = url('aggregator/categories/' . $category->cid);
-    $output .= theme('aggregator_summary_items', array('summary_items' => $summary_items, 'source' => $category));
+    
+    $categories[] = $built_category;
   }
 
-  return theme('aggregator_wrapper', array('content' => $output));
+  return theme('aggregator_page_categories', array('categories' => $categories));
+}
+
+/**
+ * Processes variables for aggregator-page-categories.html.twig.
+ *
+ * @see aggregator-page-categories.html.twig
+ */
+function template_preprocess_aggregator_page_categories(&$variables) {
+  foreach ($variables['categories'] as &$category) {
+    foreach ($category['items'] as &$item) {
+      _aggregator_prepare_item_times($item);
+    }
+  }
 }
 
 /**
@@ -562,29 +587,6 @@ function template_preprocess_aggregator_summary_items(&$variables) {
 }
 
 /**
- * Processes variables for aggregator-summary-item.tpl.php.
- *
- * @see aggregator-summary-item.tpl.php
- */
-function template_preprocess_aggregator_summary_item(&$variables) {
-  $item = $variables['item'];
-
-  $variables['item_url'] = l(check_plain($item->title), check_url(url($item->link, array('absolute' => TRUE))), array(
-    'attributes' => array(
-      'class' => array('feed-item-url',),
-    ),
-  ));
-  $variables['item_age'] = theme('datetime', array(
-    'attributes' => array(
-      'datetime' => format_date($item->timestamp, 'html_datetime', '', 'UTC'),
-      'class' => array('feed-item-age',),
-    ),
-    'text' => t('%age old', array('%age' => format_interval(REQUEST_TIME - $item->timestamp))),
-    'html' => TRUE,
-  ));
-}
-
-/**
  * Processes variables for aggregator-feed-source.tpl.php.
  *
  * @see aggregator-feed-source.tpl.php
diff --git a/core/themes/stark/templates/aggregator/aggregator-page-categories.html.twig b/core/themes/stark/templates/aggregator/aggregator-page-categories.html.twig
new file mode 100644
index 0000000..b807535
--- /dev/null
+++ b/core/themes/stark/templates/aggregator/aggregator-page-categories.html.twig
@@ -0,0 +1,31 @@
+{#
+/**
+ * @file
+ * Displays a list of aggregator categories.
+ *
+ * Available variables:
+ * - categories: Aggregator categories. Each contains a list of items.
+ *
+ * @see template_preprocess
+ * @see template_preprocess_aggregator_page_categories
+ * @see theme_pager
+ *
+ * @ingroup themeable
+ */
+#}
+<section class="aggregator-page-categories">
+  {% for category in categories %}
+    <article>
+      <h3><a href="{{ category.url }}">{{ category.title }}</a></h3>
+      <ul>
+      {% for item in category.items %}
+        <li>
+          <a href="{{ item.link }}">{{ item.title }}</a> 
+          <time datetime="{{ item.source_date_stamp }}">{{ item.age }}</time>
+        </li>
+      {% endfor %}
+      </ul>
+      <a href="{{ category.url }}">{{ 'More' | t }}</a>
+    </article>
+  {% endfor %}
+</section>
diff --git a/core/themes/stark/templates/aggregator/aggregator-page-sources.html.twig b/core/themes/stark/templates/aggregator/aggregator-page-sources.html.twig
new file mode 100644
index 0000000..768325c
--- /dev/null
+++ b/core/themes/stark/templates/aggregator/aggregator-page-sources.html.twig
@@ -0,0 +1,40 @@
+{#
+/**
+ * @file
+ * Displays a list of aggregator sources.
+ *
+ * Available variables:
+ * - sources: Aggregator sources. Each contains a list of items.
+ * - icons: Icons pointing to feeds of sources.
+ *
+ * @see template_preprocess
+ * @see template_preprocess_aggregator_page_sources
+ * @see theme_pager
+ *
+ * @ingroup themeable
+ */
+#}
+<section class="aggregator-page-sources">
+  {% for source in sources %}
+    <article>
+      <h3><a href="{{ source.url }}">{{ source.title }}</a></h3>
+      <ul>
+      {% for item in source.items %}
+        <li>
+          <a href="{{ item.link }}">{{ item.title }}</a> 
+          <time datetime="{{ item.source_date_stamp }}">{{ item.age }}</time>
+        </li>
+      {% endfor %}
+      </ul>
+      <a href="{{ source.url }}">{{ 'More' | t }}</a>
+    </article>
+  {% endfor %}
+  
+  {% if icons %}
+    <div class="icons">
+    {% for icon in icons %}
+      {{ icon }}
+    {% endfor %}
+    </div>
+  {% endif %}
+</section>
diff --git a/core/themes/stark/templates/aggregator/aggregator.html.twig b/core/themes/stark/templates/aggregator/aggregator.html.twig
new file mode 100644
index 0000000..c1d0593
--- /dev/null
+++ b/core/themes/stark/templates/aggregator/aggregator.html.twig
@@ -0,0 +1,67 @@
+{#
+/**
+ * @file
+ * Default theme implementation to wrap aggregator content.
+ *
+ * Available variables:
+ * - items: Aggregator content.
+ * - pager: Pager links rendered through theme_pager(). 
+ *
+ * @see template_preprocess
+ * @see template_preprocess_aggregator
+ * @see theme_pager
+ *
+ * @ingroup themeable
+ */
+#}
+<section class="feed">
+  
+  {% for i in items %}
+    <article>
+    
+      <h3>
+        <a href="{{ i.feed_url }}">{{ i.feed_title }}</a>
+      </h3>
+    
+      <footer>
+        {% if i.source_date %}
+          <time datetime="{{ i.source_date_stamp }}">
+            {% if i.show_age %}
+              {{ i.age }}
+            {% else %}
+              {{ 'Date' | t }} {{ i.source_date }}
+            {% endif %}
+          </time>
+        {% endif %}
+  
+        {% if i.category_links %}
+          <div class="terms">
+            <span>{{ 'Categories' | t }}</span> 
+            <ul>
+            {% for item in i.category_links %}
+              {% if loop.last %}
+                <li>{{ item }}</li>
+              {% else %}
+                <li>{{ item }}, </li>
+              {% endif %}
+            {% endfor %}
+            </ul>
+          </div>
+        {% endif %}
+  
+        {% if i.source_url %}
+          <a href="{{ i.source_url }}">{{ i.source_title }}</a>
+        {% endif %}
+      </footer>
+      
+      {% if i.content %}
+        <div class="content">
+          {{ i.content }}
+        </div>
+      {% endif %}
+    
+    </article>
+  {% endfor %}
+  
+  {{ pager }}
+</section>
