diff --git a/core/lib/Drupal/Core/Config/Entity/Display.php b/core/lib/Drupal/Core/Config/Entity/Display.php
new file mode 100644
index 0000000..bb0a617
--- /dev/null
+++ b/core/lib/Drupal/Core/Config/Entity/Display.php
@@ -0,0 +1,190 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Core\Booze\Display.
+ */
+
+namespace Drupal\Core\Config\Entity;
+
+use Drupal\layout\Plugin\LayoutInterface;
+
+/**
+ * Configuration encapsulator that provides all the data needed by block-driven
+ * controllers to render a page.
+ */
+class Display extends ConfigEntityBase {
+
+  /**
+   * The ID (config name) identifying a specific display object.
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * The human-readable label of this display.
+   * @todo we probably don't need/want to have this.
+   *
+   * @var string
+   */
+  public $label;
+
+  /**
+   * The UUID identifying a specific display object.
+   *
+   * @var string
+   */
+  public $uuid;
+
+  /**
+   * The layout plugin instance being used to serve this page.
+   *
+   * @var Drupal\layout\Plugin\LayoutInterface
+   */
+  protected $layoutPlugin;
+
+  /**
+   * The name of the layout plugin to use.
+   *
+   * @var string
+   */
+  public $layout;
+
+  /**
+   * An array of settings to be coupled with the layout plugin to create a
+   * layout plugin instance.
+   *
+   * @var array
+   */
+  public $layoutSettings = array();
+
+  /**
+   * Storage for data sources that have been statically assigned - that is, not
+   * derived in some way from the Request.
+   *
+   * The array is keyed on the name of a data source, and the values are getters
+   * that are able to retrieve the appropriate data.
+   *
+   * @todo define how the getters work.
+   *
+   * @var array
+   */
+  public $staticData = array();
+
+  /**
+   * Contains all block configuration.
+   *
+   * There are two levels to the configuration contained herein: display-level
+   * block configuration, and then block instance configuration.
+   *
+   * Block instance configuration is stored in a separate config object. This
+   * array is keyed by the config name that uniquely identifies each block
+   * instance. At runtime, various object methods will retrieve this additional
+   * config and return it to calling code.
+   *
+   * Display-level block configuration is data that determines the behavior of
+   * a block *in this display*. The most important examples of this are the
+   * region to which the block is assigned, and its weighting in that region.
+   *
+   * @code
+   *    array(
+   *      'block1-configkey' => array(
+   *        'region' => 'content',
+   *        // store the region role name here so that we can do role conversion w/out
+   *        // needing to have access to the original layout plugin
+   *        'region-role' => 'content',
+   *        // increment by 100 so there is ALWAYS plenty of space for manual insertion
+   *        'weight' => -100,
+   *      ),
+   *      'block2-configkey' => array(
+   *        'region' => 'sidebar_first',
+   *        'region-role' => 'sidebar',
+   *        'weight' => -100,
+   *      ),
+   *      'block2-configkey' => array(
+   *        'region' => 'sidebar_first',
+   *        'region-role' => 'sidebar',
+   *        'weight' => 0,
+   *      ),
+   *      'maincontent' => array(
+   *        'region' => 'content',
+   *        'region-role' => 'content',
+   *        'weight' => -200,
+   *      ),
+   *    );
+   * @endcode
+   *
+   * @var array
+   */
+  public $blockConfig = array();
+
+  public function __construct(array $values, $entity_type) {
+    $this->layout = $values['layout'];
+    // @todo oh so much, but really, blocks for now.
+    parent::__construct($values, 'booze_display');
+  }
+
+  /**
+   * Sets the controller that should be used to serve the main page content.
+   *
+   * "Main page content" is analogous to the callback specified in
+   * 'page callback' in Drupal 6 and 7. In a blocks-driven world, such direct
+   * callbacks run a bit against the grain. However, the simplicity of
+   * implementing and understanding it is so beneficial to developer experience
+   * that we provide this 'main' content option, which simulates the old
+   * behavior by injecting a virtualized 'main' block that passes through
+   * to a specified callback.
+   *
+   * We normalize the main content block here in the configuration object so
+   * that various controllers consuming the display need not repeatedly
+   * implement this special handling for the main callback.
+   *
+   * @param Callable $callback
+   *   Any form of callable. @todo PHP 5.4 allows type hinting as Callable.
+   * @param array $args
+   *   An array of arguments to pass to the callable.
+   */
+  public function setMainContent($callback, array $args = array()) {
+    // @todo need to wrap the callback up in a passthru block
+    // @todo consider throwing an exception if this display instance doesn't appear to support main content
+  }
+
+
+  /**
+   * Returns the config info about all blocks on this display.
+   *
+   * There are two levels of configuration that are being captured here: the
+   * configuration for the block itself (i.e., config generated by a user saving
+   * the block's edit form), and configuration for how the particular block
+   * instance behaves in *this* display. The former is typically its own config
+   * object, and only a reference to that config key is stored directly on this
+   * object. The most important examples of the latter are the region in which
+   * the block is placed, and its weighting within the region.
+   *
+   * @todo we need to explore a *lot* more just how freestanding we make blocks.
+   *
+   * @return array
+   *   An array of block info, keyed on each block's config name.
+   *
+   * @todo implement batch-loading logic to try to minimize discrete queries.
+   */
+  public function getAllBlockInfo() {
+
+  }
+
+  /**
+   * Returns the layout plugin instance to be used with this display.
+   *
+   * @return Drupal\layout\Plugin\LayoutInterface
+   */
+  public function getLayoutPluginInstance() {
+    if ($this->layoutPlugin === NULL) {
+      // @todo if we're doing any magic resolution/hotswapping of layouts, this
+      // is a place it could happen.
+      $this->layoutPlugin = layout_manager()->createInstance($this->layout);
+    }
+
+    return $this->layoutPlugin;
+  }
+}
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index ea3dadc..9b5e090 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -4118,6 +4118,29 @@ function system_archiver_info() {
 }
 
 /**
+ * Implements hook_entity_info().
+ *
+ * Provides the core Display object, which contains all the info necessary for
+ * block-driven pages.
+ */
+function system_entity_info() {
+  return array(
+    'booze_display' => array(
+      'label' => t('Display'),
+      'entity class' => 'Drupal\Core\Config\Entity\Display',
+      'controller class' => 'Drupal\Core\Config\Entity\ConfigStorageController',
+      'config prefix' => 'booze.display',
+      'fieldable' => FALSE,
+      'entity keys' => array(
+        'id' => 'id',
+        'label' => 'label', // @todo may not need this if internal-only (?)
+        'uuid' => 'uuid',
+      ),
+    )
+  );
+}
+
+/**
  * Returns HTML for a confirmation form.
  *
  * By default this does not alter the appearance of a form at all,
