diff --git a/lib/Drupal/views/View.php b/lib/Drupal/views/View.php
index 371bc7d..02c03d2 100644
--- a/lib/Drupal/views/View.php
+++ b/lib/Drupal/views/View.php
@@ -21,9 +21,7 @@ use Drupal\views\Plugin\Type\ViewsPluginManager;
  * An object to contain all of the data to generate a view, plus the member
  * functions to build the view query, execute the query and render the output.
  */
-class View extends ViewsDbObject {
-
-  var $db_table = 'views_view';
+class View extends ViewStorage {
 
   var $base_table = 'node';
 
@@ -37,13 +35,6 @@ class View extends ViewsDbObject {
   var $name = "";
 
   /**
-   * The id of the view, which is used only for views in the database.
-   *
-   * @var number
-   */
-  var $vid;
-
-  /**
    * The description of the view, which is used only in the interface.
    *
    * @var string
@@ -269,17 +260,6 @@ class View extends ViewsDbObject {
   protected $response = NULL;
 
   /**
-   * Constructor
-   */
-  function __construct() {
-    parent::init();
-    // Make sure all of our sub objects are arrays.
-    foreach ($this->db_objects() as $key => $object) {
-      $this->$key = array();
-    }
-  }
-
-  /**
    * Perform automatic updates when loading or importing a view.
    *
    * Over time, some things about Views or Drupal data has changed.
@@ -302,14 +282,6 @@ class View extends ViewsDbObject {
   }
 
   /**
-   * Returns the complete list of dependent objects in a view, for the purpose
-   * of initialization and loading/saving to/from the database.
-   */
-  static function db_objects() {
-    return array('display' => 'Display');
-  }
-
-  /**
    * Set the arguments that come to this view. Usually from the URL
    * but possibly from elsewhere.
    */
diff --git a/lib/Drupal/views/ViewStorage.php b/lib/Drupal/views/ViewStorage.php
new file mode 100644
index 0000000..e78622c
--- /dev/null
+++ b/lib/Drupal/views/ViewStorage.php
@@ -0,0 +1,265 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\views\ViewStorage.
+ */
+
+namespace Drupal\views;
+
+use Drupal\config\ConfigurableBase;
+
+class ViewStorage extends ConfigurableBase {
+
+  /**
+   * @var string
+   */
+  public $db_table;
+
+  /**
+   * Add a new display handler to the view, automatically creating an id.
+   *
+   * @param $type
+   *   The plugin type from the views plugin data. Defaults to 'page'.
+   * @param $title
+   *   The title of the display; optional, may be filled in from default.
+   * @param $id
+   *   The id to use.
+   * @return
+   *   The key to the display in $view->display, so that the new display
+   *   can be easily located.
+   */
+  function add_display($type = 'page', $title = NULL, $id = NULL) {
+    if (empty($type)) {
+      return FALSE;
+    }
+
+    $plugin = views_fetch_plugin_data('display', $type);
+    if (empty($plugin)) {
+      $plugin['title'] = t('Broken');
+    }
+
+
+    if (empty($id)) {
+      $id = $this->generate_display_id($type);
+      if ($id !== 'default') {
+        preg_match("/[0-9]+/", $id, $count);
+        $count = $count[0];
+      }
+      else {
+        $count = '';
+      }
+
+      if (empty($title)) {
+        if ($count > 1) {
+          $title = $plugin['title'] . ' ' . $count;
+        }
+        else {
+          $title = $plugin['title'];
+        }
+      }
+    }
+
+    $display_options = array(
+      'type' => $type,
+      'id' => $id,
+      'display_title' => $title,
+    );
+
+    // Create the new display object
+    $display = new ViewsDisplay($display_options);
+
+    // Add the new display object to the view.
+    $this->display[$id] = $display;
+    return $id;
+  }
+
+  /**
+   * Generate a display id of a certain plugin type.
+   *
+   * @param $type
+   *   Which plugin should be used for the new display id.
+   */
+  function generate_display_id($type) {
+    // 'default' is singular and is unique, so just go with 'default'
+    // for it. For all others, start counting.
+    if ($type == 'default') {
+      return 'default';
+    }
+    // Initial id.
+    $id = $type . '_1';
+    $count = 1;
+
+    // Loop through IDs based upon our style plugin name until
+    // we find one that is unused.
+    while (!empty($this->display[$id])) {
+      $id = $type . '_' . ++$count;
+    }
+
+    return $id;
+  }
+
+  /**
+   * Generates a unique ID for an item.
+   *
+   * These items are typically fields, filters, sort criteria, or arguments.
+   *
+   * @param $requested_id
+   *   The requested ID for the item.
+   * @param $existing_items
+   *   An array of existing items, keyed by their IDs.
+   *
+   * @return
+   *   A unique ID. This will be equal to $requested_id if no item with that ID
+   *   already exists. Otherwise, it will be appended with an integer to make
+   *   it unique, e.g. "{$requested_id}_1", "{$requested_id}_2", etc.
+   */
+  public static function generate_item_id($requested_id, $existing_items) {
+    $count = 0;
+    $id = $requested_id;
+    while (!empty($existing_items[$id])) {
+      $id = $requested_id . '_' . ++$count;
+    }
+    return $id;
+  }
+
+  /**
+   * Create a new display and a display handler for it.
+   * @param $type
+   *   The plugin type from the views plugin data. Defaults to 'page'.
+   * @param $title
+   *   The title of the display; optional, may be filled in from default.
+   * @param $id
+   *   The id to use.
+   * @return views_plugin_display
+   *   A reference to the new handler object.
+   */
+  function &new_display($type = 'page', $title = NULL, $id = NULL) {
+    $id = $this->add_display($type, $title, $id);
+
+    // Create a handler
+    $this->display[$id]->handler = views_get_plugin('display', $this->display[$id]->display_plugin);
+    if (empty($this->display[$id]->handler)) {
+      // provide a 'default' handler as an emergency. This won't work well but
+      // it will keep things from crashing.
+      $this->display[$id]->handler = views_get_plugin('display', 'default');
+    }
+
+    if (!empty($this->display[$id]->handler)) {
+      // Initialize the new display handler with data.
+      $this->display[$id]->handler->init($this, $this->display[$id]);
+      // If this is NOT the default display handler, let it know which is
+      if ($id != 'default') {
+        $this->display[$id]->handler->default_display = &$this->display['default']->handler;
+      }
+    }
+
+    return $this->display[$id]->handler;
+  }
+
+  /**
+   * Add an item with a handler to the view.
+   *
+   * These items may be fields, filters, sort criteria, or arguments.
+   */
+  function add_item($display_id, $type, $table, $field, $options = array(), $id = NULL) {
+    $types = View::views_object_types();
+    $this->set_display($display_id);
+
+    $fields = $this->display[$display_id]->handler->get_option($types[$type]['plural']);
+
+    if (empty($id)) {
+      $id = $this->generate_item_id($field, $fields);
+    }
+
+    $new_item = array(
+      'id' => $id,
+      'table' => $table,
+      'field' => $field,
+    ) + $options;
+
+    if (!empty($types[$type]['type'])) {
+      $handler_type = $types[$type]['type'];
+    }
+    else {
+      $handler_type = $type;
+    }
+
+    $handler = views_get_handler($table, $field, $handler_type);
+
+    $fields[$id] = $new_item;
+    $this->display[$display_id]->handler->set_option($types[$type]['plural'], $fields);
+
+    return $id;
+  }
+
+  /**
+   * Get an array of items for the current display.
+   */
+  function get_items($type, $display_id = NULL) {
+    $this->set_display($display_id);
+
+    if (!isset($display_id)) {
+      $display_id = $this->current_display;
+    }
+
+    // Get info about the types so we can get the right data.
+    $types = View::views_object_types();
+    return $this->display[$display_id]->handler->get_option($types[$type]['plural']);
+  }
+
+  /**
+   * Get the configuration of an item (field/sort/filter/etc) on a given
+   * display.
+   */
+  function get_item($display_id, $type, $id) {
+    // Get info about the types so we can get the right data.
+    $types = View::views_object_types();
+    // Initialize the display
+    $this->set_display($display_id);
+
+    // Get the existing configuration
+    $fields = $this->display[$display_id]->handler->get_option($types[$type]['plural']);
+
+    return isset($fields[$id]) ? $fields[$id] : NULL;
+  }
+
+  /**
+   * Set the configuration of an item (field/sort/filter/etc) on a given
+   * display.
+   *
+   * Pass in NULL for the $item to remove an item.
+   */
+  function set_item($display_id, $type, $id, $item) {
+    // Get info about the types so we can get the right data.
+    $types = View::views_object_types();
+    // Initialize the display
+    $this->set_display($display_id);
+
+    // Get the existing configuration
+    $fields = $this->display[$display_id]->handler->get_option($types[$type]['plural']);
+    if (isset($item)) {
+      $fields[$id] = $item;
+    }
+    else {
+      unset($fields[$id]);
+    }
+
+    // Store.
+    $this->display[$display_id]->handler->set_option($types[$type]['plural'], $fields);
+  }
+
+  /**
+   * Set an option on an item.
+   *
+   * Use this only if you have just 1 or 2 options to set; if you have
+   * many, consider getting the item, adding the options and doing
+   * set_item yourself.
+   */
+  function set_item_option($display_id, $type, $id, $option, $value) {
+    $item = $this->get_item($display_id, $type, $id);
+    $item[$option] = $value;
+    $this->set_item($display_id, $type, $id, $item);
+  }
+
+}
\ No newline at end of file
diff --git a/lib/Drupal/views/ViewStorageController.php b/lib/Drupal/views/ViewStorageController.php
new file mode 100644
index 0000000..ffad4a4
--- /dev/null
+++ b/lib/Drupal/views/ViewStorageController.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\views\ViewStorageController.
+ */
+
+namespace Drupal\views;
+
+use Drupal\config\ConfigStorageController;
+
+class ViewStorageController extends ConfigStorageController {
+
+  /**
+   * Overrides Drupal\config\ConfigStorageController::attachLoad();
+   */
+  protected function attachLoad(&$queried_entities, $revision_id = FALSE) {
+    foreach ($queried_entities as $id => $entity) {
+      foreach ($entity->display as $key => $options) {
+        // Create a ViewsDisplay object using the display options.
+        $entity->display[$key] = new ViewsDisplay($options);
+      }
+    }
+  }
+
+}
\ No newline at end of file
diff --git a/lib/Drupal/views/ViewsDisplay.php b/lib/Drupal/views/ViewsDisplay.php
index af7f47a..5bcda2f 100644
--- a/lib/Drupal/views/ViewsDisplay.php
+++ b/lib/Drupal/views/ViewsDisplay.php
@@ -13,32 +13,30 @@ namespace Drupal\views;
  * This is just the database storage mechanism, and isn't terribly important
  * to the behavior of the display at all.
  */
-class ViewsDisplay extends ViewsDbObject {
+class ViewsDisplay {
 
   /**
    * The display handler itself, which has all the methods.
    *
    * @var views_plugin_display
    */
-  var $handler;
+  public $handler;
 
   /**
    * Stores all options of the display, like fields, filters etc.
    *
    * @var array
    */
-  var $display_options;
+  public $display_options;
 
-  var $db_table = 'views_display';
+  function __construct(array $display_options = array()) {
+    $this->display_options = $display_options;
 
-  function __construct($init = TRUE) {
-    parent::init($init);
-  }
-
-  function options($type, $id, $title) {
-    $this->display_plugin = $type;
-    $this->id = $id;
-    $this->display_title = $title;
+    if (!empty($display_options)) {
+      $this->display_plugin = $display_options['display_plugin'];
+      $this->id = $display_options['id'];
+      $this->display_title = $display_options['display_title'];
+    }
   }
 
 }
diff --git a/views.info b/views.info
index 94edad7..a3332e7 100644
--- a/views.info
+++ b/views.info
@@ -4,6 +4,7 @@ package = Views
 core = 8.x
 php = 5.2
 dependencies[] = ctools
+dependencies[] = config
 
 ; Always available CSS
 stylesheets[all][] = css/views.css
diff --git a/views.module b/views.module
index 765c13d..359de89 100644
--- a/views.module
+++ b/views.module
@@ -74,25 +74,28 @@ function views_temp_store() {
 }
 
 /**
- * Implements hook_ctools_exportable_info().
+ * Implements hook_entity_info().
  */
-function views_ctools_exportable_info() {
-  return array(
+function views_entity_info() {
+  $return = array(
     'view' => array(
-      'controller class' => 'Drupal\ctools\DatabaseExportableController',
-      'key' => 'name',
-      'identifier' => 'view',
-      'default hook' => 'views_default_views',
-      'bulk export' => TRUE,
-      'api' => array(
-        'owner' => 'views',
-        'api' => 'views_default',
-        'minimum_version' => '2',
-        'current_version' => '3.0',
+      'label' => t('View'),
+      'entity class' => 'Drupal\views\View',
+      'controller class' => 'Drupal\views\ViewStorageController',
+      'form controller class' => array(
+        'default' => 'Drupal\node\NodeFormController',
+      ),
+      'config prefix' => 'views.view',
+      'fieldable' => FALSE,
+      'entity keys' => array(
+        'id' => 'name',
+        'label' => 'human_name',
+        'uuid' => 'uuid',
       ),
-      'schema' => 'views_view',
     ),
   );
+
+  return $return;
 }
 
 /**
