diff --git a/sites/all/modules/views/help/api-plugins.html b/sites/all/modules/views/help/api-plugins.html
index 5f85061..4ad645e 100644
--- a/sites/all/modules/views/help/api-plugins.html
+++ b/sites/all/modules/views/help/api-plugins.html
@@ -13,6 +13,8 @@ There are 5 types of plugins in Views:
 <dd>Argument default plugins allow pluggable ways of providing arguments for blocks. Views includes plugins to extract node and user IDs from the URL; additional plugins could be used for a wide variety of tasks.</dd>
 <dt>Argument validator</dt>
 <dd>Validator plugins can ensure arguments are valid, and even do transformations on the arguments.</dd>
+<dt>Access</dt>
+<dd>Access plugins are responsible for controlling access to the view.</dd>
 </dl>
 
 Plugins are registered by implementing <strong>hook_views_plugins()</strong> in your modulename.views.inc file and returning an array of data.
@@ -35,6 +37,9 @@ The array will look something like this:
     'argument validator' => array(
       // ... list of argument validator plugins,
      ),
+     'access' => array(
+      // ... list of access plugins,
+     ),
   );
 <code>
 
@@ -72,4 +77,4 @@ Of particular interest is the <em>path</em> directive, which works a little diff
 
 Note that unlike handler registration, where parentage is referred to by object name, with plugins it is referred to by the unique plugin identifier. Please be sure to prefix your plugin identifiers with your module name to ensure namespace safety; after all, two different modules could try to implement the 'grid2' plugin, and that would cause one plugin to completely fail.
 
-...TODO: Finish this document....
\ No newline at end of file
+...TODO: Finish this document....
diff --git a/sites/all/modules/views/includes/handlers.inc b/sites/all/modules/views/includes/handlers.inc
index f5c4a01..899d21c 100644
--- a/sites/all/modules/views/includes/handlers.inc
+++ b/sites/all/modules/views/includes/handlers.inc
@@ -473,6 +473,19 @@ class views_handler extends views_object {
   }
 
   /**
+   * Validates the handler against the complete View.
+   *
+   * This is called when the complete View is being validated. For validating
+   * the handler options form use options_validate().
+   *
+   * @see views_handler::options_validate()
+   *
+   * @return
+   *   Empty array if the handler is valid; an array of error strings if it is not.
+   */
+  function validate() { return array(); }
+
+  /**
    * Determine if the handler is considered 'broken', meaning it's a
    * a placeholder used when a handler can't be found.
    */
diff --git a/sites/all/modules/views/includes/plugins.inc b/sites/all/modules/views/includes/plugins.inc
index 5223ceb..00a024f 100644
--- a/sites/all/modules/views/includes/plugins.inc
+++ b/sites/all/modules/views/includes/plugins.inc
@@ -241,10 +241,10 @@ function views_views_plugins() {
 /**
  * Builds and return a list of all plugins available in the system.
  *
- * @return Nested array of plugins, grouped by type and
+ * @return Nested array of plugins, grouped by type.
  */
 function views_discover_plugins() {
-  $cache = array('display' => array(), 'style' => array(), 'row' => array());
+  $cache = array('display' => array(), 'style' => array(), 'row' => array(), 'argument default' => array(), 'argument validator' => array(), 'access' => array());
   // Get plugins from all mdoules.
   foreach (module_implements('views_plugins') as $module) {
     $function = $module . '_views_plugins';
diff --git a/sites/all/modules/views/plugins/views_plugin_access_perm.inc b/sites/all/modules/views/plugins/views_plugin_access_perm.inc
index 12c3c34..cb90920 100644
--- a/sites/all/modules/views/plugins/views_plugin_access_perm.inc
+++ b/sites/all/modules/views/plugins/views_plugin_access_perm.inc
@@ -2,7 +2,7 @@
 // $Id: views_plugin_access_perm.inc,v 1.2 2008/09/17 22:26:55 merlinofchaos Exp $
 
 /**
- * Access plugin that provides no access control at all.
+ * Access plugin that provides permission-based access control.
  */
 class views_plugin_access_perm extends views_plugin_access {
   function access($account) {
diff --git a/sites/all/modules/views/plugins/views_plugin_access_role.inc b/sites/all/modules/views/plugins/views_plugin_access_role.inc
index a8fd2fb..76f9543 100644
--- a/sites/all/modules/views/plugins/views_plugin_access_role.inc
+++ b/sites/all/modules/views/plugins/views_plugin_access_role.inc
@@ -2,7 +2,7 @@
 // $Id: views_plugin_access_role.inc,v 1.1 2008/09/08 22:50:17 merlinofchaos Exp $
 
 /**
- * Access plugin that provides no access control at all.
+ * Access plugin that provides role-based access control.
  */
 class views_plugin_access_role extends views_plugin_access {
   function access($account) {
diff --git a/sites/all/modules/views/plugins/views_plugin_display.inc b/sites/all/modules/views/plugins/views_plugin_display.inc
index c8b2dc6..68d88d9 100644
--- a/sites/all/modules/views/plugins/views_plugin_display.inc
+++ b/sites/all/modules/views/plugins/views_plugin_display.inc
@@ -1618,6 +1618,12 @@ class views_plugin_display extends views_plugin {
    */
   function get_style_type() { return 'normal'; }
 
+  /**
+   * Make sure the display and all associated handlers are valid.
+   *
+   * @return
+   *   Empty array if the display is valid; an array of error strings if it is not.
+   */
   function validate() {
     $errors = array();
     // Make sure displays that use fields HAVE fields.
@@ -1638,6 +1644,7 @@ class views_plugin_display extends views_plugin {
       $errors[] = t('Display "@display" uses a path but the path is undefined.', array('@display' => $this->display->display_title));
     }
 
+    // Validate style plugin
     $style = $this->get_plugin();
     if (empty($style)) {
       $errors[] = t('Display "@display" has an invalid style plugin.', array('@display' => $this->display->display_title));
@@ -1648,6 +1655,22 @@ class views_plugin_display extends views_plugin {
         $errors = array_merge($errors, $result);
       }
     }
+
+    // Validate handlers
+    foreach (views_object_types() as $type => $info) {
+      $plural = $info['plural'];
+      // Skip handlers which are defaulted as there is no point in
+      // validating them again.
+      if (!$this->is_defaulted($plural)) {
+        foreach ($this->get_handlers($type) as $handler) {
+          $result = $handler->validate();
+          if (!empty($result) && is_array($result)) {
+            $errors = array_merge($errors, $result);
+          }
+        }
+      }
+    }
+
     return $errors;
   }
 
