 pager_example/pager_example.info.yml              |  7 +++
 pager_example/pager_example.links.menu.yml        |  3 +
 pager_example/pager_example.module                | 19 ++++++
 pager_example/pager_example.routing.yml           |  6 ++
 pager_example/src/Controller/PagerExamplePage.php | 70 +++++++++++++++++++++++
 pager_example/src/Tests/PagerExampleTest.php      | 65 +++++++++++++++++++++
 6 files changed, 170 insertions(+)

diff --git a/pager_example/pager_example.info.yml b/pager_example/pager_example.info.yml
new file mode 100644
index 0000000..0bb25ac
--- /dev/null
+++ b/pager_example/pager_example.info.yml
@@ -0,0 +1,7 @@
+name: Pager Example
+type: module
+description: 'The example output nodes with pager.'
+package: Example modules
+core: 8.x
+dependencies:
+  - node
diff --git a/pager_example/pager_example.links.menu.yml b/pager_example/pager_example.links.menu.yml
new file mode 100644
index 0000000..3edfd40
--- /dev/null
+++ b/pager_example/pager_example.links.menu.yml
@@ -0,0 +1,3 @@
+pager_example.page:
+  title: Pager example
+  route_name: pager_example.page
diff --git a/pager_example/pager_example.module b/pager_example/pager_example.module
new file mode 100644
index 0000000..c67102c
--- /dev/null
+++ b/pager_example/pager_example.module
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * @file
+ * Pager Example.
+ */
+
+/**
+ * @defgroup pager_example Example: Pager
+ * @ingroup examples
+ * @{
+ * Output node in the table with pagination.
+ *
+ * @see \Drupal\Core\Database\Query\PagerSelectExtender
+ */
+
+/**
+ * @} End of "defgroup pager_example".
+ */
diff --git a/pager_example/pager_example.routing.yml b/pager_example/pager_example.routing.yml
new file mode 100644
index 0000000..f800c9e
--- /dev/null
+++ b/pager_example/pager_example.routing.yml
@@ -0,0 +1,6 @@
+pager_example.page:
+  path: 'examples/pager_example'
+  defaults:
+    _controller: '\Drupal\pager_example\Controller\PagerExamplePage::getContent'
+  requirements:
+    _permission: 'access content'
diff --git a/pager_example/src/Controller/PagerExamplePage.php b/pager_example/src/Controller/PagerExamplePage.php
new file mode 100644
index 0000000..c46155c
--- /dev/null
+++ b/pager_example/src/Controller/PagerExamplePage.php
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\pager_example\Controller\PagerExamplePage.
+ */
+
+namespace Drupal\pager_example\Controller;
+
+use Drupal\Core\Controller\ControllerBase;
+
+
+/**
+ * Controller for pager_example.page route.
+ */
+class PagerExamplePage extends ControllerBase {
+
+  /**
+   * Content callback for the pager_example.page route.
+   */
+  public function getContent() {
+
+    $count_nodes = db_select('node', 'n')
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+
+    if ($count_nodes == 0) {
+      return array(
+        '#markup' => $this->t('No node for output. Please <a href="@url">create a node</a>.',
+          array(
+            '@url' => \Drupal::url('node.add_page'),
+          )
+        )
+      );
+    }
+
+    $pager_data = db_select('node', 'n')
+      ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
+      ->fields('n', array('nid'))
+      ->orderBy('n.nid', 'DESC')
+      ->limit(2)
+      ->execute()
+      ->fetchAllAssoc('nid');
+
+    $rows = array();
+
+    $nodes = entity_load_multiple('node', array_keys($pager_data));
+
+    foreach ($nodes as $node) {
+      $rows[] = array(
+        'nid' => $node->id(),
+        'title' => $node->getTitle(),
+      );
+    }
+
+    $page['pager_example'] = array(
+      '#rows' => $rows,
+      '#header' => array(t('NID'), t('Title')),
+      '#type' => 'table',
+      '#empty' => t('No content available.'),
+    );
+    $page['pager'] = array(
+      '#type' => 'pager',
+      '#weight' => 10,
+    );
+
+    return $page;
+  }
+}
diff --git a/pager_example/src/Tests/PagerExampleTest.php b/pager_example/src/Tests/PagerExampleTest.php
new file mode 100644
index 0000000..9c6f4b6
--- /dev/null
+++ b/pager_example/src/Tests/PagerExampleTest.php
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\pager_example\Tests\PagerExampleTest.
+ */
+
+namespace Drupal\pager_example\Tests;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests paging.
+ *
+ * @group pager_example
+ */
+class PagerExampleTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('pager_example', 'node');
+
+  /**
+   * The main user for testing.
+   *
+   * @var object
+   */
+  protected $user;
+
+  protected function setUp() {
+    parent::setUp();
+  }
+
+  /**
+   * Confirms nodes paging works correctly on page "pager_example".
+   */
+  function testPagerExamplePage() {
+    $permissions = array('access content');
+    $this->user = $this->drupalCreateUser($permissions);
+    $this->drupalLogin($this->user);
+
+    $nodes = array();
+    $nodes[] = $this->drupalCreateNode();
+
+    $this->drupalGet('examples/pager_example');
+    $this->assertNoRaw(t('next'), 'Paging links not found.');
+
+    // Create new 5 nodes.
+    for ($i = 1; $i <= 5; $i++) {
+      $nodes[] = $this->drupalCreateNode();
+    }
+
+    // Check the first page.
+    $this->drupalGet('examples/pager_example');
+    $this->assertRaw(t('next'), 'Paging links found.');
+    $this->assertRaw($nodes[5]->getTitle(), 'Node 6 appears on page 1.');
+
+    // Check the last page.
+    $this->drupalGet('examples/pager_example', array('query' => array('page' => 3)));
+    $this->assertRaw($nodes[0]->getTitle(), 'Node 1 appears on page 4.');
+  }
+}
