diff --git a/core/includes/pager.inc b/core/includes/pager.inc
index 4c497ba..a33cb3c 100644
--- a/core/includes/pager.inc
+++ b/core/includes/pager.inc
@@ -142,13 +142,15 @@ function pager_get_query_parameters() {
 }
 
 /**
- * Returns HTML for a query pager.
+ * Prepares variables for pager templates.
+ *
+ * Default template: pager.html.twig.
  *
  * Menu callbacks that display paged query results should call theme('pager') to
  * retrieve a pager control so that users can view other results. Format a list
  * of nearby pages with additional query results.
  *
- * @param $variables
+ * @param array $variables
  *   An associative array containing:
  *   - tags: An array of labels for the controls in the pager.
  *   - element: An optional integer to distinguish between multiple pagers on
@@ -156,10 +158,8 @@ function pager_get_query_parameters() {
  *   - parameters: An associative array of query string parameters to append to
  *     the pager links.
  *   - quantity: The number of pages in the list.
- *
- * @ingroup themeable
  */
-function theme_pager($variables) {
+function template_preprocess_pager(&$variables) {
   $tags = $variables['tags'];
   $element = $variables['element'];
   $parameters = $variables['parameters'];
@@ -200,51 +200,55 @@ function theme_pager($variables) {
 
   // Create the "first" and "previous" links if we are not on the first page.
   if ($pager_page_array[$element] > 0) {
-    $li_first = theme('pager_link__first', array(
-      'text' => (isset($tags[0]) ? $tags[0] : t('« first')),
-      'page_new' => pager_load_array(0, $element, $pager_page_array),
-      'element' => $element,
-      'parameters' => $parameters,
-      'attributes' => array('rel' => 'first'),
-    ));
-    $li_previous = theme('pager_link__previous', array(
-      'text' => isset($tags[1]) ? $tags[1] : t('‹ previous'),
-      'page_new' => pager_load_array($pager_page_array[$element] - 1, $element, $pager_page_array),
-      'element' => $element,
-      'parameters' => $parameters,
-      'attributes' => array('rel' => 'prev'),
-    ));
+    $li_first = array(
+      '#theme' => 'pager_link__first',
+      '#text' => (isset($tags[0]) ? $tags[0] : t('« first')),
+      '#page_new' => pager_load_array(0, $element, $pager_page_array),
+      '#element' => $element,
+      '#parameters' => $parameters,
+      '#attributes' => array('rel' => 'first'),
+    );
+    $li_previous = array(
+      '#theme' => 'pager_link__previous',
+      '#text' => isset($tags[1]) ? $tags[1] : t('‹ previous'),
+      '#page_new' => pager_load_array($pager_page_array[$element] - 1, $element, $pager_page_array),
+      '#element' => $element,
+      '#parameters' => $parameters,
+      '#attributes' => array('rel' => 'prev'),
+    );
   }
 
   // Create the "last" and "next" links if we are not on the last page.
   if ($pager_page_array[$element] < ($pager_total[$element] - 1)) {
-    $li_next = theme('pager_link__next', array(
-      'text' => isset($tags[3]) ? $tags[3] : t('next ›'),
-      'page_new' => pager_load_array($pager_page_array[$element] + 1, $element, $pager_page_array),
-      'element' => $element,
-      'parameters' => $parameters,
-      'attributes' => array('rel' => 'next'),
-    ));
-    $li_last = theme('pager_link__last', array(
-      'text' => (isset($tags[4]) ? $tags[4] : t('last »')),
-      'page_new' => pager_load_array($pager_total[$element] - 1, $element, $pager_page_array),
-      'element' => $element,
-      'parameters' => $parameters,
-      'attributes' => array('rel' => 'last'),
-    ));
+    $li_next = array(
+      '#theme' => 'pager_link__next',
+      '#text' => isset($tags[3]) ? $tags[3] : t('next ›'),
+      '#page_new' => pager_load_array($pager_page_array[$element] + 1, $element, $pager_page_array),
+      '#element' => $element,
+      '#parameters' => $parameters,
+      '#attributes' => array('rel' => 'next'),
+    );
+    $li_last = array(
+      '#theme' => 'pager_link__last',
+      '#text' => (isset($tags[4]) ? $tags[4] : t('last »')),
+      '#page_new' => pager_load_array($pager_total[$element] - 1, $element, $pager_page_array),
+      '#element' => $element,
+      '#parameters' => $parameters,
+      '#attributes' => array('rel' => 'last'),
+    );
   }
 
   if ($pager_total[$element] > 1) {
     if ($li_first) {
       $items[] = array(
         '#wrapper_attributes' => array('class' => array('pager-first')),
-        '#markup' => $li_first,
+        'link' => $li_first,
       );
     }
     if ($li_previous) {
       $items[] = array(
         '#wrapper_attributes' => array('class' => array('pager-previous')),
-        '#markup' => $li_previous,
+        'link' => $li_previous,
       );
     }
 
@@ -261,13 +265,14 @@ function theme_pager($variables) {
         if ($i < $pager_current) {
           $items[] = array(
             '#wrapper_attributes' => array('class' => array('pager-item')),
-            '#markup' => theme('pager_link', array(
-              'text' => $i,
-              'page_new' => pager_load_array($i - 1, $element, $pager_page_array),
-              'element' => $element,
-              'interval' => ($pager_current - $i),
-              'parameters' => $parameters,
-            )),
+            'link' => array(
+              '#theme' => 'pager_link',
+              '#text' => $i,
+              '#page_new' => pager_load_array($i - 1, $element, $pager_page_array),
+              '#element' => $element,
+              '#interval' => ($pager_current - $i),
+              '#parameters' => $parameters,
+            ),
           );
         }
         if ($i == $pager_current) {
@@ -279,13 +284,14 @@ function theme_pager($variables) {
         if ($i > $pager_current) {
           $items[] = array(
             '#wrapper_attributes' => array('class' => array('pager-item')),
-            '#markup' => theme('pager_link', array(
-              'text' => $i,
-              'page_new' => pager_load_array($i - 1, $element, $pager_page_array),
-              'element' => $element,
-              'interval' => ($i - $pager_current),
-              'parameters' => $parameters,
-            )),
+            'link' => array(
+              '#theme' => 'pager_link',
+              '#text' => $i,
+              '#page_new' => pager_load_array($i - 1, $element, $pager_page_array),
+              '#element' => $element,
+              '#interval' => ($i - $pager_current),
+              '#parameters' => $parameters,
+            ),
           );
         }
       }
@@ -300,26 +306,30 @@ function theme_pager($variables) {
     if ($li_next) {
       $items[] = array(
         '#wrapper_attributes' => array('class' => array('pager-next')),
-        '#markup' => $li_next,
+        'link' => $li_next,
       );
     }
     if ($li_last) {
       $items[] = array(
         '#wrapper_attributes' => array('class' => array('pager-last')),
-        '#markup' => $li_last,
+        'link' => $li_last,
       );
     }
-    return '<h2 class="element-invisible">' . t('Pages') . '</h2>' . theme('item_list', array(
-      'items' => $items,
-      'attributes' => array('class' => array('pager')),
-    ));
+
+    $variables['items'] = array(
+      '#theme' => 'item_list',
+      '#items' => $items,
+      '#attributes' => array('class' => array('pager')),
+    );
   }
 }
 
 /**
- * Returns HTML for a link to a specific query result page.
+ * Prepares variables for pager link templates.
  *
- * @param $variables
+ * Default template: pager-link.html.twig.
+ *
+ * @param array $variables
  *   An associative array containing:
  *   - text: The link text. Also used to figure out the title attribute of the
  *     link, if it is not provided in $variables['attributes']['title']; in
@@ -334,11 +344,9 @@ function theme_pager($variables) {
  *   - attributes: An associative array of HTML attributes to apply to the
  *     pager link.
  *
- * @see theme_pager()
- *
- * @ingroup themeable
+ * @see template_preprocess_pager()
  */
-function theme_pager_link($variables) {
+function template_preprocess_pager_link(&$variables) {
   $text = $variables['text'];
   $page_new = $variables['page_new'];
   $element = $variables['element'];
@@ -377,7 +385,7 @@ function theme_pager_link($variables) {
     }
   }
 
-  return l($text, current_path(), array('query' => $query, 'attributes' => $attributes));
+  $variables['link'] = l($text, current_path(), array('query' => $query, 'attributes' => $attributes));
 }
 
 /**
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 0347dbe..09c3460 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -3211,21 +3211,11 @@ function drupal_common_theme() {
     // From pager.inc.
     'pager' => array(
       'variables' => array('tags' => array(), 'element' => 0, 'parameters' => array(), 'quantity' => 9),
-    ),
-    'pager_first' => array(
-      'variables' => array('text' => NULL, 'element' => 0, 'parameters' => array()),
-    ),
-    'pager_previous' => array(
-      'variables' => array('text' => NULL, 'element' => 0, 'interval' => 1, 'parameters' => array()),
-    ),
-    'pager_next' => array(
-      'variables' => array('text' => NULL, 'element' => 0, 'interval' => 1, 'parameters' => array()),
-    ),
-    'pager_last' => array(
-      'variables' => array('text' => NULL, 'element' => 0, 'parameters' => array()),
+      'template' => 'pager',
     ),
     'pager_link' => array(
       'variables' => array('text' => NULL, 'page_new' => NULL, 'element' => NULL, 'parameters' => array(), 'attributes' => array()),
+      'template' => 'pager-link',
     ),
     // From menu.inc.
     'menu_link' => array(
diff --git a/core/modules/system/css/system.theme.css b/core/modules/system/css/system.theme.css
index c67d1a1..adc9b3a 100644
--- a/core/modules/system/css/system.theme.css
+++ b/core/modules/system/css/system.theme.css
@@ -177,7 +177,7 @@ abbr.form-required, abbr.tabledrag-changed, abbr.ajax-changed {
 }
 
 /**
- * Markup generated by theme_pager().
+ * Markup generated by pager.html.twig.
  */
 .item-list .pager {
   clear: both;
diff --git a/core/modules/system/templates/pager-link.html.twig b/core/modules/system/templates/pager-link.html.twig
new file mode 100644
index 0000000..10fdb04
--- /dev/null
+++ b/core/modules/system/templates/pager-link.html.twig
@@ -0,0 +1,16 @@
+{#
+/**
+ * @file
+ * Default theme implementation to display a pager link.
+ *
+ * Available variables:
+ * - link: The pager link.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_pager_link()
+ *
+ * @ingroup themeable
+ */
+ @todo Revisit this template after http://drupal.org/node/1595614 is resolved.
+#}
+{{ link }}
diff --git a/core/modules/system/templates/pager.html.twig b/core/modules/system/templates/pager.html.twig
new file mode 100644
index 0000000..b8274a7
--- /dev/null
+++ b/core/modules/system/templates/pager.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Default theme implementation to display a pager.
+ *
+ * Available variables:
+ * - items: List of pager items.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_pager()
+ *
+ * @ingroup themeable
+ */
+#}
+{% if items %}
+  <h2 class="element-invisible">{{ 'Pages'|t }}</h2>
+  {{ items }}
+{% endif %}
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/pager/Full.php b/core/modules/views/lib/Drupal/views/Plugin/views/pager/Full.php
index 08a5978..b075bed 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/pager/Full.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/pager/Full.php
@@ -82,7 +82,8 @@ public function summaryTitle() {
    */
   function render($input) {
     $pager_theme = views_theme_functions('pager', $this->view, $this->view->display_handler->display);
-    // The 0, 1, 3, 4 index are correct. See theme_pager documentation.
+    // The 0, 1, 3, 4 indexes are correct. See the template_preprocess_pager()
+    // documentation.
     $tags = array(
       0 => $this->options['tags']['first'],
       1 => $this->options['tags']['previous'],
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/pager/Mini.php b/core/modules/views/lib/Drupal/views/Plugin/views/pager/Mini.php
index 561a2ff..a22eb6c 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/pager/Mini.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/pager/Mini.php
@@ -92,7 +92,7 @@ public function postExecute(&$result) {
    * Overrides \Drupal\views\Plugin\views\pager\PagerPluginBase::render().
    */
   function render($input) {
-    // The 1, 3 index are correct, see theme_pager().
+    // The 1, 3 indexes are correct, see template_preprocess_pager().
     $tags = array(
       1 => $this->options['tags']['previous'],
       3 => $this->options['tags']['next'],
