diff --git a/core/modules/page/config/page.page.about.yml b/core/modules/page/config/page.page.about.yml
new file mode 100644
index 0000000..7ccc990
--- /dev/null
+++ b/core/modules/page/config/page.page.about.yml
@@ -0,0 +1,4 @@
+id: about
+label: 'About us'
+path: "about-us"
+layout: 'static_layout:layout__two-col'
diff --git a/core/modules/page/config/page.page.news.yml b/core/modules/page/config/page.page.news.yml
new file mode 100644
index 0000000..47f9aac
--- /dev/null
+++ b/core/modules/page/config/page.page.news.yml
@@ -0,0 +1,4 @@
+id: news
+label: 'News'
+path: "news"
+layout: 'static_layout:layout__one-col'
diff --git a/core/modules/page/lib/Drupal/page/PageFormController.php b/core/modules/page/lib/Drupal/page/PageFormController.php
new file mode 100644
index 0000000..02f41fb
--- /dev/null
+++ b/core/modules/page/lib/Drupal/page/PageFormController.php
@@ -0,0 +1,97 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\page\PageFormController.
+ */
+
+namespace Drupal\page;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityFormController;
+use Drupal\page\Plugin\Core\Entity\Page;
+
+/**
+ * Form controller for the page edit/add forms.
+ */
+class PageFormController extends EntityFormController {
+
+  /**
+   * Overrides Drupal\Core\Entity\EntityFormController::form().
+   */
+  public function form(array $form, array &$form_state, EntityInterface $page) {
+    $form['label'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Page title'),
+      '#maxlength' => 255,
+      '#default_value' => $page->label(),
+      '#description' => t("Example: 'Latest news' or 'About us'."),
+      '#required' => TRUE,
+    );
+    $form['id'] = array(
+      '#type' => 'machine_name',
+      '#default_value' => $page->id(),
+      '#machine_name' => array(
+        'exists' => 'page_load',
+        'source' => array('label'),
+      ),
+      '#disabled' => !$page->isNew(),
+    );
+    $form['path'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Page path'),
+      '#default_value' => $page->path,
+      '#size' => 40,
+      '#field_prefix' => url(NULL, array('absolute' => TRUE)),
+    );
+
+    // Get list of layouts and expose that for page layout selection.
+    $layouts = drupal_container()->get('plugin.manager.layout')->getDefinitions();
+    $layout_options = array();
+    foreach ($layouts as $key => $layout) {
+      $layout_options[$key] = $layout['title'];
+    }
+    $form['layout'] = array(
+      '#type' => 'select',
+      '#title' => t('Layout'),
+      '#default_value' => isset($page->layout) ? $page->layout : '',
+      '#options' => $layout_options,
+    );
+
+    return parent::form($form, $form_state, $page);
+  }
+
+  /**
+   * Overrides Drupal\Core\Entity\EntityFormController::actions().
+   */
+  protected function actions(array $form, array &$form_state) {
+    // Only includes a Save action for the entity, no direct Delete button.
+    return array(
+      'submit' => array(
+        '#value' => t('Save'),
+        '#validate' => array(
+          array($this, 'validate'),
+        ),
+        '#submit' => array(
+          array($this, 'submit'),
+          array($this, 'save'),
+        ),
+      ),
+    );
+  }
+
+  /**
+   * Overrides Drupal\Core\Entity\EntityFormController::save().
+   */
+  public function save(array $form, array &$form_state) {
+    $page = $this->getEntity($form_state);
+    $page->save();
+
+    watchdog('page', 'Landing page @label saved.', array('@label' => $page->label()), WATCHDOG_NOTICE);
+    drupal_set_message(t('Landing page %label saved.', array('%label' => $page->label())));
+
+    $form_state['redirect'] = 'admin/content/pages';
+  }
+
+}
+
diff --git a/core/modules/page/lib/Drupal/page/PageListController.php b/core/modules/page/lib/Drupal/page/PageListController.php
new file mode 100644
index 0000000..6be850d
--- /dev/null
+++ b/core/modules/page/lib/Drupal/page/PageListController.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\page\PageListController.
+ */
+
+namespace Drupal\page;
+
+use Drupal\Core\Config\Entity\ConfigEntityListController;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityStorageControllerInterface;
+use Drupal\page\Plugin\Core\Entity\Page;
+
+/**
+ * Provides a listing of pages.
+ */
+class PageListController extends ConfigEntityListController {
+
+  /**
+   * Overrides Drupal\Core\Entity\EntityListController::buildHeader();
+   *
+   * Replace machine name with path and layout.
+   */
+  public function buildHeader() {
+    $row['label'] = t('Title');
+    $row['paths'] = t('Path');
+    $row['layout'] = t('Layout');
+    $row['operations'] = t('Operations');
+    return $row;
+  }
+
+  /**
+   * Overrides Drupal\Core\Entity\EntityListController::buildRow();
+   *
+   * Replace machine name with path and layout.
+   */
+  public function buildRow(EntityInterface $entity) {
+    $row['label'] = $entity->label();
+    $row['path'] = check_plain($entity->path);
+    $layout = drupal_container()->get('plugin.manager.layout')->getDefinition($entity->layout);
+    $row['layout'] = check_plain($layout['title']);
+    $operations = $this->buildOperations($entity);
+    $row['operations']['data'] = $operations;
+    return $row;
+  }
+
+}
diff --git a/core/modules/page/lib/Drupal/page/Plugin/Core/Entity/Page.php b/core/modules/page/lib/Drupal/page/Plugin/Core/Entity/Page.php
new file mode 100644
index 0000000..aa0663e
--- /dev/null
+++ b/core/modules/page/lib/Drupal/page/Plugin/Core/Entity/Page.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\page\Plugin\Core\Entity\Page.
+ */
+
+namespace Drupal\page\Plugin\Core\Entity;
+
+use Drupal\Core\Config\Entity\ConfigEntityBase;
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+
+
+/**
+ * Defines the page entity class.
+ *
+ * @Plugin(
+ *   id = "page",
+ *   label = @Translation("Page"),
+ *   module = "page",
+ *   controller_class =  "Drupal\Core\Config\Entity\ConfigStorageController",
+ *   form_controller_class = {
+ *     "default" = "Drupal\page\PageFormController",
+ *   },
+ *   list_controller_class = "Drupal\page\PageListController",
+ *   list_path = "admin/content/pages",
+ *   uri_callback = "page_uri",
+ *   config_prefix = "page.page",
+ *   entity_keys = {
+ *     "id" = "id",
+ *     "label" = "label",
+ *     "uuid" = "uuid",
+ *   }
+ * )
+ */
+class Page extends ConfigEntityBase {
+
+  /**
+   * The page ID (machine name).
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * The page UUID.
+   *
+   * @var string
+   */
+  public $uuid;
+
+  /**
+   * The page title.
+   *
+   * @var string
+   */
+  public $label;
+
+  /**
+   * Path associated with this page.
+   *
+   * @var string
+   */
+  public $path;
+
+  /**
+   * Layout machine name associated with this page.
+   *
+   * @var string
+   */
+  public $layout;
+
+}
diff --git a/core/modules/page/page.admin.inc b/core/modules/page/page.admin.inc
new file mode 100644
index 0000000..bc1f42c
--- /dev/null
+++ b/core/modules/page/page.admin.inc
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @file
+ * Administration functions to maintain a set of pages using layouts.
+ */
+
+use Drupal\page\Plugin\Core\Entity\Page;
+
+/**
+ * Page callback: Presents list of landing pages.
+ *
+ * @see page_menu()
+ */
+function page_page_list() {
+  $controller = entity_list_controller('page');
+  return $controller->render();
+}
+
+/**
+ * Page callback: Presents the page editing form.
+ *
+ * @see page_menu()
+ */
+function page_page_edit(Page $page) {
+  drupal_set_title(t('<em>Edit landing page</em> @label', array('@label' => $page->label())), PASS_THROUGH);
+  return entity_get_form($page);
+}
+
+/**
+ * Page callback: Provides the new page addition form.
+ *
+ * @see page_menu()
+ */
+function page_page_add() {
+  $page = entity_create('page', array());
+  return entity_get_form($page);
+}
+
+/**
+ * Page callback: Form constructor for page deletion confirmation form.
+ *
+ * @see page_menu()
+ */
+function page_confirm_delete($form, &$form_state, Page $page) {
+  // Always provide entity id in the same form key as in the entity edit form.
+  $form['id'] = array('#type' => 'value', '#value' => $page->id());
+  $form_state['page'] = $page;
+  return confirm_form($form,
+    t('Are you sure you want to remove the landing page %title?', array('%title' => $page->label())),
+    'admin/content/pages',
+    t('This action cannot be undone.'),
+    t('Delete'),
+    t('Cancel')
+  );
+}
+
+/**
+ * Form submission handler for page_confirm_delete().
+ */
+function page_confirm_delete_submit($form, &$form_state) {
+  $page = $form_state['page'];
+  $page->delete();
+  drupal_set_message(t('Landing page %label has been deleted.', array('%label' => $page->label())));
+  watchdog('page', 'Landing page %label has been deleted.', array('%label' => $page->label()), WATCHDOG_NOTICE);
+  $form_state['redirect'] = 'admin/content/pages';
+}
diff --git a/core/modules/page/page.info b/core/modules/page/page.info
new file mode 100644
index 0000000..d67d3f5
--- /dev/null
+++ b/core/modules/page/page.info
@@ -0,0 +1,8 @@
+name = Landing pages
+description = Makes it possible to set up landing pages with distinct layouts.
+package = Core
+version = VERSION
+core = 8.x
+dependencies[] = config
+dependencies[] = layout
+configure = admin/content/pages
diff --git a/core/modules/page/page.module b/core/modules/page/page.module
new file mode 100644
index 0000000..ab31a1a
--- /dev/null
+++ b/core/modules/page/page.module
@@ -0,0 +1,112 @@
+<?php
+
+/**
+ * @file
+ * Module to maintain a set of landing pages using layouts.
+ */
+
+use Drupal\page\Plugin\Core\Entity\Page;
+
+/**
+ * Implements hook_help().
+ */
+function page_help($path, $arg) {
+  switch($path) {
+    case 'admin/help#page':
+      return '<p>' . t('The page module lets you create landing pages with layouts and blocks configured specifically for the page.') . '</p>';
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function page_menu() {
+  $items['admin/content/pages'] = array(
+    'title' => 'Landing pages',
+    'page callback' => 'page_page_list',
+    'access callback' => 'user_access',
+    'access arguments' => array('administer pages'),
+    'file' => 'page.admin.inc',
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 20,
+  );
+  $items['admin/content/pages/add'] = array(
+    'title' => 'Add landing page',
+    'page callback' => 'page_page_add',
+    'access callback' => 'user_access',
+    'access arguments' => array('administer pages'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'page.admin.inc',
+  );
+  $items['admin/content/pages/manage/%page'] = array(
+    'title' => 'Edit landing page',
+    'page callback' => 'page_page_edit',
+    'page arguments' => array(4),
+    'access callback' => 'user_access',
+    'access arguments' => array('administer pages'),
+    'type' => MENU_CALLBACK,
+    'file' => 'page.admin.inc',
+  );
+  $items['admin/content/pages/manage/%page/edit'] = array(
+    'title' => 'Edit',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['admin/content/pages/manage/%page/delete'] = array(
+    'title' => 'Delete',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('page_confirm_delete', 4),
+    'access callback' => 'user_access',
+    'access arguments' => array('administer pages'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'page.admin.inc',
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_permission().
+ */
+function page_permission() {
+  return array(
+    'administer pages' => array(
+      'title' => t('Administer pages'),
+      'description' => t('Manage a set of landing pages with distinct layouts on the site.'),
+    ),
+  );
+}
+
+/**
+ * Entity URI callback.
+ *
+ * @param Drupal\page\Page $page
+ *   Page configuration entity instance.
+ *
+ * @return array
+ *   Entity URI information.
+ */
+function page_uri(Page $page) {
+  return array(
+    'path' => 'admin/content/pages/manage/' . $page->id(),
+  );
+}
+
+/**
+ * Load one page object by its identifier.
+ *
+ * @return Drupal\page\Page
+ *   Page configuration entity instance.
+ */
+function page_load($id) {
+  return entity_load('page', $id);
+}
+
+/**
+ * Load all page objects.
+ *
+ * @return array
+ *   List of Drupal\page\Page instances keyed by id.
+ */
+function page_load_all() {
+  return entity_load_multiple('page');
+}
