diff --git a/css/views-admin.bartik.css b/css/views-admin.bartik.css
index 06d0608..c6f0692 100644
--- a/css/views-admin.bartik.css
+++ b/css/views-admin.bartik.css
@@ -27,10 +27,17 @@
 }
 
 .views-displays .secondary > li a {
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
   border-radius: 5px;
 }
 
 .views-displays .secondary > li.open a {
+  -moz-border-radius: 5px 5px 0 0;
+  -webkit-border-bottom-left-radius: 0;
+  -webkit-border-bottom-right-radius: 0;
+  -webkit-border-top-left-radius: 5px;
+  -webkit-border-top-right-radius: 5px;
   border-radius: 5px 5px 0 0;
 }
 
@@ -79,7 +86,7 @@
   background-image:
     -moz-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f9f9f9 100%);
   background-image:
     -webkit-gradient(
@@ -92,13 +99,15 @@
   background-image:
     -webkit-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f9f9f9 100%);
   background-image:
     linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f9f9f9 100%);
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
   border-radius: 5px;
   padding-bottom: 1px;
   padding-top: 1px;
@@ -108,7 +117,7 @@
   background-image:
     -moz-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f1f1f1 100%);
   background-image:
     -webkit-gradient(
@@ -121,12 +130,12 @@
   background-image:
     -webkit-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f1f1f1 100%);
   background-image:
     linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f1f1f1 100%);
 }
 
@@ -144,7 +153,7 @@
   background-image:
     -moz-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f9f9f9 100%);
   background-image:
     -webkit-gradient(
@@ -157,12 +166,12 @@
   background-image:
     -webkit-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f9f9f9 100%);
   background-image:
     linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f9f9f9 100%);
 }
 
diff --git a/css/views-admin.contextual.css b/css/views-admin.contextual.css
index 0497a56..fb2d09c 100644
--- a/css/views-admin.contextual.css
+++ b/css/views-admin.contextual.css
@@ -31,6 +31,8 @@ html.js #views-live-preview div.contextual {
 /* @group List */
 
 div.contextual ul.contextual-links {
+  -moz-border-radius: 0 4px 4px 4px;
+  -webkit-border-radius: 0 4px 4px 4px;
   border-radius: 0 4px 4px 4px;
   min-width: 10em;
   padding: 6px 6px 9px 6px;
diff --git a/css/views-admin.ctools-rtl.css b/css/views-admin.ctools-rtl.css
index dcdd4ff..338b2fb 100644
--- a/css/views-admin.ctools-rtl.css
+++ b/css/views-admin.ctools-rtl.css
@@ -75,7 +75,7 @@
 
 /* Override for filter button on the views list screen */
 #ctools-export-ui-list-form .form-submit {
-  margin-left: 0;
+  margin-left: 0em;
   margin-right: auto;
 }
 
diff --git a/css/views-admin.ctools.css b/css/views-admin.ctools.css
index 91a1b80..52c8952 100644
--- a/css/views-admin.ctools.css
+++ b/css/views-admin.ctools.css
@@ -214,8 +214,8 @@ h2.ctools-collapsible-handle {
 
 /* Override for filter button on the views list screen */
 #ctools-export-ui-list-form .form-submit {
-  margin-top: 0 !important;
-  margin-right: 0;
+  margin-top: 0em !important;
+  margin-right: 0em;
 }
 
 .ctools-export-ui-row + .ctools-export-ui-row {
diff --git a/css/views-admin.seven.css b/css/views-admin.seven.css
index 8ad4eb8..d58bb1b 100644
--- a/css/views-admin.seven.css
+++ b/css/views-admin.seven.css
@@ -262,6 +262,8 @@ table th {
 
 .views-displays .secondary a {
   background-color: #f1f1f1;
+  -moz-border-radius: 7px;
+  -webkit-border-radius: 7px;
   border-radius: 7px;
   color: #008BCB;
 }
@@ -430,7 +432,7 @@ table th {
   background-image:
     -moz-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f9f9f9 100%);
   background-image:
     -webkit-gradient(
@@ -443,21 +445,23 @@ table th {
   background-image:
     -webkit-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f9f9f9 100%);
   background-image:
     linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f9f9f9 100%);
-  border-radius: 11px;
+  -moz-border-radius: 11px 11px 11px 11px;
+  -webkit-border-radius: 11px 11px 11px 11px;
+  border-radius: 11px 11px 11px 11px;
 }
 
 .ctools-button-processed:hover {
   background-image:
     -moz-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f1f1f1 100%);
   background-image:
     -webkit-gradient(
@@ -470,12 +474,12 @@ table th {
   background-image:
     -webkit-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f1f1f1 100%);
   background-image:
     linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f1f1f1 100%);
 }
 
@@ -483,7 +487,7 @@ table th {
   background-image:
     -moz-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f9f9f9 100%);
   background-image:
     -webkit-gradient(
@@ -496,12 +500,12 @@ table th {
   background-image:
     -webkit-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f9f9f9 100%);
   background-image:
     linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #f9f9f9 100%);
 }
 
diff --git a/css/views-admin.theme-rtl.css b/css/views-admin.theme-rtl.css
index b2656f1..f966432 100644
--- a/css/views-admin.theme-rtl.css
+++ b/css/views-admin.theme-rtl.css
@@ -74,7 +74,7 @@
 .container-inline > * + *,
 .container-inline .fieldset-wrapper > * + * {
   padding-left: 0;
-  padding-right: 4px;
+  padding-right: 4pt;
 }
 
 .views-admin .form-type-checkbox + .form-wrapper {
@@ -164,7 +164,7 @@ div.form-item-displays-live-preview {
  */
 
 .views-display-setting .label {
-  margin-left: 3px;
+  margin-left: 3pt;
 }
 
 /* @end */
diff --git a/css/views-admin.theme.css b/css/views-admin.theme.css
index 49dd805..8611783 100644
--- a/css/views-admin.theme.css
+++ b/css/views-admin.theme.css
@@ -49,7 +49,7 @@
     url("../images/sprites.png"),
     -moz-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #e8e8e8 100%);
   background-image:
     url("../images/sprites.png"),
@@ -64,10 +64,12 @@
     url("../images/sprites.png"),
     -webkit-linear-gradient(
       -90deg,
-      #ffffff 0,
+      #ffffff 0px,
       #e8e8e8 100%);
   background-repeat: no-repeat, repeat-y;
   border: 1px solid #dddddd;
+  -moz-border-radius: 4px;
+  -webkit-border-radius: 4px;
   border-radius: 4px;
   -moz-box-shadow: 0 0 0 rgba(0,0,0,0.3333) inset;
   -webkit-box-shadow: 0 0 0 rgba(0,0,0,0.3333) inset;
@@ -184,7 +186,7 @@ input.form-radio {
 
 .container-inline > * + *,
 .container-inline .fieldset-wrapper > * + * {
-  padding-left: 4px; /* LTR */
+  padding-left: 4pt; /* LTR */
 }
 
 .views-admin fieldset fieldset.container-inline {
@@ -696,7 +698,7 @@ ul#views-display-menu-tabs li.add ul.action-list li{
 }
 
 .views-display-setting .label {
-  margin-right: 3px; /* LTR */
+  margin-right: 3pt; /* LTR */
 }
 
 /* @end */
@@ -753,6 +755,8 @@ ul#views-display-menu-tabs li.add ul.action-list li{
 .views-ui-dialog .ui-dialog-titlebar-close {
   background: url("../images/close.png") no-repeat scroll 6px 3px #F3F4EE;
   border-color: #aaaaaa;
+  -moz-border-radius: 0 10px 12px 0;
+  -webkit-border-radius: 0 10px 12px 0;
   border-radius: 0 10px 12px 0;
   border-style: solid;
   border-width: 1px 1px 1px 0;
@@ -1057,9 +1061,11 @@ ul#views-display-menu-tabs li.add ul.action-list li{
   background-image: url("../images/loading-small.gif");
   background-position: center center;
   background-repeat: no-repeat;
+  -moz-border-radius: 7px;
+  -webkit-border-radius: 7px;
   border-radius: 7px;
   height: 24px;
-  opacity: 0.9;
+  opacity: .9;
   padding: 4px;
   width: 24px;
 }
diff --git a/css/views.base-rtl.css b/css/views-rtl.css
similarity index 66%
rename from css/views.base-rtl.css
rename to css/views-rtl.css
index 3755668..f804639 100644
--- a/css/views.base-rtl.css
+++ b/css/views-rtl.css
@@ -1,3 +1,5 @@
+
 .views-exposed-form .views-exposed-widget {
   float: right; /* RTL */
+  padding: .5em 1em 0 0; /* RTL */
 }
diff --git a/css/views.base.css b/css/views.css
similarity index 67%
rename from css/views.base.css
rename to css/views.css
index 51750a5..bf96f70 100644
--- a/css/views.base.css
+++ b/css/views.css
@@ -1,9 +1,10 @@
 .views-exposed-form .views-exposed-widget {
   float: left; /* LTR */
+  padding: .5em 1em 0 0; /* LTR */
 }
 
 .views-exposed-form .views-exposed-widget .form-submit {
-  margin-top: 0.5em;
+  margin-top: 1.6em;
 }
 
 .views-exposed-form .form-item,
@@ -12,8 +13,12 @@
   margin-bottom: 0;
 }
 
+.views-exposed-form label {
+  font-weight: bold;
+}
+
 .views-exposed-widgets {
-  margin-bottom: 0.5em;
+  margin-bottom: .5em;
 }
 
 /* table style column align */
@@ -27,6 +32,11 @@
   text-align: center;
 }
 
+/* Remove the border on tbody that system puts in */
+.views-view-grid tbody {
+  border-top: none;
+}
+
 .view .progress-disabled {
   float: none;
 }
diff --git a/lib/Drupal/views/Plugin/views/argument_default/ArgumentDefaultPluginBase.php b/lib/Drupal/views/Plugin/views/argument_default/ArgumentDefaultPluginBase.php
index 65ed286..1e329e7 100644
--- a/lib/Drupal/views/Plugin/views/argument_default/ArgumentDefaultPluginBase.php
+++ b/lib/Drupal/views/Plugin/views/argument_default/ArgumentDefaultPluginBase.php
@@ -37,6 +37,7 @@ abstract class ArgumentDefaultPluginBase extends PluginBase {
     $this->view = &$view;
     $this->argument = &$argument;
 
+    $this->convert_options($options);
     $this->unpack_options($this->options, $options);
   }
 
@@ -82,6 +83,16 @@ abstract class ArgumentDefaultPluginBase extends PluginBase {
     }
   }
 
+  /**
+   * Convert options from the older style.
+   *
+   * In Views 3, the method of storing default argument options has changed
+   * and each plugin now gets its own silo. This method can be used to
+   * move arguments from the old style to the new style. See
+   * views_plugin_argument_default_fixed for a good example of this method.
+   */
+  function convert_options(&$options) { }
+
 }
 
 /**
diff --git a/lib/Drupal/views/Plugin/views/argument_default/Fixed.php b/lib/Drupal/views/Plugin/views/argument_default/Fixed.php
index a6c6be7..cc688aa 100644
--- a/lib/Drupal/views/Plugin/views/argument_default/Fixed.php
+++ b/lib/Drupal/views/Plugin/views/argument_default/Fixed.php
@@ -45,4 +45,10 @@ class Fixed extends ArgumentDefaultPluginBase {
     return $this->options['argument'];
   }
 
+  function convert_options(&$options) {
+    if (!isset($options['argument']) && isset($this->argument->options['default_argument_fixed'])) {
+      $options['argument'] = $this->argument->options['default_argument_fixed'];
+    }
+  }
+
 }
diff --git a/lib/Drupal/views/Plugin/views/argument_default/Php.php b/lib/Drupal/views/Plugin/views/argument_default/Php.php
index 0a013b2..ec97dfb 100644
--- a/lib/Drupal/views/Plugin/views/argument_default/Php.php
+++ b/lib/Drupal/views/Plugin/views/argument_default/Php.php
@@ -42,6 +42,12 @@ class Php extends ArgumentDefaultPluginBase {
     $this->check_access($form, 'code');
   }
 
+  function convert_options(&$options) {
+    if (!isset($options['code']) && isset($this->argument->options['default_argument_php'])) {
+      $options['code'] = $this->argument->options['default_argument_php'];
+    }
+  }
+
   /**
    * Only let users with PHP block visibility permissions set/modify this
    * default plugin.
diff --git a/lib/Drupal/views/Plugin/views/argument_validator/ArgumentValidatorPluginBase.php b/lib/Drupal/views/Plugin/views/argument_validator/ArgumentValidatorPluginBase.php
index bdf3ff3..99a2992 100644
--- a/lib/Drupal/views/Plugin/views/argument_validator/ArgumentValidatorPluginBase.php
+++ b/lib/Drupal/views/Plugin/views/argument_validator/ArgumentValidatorPluginBase.php
@@ -30,6 +30,7 @@ abstract class ArgumentValidatorPluginBase extends PluginBase {
     $this->view = &$view;
     $this->argument = &$argument;
 
+    $this->convert_options($options);
     $this->unpack_options($this->options, $options);
   }
 
@@ -55,6 +56,16 @@ abstract class ArgumentValidatorPluginBase extends PluginBase {
   function options_submit(&$form, &$form_state, &$options = array()) { }
 
   /**
+   * Convert options from the older style.
+   *
+   * In Views 3, the method of storing default argument options has changed
+   * and each plugin now gets its own silo. This method can be used to
+   * move arguments from the old style to the new style. See
+   * views_plugin_argument_default_fixed for a good example of this method.
+   */
+  function convert_options(&$options) { }
+
+  /**
    * Determine if the administrator has the privileges to use this plugin
    */
   function access() { return TRUE; }
diff --git a/lib/Drupal/views/Plugin/views/argument_validator/Php.php b/lib/Drupal/views/Plugin/views/argument_validator/Php.php
index b6699c3..94e0979 100644
--- a/lib/Drupal/views/Plugin/views/argument_validator/Php.php
+++ b/lib/Drupal/views/Plugin/views/argument_validator/Php.php
@@ -49,6 +49,12 @@ class Php extends ArgumentValidatorPluginBase {
     return user_access('use PHP for settings');
   }
 
+  function convert_options(&$options) {
+    if (!isset($options['code']) && isset($this->argument->options['validate_argument_php'])) {
+      $options['code'] = $this->argument->options['validate_argument_php'];
+    }
+  }
+
   function validate_argument($argument) {
     // set up variables to make it easier to reference during the argument.
     $view = &$this->view;
diff --git a/lib/Drupal/views/Plugin/views/cache/CachePluginBase.php b/lib/Drupal/views/Plugin/views/cache/CachePluginBase.php
index 65fa875..6b069d9 100644
--- a/lib/Drupal/views/Plugin/views/cache/CachePluginBase.php
+++ b/lib/Drupal/views/Plugin/views/cache/CachePluginBase.php
@@ -289,7 +289,7 @@ abstract class CachePluginBase extends PluginBase {
         'build_info' => $build_info,
         'roles' => array_keys($user->roles),
         'super-user' => $user->uid == 1, // special caching for super user.
-        'langcode' => language(LANGUAGE_TYPE_INTERFACE)->langcode,
+        'language' => language(LANGUAGE_TYPE_INTERFACE)->langcode,
         'base_url' => $GLOBALS['base_url'],
       );
       foreach (array('exposed_info', 'page', 'sort', 'order', 'items_per_page', 'offset') as $key) {
@@ -312,7 +312,7 @@ abstract class CachePluginBase extends PluginBase {
         'roles' => array_keys($user->roles),
         'super-user' => $user->uid == 1, // special caching for super user.
         'theme' => $GLOBALS['theme'],
-        'langcode' => language(LANGUAGE_TYPE_INTERFACE)->langcode,
+        'language' => language(LANGUAGE_TYPE_INTERFACE)->langcode,
         'base_url' => $GLOBALS['base_url'],
       );
 
diff --git a/lib/Drupal/views/Plugin/views/display/Attachment.php b/lib/Drupal/views/Plugin/views/display/Attachment.php
index fb07f31..a83a54b 100644
--- a/lib/Drupal/views/Plugin/views/display/Attachment.php
+++ b/lib/Drupal/views/Plugin/views/display/Attachment.php
@@ -25,19 +25,14 @@ use Drupal\Core\Annotation\Translation;
  *   help = @Translation("Attachments added to other displays to achieve multiple views in the same view."),
  *   theme = "views_view",
  *   contextual_links_locations = {""},
+ *   use_pager = FALSE,
+ *   use_more = TRUE,
  *   accept_attachments = FALSE,
  *   help_topic = "display-attachment"
  * )
  */
 class Attachment extends DisplayPluginBase {
 
-  /**
-   * Whether the display allows the use of a pager or not.
-   *
-   * @var bool
-   */
-  protected $usesPager = FALSE;
-
   function option_definition() {
     $options = parent::option_definition();
 
@@ -252,7 +247,7 @@ class Attachment extends DisplayPluginBase {
     $view->set_arguments($args);
     $view->set_display($this->display->id);
     if ($this->get_option('inherit_pager')) {
-      $view->display_handler->usesPager = $this->view->display[$display_id]->handler->usesPager();
+      $view->display_handler->use_pager = $this->view->display[$display_id]->handler->use_pager();
       $view->display_handler->set_option('pager', $this->view->display[$display_id]->handler->get_option('pager'));
     }
 
@@ -295,8 +290,12 @@ class Attachment extends DisplayPluginBase {
     return $this->options['inherit_exposed_filters'] ? FALSE : TRUE;
   }
 
+  function use_pager() {
+    return !empty($this->use_pager);
+  }
+
   function render_pager() {
-    return $this->usesPager() && $this->get_option('render_pager');
+    return !empty($this->use_pager) && $this->get_option('render_pager');
   }
 
 }
diff --git a/lib/Drupal/views/Plugin/views/display/Block.php b/lib/Drupal/views/Plugin/views/display/Block.php
index f3e5075..e58b9e1 100644
--- a/lib/Drupal/views/Plugin/views/display/Block.php
+++ b/lib/Drupal/views/Plugin/views/display/Block.php
@@ -22,6 +22,8 @@ use Drupal\Core\Annotation\Translation;
  *   theme = "views_view",
  *   uses_hook_block = TRUE,
  *   contextual_links_locations = {"block"},
+ *   use_pager = TRUE,
+ *   use_more = TRUE,
  *   accept_attachments = TRUE,
  *   admin = @Translation("Block"),
  *   help_topic = "display-block"
diff --git a/lib/Drupal/views/Plugin/views/display/DefaultDisplay.php b/lib/Drupal/views/Plugin/views/display/DefaultDisplay.php
index 28bb9c9..260a2ac 100644
--- a/lib/Drupal/views/Plugin/views/display/DefaultDisplay.php
+++ b/lib/Drupal/views/Plugin/views/display/DefaultDisplay.php
@@ -21,6 +21,8 @@ use Drupal\Core\Annotation\Translation;
  *   help = @Translation("Default settings for this view."),
  *   theme = "views_view",
  *   no_ui = TRUE,
+ *   use_pager = TRUE,
+ *   use_more = TRUE,
  *   accept_attachments = TRUE,
  *   help_topic = "display-default"
  * )
diff --git a/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php b/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
index a432506..6edd6a6 100644
--- a/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
+++ b/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
@@ -64,20 +64,6 @@ abstract class DisplayPluginBase extends PluginBase {
    */
   protected $usesAJAX = TRUE;
 
-  /**
-   * Whether the display allows the use of a pager or not.
-   *
-   * @var bool
-   */
-  protected $usesPager = TRUE;
-
-  /**
-   * Whether the display allows the use of a 'more' link or not.
-   *
-   * @var bool
-   */
-  protected $usesMore = TRUE;
-
   function init(&$view, &$display, $options = NULL) {
     $this->view = &$view;
     $this->display = &$display;
@@ -134,15 +120,6 @@ abstract class DisplayPluginBase extends PluginBase {
       $this->unpack_options($this->options, $options);
     }
 
-    // Convert the field_language and field_language_add_to_query settings.
-    $field_language = $this->get_option('field_language');
-    $field_language_add_to_query = $this->get_option('field_language_add_to_query');
-    if (isset($field_langcode)) {
-      $this->set_option('field_langcode', $field_language);
-      $this->set_option('field_langcode_add_to_query', $field_language_add_to_query);
-      $changed = TRUE;
-    }
-
     // Mark the view as changed so the user has a chance to save it.
     if ($changed) {
       $this->view->changed = TRUE;
@@ -236,46 +213,20 @@ abstract class DisplayPluginBase extends PluginBase {
   }
 
   /**
-   * Whether the display allows the use of a pager or not.
-   *
-   * @return bool
-   */
-
-  function usesPager() {
-    return $this->usesPager;
-  }
-
-  /**
-   * Whether the display is using a pager or not.
-   *
-   * @return bool
+   * Does the display have a pager enabled?
    */
-  function isPagerEnabled() {
-    if ($this->usesPager()) {
-      $pager = $this->get_plugin('pager');
-      if ($pager) {
-        return $pager->use_pager();
-      }
+  function use_pager() {
+    $pager = $this->get_plugin('pager');
+    if ($pager) {
+      return $pager->use_pager();
     }
-    return FALSE;
   }
 
   /**
-   * Whether the display allows the use of a 'more' link or not.
-   *
-   * @return bool
+   * Does the display have a more link enabled?
    */
-  function usesMore() {
-    return $this->usesMore;
-  }
-
-  /**
-   * Whether the display is using the 'more' link or not.
-   *
-   * @return bool
-   */
-  function isMoreEnabled() {
-    if ($this->usesMore()) {
+  function use_more() {
+    if (!empty($this->definition['use_more'])) {
       return $this->get_option('use_more');
     }
     return FALSE;
@@ -292,7 +243,7 @@ abstract class DisplayPluginBase extends PluginBase {
    * Should the enabled display more link be shown when no more items?
    */
   function use_more_always() {
-    if ($this->usesMore()) {
+    if (!empty($this->definition['use_more'])) {
       return $this->get_option('use_more_always');
     }
     return FALSE;
@@ -302,7 +253,7 @@ abstract class DisplayPluginBase extends PluginBase {
    * Does the display have custom link text?
    */
   function use_more_text() {
-    if ($this->usesMore()) {
+    if (!empty($this->definition['use_more'])) {
       return $this->get_option('use_more_text');
     }
     return FALSE;
@@ -377,7 +328,7 @@ abstract class DisplayPluginBase extends PluginBase {
     );
 
     // If the display cannot use a pager, then we cannot default it.
-    if (!$this->usesPager()) {
+    if (empty($this->definition['use_pager'])) {
       unset($sections['pager']);
       unset($sections['items_per_page']);
     }
@@ -496,12 +447,11 @@ abstract class DisplayPluginBase extends PluginBase {
         'default' => FALSE,
         'bool' => TRUE,
       ),
-      'field_langcode' => array(
+      'field_language' => array(
         'default' => '***CURRENT_LANGUAGE***',
       ),
-      'field_langcode_add_to_query' => array(
-        'default' => TRUE,
-        'bool' => TRUE,
+      'field_language_add_to_query' => array(
+        'default' => 1,
       ),
 
       // These types are all plugins that can have individual settings
@@ -619,7 +569,7 @@ abstract class DisplayPluginBase extends PluginBase {
       ),
     );
 
-    if (!$this->usesPager()) {
+    if (empty($this->definition['use_pager'])) {
       $options['defaults']['default']['use_pager'] = FALSE;
       $options['defaults']['default']['items_per_page'] = FALSE;
       $options['defaults']['default']['offset'] = FALSE;
@@ -1181,7 +1131,7 @@ abstract class DisplayPluginBase extends PluginBase {
     );
 
     // If pagers aren't allowed, change the text of the item:
-    if (!$this->usesPager()) {
+    if (empty($this->definition['use_pager'])) {
       $options['pager']['title'] = t('Items to display');
     }
 
@@ -1189,7 +1139,7 @@ abstract class DisplayPluginBase extends PluginBase {
       $options['pager']['links']['pager_options'] = t('Change settings for this pager type.');
     }
 
-    if ($this->usesMore()) {
+    if (!empty($this->definition['use_more'])) {
       $options['use_more'] = array(
         'category' => 'pager',
         'title' => t('More link'),
@@ -1223,10 +1173,11 @@ abstract class DisplayPluginBase extends PluginBase {
     if (module_exists('language')) {
       $languages = array_merge($languages, language_list());
     }
-    $options['field_langcode'] = array(
+    $field_language = array();
+    $options['field_language'] = array(
       'category' => 'other',
       'title' => t('Field Language'),
-      'value' => $languages[$this->get_option('field_langcode')],
+      'value' => $languages[$this->get_option('field_language')],
       'desc' => t('All fields which support translations will be displayed in the selected language.'),
     );
 
@@ -1616,17 +1567,17 @@ abstract class DisplayPluginBase extends PluginBase {
           );
           $languages = array_merge($languages, views_language_list());
 
-          $form['field_langcode'] = array(
+          $form['field_language'] = array(
             '#type' => 'select',
             '#title' => t('Field Language'),
             '#description' => t('All fields which support translations will be displayed in the selected language.'),
             '#options' => $languages,
-            '#default_value' => $this->get_option('field_langcode'),
+            '#default_value' => $this->get_option('field_language'),
           );
-          $form['field_langcode_add_to_query'] = array(
+          $form['field_language_add_to_query'] = array(
             '#type' => 'checkbox',
             '#title' => t('When needed, add the field language condition to the query'),
-            '#default_value' => $this->get_option('field_langcode_add_to_query'),
+            '#default_value' => $this->get_option('field_language_add_to_query'),
           );
         }
         else {
@@ -2075,7 +2026,7 @@ abstract class DisplayPluginBase extends PluginBase {
         $pager = $this->get_option('pager');
         $form['pager']['type'] =  array(
           '#type' => 'radios',
-          '#options' => views_fetch_plugin_names('pager', !$this->usesPager() ? 'basic' : NULL, array($this->view->base_table)),
+          '#options' => views_fetch_plugin_names('pager', empty($this->definition['use_pager']) ? 'basic' : NULL, array($this->view->base_table)),
           '#default_value' => $pager['type'],
         );
 
@@ -2290,8 +2241,8 @@ abstract class DisplayPluginBase extends PluginBase {
         $this->set_option($section, $form_state['values'][$section]);
         break;
       case 'field_language':
-        $this->set_option('field_langcode', $form_state['values']['field_langcode']);
-        $this->set_option('field_langcode_add_to_query', $form_state['values']['field_langcode_add_to_query']);
+        $this->set_option('field_language', $form_state['values']['field_language']);
+        $this->set_option('field_language_add_to_query', $form_state['values']['field_language_add_to_query']);
         break;
       case 'use_ajax':
       case 'hide_attachment_summary':
@@ -2478,7 +2429,7 @@ abstract class DisplayPluginBase extends PluginBase {
    * Render the 'more' link
    */
   function render_more_link() {
-    if ($this->usesMore() && ($this->use_more_always() || (!empty($this->view->pager) && $this->view->pager->has_more_records()))) {
+    if ($this->use_more() && ($this->use_more_always() || (!empty($this->view->pager) && $this->view->pager->has_more_records()))) {
       $path = $this->get_path();
 
       if ($this->get_option('link_display') == 'custom_url' && $override_path = $this->get_option('link_url')) {
@@ -2583,7 +2534,7 @@ abstract class DisplayPluginBase extends PluginBase {
    */
   function pre_execute() {
     $this->view->set_use_ajax($this->isAJAXEnabled());
-    if ($this->usesMore() && !$this->use_more_always()) {
+    if ($this->use_more() && !$this->use_more_always()) {
       $this->view->get_total_rows = TRUE;
     }
     $this->view->init_handlers();
diff --git a/lib/Drupal/views/Plugin/views/display/Embed.php b/lib/Drupal/views/Plugin/views/display/Embed.php
index 3b7f2c9..7bb9f2c 100644
--- a/lib/Drupal/views/Plugin/views/display/Embed.php
+++ b/lib/Drupal/views/Plugin/views/display/Embed.php
@@ -16,7 +16,7 @@ use Drupal\Core\Annotation\Translation;
  * @ingroup views_display_plugins
  *
  * @todo: Wait until annotations/plugins support access mehtods.
- * no_ui => !config('views.settings')->get('ui.show.display_embed'),
+ * no ui => !config('views.settings')->get('ui.show.display_embed'),
  *
  * @Plugin(
  *   id = "embed",
@@ -24,6 +24,7 @@ use Drupal\Core\Annotation\Translation;
  *   help = @Translation("Provide a display which can be embedded using the views api."),
  *   theme = "views_view",
  *   uses_hook_menu = FALSE,
+ *   use_pager = TRUE,
  *   accept_attachments = FALSE,
  *   help_topic = "display-embed"
  * )
diff --git a/lib/Drupal/views/Plugin/views/display/Feed.php b/lib/Drupal/views/Plugin/views/display/Feed.php
index a9ec6b1..0203afd 100644
--- a/lib/Drupal/views/Plugin/views/display/Feed.php
+++ b/lib/Drupal/views/Plugin/views/display/Feed.php
@@ -23,6 +23,7 @@ use Drupal\Core\Annotation\Translation;
  *   title = @Translation("Feed"),
  *   help = @Translation("Display the view as a feed, such as an RSS feed."),
  *   uses_hook_menu = TRUE,
+ *   use_pager = FALSE,
  *   accept_attachments = FALSE,
  *   admin = @Translation("Feed"),
  *   help_topic = "display-feed"
@@ -37,13 +38,6 @@ class Feed extends Page {
    */
   protected $usesAJAX = FALSE;
 
-  /**
-   * Whether the display allows the use of a pager or not.
-   *
-   * @var bool
-   */
-  protected $usesPager = FALSE;
-
   function init(&$view, &$display, $options = NULL) {
     parent::init($view, $display, $options);
 
diff --git a/lib/Drupal/views/Plugin/views/display/Page.php b/lib/Drupal/views/Plugin/views/display/Page.php
index a9db7ba..3a44204 100644
--- a/lib/Drupal/views/Plugin/views/display/Page.php
+++ b/lib/Drupal/views/Plugin/views/display/Page.php
@@ -22,6 +22,8 @@ use Drupal\Core\Annotation\Translation;
  *   uses_hook_menu = TRUE,
  *   contextual_links_locations = {"page"},
  *   theme = "views_view",
+ *   use_pager = TRUE,
+ *   use_more = TRUE,
  *   accept_attachments = TRUE,
  *   admin = @Translation("Page"),
  *   help_topic = "display-page"
diff --git a/lib/Drupal/views/Plugin/views/style/DefaultStyle.php b/lib/Drupal/views/Plugin/views/style/DefaultStyle.php
index a98c3fa..05e2cb3 100644
--- a/lib/Drupal/views/Plugin/views/style/DefaultStyle.php
+++ b/lib/Drupal/views/Plugin/views/style/DefaultStyle.php
@@ -21,6 +21,7 @@ use Drupal\Core\Annotation\Translation;
  *   title = @Translation("Unformatted list"),
  *   help = @Translation("Displays rows one after another."),
  *   theme = "views_view_unformatted",
+ *   uses_grouping = TRUE,
  *   type = "normal",
  *   help_topic = "style-unformatted"
  * )
diff --git a/lib/Drupal/views/Plugin/views/style/StylePluginBase.php b/lib/Drupal/views/Plugin/views/style/StylePluginBase.php
index 74d30f3..a8d2f45 100644
--- a/lib/Drupal/views/Plugin/views/style/StylePluginBase.php
+++ b/lib/Drupal/views/Plugin/views/style/StylePluginBase.php
@@ -64,13 +64,6 @@ abstract class StylePluginBase extends PluginBase {
   protected $usesRowClass = FALSE;
 
   /**
-   * Does the style plugin support grouping of rows.
-   *
-   * @var bool
-   */
-  protected $usesGrouping = TRUE;
-
-  /**
    * Does the style plugin for itself support to add fields to it's output.
    *
    * This option only makes sense on style plugins without row plugins, like
@@ -104,6 +97,9 @@ abstract class StylePluginBase extends PluginBase {
       'grouping' => array(),
     );
 
+    $this->definition += array(
+      'uses_grouping' => TRUE,
+    );
   }
 
   function destroy() {
@@ -134,15 +130,6 @@ abstract class StylePluginBase extends PluginBase {
   }
 
   /**
-   * Returns the usesGrouping property.
-   *
-   * @return bool
-   */
-  function usesGrouping() {
-    return $this->usesGrouping;
-  }
-
-  /**
    * Return TRUE if this style also uses fields.
    *
    * @return bool
@@ -237,10 +224,10 @@ abstract class StylePluginBase extends PluginBase {
   function options_form(&$form, &$form_state) {
     parent::options_form($form, $form_state);
     // Only fields-based views can handle grouping.  Style plugins can also exclude
-    // themselves from being groupable by setting their "usesGrouping" property
-    // to FALSE.
-    // @TODO: Document "usesGrouping" in docs.php when docs.php is written.
-    if ($this->usesFields() && $this->usesGrouping()) {
+    // themselves from being groupable by setting their "use grouping" definiton
+    // key to FALSE.
+    // @TODO: Document "uses grouping" in docs.php when docs.php is written.
+    if ($this->usesFields() && $this->definition['uses_grouping']) {
       $options = array('' => t('- None -'));
       $field_labels = $this->display->handler->get_field_labels(TRUE);
       $options += $field_labels;
diff --git a/lib/Drupal/views/Tests/Language/ArgumentLanguage.php b/lib/Drupal/views/Tests/Language/ArgumentLanguage.php
deleted file mode 100644
index dc21a90..0000000
--- a/lib/Drupal/views/Tests/Language/ArgumentLanguage.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * @file
- * Definition of Drupal\views\Tests\Language\ArgumentLanguage.php
- */
-
-namespace Drupal\views\Tests\Language;
-
-use Drupal\Core\Language\Language;
-
-/**
- * Tests the argument language handler.
- *
- * @see Views\language\Plugin\views\argument\Language.php
- */
-class ArgumentLanguage extends LanguageTestBase {
-  public static function getInfo() {
-    return array(
-      'name' => 'Argument: Language',
-      'description' => 'Tests the argument language handler.',
-      'group' => 'Views Handlers'
-    );
-  }
-
-  public function testFilter() {
-    foreach (array('en' => 'John', 'xx-lolspeak' => 'George') as $langcode => $name) {
-      $view = $this->getBasicView();
-      $view->display['default']->handler->override_option('arguments', array(
-        'langcode' => array(
-          'id' => 'langcode',
-          'table' => 'views_test',
-          'field' => 'langcode',
-        ),
-      ));
-      $this->executeView($view, array($langcode));
-
-      $expected = array(array(
-        'name' => $name,
-      ));
-      $this->assertIdenticalResultset($view, $expected, array('views_test_name' => 'name'));
-      $view->destroy();
-    }
-  }
-}
diff --git a/lib/Drupal/views/Tests/Language/FieldLanguage.php b/lib/Drupal/views/Tests/Language/FieldLanguage.php
deleted file mode 100644
index 08badae..0000000
--- a/lib/Drupal/views/Tests/Language/FieldLanguage.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/**
- * @file
- * Definition of Drupal\views\Tests\Language\FieldLanguage.php
- */
-
-namespace Drupal\views\Tests\Language;
-
-use Drupal\Core\Language\Language;
-
-/**
- * Tests the field language handler.
- *
- * @see Views\language\Plugin\views\field\Language
- */
-class FieldLanguage extends LanguageTestBase {
-  public static function getInfo() {
-    return array(
-      'name' => 'Field: Language',
-      'description' => 'Tests the field language handler.',
-      'group' => 'Views Handlers'
-    );
-  }
-
-  public function testField() {
-    $view = $this->getBasicView();
-    $view->display['default']->handler->override_option('fields', array(
-      'langcode' => array(
-        'id' => 'langcode',
-        'table' => 'views_test',
-        'field' => 'langcode',
-      ),
-    ));
-    $this->executeView($view);
-
-    $this->assertEqual($view->field['langcode']->advanced_render($view->result[0]), 'English');
-    $this->assertEqual($view->field['langcode']->advanced_render($view->result[1]), 'Lolspeak');
-  }
-}
diff --git a/lib/Drupal/views/Tests/Language/FilterLanguage.php b/lib/Drupal/views/Tests/Language/FilterLanguage.php
deleted file mode 100644
index 466bf1c..0000000
--- a/lib/Drupal/views/Tests/Language/FilterLanguage.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * @file
- * Definition of Drupal\views\Tests\Language\FilterLanguage.php
- */
-
-namespace Drupal\views\Tests\Language;
-
-use Drupal\Core\Language\Language;
-
-/**
- * Tests the filter language handler.
- *
- * @see Views\language\Plugin\views\filter\Language
- */
-class FilterLanguage extends LanguageTestBase {
-  public static function getInfo() {
-    return array(
-      'name' => 'Filter: Language',
-      'description' => 'Tests the filter language handler.',
-      'group' => 'Views Handlers'
-    );
-  }
-
-  public function testFilter() {
-    foreach (array('en' => 'John', 'xx-lolspeak' => 'George') as $langcode => $name) {
-      $view = $this->getBasicView();
-      $view->display['default']->handler->override_option('filters', array(
-        'langcode' => array(
-          'id' => 'langcode',
-          'table' => 'views_test',
-          'field' => 'langcode',
-          'value' => array($langcode),
-        ),
-      ));
-      $this->executeView($view);
-
-      $expected = array(array(
-        'name' => $name,
-      ));
-      $this->assertIdenticalResultset($view, $expected, array('views_test_name' => 'name'));
-      $view->destroy();
-    }
-  }
-}
diff --git a/lib/Drupal/views/Tests/Language/LanguageTestBase.php b/lib/Drupal/views/Tests/Language/LanguageTestBase.php
deleted file mode 100644
index f811b52..0000000
--- a/lib/Drupal/views/Tests/Language/LanguageTestBase.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/**
- * @file
- * Definition of Drupal\views\Tests\Language\LanguageTestBase.php
- */
-
-namespace Drupal\views\Tests\Language;
-
-use Drupal\views\Tests\ViewsSqlTest;
-use Drupal\Core\Language\Language;
-
-/**
- * Base class for all Language handler tests.
- */
-abstract class LanguageTestBase extends ViewsSqlTest {
-  public static $modules = array('views', 'language');
-
-  protected function setUp() {
-    parent::setUp();
-    // Create another language beside english.
-    $language = new Language(array('langcode' => 'xx-lolspeak', 'name' => 'Lolspeak'));
-    language_save($language);
-  }
-
-
-  protected function schemaDefinition() {
-    $schema = parent::schemaDefinition();
-    $schema['views_test']['fields']['langcode'] = array(
-      'description' => 'The {language}.langcode of this beatle.',
-      'type' => 'varchar',
-      'length' => 12,
-      'default' => '',
-    );
-
-    return $schema;
-  }
-
-  protected function viewsData() {
-    $data = parent::viewsData();
-    $data['views_test']['langcode'] = array(
-      'title' => t('Langcode'),
-      'help' => t('Langcode'),
-      'field' => array(
-        'id' => 'language',
-      ),
-      'argument' => array(
-        'id' => 'language',
-      ),
-      'filter' => array(
-        'id' => 'language',
-      ),
-    );
-
-    return $data;
-  }
-
-  protected function dataSet() {
-    $data = parent::dataSet();
-    $data[0]['langcode'] = 'en';
-    $data[1]['langcode'] = 'xx-lolspeak';
-    $data[2]['langcode'] = '';
-    $data[3]['langcode'] = '';
-    $data[4]['langcode'] = '';
-
-    return $data;
-  }
-}
diff --git a/lib/Drupal/views/Tests/ViewStorageTest.php b/lib/Drupal/views/Tests/ViewStorageTest.php
new file mode 100644
index 0000000..fa07fbe
--- /dev/null
+++ b/lib/Drupal/views/Tests/ViewStorageTest.php
@@ -0,0 +1,177 @@
+<?php
+
+/**
+ * Definition of Drupal\views\Tests\ViewStorageTest.
+ */
+
+namespace Drupal\views\Tests;
+
+use Drupal\simpletest\WebTestBase;
+use Drupal\views\ViewStorageController;
+use Drupal\views\View;
+use Drupal\views\ViewDisplay;
+
+/**
+ * Tests that functionality of the the ViewStorageController.
+ */
+class ViewStorageTest extends WebTestBase {
+
+  /**
+   * Properties that should be stored in the configuration.
+   *
+   * @var array
+   */
+  protected $config_properties = array(
+    'disabled',
+    'api_version',
+    'name',
+    'description',
+    'tag',
+    'base_table',
+    'human_name',
+    'core',
+    'display',
+  );
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('views');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Views configurable CRUD tests',
+      'description' => 'Test the CRUD functionality for ViewStorage.',
+      'group' => 'Views',
+    );
+  }
+
+  /**
+   * Tests CRUD operations.
+   */
+  function testConfigurableCRUD() {
+
+    // Get the Configurable information and controller.
+    $info = entity_get_info('view');
+    $controller = entity_get_controller('view');
+
+    // Confirm that an info array has been returned.
+    $this->assertTrue(!empty($info) && is_array($info), 'The View  info array is loaded.');
+
+    // Confirm we have the correct controller class.
+    $this->assertTrue($controller instanceof ViewStorageController, 'The correct controller is loaded.');
+
+    // Load a single Configurable object from the controller.
+    $load = $controller->load(array('archive'));
+    $view = reset($load);
+
+    // Confirm that an actual view object is loaded and that it returns all of
+    // expected properties.
+    $this->assertTrue($view instanceof View, 'Single View instance loaded.');
+    foreach ($this->config_properties as $property) {
+      $this->assertTrue(isset($view->{$property}), format_string('Property: @property loaded onto View.', array('@property' => $property)));
+    }
+
+    // Check the displays have been loaded correctly from config display data.
+    $expected_displays = array('default', 'page', 'block');
+    $this->assertEqual(array_keys($view->display), $expected_displays, 'The correct display names are present.');
+
+    // Check each ViewDisplay object and confirm that it has the correct key.
+    foreach ($view->display as $key => $display) {
+      $this->assertTrue($display instanceof ViewDisplay, format_string('Display: @display is instance of ViewDisplay.', array('@display' => $key)));
+      $this->assertEqual($key, $display->id, 'The display has the correct ID.');
+      // Confirm that the display options array exists.
+      $display_options = $display->display_options;
+      $this->assertTrue(!empty($display_options) && is_array($display_options), 'Display options exist.');
+    }
+
+    // Fetch data for all Configurable objects and default view configurations.
+    $all_configurables = $controller->load();
+    $all_config = config_get_storage_names_with_prefix('views.view');
+
+    // Remove the 'views.view.' prefix from config names for comparision with
+    // loaded Configurable objects.
+    $prefix_map = function ($value) {
+      $parts = explode('.', $value);
+      return end($parts);
+    };
+
+    // Check that the correct number of Configurable objects have been loaded.
+    $count = count($all_configurables);
+    $this->assertEqual($count, count($all_config), format_string('The array of all @count Configurable objects is loaded.', array('@count' => $count)));
+
+    // Check that all of these machine names match.
+    $this->assertIdentical(array_keys($all_configurables), array_map($prefix_map, $all_config), 'All loaded elements match.');
+
+    // Create a new View instance with empty values.
+    $created = $controller->create(array());
+
+    $this->assertTrue($created instanceof View, 'Created object is a View.');
+    // Check that the View contains all of the properties.
+    foreach ($this->config_properties as $property) {
+      $this->assertTrue(isset($view->{$property}), format_string('Property: @property created on View.', array('@property' => $property)));
+    }
+
+    // Create a new View instance with config values.
+    $values = config('views.view.archive')->get();
+    $created = $controller->create($values);
+
+    $this->assertTrue($created instanceof View, 'Created object is a View.');
+    // Check that the View contains all of the properties.
+    $properties = $this->config_properties;
+    array_pop($properties);
+
+    // Test all properties except displays.
+    foreach ($properties as $property) {
+      $this->assertTrue(isset($created->{$property}), format_string('Property: @property created on View.', array('@property' => $property)));
+      $this->assertIdentical($values[$property], $created->{$property}, format_string('Property value: @property matches configuration value.', array('@property' => $property)));
+    }
+
+    // Test created displays.
+    foreach ($created->display as $key => $display) {
+      $this->assertTrue($display instanceof ViewDisplay, format_string('Display @display is an instance of ViewDisplay.', array('@display' => $key)));
+    }
+
+    // Save the newly created view, but modify the name.
+    $created->set('name', 'archive_copy');
+    $created->set('tag', 'changed');
+    $created->save();
+
+    // Load the newly saved config.
+    $config = config('views.view.archive_copy');
+    $this->assertFalse($config->isNew(), 'New config has been loaded.');
+
+    $this->assertEqual($created->tag, $config->get('tag'), 'A changed value has been saved.');
+
+    // Change a value and save.
+    $view->tag = 'changed';
+    $view->save();
+
+    // Check value have been written to config.
+    $config = config('views.view.archive')->get();
+    $this->assertEqual($view->tag, $config['tag'], 'View property saved to config.');
+
+    // Delete the config.
+    $created->delete();
+    $config = config('views.view.archive_copy');
+
+    $this->assertTrue($config->isNew(), 'Deleted config is now new.');
+
+    // Check whether load, save and load produce the same kind of view.
+    $values = config('views.view.archive')->get();
+    $created = $controller->create($values);
+
+    $created->save();
+    $loaded_entities = $controller->load(array($created->id()));
+    $created_loaded = reset($loaded_entities);
+    $values_loaded = config('views.view.archive')->get();
+
+    $this->assertTrue(isset($created_loaded->display['default']->display_options), 'Make sure that the display options exists.');
+    $this->assertEqual($created_loaded->display['default']->display_plugin, 'default', 'Make sure the right display plugin is set.');
+
+    $this->assertEqual($values, $values_loaded, 'The loaded config is the same as the original loaded one.');
+  }
+
+}
diff --git a/lib/Drupal/views/View.php b/lib/Drupal/views/View.php
index 80d7d94..ca6babd 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
@@ -276,17 +267,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.
@@ -309,14 +289,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.
    */
@@ -1804,186 +1776,6 @@ class View extends ViewsDbObject {
   }
 
   /**
-   * Static factory method to load a list of views based upon a $where clause.
-   *
-   * Although this method could be implemented to simply iterate over views::load(),
-   * that would be very slow.  Buiding the views externally from unified queries is
-   * much faster.
-   */
-  static function load_views() {
-    $result = db_query("SELECT DISTINCT v.* FROM {views_view} v");
-    $views = array();
-
-    // Load all the views.
-    foreach ($result as $data) {
-      $view = new View();
-      $view->load_row($data);
-      $view->loaded = TRUE;
-      $view->type = t('Normal');
-      $views[$view->name] = $view;
-      $names[$view->vid] = $view->name;
-    }
-
-    // Stop if we didn't get any views.
-    if (!$views) {
-      return array();
-    }
-
-    // Now load all the subtables:
-    foreach (View::db_objects() as $key => $object) {
-      $table_name = "views_" . $key;
-      $object_name = "Views$object";
-      $result = db_query("SELECT * FROM {{$table_name}} WHERE vid IN (:vids) ORDER BY vid, position",
-        array(':vids' => array_keys($names)));
-
-      foreach ($result as $data) {
-        $object = new $object_name(FALSE);
-        $object->load_row($data);
-
-        // Because it can get complicated with this much indirection,
-        // make a shortcut reference.
-        $location = &$views[$names[$object->vid]]->$key;
-
-        // If we have a basic id field, load the item onto the view based on
-        // this ID, otherwise push it on.
-        if (!empty($object->id)) {
-          $location[$object->id] = $object;
-        }
-        else {
-          $location[] = $object;
-        }
-      }
-    }
-    return $views;
-  }
-
-  /**
-   * Save the view to the database. If the view does not already exist,
-   * A vid will be assigned to the view and also returned from this function.
-   */
-  function save() {
-    if ($this->vid == 'new') {
-      $this->vid = NULL;
-    }
-    // If there is no vid, check if a view with this machine name already exists.
-    elseif (empty($this->vid)) {
-      $vid = db_query("SELECT vid from {views_view} WHERE name = :name", array(':name' => $this->name))->fetchField();
-      $this->vid = $vid ? $vid : NULL;
-    }
-
-    $transaction = db_transaction();
-
-    try {
-      // If we have no vid or our vid is a string, this is a new view.
-      if (!empty($this->vid)) {
-        // remove existing table entries
-        foreach ($this->db_objects() as $key => $object) {
-          db_delete('views_' . $key)
-            ->condition('vid', $this->vid)
-            ->execute();
-        }
-      }
-
-      $this->save_row(!empty($this->vid) ? 'vid' : FALSE);
-
-      // Save all of our subtables.
-      foreach ($this->db_objects() as $key => $object) {
-        $this->_save_rows($key);
-      }
-    }
-    catch (Exception $e) {
-      $transaction->rollback();
-      watchdog_exception('views', $e);
-      throw $e;
-    }
-
-    $this->save_locale_strings();
-
-    // Clear caches.
-    views_invalidate_cache();
-
-    // @todo Remove this.
-    // Explicitly rebuild the menu.
-    menu_router_rebuild();
-  }
-
-  /**
-   * Save a row to the database for the given key, which is one of the
-   * keys from View::db_objects()
-   */
-  function _save_rows($key) {
-    $count = 0;
-    foreach ($this->$key as $position => $object) {
-      $object->position = ++$count;
-      $object->vid = $this->vid;
-      $object->save_row();
-    }
-  }
-
-  /**
-   * Delete the view from the database.
-   */
-  function delete($clear = TRUE) {
-    if (empty($this->vid)) {
-      return;
-    }
-
-    db_delete('views_view')
-      ->condition('vid', $this->vid)
-      ->execute();
-    // Delete from all of our subtables as well.
-    foreach ($this->db_objects() as $key => $object) {
-      db_delete('views_'. $key)
-        ->condition('vid', $this->vid)
-        ->execute();
-    }
-
-    cache('cache_views')->delete('views_query:' . $this->name);
-
-    if ($clear) {
-      // Clear caches.
-      views_invalidate_cache();
-    }
-  }
-
-  /**
-   * Export a view as PHP code.
-   */
-  function export($indent = '') {
-    $this->init_display();
-    $this->init_query();
-    $output = '';
-    $output .= $this->export_row('view', $indent);
-    // Set the API version
-    $output .= $indent . '$view->api_version = \'' . views_api_version() . "';\n";
-    $output .= $indent . '$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */' . "\n";
-
-    foreach ($this->display as $id => $display) {
-      $output .= "\n" . $indent . "/* Display: $display->display_title */\n";
-      $output .= $indent . '$handler = $view->new_display(' . ctools_var_export($display->display_plugin, $indent) . ', ' . ctools_var_export($display->display_title, $indent) . ', \'' . $id . "');\n";
-      if (empty($display->handler)) {
-        // @todo -- probably need a method of exporting broken displays as
-        // they may simply be broken because a module is not installed. That
-        // does not invalidate the display.
-        continue;
-      }
-
-      $output .= $display->handler->export_options($indent, '$handler->options');
-    }
-
-    // Give the localization system a chance to export translatables to code.
-    if ($this->init_localization()) {
-      $this->export_locale_strings('export');
-      $translatables = $this->localization_plugin->export_render($indent);
-      if (!empty($translatables)) {
-        $output .= $translatables;
-      }
-    }
-
-    return $output;
-  }
-
-  /**
    * Make a copy of this view that has been sanitized of all database IDs
    * and handlers and other stuff.
    *
diff --git a/lib/Drupal/views/ViewDisplay.php b/lib/Drupal/views/ViewDisplay.php
new file mode 100644
index 0000000..1e374d4
--- /dev/null
+++ b/lib/Drupal/views/ViewDisplay.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\views\ViewDisplay.
+ */
+
+namespace Drupal\views;
+
+/**
+ * A display type in a view.
+ *
+ * This is just the database storage mechanism, and isn't terribly important
+ * to the behavior of the display at all.
+ */
+class ViewDisplay {
+
+  /**
+   * The display handler itself, which has all the methods.
+   *
+   * @var views_plugin_display
+   */
+  public $handler;
+
+  /**
+   * Stores all options of the display, like fields, filters etc.
+   *
+   * @var array
+   */
+  public $display_options;
+
+  function __construct(array $display_options = array()) {
+    if (!empty($display_options)) {
+      $this->display_options = $display_options['display_options'];
+      $this->display_plugin = $display_options['display_plugin'];
+      $this->id = $display_options['id'];
+      $this->display_title = $display_options['display_title'];
+    }
+  }
+
+}
diff --git a/lib/Drupal/views/ViewsDbObject.php b/lib/Drupal/views/ViewStorage.php
similarity index 60%
rename from lib/Drupal/views/ViewsDbObject.php
rename to lib/Drupal/views/ViewStorage.php
index ba3a9a0..3d87285 100644
--- a/lib/Drupal/views/ViewsDbObject.php
+++ b/lib/Drupal/views/ViewStorage.php
@@ -2,171 +2,24 @@
 
 /**
  * @file
- * Definition of Drupal\views\ViewsDbObject.
+ * Definition of Drupal\views\ViewStorage.
  */
 
 namespace Drupal\views;
 
-/**
- * Base class for views' database objects.
- */
-class ViewsDbObject {
+use Drupal\config\ConfigurableBase;
 
-  public $db_table;
-
-  /**
-   * Initialize this object, setting values from schema defaults.
-   *
-   * @param $init
-   *   If an array, this is a set of values from db_fetch_object to
-   *   load. Otherwse, if TRUE values will be filled in from schema
-   *   defaults.
-   */
-  function init($init = TRUE) {
-    if (is_array($init)) {
-      return $this->load_row($init);
-    }
+class ViewStorage extends ConfigurableBase {
 
-    if (!$init) {
-      return;
-    }
-
-    $schema = drupal_get_schema($this->db_table);
-
-    if (!$schema) {
-      return;
-    }
-
-    // Go through our schema and build correlations.
-    foreach ($schema['fields'] as $field => $info) {
-      if ($info['type'] == 'serial') {
-        $this->$field = NULL;
-      }
-      if (!isset($this->$field)) {
-        if (!empty($info['serialize']) && isset($info['serialized default'])) {
-          $this->$field = unserialize($info['serialized default']);
-        }
-        elseif (isset($info['default'])) {
-          $this->$field = $info['default'];
-        }
-        else {
-          $this->$field = '';
-        }
-      }
-    }
+  public function __construct(array $values, $entity_type) {
+    parent::__construct($values, 'view');
   }
 
   /**
-   * Write the row to the database.
-   *
-   * @param $update
-   *   If true this will be an UPDATE query. Otherwise it will be an INSERT.
+   * Overrides Drupal\entity\StorableInterface::id().
    */
-  function save_row($update = NULL) {
-    $fields = $defs = $values = $serials = array();
-    $schema = drupal_get_schema($this->db_table);
-
-    // Go through our schema and build correlations.
-    foreach ($schema['fields'] as $field => $info) {
-      // special case -- skip serial types if we are updating.
-      if ($info['type'] == 'serial') {
-        $serials[] = $field;
-        continue;
-      }
-      elseif ($info['type'] == 'int') {
-        $this->$field = (int) $this->$field;
-      }
-      $fields[$field] = empty($info['serialize']) ? $this->$field : serialize($this->$field);
-    }
-    if (!$update) {
-      $query = db_insert($this->db_table);
-    }
-    else {
-      $query = db_update($this->db_table)
-        ->condition($update, $this->$update);
-    }
-    $return = $query
-      ->fields($fields)
-      ->execute();
-
-    if ($serials && !$update) {
-      // get last insert ids and fill them in.
-      // Well, one ID.
-      foreach ($serials as $field) {
-        $this->$field = $return;
-      }
-    }
-  }
-
-  /**
-   * Load the object with a row from the database.
-   *
-   * This method is separate from the constructor in order to give us
-   * more flexibility in terms of how the view object is built in different
-   * contexts.
-   *
-   * @param $data
-   *   An object from db_fetch_object. It should contain all of the fields
-   *   that are in the schema.
-   */
-  function load_row($data) {
-    $schema = drupal_get_schema($this->db_table);
-
-    // Go through our schema and build correlations.
-    foreach ($schema['fields'] as $field => $info) {
-      $this->$field = empty($info['serialize']) ? $data->$field : unserialize($data->$field);
-    }
-  }
-
-  /**
-   * Export a loaded row, such as an argument, field or the view itself to PHP code.
-   *
-   * @param $identifier
-   *   The variable to assign the PHP code for this object to.
-   * @param $indent
-   *   An optional indentation for prettifying nested code.
-   */
-  function export_row($identifier = NULL, $indent = '') {
-    // @todo replace with http://drupal.org/node/1741154.
-    ctools_include('export');
-
-    if (!$identifier) {
-      $identifier = $this->db_table;
-    }
-    $schema = drupal_get_schema($this->db_table);
-
-    $output = $indent . '$' . $identifier . ' = new ' . get_class($this) . "();\n";
-    // Go through our schema and build correlations.
-    foreach ($schema['fields'] as $field => $info) {
-      if (!empty($info['no export'])) {
-        continue;
-      }
-      if (!isset($this->$field)) {
-        if (isset($info['default'])) {
-          $this->$field = $info['default'];
-        }
-        else {
-          $this->$field = '';
-        }
-
-        // serialized defaults must be set as serialized.
-        if (isset($info['serialize'])) {
-          $this->$field = unserialize($this->$field);
-        }
-      }
-      $value = $this->$field;
-      if ($info['type'] == 'int') {
-        if (isset($info['size']) && $info['size'] == 'tiny') {
-          $value = (bool) $value;
-        }
-        else {
-          $value = (int) $value;
-        }
-      }
-
-      $output .= $indent . '$' . $identifier . '->' . $field . ' = ' . ctools_var_export($value, $indent) . ";\n";
-    }
-    return $output;
+  public function id() {
+    return $this->name;
   }
 
   /**
@@ -213,9 +66,14 @@ class ViewsDbObject {
       }
     }
 
+    $display_options = array(
+      'type' => $type,
+      'id' => $id,
+      'display_title' => $title,
+    );
+
     // Create the new display object
-    $display = new ViewsDisplay();
-    $display->options($type, $id, $title);
+    $display = new ViewDisplay($display_options);
 
     // Add the new display object to the view.
     $this->display[$id] = $display;
diff --git a/lib/Drupal/views/ViewStorageController.php b/lib/Drupal/views/ViewStorageController.php
new file mode 100644
index 0000000..ef5911a
--- /dev/null
+++ b/lib/Drupal/views/ViewStorageController.php
@@ -0,0 +1,128 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\views\ViewStorageController.
+ */
+
+namespace Drupal\views;
+
+use Drupal\config\ConfigStorageController;
+use Drupal\entity\StorableInterface;
+
+class ViewStorageController extends ConfigStorageController {
+
+  /**
+   * Overrides Drupal\config\ConfigStorageController::attachLoad();
+   */
+  protected function attachLoad(&$queried_entities, $revision_id = FALSE) {
+    foreach ($queried_entities as $id => $entity) {
+      $this->attachDisplays($entity);
+    }
+  }
+
+  /**
+   * Overrides Drupal\config\ConfigStorageController::save().
+   *
+   * This currently replaces the reflection code with a static array of
+   * properties to be set on the config object. This can be removed
+   * when the view storage is isolated so the ReflectionClass can work.
+   */
+  public function save(StorableInterface $entity) {
+    $prefix = $this->entityInfo['config prefix'] . '.';
+
+    // Load the stored entity, if any.
+    if ($entity->getOriginalID()) {
+      $id = $entity->getOriginalID();
+    }
+    else {
+      $id = $entity->id();
+    }
+    $config = config($prefix . $id);
+    $config->setName($prefix . $entity->id());
+
+    if (!$config->isNew() && !isset($entity->original)) {
+      $entity->original = entity_load_unchanged($this->entityType, $id);
+    }
+
+    $this->preSave($entity);
+    $this->invokeHook('presave', $entity);
+
+    // @todo: This temp measure will be removed once we have a better way or
+    // separation of storage and the executed view.
+    $config_properties = array (
+      'disabled',
+      'api_version',
+      'name',
+      'description',
+      'tag',
+      'base_table',
+      'human_name',
+      'core',
+      'display',
+    );
+
+    foreach ($config_properties as $property) {
+      if ($property == 'display') {
+        $displays = array();
+        foreach ($entity->display as $key => $display) {
+          $displays[$key] = array(
+            'display_options' => $display->display_options,
+            'display_plugin' => $display->display_plugin,
+            'id' => $display->id,
+            'display_title' => $display->display_title,
+            'position' => isset($display->position) ? $display->position : 0,
+          );
+        }
+        $config->set('display', $displays);
+      }
+      else {
+        $config->set($property, $entity->$property);
+      }
+    }
+
+    if (!$config->isNew()) {
+      $return = SAVED_NEW;
+      $config->save();
+      $this->postSave($entity, TRUE);
+      $this->invokeHook('update', $entity);
+    }
+    else {
+      $return = SAVED_UPDATED;
+      $config->save();
+      $entity->enforceIsNew(FALSE);
+      $this->postSave($entity, FALSE);
+      $this->invokeHook('insert', $entity);
+    }
+
+    unset($entity->original);
+
+    return $return;
+  }
+
+  /**
+   * Overrides Drupal\config\ConfigStorageController::create().
+   */
+  public function create(array $values) {
+    $entity = parent::create($values);
+    $this->attachDisplays($entity);
+    return $entity;
+  }
+
+  /**
+   * Attaches an array of ViewDisplay objects to the view display property.
+   *
+   * @param Drupal\entity\StorableInterface $entity
+   */
+  protected function attachDisplays($entity) {
+    if (isset($entity->display) && is_array($entity->display)) {
+      $displays = array();
+      foreach ($entity->get('display') as $key => $options) {
+        // Create a ViewDisplay object using the display options.
+        $displays[$key] = new ViewDisplay($options);
+      }
+      $entity->set('display', $displays);
+    }
+  }
+
+}
diff --git a/lib/Drupal/views/ViewsDisplay.php b/lib/Drupal/views/ViewsDisplay.php
deleted file mode 100644
index af7f47a..0000000
--- a/lib/Drupal/views/ViewsDisplay.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\views\ViewsDisplay.
- */
-
-namespace Drupal\views;
-
-/**
- * A display type in a view.
- *
- * This is just the database storage mechanism, and isn't terribly important
- * to the behavior of the display at all.
- */
-class ViewsDisplay extends ViewsDbObject {
-
-  /**
-   * The display handler itself, which has all the methods.
-   *
-   * @var views_plugin_display
-   */
-  var $handler;
-
-  /**
-   * Stores all options of the display, like fields, filters etc.
-   *
-   * @var array
-   */
-  var $display_options;
-
-  var $db_table = 'views_display';
-
-  function __construct($init = TRUE) {
-    parent::init($init);
-  }
-
-  function options($type, $id, $title) {
-    $this->display_plugin = $type;
-    $this->id = $id;
-    $this->display_title = $title;
-  }
-
-}
diff --git a/lib/Views/field/Plugin/views/field/Field.php b/lib/Views/field/Plugin/views/field/Field.php
index b0f2fc4..cfc406f 100644
--- a/lib/Views/field/Plugin/views/field/Field.php
+++ b/lib/Views/field/Plugin/views/field/Field.php
@@ -223,26 +223,26 @@ class Field extends FieldPluginBase {
       $this->ensure_my_table();
       $this->add_additional_fields($fields);
 
-      // Filter by langcode, if field translation is enabled.
+      // Filter by language, if field translation is enabled.
       $field = $this->field_info;
-      if (field_is_translatable($entity_type, $field) && !empty($this->view->display_handler->options['field_langcode_add_to_query'])) {
-        $column = $this->table_alias . '.langcode';
+      if (field_is_translatable($entity_type, $field) && !empty($this->view->display_handler->options['field_language_add_to_query'])) {
+        $column = $this->table_alias . '.language';
         // By the same reason as field_language the field might be LANGUAGE_NOT_SPECIFIED in reality so allow it as well.
-        // @see this::field_langcode()
-        $default_langcode = language_default()->langcode;
-        $langcode = str_replace(array('***CURRENT_LANGUAGE***', '***DEFAULT_LANGUAGE***'),
-                                array(drupal_container()->get(LANGUAGE_TYPE_CONTENT)->langcode, $default_langcode),
-                                $this->view->display_handler->options['field_langcode']);
+        // @see this::field_language()
+        $default_language = language_default()->langcode;
+        $language = str_replace(array('***CURRENT_LANGUAGE***', '***DEFAULT_LANGUAGE***'),
+                                array(drupal_container()->get(LANGUAGE_TYPE_CONTENT)->langcode, $default_language),
+                                $this->view->display_handler->options['field_language']);
         $placeholder = $this->placeholder();
-        $langcode_fallback_candidates = array($langcode);
+        $language_fallback_candidates = array($language);
         if (variable_get('locale_field_language_fallback', TRUE)) {
           require_once DRUPAL_ROOT . '/includes/language.inc';
-          $langcode_fallback_candidates = array_merge($langcode_fallback_candidates, language_fallback_get_candidates());
+          $language_fallback_candidates = array_merge($language_fallback_candidates, language_fallback_get_candidates());
         }
         else {
-          $langcode_fallback_candidates[] = LANGUAGE_NOT_SPECIFIED;
+          $language_fallback_candidates[] = LANGUAGE_NOT_SPECIFIED;
         }
-        $this->query->add_where_expression(0, "$column IN($placeholder) OR $column IS NULL", array($placeholder => $langcode_fallback_candidates));
+        $this->query->add_where_expression(0, "$column IN($placeholder) OR $column IS NULL", array($placeholder => $language_fallback_candidates));
       }
     }
 
@@ -719,7 +719,7 @@ class Field extends FieldPluginBase {
     $entity = clone $values->_field_data[$this->field_alias]['entity'];
 
     $entity_type = $values->_field_data[$this->field_alias]['entity_type'];
-    $langcode = $this->field_langcode($entity_type, $entity);
+    $langcode = $this->field_language($entity_type, $entity);
     // If we are grouping, copy our group fields into the cloned entity.
     // It's possible this will cause some weirdness, but there's only
     // so much we can hope to do.
@@ -840,7 +840,7 @@ class Field extends FieldPluginBase {
       return array();
     }
 
-    $langcode = $this->field_langcode($entity_type, $entity);
+    $langcode = $this->field_language($entity_type, $entity);
     $render_array = field_view_field($entity_type, $entity, $this->definition['field_name'], $display, $langcode);
 
     $items = array();
@@ -906,20 +906,20 @@ class Field extends FieldPluginBase {
    * Return the language code of the language the field should be displayed in,
    * according to the settings.
    */
-  function field_langcode($entity_type, $entity) {
+  function field_language($entity_type, $entity) {
     if (field_is_translatable($entity_type, $this->field_info)) {
-      $default_langcode = language_default()->langcode;
-      $langcode = str_replace(array('***CURRENT_LANGUAGE***', '***DEFAULT_LANGUAGE***'),
-                              array(drupal_container()->get(LANGUAGE_TYPE_CONTENT)->langcode, $default_langcode),
+      $default_language = language_default()->langcode;
+      $language = str_replace(array('***CURRENT_LANGUAGE***', '***DEFAULT_LANGUAGE***'),
+                              array(drupal_container()->get(LANGUAGE_TYPE_CONTENT)->langcode, $default_language),
                               $this->view->display_handler->options['field_language']);
 
       // Give the Field Language API a chance to fallback to a different language
       // (or LANGUAGE_NOT_SPECIFIED), in case the field has no data for the selected language.
       // field_view_field() does this as well, but since the returned language code
       // is used before calling it, the fallback needs to happen explicitly.
-      $langcode = field_language($entity_type, $entity, $this->field_info['field_name'], $langcode);
+      $language = field_language($entity_type, $entity, $this->field_info['field_name'], $language);
 
-      return $langcode;
+      return $language;
     }
     else {
       return LANGUAGE_NOT_SPECIFIED;
diff --git a/lib/Views/locale/Plugin/views/argument/Language.php b/lib/Views/locale/Plugin/views/argument/Language.php
index f53041d..56aed78 100644
--- a/lib/Views/locale/Plugin/views/argument/Language.php
+++ b/lib/Views/locale/Plugin/views/argument/Language.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Definition of Views\language\Plugin\views\argument\Language.
+ * Definition of Views\locale\Plugin\views\argument\Language.
  */
 
-namespace Views\language\Plugin\views\argument;
+namespace Views\locale\Plugin\views\argument;
 
 use Drupal\views\Plugin\views\argument\ArgumentPluginBase;
 use Drupal\Core\Annotation\Plugin;
@@ -16,18 +16,22 @@ use Drupal\Core\Annotation\Plugin;
  * @ingroup views_argument_handlers
  *
  * @Plugin(
- *   id = "language",
- *   module = "language"
+ *   id = "locale_language",
+ *   module = "locale"
  * )
  */
 class Language extends ArgumentPluginBase {
 
+  function construct() {
+    parent::construct('language');
+  }
+
   /**
    * Override the behavior of summary_name(). Get the user friendly version
    * of the language.
    */
   function summary_name($data) {
-    return $this->language($data->{$this->name_alias});
+    return $this->locale_language($data->{$this->name_alias});
   }
 
   /**
@@ -35,10 +39,10 @@ class Language extends ArgumentPluginBase {
    * of the language.
    */
   function title() {
-    return $this->language($this->argument);
+    return $this->locale_language($this->argument);
   }
 
-  function language($langcode) {
+  function locale_language($langcode) {
     $languages = views_language_list();
     return isset($languages[$langcode]) ? $languages[$langcode] : t('Unknown language');
   }
diff --git a/lib/Views/locale/Plugin/views/field/Language.php b/lib/Views/locale/Plugin/views/field/Language.php
index 7b003c1..d7d0caf 100644
--- a/lib/Views/locale/Plugin/views/field/Language.php
+++ b/lib/Views/locale/Plugin/views/field/Language.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Definition of Views\language\Plugin\views\field\Language.
+ * Definition of Views\locale\Plugin\views\field\Language.
  */
 
-namespace Views\language\Plugin\views\field;
+namespace Views\locale\Plugin\views\field;
 
 use Drupal\views\Plugin\views\field\FieldPluginBase;
 use Drupal\Core\Annotation\Plugin;
@@ -16,8 +16,8 @@ use Drupal\Core\Annotation\Plugin;
  * @ingroup views_field_handlers
  *
  * @Plugin(
- *   id = "language",
- *   module = "language"
+ *   id = "locale_language",
+ *   module = "locale"
  * )
  */
 class Language extends FieldPluginBase {
@@ -40,11 +40,9 @@ class Language extends FieldPluginBase {
   }
 
   function render($values) {
-    // @todo: Drupal Core dropped native language until config translation is
-    // ready, see http://drupal.org/node/1616594.
+    $languages = locale_language_list(empty($this->options['native_language']) ? 'name' : 'native');
     $value = $this->get_value($values);
-    $language = language_load($value);
-    return $language ? $language->name : '';
+    return isset($languages[$value]) ? $languages[$value] : '';
   }
 
 }
diff --git a/lib/Views/locale/Plugin/views/field/NodeLanguage.php b/lib/Views/locale/Plugin/views/field/NodeLanguage.php
index 76ace42..af82aef 100644
--- a/lib/Views/locale/Plugin/views/field/NodeLanguage.php
+++ b/lib/Views/locale/Plugin/views/field/NodeLanguage.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Definition of Views\node\Plugin\views\field\Language.
+ * Definition of Views\locale\Plugin\views\field\NodeLanguage.
  */
 
-namespace Views\node\Plugin\views\field;
+namespace Views\locale\Plugin\views\field;
 
 use Views\node\Plugin\views\field\Node;
 use Drupal\Core\Annotation\Plugin;
@@ -17,10 +17,10 @@ use Drupal\Core\Annotation\Plugin;
  *
  * @Plugin(
  *   id = "node_language",
- *   module = "node"
+ *   module = "locale"
  * )
  */
-class Language extends Node {
+class NodeLanguage extends Node {
 
   function option_definition() {
     $options = parent::option_definition();
@@ -40,11 +40,9 @@ class Language extends Node {
   }
 
   function render($values) {
-    // @todo: Drupal Core dropped native language until config translation is
-    // ready, see http://drupal.org/node/1616594.
+    $languages = views_language_list(empty($this->options['native_language']) ? 'name' : 'native');
     $value = $this->get_value($values);
-    $language = language_load($value);
-    $value = $language ? $language->name : '';
+    $value = isset($languages[$value]) ? $languages[$value] : '';
     return $this->render_link($value, $values);
   }
 
diff --git a/lib/Views/locale/Plugin/views/filter/Language.php b/lib/Views/locale/Plugin/views/filter/Language.php
index 294690c..384a967 100644
--- a/lib/Views/locale/Plugin/views/filter/Language.php
+++ b/lib/Views/locale/Plugin/views/filter/Language.php
@@ -2,13 +2,13 @@
 
 /**
  * @file
- * Definition of Views\language\Plugin\views\filter\Language.
+ * Definition of Views\locale\Plugin\views\filter\Language.
  */
 
-namespace Views\language\Plugin\views\filter;
+namespace Views\locale\Plugin\views\filter;
 
-use Drupal\views\Plugin\views\filter\InOperator;
 use Drupal\Core\Annotation\Plugin;
+use Drupal\views\Plugin\views\filter\InOperator;
 
 /**
  * Filter by language.
@@ -16,8 +16,8 @@ use Drupal\Core\Annotation\Plugin;
  * @ingroup views_filter_handlers
  *
  * @Plugin(
- *   id = "language",
- *   module = "language"
+ *   id = "locale_language",
+ *   module = "locale"
  * )
  */
 class Language extends InOperator {
diff --git a/lib/Views/locale/Plugin/views/filter/Language.php b/lib/Views/locale/Plugin/views/filter/NodeLanguage.php
similarity index 76%
copy from lib/Views/locale/Plugin/views/filter/Language.php
copy to lib/Views/locale/Plugin/views/filter/NodeLanguage.php
index 294690c..1ee7fb4 100644
--- a/lib/Views/locale/Plugin/views/filter/Language.php
+++ b/lib/Views/locale/Plugin/views/filter/NodeLanguage.php
@@ -2,13 +2,13 @@
 
 /**
  * @file
- * Definition of Views\language\Plugin\views\filter\Language.
+ * Definition of Views\locale\Plugin\views\filter\NodeLanguage.
  */
 
-namespace Views\language\Plugin\views\filter;
+namespace Views\locale\Plugin\views\filter;
 
-use Drupal\views\Plugin\views\filter\InOperator;
 use Drupal\Core\Annotation\Plugin;
+use Drupal\views\Plugin\views\filter\InOperator;
 
 /**
  * Filter by language.
@@ -16,11 +16,11 @@ use Drupal\Core\Annotation\Plugin;
  * @ingroup views_filter_handlers
  *
  * @Plugin(
- *   id = "language",
- *   module = "language"
+ *   id = "node_language",
+ *   module = "locale"
  * )
  */
-class Language extends InOperator {
+class NodeLanguage extends InOperator {
 
   function get_value_options() {
     if (!isset($this->value_options)) {
diff --git a/lib/Views/locale/Plugin/views/argument/Language.php b/lib/Views/node/Plugin/views/argument/Language.php
similarity index 61%
copy from lib/Views/locale/Plugin/views/argument/Language.php
copy to lib/Views/node/Plugin/views/argument/Language.php
index f53041d..d03016d 100644
--- a/lib/Views/locale/Plugin/views/argument/Language.php
+++ b/lib/Views/node/Plugin/views/argument/Language.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Definition of Views\language\Plugin\views\argument\Language.
+ * Definition of Views\node\Plugin\views\argument\Language.
  */
 
-namespace Views\language\Plugin\views\argument;
+namespace Views\node\Plugin\views\argument;
 
 use Drupal\views\Plugin\views\argument\ArgumentPluginBase;
 use Drupal\Core\Annotation\Plugin;
@@ -13,32 +13,34 @@ use Drupal\Core\Annotation\Plugin;
 /**
  * Argument handler to accept a language.
  *
- * @ingroup views_argument_handlers
- *
  * @Plugin(
- *   id = "language",
- *   module = "language"
+ *   id = "node_language",
+ *   module = "node"
  * )
  */
 class Language extends ArgumentPluginBase {
 
+  function construct() {
+    parent::construct('language');
+  }
+
   /**
    * Override the behavior of summary_name(). Get the user friendly version
    * of the language.
    */
   function summary_name($data) {
-    return $this->language($data->{$this->name_alias});
+    return $this->node_language($data->{$this->name_alias});
   }
 
   /**
-   * Override the behavior of title(). Get the user friendly version
-   * of the language.
+   * Override the behavior of title(). Get the user friendly version of the
+   * node type.
    */
   function title() {
-    return $this->language($this->argument);
+    return $this->node_language($this->argument);
   }
 
-  function language($langcode) {
+  function node_language($langcode) {
     $languages = views_language_list();
     return isset($languages[$langcode]) ? $languages[$langcode] : t('Unknown language');
   }
diff --git a/lib/Views/node/Plugin/views/argument_validator/Node.php b/lib/Views/node/Plugin/views/argument_validator/Node.php
index e20d2b0..da06721 100644
--- a/lib/Views/node/Plugin/views/argument_validator/Node.php
+++ b/lib/Views/node/Plugin/views/argument_validator/Node.php
@@ -80,6 +80,15 @@ class Node extends ArgumentValidatorPluginBase {
     $options['types'] = array_filter($options['types']);
   }
 
+  function convert_options(&$options) {
+    if (!isset($options['types']) && !empty($this->argument->options['validate_argument_node_type'])) {
+      $options['types'] = isset($this->argument->options['validate_argument_node_type']) ? $this->argument->options['validate_argument_node_type'] : array();
+      $options['access'] = !empty($this->argument->options['validate_argument_node_access']);
+      $options['access_op'] = isset($this->argument->options['validate_argument_node_access_op']) ? $this->argument->options['validate_argument_node_access_op'] : 'view';
+      $options['nid_type'] = isset($this->argument->options['validate_argument_nid_type']) ? $this->argument->options['validate_argument_nid_type'] : array();
+    }
+  }
+
   function validate_argument($argument) {
     $types = $this->options['types'];
 
diff --git a/lib/Views/node/Plugin/views/field/Node.php b/lib/Views/node/Plugin/views/field/Node.php
index 7bea649..29d57fa 100644
--- a/lib/Views/node/Plugin/views/field/Node.php
+++ b/lib/Views/node/Plugin/views/field/Node.php
@@ -30,7 +30,7 @@ class Node extends FieldPluginBase {
     if (!empty($this->options['link_to_node'])) {
       $this->additional_fields['nid'] = array('table' => 'node', 'field' => 'nid');
       if (module_exists('translation')) {
-        $this->additional_fields['langcode'] = array('table' => 'node', 'field' => 'langcode');
+        $this->additional_fields['language'] = array('table' => 'node', 'field' => 'language');
       }
     }
   }
@@ -65,11 +65,11 @@ class Node extends FieldPluginBase {
       if ($data !== NULL && $data !== '') {
         $this->options['alter']['make_link'] = TRUE;
         $this->options['alter']['path'] = "node/" . $this->get_value($values, 'nid');
-        if (isset($this->aliases['langcode'])) {
+        if (isset($this->aliases['language'])) {
           $languages = language_list();
-          $langcode = $this->get_value($values, 'langcode');
-          if (isset($languages[$langcode])) {
-            $this->options['alter']['language'] = $languages[$langcode];
+          $language = $this->get_value($values, 'language');
+          if (isset($languages[$language])) {
+            $this->options['alter']['language'] = $languages[$language];
           }
           else {
             unset($this->options['alter']['language']);
diff --git a/lib/Views/node/Plugin/views/field/Revision.php b/lib/Views/node/Plugin/views/field/Revision.php
index 0882f48..b110e76 100644
--- a/lib/Views/node/Plugin/views/field/Revision.php
+++ b/lib/Views/node/Plugin/views/field/Revision.php
@@ -28,7 +28,7 @@ class Revision extends Node {
       $this->additional_fields['vid'] = 'vid';
       $this->additional_fields['nid'] = 'nid';
       if (module_exists('translation')) {
-        $this->additional_fields['langcode'] = array('table' => 'node', 'field' => 'langcode');
+        $this->additional_fields['language'] = array('table' => 'node', 'field' => 'language');
       }
     }
   }
@@ -63,10 +63,10 @@ class Revision extends Node {
       $vid = $this->get_value($values, 'vid');
       $this->options['alter']['path'] = "node/" . $nid . '/revisions/' . $vid . '/view';
       if (module_exists('translation')) {
-        $langcode = $this->get_value($values, 'langcode');
+        $language = $this->get_value($values, 'language');
         $languages = language_list();
-        if (isset($languages[$langcode])) {
-          $this->options['alter']['langcode'] = $languages[$langcode];
+        if (isset($languages[$language])) {
+          $this->options['alter']['language'] = $languages[$language];
         }
       }
     }
diff --git a/lib/Views/taxonomy/Plugin/views/argument_validate/Term.php b/lib/Views/taxonomy/Plugin/views/argument_validate/Term.php
index d57877a..d2a27a2 100644
--- a/lib/Views/taxonomy/Plugin/views/argument_validate/Term.php
+++ b/lib/Views/taxonomy/Plugin/views/argument_validate/Term.php
@@ -87,6 +87,14 @@ class Term extends ArgumentValidatorPluginBase {
     $options['vocabularies'] = array_filter($options['vocabularies']);
   }
 
+  function convert_options(&$options) {
+    if (!isset($options['vocabularies']) && !empty($this->argument->options['validate_argument_vocabulary'])) {
+      $options['vocabularies'] = $this->argument->options['validate_argument_vocabulary'];
+      $options['type'] = $this->argument->options['validate_argument_type'];
+      $options['transform'] = isset($this->argument->options['validate_argument_transform']) ? $this->argument->options['validate_argument_transform'] : FALSE;
+    }
+  }
+
   function validate_argument($argument) {
     $vocabularies = array_filter($this->options['vocabularies']);
     $type = $this->options['type'];
diff --git a/lib/Views/translation/Plugin/views/field/NodeLinkTranslate.php b/lib/Views/translation/Plugin/views/field/NodeLinkTranslate.php
index b915c40..a430406 100644
--- a/lib/Views/translation/Plugin/views/field/NodeLinkTranslate.php
+++ b/lib/Views/translation/Plugin/views/field/NodeLinkTranslate.php
@@ -26,7 +26,7 @@ class NodeLinkTranslate extends Link {
     // ensure user has access to edit this node.
     $node = $this->get_value($values);
     $node->status = 1; // unpublished nodes ignore access control
-    if (empty($node->langcode) || !translation_supported_type($node->type) || !node_access('view', $node) || !user_access('translate content')) {
+    if (empty($node->language) || !translation_supported_type($node->type) || !node_access('view', $node) || !user_access('translate content')) {
       return;
     }
 
diff --git a/lib/Views/translation/Plugin/views/field/NodeTranslationLink.php b/lib/Views/translation/Plugin/views/field/NodeTranslationLink.php
index 7c553f1..0d9b054 100644
--- a/lib/Views/translation/Plugin/views/field/NodeTranslationLink.php
+++ b/lib/Views/translation/Plugin/views/field/NodeTranslationLink.php
@@ -27,7 +27,7 @@ class NodeTranslationLink extends FieldPluginBase {
     $this->additional_fields['nid'] = 'nid';
     $this->additional_fields['tnid'] = 'tnid';
     $this->additional_fields['title'] = 'title';
-    $this->additional_fields['langcode'] = 'langcode';
+    $this->additional_fields['language'] = 'language';
   }
 
   function query() {
@@ -45,7 +45,7 @@ class NodeTranslationLink extends FieldPluginBase {
 
     $tnid = $this->get_value($values, 'tnid');
     // Only load translations if the node isn't in the current language.
-    if ($this->get_value($values, 'langcode') != $language_interface->langcode) {
+    if ($this->get_value($values, 'language') != $language_interface->langcode) {
       $translations = translation_node_get_translations($tnid);
       if (isset($translations[$language_interface->langcode])) {
         $values->{$this->aliases['nid']} = $translations[$language_interface->langcode]->nid;
diff --git a/lib/Views/translation/Plugin/views/relationship/Translation.php b/lib/Views/translation/Plugin/views/relationship/Translation.php
index 1cb4969..4931162 100644
--- a/lib/Views/translation/Plugin/views/relationship/Translation.php
+++ b/lib/Views/translation/Plugin/views/relationship/Translation.php
@@ -41,7 +41,7 @@ class Translation extends RelationshipPluginBase {
       'current' => t('Current language'),
       'default' => t('Default language'),
     );
-    $options = array_merge($options, views_language_list());
+    $options = array_merge($options, locale_language_list());
     $form['language'] = array(
       '#type' => 'select',
       '#options' => $options,
@@ -75,20 +75,20 @@ class Translation extends RelationshipPluginBase {
       switch ($this->options['language']) {
         case 'current':
           $def['extra'][] = array(
-            'field' => 'langcode',
+            'field' => 'language',
             'value' => '***CURRENT_LANGUAGE***',
           );
           break;
         case 'default':
           $def['extra'][] = array(
-            'field' => 'langcode',
+            'field' => 'language',
             'value' => '***DEFAULT_LANGUAGE***',
           );
           break;
         // Other values will be the language codes.
         default:
           $def['extra'][] = array(
-            'field' => 'langcode',
+            'field' => 'language',
             'value' => $this->options['language'],
           );
           break;
diff --git a/lib/Views/user/Plugin/views/argument_default/User.php b/lib/Views/user/Plugin/views/argument_default/User.php
index 5f31360..a5bdc01 100644
--- a/lib/Views/user/Plugin/views/argument_default/User.php
+++ b/lib/Views/user/Plugin/views/argument_default/User.php
@@ -37,6 +37,12 @@ class User extends ArgumentDefaultPluginBase {
     );
   }
 
+  function convert_options(&$options) {
+    if (!isset($options['user']) && isset($this->argument->options['default_argument_user'])) {
+      $options['user'] = $this->argument->options['default_argument_user'];
+    }
+  }
+
   function get_argument() {
     foreach (range(1, 3) as $i) {
       $user = menu_get_object('user', $i);
diff --git a/lib/Views/user/Plugin/views/argument_validator/User.php b/lib/Views/user/Plugin/views/argument_validator/User.php
index 7704896..5c1cb45 100644
--- a/lib/Views/user/Plugin/views/argument_validator/User.php
+++ b/lib/Views/user/Plugin/views/argument_validator/User.php
@@ -72,6 +72,14 @@ class User extends ArgumentValidatorPluginBase {
     $options['roles'] = array_filter($options['roles']);
   }
 
+  function convert_options(&$options) {
+    if (!isset($options['type']) && isset($this->argument->options['validate_user_argument_type'])) {
+      $options['type'] = $this->argument->options['validate_user_argument_type'];
+      $options['restrict_roles'] = $this->argument->options['validate_user_restrict_roles'];
+      $options['roles'] = $this->argument->options['validate_user_roles'];
+    }
+  }
+
   function validate_argument($argument) {
     $type = $this->options['type'];
     // is_numeric() can return false positives, so we ensure it's an integer.
diff --git a/modules/comment.views.inc b/modules/comment.views.inc
index e950298..1b5990c 100644
--- a/modules/comment.views.inc
+++ b/modules/comment.views.inc
@@ -165,10 +165,9 @@ function comment_views_data() {
   );
 
 
-  // Langcode field
-  if (module_exists('language')) {
-    $data['comment']['language']['moved to'] = array('comment', 'langcode');
-    $data['comment']['langcode'] = array(
+  // Language field
+  if (module_exists('locale')) {
+    $data['comment']['language'] = array(
       'title' => t('Language'),
       'help' => t('The language the comment is in.'),
       'field' => array(
diff --git a/modules/field.views.inc b/modules/field.views.inc
index 1f2ed12..6c9de81 100644
--- a/modules/field.views.inc
+++ b/modules/field.views.inc
@@ -165,7 +165,7 @@ function field_views_field_default_views_data($field) {
     $tables[FIELD_LOAD_REVISION] = $revision_table;
   }
 
-  $add_fields = array('delta', 'langcode', 'bundle');
+  $add_fields = array('delta', 'language', 'bundle');
   foreach ($field['columns'] as $column_name => $attributes) {
     $add_fields[] = _field_sql_storage_columnname($field['field_name'], $column_name);
   }
diff --git a/modules/language.views.inc b/modules/language.views.inc
index 7521d52..1780191 100644
--- a/modules/language.views.inc
+++ b/modules/language.views.inc
@@ -19,6 +19,10 @@ function language_views_data() {
     'help' => t('A language used in drupal.'),
   );
 
+  // name
+  // direction
+  // weight
+
   $data['language']['langcode'] = array(
     'title' => t('Language code'),
     'help' => t("Language code, e.g. 'de' or 'en-US'."),
diff --git a/modules/locale.views.inc b/modules/locale.views.inc
index a18c80a..cdbb32b 100644
--- a/modules/locale.views.inc
+++ b/modules/locale.views.inc
@@ -195,3 +195,27 @@ function locale_views_data() {
 
   return $data;
 }
+
+/**
+ * Implements hook_views_data_alter().
+ */
+function locale_views_data_alter(&$data) {
+  // Language field
+  $data['node']['language'] = array(
+    'title' => t('Language'),
+    'help' => t('The language the content is in.'),
+    'field' => array(
+      'id' => 'node_language',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'id' => 'node_language',
+    ),
+    'argument' => array(
+      'id' => 'node_language',
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+  );
+}
diff --git a/modules/node.views.inc b/modules/node.views.inc
index e2a6dab..cdabd84 100644
--- a/modules/node.views.inc
+++ b/modules/node.views.inc
@@ -221,28 +221,6 @@ function node_views_data() {
     ),
   );
 
-  // Language field
-  if (module_exists('language')) {
-    $data['node']['language']['moved to'] = array('node', 'langcode');
-    $data['node']['langcode'] = array(
-      'title' => t('Language'),
-      'help' => t('The language the content is in.'),
-      'field' => array(
-        'id' => 'node_language',
-        'click sortable' => TRUE,
-      ),
-      'filter' => array(
-        'id' => 'language',
-      ),
-      'argument' => array(
-        'id' => 'language',
-      ),
-      'sort' => array(
-        'id' => 'standard',
-      ),
-    );
-  }
-
   // Define some fields based upon views_handler_field_entity in the entity
   // table so they can be re-used with other query backends.
   // @see views_handler_field_entity
diff --git a/modules/user.views.inc b/modules/user.views.inc
index 4f399c0..8b925d6 100644
--- a/modules/user.views.inc
+++ b/modules/user.views.inc
@@ -151,8 +151,7 @@ function user_views_data() {
   );
 
   // language
-  $data['users']['language']['moved to'] = array('users', 'langcode');
-  $data['users']['langcode'] = array(
+  $data['users']['language'] = array(
     'title' => t('Language'), // The item it appears as on the UI,
     'help' => t('Language of the user'),
     'field' => array(
diff --git a/tests/views_test/views_cache.test.css b/tests/views_cache.test.css
similarity index 100%
rename from tests/views_test/views_cache.test.css
rename to tests/views_cache.test.css
diff --git a/tests/views_test/views_cache.test.js b/tests/views_cache.test.js
similarity index 100%
rename from tests/views_test/views_cache.test.js
rename to tests/views_cache.test.js
diff --git a/views.info b/views.info
index adea473..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.base.css
+stylesheets[all][] = css/views.css
diff --git a/views.install b/views.install
index b986b05..6154bab 100644
--- a/views.install
+++ b/views.install
@@ -35,6 +35,9 @@ function views_schema() {
       ),
       'object' => 'Drupal\views\View',
       // the callback to load the displays
+      'load all callback' => 'views_get_all_views',
+      'load callback' => 'views_storage_load',
+      'save callback' => 'views_storage_save',
       'subrecords callback' => 'views_load_display_records',
       // the variable that holds enabled/disabled status
       'status' => 'views_defaults',
diff --git a/views.module b/views.module
index b840c02..fe0796f 100644
--- a/views.module
+++ b/views.module
@@ -36,7 +36,6 @@ function views_core_modules() {
     'field',
     'filter',
     'file',
-    'language',
     'locale',
     'node',
     'search',
@@ -75,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;
 }
 
 /**
@@ -965,18 +967,18 @@ function views_add_contextual_links(&$render_element, $location, $view, $display
  *   Boolean to return all languages or only enabled ones
  *
  * @see locale_language_list()
- * @todo Figure out whether we need this with language module.
  */
 function views_language_list($field = 'name', $all = FALSE) {
   if ($all) {
     $languages = language_list();
   }
   else {
-    $languages = language_list();
+    $languages = language_list('enabled');
+    $languages = $languages[1];
   }
   $list = array();
   foreach ($languages as $language) {
-    $list[$language->langcode] = ($field == 'name') ? t($language->name) : $language->$field;
+    $list[$language->language] = ($field == 'name') ? t($language->name) : $language->$field;
   }
   return $list;
 }
@@ -1387,7 +1389,7 @@ function views_fetch_plugin_names($type, $key = NULL, $base = array()) {
       continue;
     }
 
-    if (empty($plugin['no_ui']) && (empty($base) || empty($plugin['base']) || array_intersect($base, $plugin['base']))) {
+    if (empty($plugin['no ui']) && (empty($base) || empty($plugin['base']) || array_intersect($base, $plugin['base']))) {
       $plugins[$id] = $plugin['title'];
     }
   }
@@ -1570,8 +1572,28 @@ function views_get_applicable_views($type) {
  */
 function views_get_all_views($reset = FALSE) {
   // @todo replace with http://drupal.org/node/1741154.
-  ctools_include('export');
-  return ctools_export_crud_load_all('views_view', $reset);
+  $controller = entity_get_controller('view');
+  return $controller->load();
+}
+
+/**
+ * Loads a view with the storage controller.
+ *
+ * @param string $id
+ *   The view name to load.
+ *
+ * @return Drupal\views\View
+ *   The view which is loaded.
+ */
+function views_storage_load($id) {
+  $controller = entity_get_controller('view');
+  $result = $controller->load(array($id));
+  return reset($result);
+}
+
+function views_storage_save(View $view) {
+  $controller = entity_get_controller('view');
+  return $controller->save($view);
 }
 
 /**
diff --git a/views.tokens.inc b/views.tokens.inc
index efc2f41..cc45b5c 100644
--- a/views.tokens.inc
+++ b/views.tokens.inc
@@ -48,7 +48,7 @@ function views_tokens($type, $tokens, array $data = array(), array $options = ar
     $url_options['language'] = $options['language'];
   }
   $sanitize = !empty($options['sanitize']);
-  $langcode = isset($options['language']) ? $options['language']->langcode : NULL;
+  $langcode = isset($options['language']) ? $options['language']->language : NULL;
 
   $replacements = array();
 
