diff --git a/core/modules/layout/layout.admin.css b/core/modules/layout/layout.admin.css
new file mode 100644
index 0000000..05574d9
--- /dev/null
+++ b/core/modules/layout/layout.admin.css
@@ -0,0 +1,26 @@
+.layout-display {
+  background: rgb(224, 224, 224);
+}
+
+.layout-region-demonstration {
+  color: white;
+  margin: 3px;
+  padding: 10px;
+  text-transform: uppercase;
+  font-size: 0.8em;
+
+  background-image: linear-gradient(bottom, rgb(70,70,71) 40%, rgb(91,91,94) 70%, rgb(125,124,125) 88%);
+  background-image: -o-linear-gradient(bottom, rgb(70,70,71) 40%, rgb(91,91,94) 70%, rgb(125,124,125) 88%);
+  background-image: -moz-linear-gradient(bottom, rgb(70,70,71) 40%, rgb(91,91,94) 70%, rgb(125,124,125) 88%);
+  background-image: -webkit-linear-gradient(bottom, rgb(70,70,71) 40%, rgb(91,91,94) 70%, rgb(125,124,125) 88%);
+  background-image: -ms-linear-gradient(bottom, rgb(70,70,71) 40%, rgb(91,91,94) 70%, rgb(125,124,125) 88%);
+
+  background-image: -webkit-gradient(
+    linear,
+    left bottom,
+    left top,
+    color-stop(0.4, rgb(70,70,71)),
+    color-stop(0.7, rgb(91,91,94)),
+    color-stop(0.88, rgb(125,124,125))
+  );
+}
diff --git a/core/modules/layout/layout.admin.inc b/core/modules/layout/layout.admin.inc
new file mode 100644
index 0000000..2b7f913
--- /dev/null
+++ b/core/modules/layout/layout.admin.inc
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @file
+ * Administration functions for layouts.
+ */
+
+/**
+ * Page callback: Presents list of layouts.
+ *
+ * @see layout_menu()
+ */
+function layout_page_list() {
+  // Get list of layouts defined by enabled modules and themes.
+  $layouts = layout_manager()->getDefinitions();
+
+  $rows = array();
+  $header = array(t('Name'), t('Source'));
+  foreach ($layouts as $name => $layout) {
+    $provider_info = system_get_info($layout['provider']['type'], $layout['provider']['provider']);
+
+    // Build table columns for this row.
+    $row = array();
+    $row['name'] = l($layout['title'], 'admin/structure/templates/manage/' . $name);
+    // Type can either be 'module' or 'theme'.
+    $row['provider'] = t('@name @type', array('@name' => $provider_info['name'], '@type' => t($layout['provider']['type'])));
+
+    $rows[] = $row;
+  }
+
+  $build = array();
+  $build['table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+  );
+  return $build;
+
+  // Ensure the provider types are translatable. These do not need to run,
+  // just inform the static code parser of these source strings.
+  t('module');
+  t('theme');
+}
+
+/**
+ * Page callback: Demonstrate a layout template.
+ *
+ * @see layout_menu()
+ */
+function layout_page_view($key) {
+  $layout = layout_manager()->getDefinition($key);
+  drupal_set_title(t('View template %name', array('%name' => $layout['title'])), PASS_THROUGH);
+
+  // Render the layout in an admin context with region demonstrations.
+  $instance = layout_manager()->createInstance($key, array());
+  $regions = $instance->getRegions();
+  foreach ($regions as $region => $title) {
+    $regions[$region] = '<div class="layout-region-demonstration">' . $title . '</div>';
+  }
+  $build['demonstration'] = array(
+    '#type' => 'markup',
+    '#markup' => $instance->renderLayout(TRUE, $regions),
+  );
+  $build['#attached']['css'][] = drupal_get_path('module', 'layout') . '/layout.admin.css';
+  return $build;
+}
diff --git a/core/modules/layout/layout.module b/core/modules/layout/layout.module
index 7d82798..f4fb110 100644
--- a/core/modules/layout/layout.module
+++ b/core/modules/layout/layout.module
@@ -6,6 +6,48 @@
  */
 
 /**
+ * Implements hook_menu().
+ */
+function layout_menu() {
+  $items['admin/structure/templates'] = array(
+    'title' => 'Templates',
+    'description' => 'Overview of the list of layout templates available.',
+    'page callback' => 'layout_page_list',
+    'access callback' => 'user_access',
+    'access arguments' => array('administer layouts'),
+    'file' => 'layout.admin.inc',
+  );
+  $items['admin/structure/templates/manage/%'] = array(
+    'title' => 'View template',
+    'page callback' => 'layout_page_view',
+    'page arguments' => array(4),
+    'access callback' => 'layout_user_access',
+    'access arguments' => array(4),
+    'file' => 'layout.admin.inc',
+  );
+  return $items;
+}
+
+/**
+ * Menu access callback. Check for layout existance.
+ */
+function layout_user_access($key) {
+  return (user_access('administer layouts') && layout_manager()->getDefinition($key));
+}
+
+/**
+ * Implements hook_permission().
+ */
+function layout_permission() {
+  return array(
+    'administer layouts' => array(
+      'title' => t('Administer templates'),
+      'description' => t('Access administration functions for templates.'),
+    ),
+  );
+}
+
+/**
  * Get the layout plugin manager instance.
  *
  * @return Drupal\layout\Plugin\Type\LayoutManager
diff --git a/core/modules/layout/lib/Drupal/layout/Plugin/Derivative/Layout.php b/core/modules/layout/lib/Drupal/layout/Plugin/Derivative/Layout.php
index ce82c65..a6c4ea9 100644
--- a/core/modules/layout/lib/Drupal/layout/Plugin/Derivative/Layout.php
+++ b/core/modules/layout/lib/Drupal/layout/Plugin/Derivative/Layout.php
@@ -106,6 +106,7 @@ protected function iterateDirectories($dir, $provider) {
         $this->derivatives[$key] = $directory->read($fileinfo->getBasename('.yml'));
         $this->derivatives[$key]['theme'] = $key;
         $this->derivatives[$key]['path'] = $fileinfo->getPath();
+        $this->derivatives[$key]['provider'] = $provider;
         // If the layout author didn't specify a template name, assume the same
         // name as the yml file.
         if (!isset($this->derivatives[$key]['template'])) {
diff --git a/core/modules/layout/lib/Drupal/layout/Plugin/LayoutInterface.php b/core/modules/layout/lib/Drupal/layout/Plugin/LayoutInterface.php
index 5b874f6..66f0184 100644
--- a/core/modules/layout/lib/Drupal/layout/Plugin/LayoutInterface.php
+++ b/core/modules/layout/lib/Drupal/layout/Plugin/LayoutInterface.php
@@ -16,15 +16,21 @@
    * Returns a list of regions.
    *
    * @return array
-   *   An array of region machine names.
+   *   An array of region labels keyed by region machine names.
    */
   public function getRegions();
 
   /**
    * Renders layout and returns the rendered markup.
    *
+   * @param boolean $admin
+   *   TRUE if the rendered layout is displayed in an administrative context,
+   *   FALSE otherwise.
+   * @param array $regions
+   *   An array of region render arrays keyed by region machine names.
+   *
    * @return string
    *   Rendered HTML output from the layout.
    */
-  public function renderLayout();
+  public function renderLayout($admin = FALSE, $regions = array());
 }
diff --git a/core/modules/layout/lib/Drupal/layout/Plugin/layout/layout/StaticLayout.php b/core/modules/layout/lib/Drupal/layout/Plugin/layout/layout/StaticLayout.php
index 4819595..d02f428 100644
--- a/core/modules/layout/lib/Drupal/layout/Plugin/layout/layout/StaticLayout.php
+++ b/core/modules/layout/lib/Drupal/layout/Plugin/layout/layout/StaticLayout.php
@@ -78,7 +78,7 @@ public function getAdminScriptFiles() {
   /**
    * Implements Drupal\layout\Plugin\LayoutInterface::renderLayout().
    */
-  public function renderLayout($admin = FALSE) {
+  public function renderLayout($admin = FALSE, $regions = array()) {
     $definition = $this->getDefinition();
 
     // Assemble a render array with the regions and attached CSS/JS.
@@ -89,10 +89,8 @@ public function renderLayout($admin = FALSE) {
 
     // Render all regions needed for this layout.
     foreach ($this->getRegions() as $region => $title) {
-      // @todo This is just stub code to fill in regions with stuff for now.
-      // When blocks are related to layouts and not themes, we can make this
-      // really be filled in with blocks.
-      $build['#content'][$region] = '<h3>' . $title . '</h3>';
+      // Initialize regions which were not provided as empty.
+      $build['#content'][$region] = empty($regions[$region]) ? '' : $regions[$region];
     }
 
     // Fill in attached CSS and JS files based on metadata.
diff --git a/core/modules/layout/tests/layout_test.module b/core/modules/layout/tests/layout_test.module
index 52ab4a3..b897ea2 100644
--- a/core/modules/layout/tests/layout_test.module
+++ b/core/modules/layout/tests/layout_test.module
@@ -28,6 +28,13 @@ function layout_test_page() {
   $theme = 'layout_test_theme';
   theme_enable(array($theme));
   $layout = layout_manager()->createInstance('static_layout:layout_test_theme__two-col');
+
+  // Add sample content in the regions that is looked for in the tests.
+  $regions = $layout->getRegions();
+  foreach ($regions as $region => $title) {
+    $regions[$region] = '<h3>' . $title . '</h3>';
+  }
+
   return $layout->renderLayout();
 }
 
