diff --git plugins/views_plugin_display_page.inc plugins/views_plugin_display_page.inc
index eda0989..597dc0b 100644
--- plugins/views_plugin_display_page.inc
+++ plugins/views_plugin_display_page.inc
@@ -75,6 +75,36 @@ class views_plugin_display_page extends views_plugin_display {
     if (!isset($access_plugin)) {
       $access_plugin = views_get_plugin('access', 'none');
     }
+
+    // Get access callback might return an array of the callback + the dynamic arguments.
+    $access_plugin_callback = $access_plugin->get_access_callback();
+
+    if (is_array($access_plugin_callback)) {
+      $access_arguments = array();
+
+      // Find the plugin arguments.
+      $access_plugin_method = array_shift($access_plugin_callback);
+      $access_plugin_arguments = array_shift($access_plugin_callback);
+      if (!is_array($access_plugin_arguments)) {
+        $access_plugin_arguments = array();
+      }
+
+      $access_arguments[0] = array($access_plugin_method, &$access_plugin_arguments);
+
+      // Move the plugin arguments to the access arguments array.
+      $i = 1;
+      foreach ($access_plugin_arguments as $key => $value) {
+        if (is_int($value)) {
+          $access_arguments[$i] = $value;
+          $access_plugin_arguments[$key] = $i;
+          $i++;
+        }
+      }
+    }
+    else {
+      $access_arguments = array($access_plugin_callback);
+    }
+
     if ($path) {
       $items[$path] = array(
         // default views page entry
@@ -82,7 +112,7 @@ class views_plugin_display_page extends views_plugin_display {
         'page arguments' => $page_arguments,
         // Default access check (per display)
         'access callback' => 'views_access',
-        'access arguments' => array($access_plugin->get_access_callback()),
+        'access arguments' => $access_arguments,
         // Identify URL embedded arguments and correlate them to a handler
         'load arguments'  => array($this->view->name, $this->display->id, '%index'),
       );
diff --git tests/test_plugins/views_test_plugin_access_test_dynamic.inc tests/test_plugins/views_test_plugin_access_test_dynamic.inc
new file mode 100644
index 0000000..8bb4140
--- /dev/null
+++ tests/test_plugins/views_test_plugin_access_test_dynamic.inc
@@ -0,0 +1,19 @@
+<?php
+// $Id$
+
+class views_test_plugin_access_test_dynamic extends views_plugin_access {
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['access'] = array('default' => FALSE);
+
+    return $options;
+  }
+
+  function access($account) {
+    return !empty($this->options['access']) && $this->view->args[0] == variable_get('test_dynamic_access_argument1', NULL) && $this->view->args[1]== variable_get('test_dynamic_access_argument2', NULL);
+  }
+
+  function get_access_callback() {
+    return array('views_test_test_dynamic_access_callback', array(!empty($options['access']), 1, 2));
+  }
+}
\ No newline at end of file
diff --git tests/test_plugins/views_test_plugin_access_test_static.inc tests/test_plugins/views_test_plugin_access_test_static.inc
new file mode 100644
index 0000000..c978b2d
--- /dev/null
+++ tests/test_plugins/views_test_plugin_access_test_static.inc
@@ -0,0 +1,19 @@
+<?php
+// $Id$
+
+class views_test_plugin_access_test_static extends views_plugin_access {
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['access'] = array('default' => FALSE);
+
+    return $options;
+  }
+
+  function access($account) {
+    return !empty($this->options['access']);
+  }
+
+  function get_access_callback() {
+    return array('views_test_test_static_access_callback', array(!empty($options['access'])));
+  }
+}
\ No newline at end of file
diff --git tests/views_access.test tests/views_access.test
index 2f0ccfd..30f61b1 100644
--- tests/views_access.test
+++ tests/views_access.test
@@ -3,8 +3,8 @@
 
 module_load_include('test', 'views', 'tests/views_query');
 /**
-* Basic test for pluggable access.
-*/
+ * Basic test for pluggable access.
+ */
 class ViewsAccessTest extends ViewsSqlTest {
   public static function getInfo() {
     return array(
@@ -15,7 +15,7 @@ class ViewsAccessTest extends ViewsSqlTest {
   }
 
   public function setUp() {
-    parent::setUp('views', 'views_test');
+    parent::setUp();
 
     $this->admin_user = $this->drupalCreateUser(array('access all views'));
     $this->web_user = $this->drupalCreateUser();
@@ -23,6 +23,30 @@ class ViewsAccessTest extends ViewsSqlTest {
     $this->normal_user = $this->drupalCreateUser(array('views_test test permission'));
     $roles = array_keys($this->normal_user->roles);
     $this->normal_role = array_pop($roles);
+
+    // Reset the plugin data.
+    views_fetch_plugin_data(NULL, NULL, TRUE);
+  }
+
+  function viewsPlugins() {
+    $plugins = array(
+      'access' =>  array(
+        'test_static' => array(
+          'title' => t('Static test access plugin'),
+          'help' => t('Provides a static test access plugin.'),
+          'handler' => 'views_test_plugin_access_test_static',
+          'path' => drupal_get_path('module', 'views_test') . '/test_plugins',
+        ),
+        'test_dynamic' => array(
+          'title' => t('Dynamic test access plugin'),
+          'help' => t('Provides a dynamic test access plugin.'),
+          'handler' => 'views_test_plugin_access_test_dynamic',
+          'path' => drupal_get_path('module', 'views_test') . '/test_plugins',
+        ),
+      ),
+    );
+
+    return $plugins;
   }
 
   /**
@@ -39,7 +63,7 @@ class ViewsAccessTest extends ViewsSqlTest {
   }
 
   /**
-   * @todo Test perm access plugin.
+   * Test perm access plugin.
    */
   function testAccessPerm() {
     $view = $this->view_access_perm();
@@ -53,7 +77,7 @@ class ViewsAccessTest extends ViewsSqlTest {
   }
 
   /**
-   * @todo Test role access plugin.
+   * Test role access plugin.
    */
   function testAccessRole() {
     $view = $this->view_access_role();
@@ -71,8 +95,65 @@ class ViewsAccessTest extends ViewsSqlTest {
    */
 
   /**
-   * @todo Test menu access check.
+   * Test static access check.
+   */
+  function testStaticAccessPlugin() {
+    $view = $this->view_access_static();
+
+    $view->set_display('default');
+    $access_plugin = $view->display_handler->get_plugin('access');
+
+    $this->assertFalse($access_plugin->access($this->normal_user));
+
+    $access_plugin->options['access'] = TRUE;
+    $this->assertTrue($access_plugin->access($this->normal_user));
+
+    // FALSE comes from hook_menu caching.
+    $expected_hook_menu = array(
+      'views_test_test_static_access_callback', array(FALSE)
+    );
+    $hook_menu = $view->execute_hook_menu('page_1');
+    $this->assertEqual($expected_hook_menu, $hook_menu['test_access_static']['access arguments'][0]);
+
+    $expected_hook_menu = array(
+      'views_test_test_static_access_callback', array(TRUE)
+    );
+    $this->assertTrue(views_access($expected_hook_menu));
+  }
+
+  /**
+   * Test dynamic access plugin.
    */
+  function testDynamicAccessPlugin() {
+    $view = $this->view_access_dynamic();
+    $argument1 = $this->randomName();
+    $argument2 = $this->randomName();
+    variable_set('test_dynamic_access_argument1', $argument1);
+    variable_set('test_dynamic_access_argument2', $argument2);
+
+    $view->set_display('default');
+    $access_plugin = $view->display_handler->get_plugin('access');
+
+    $this->assertFalse($access_plugin->access($this->normal_user));
+
+    $access_plugin->options['access'] = TRUE;
+    $this->assertFalse($access_plugin->access($this->normal_user));
+
+    $view->set_arguments(array($argument1, $argument2));
+    $this->assertTrue($access_plugin->access($this->normal_user));
+
+    // FALSE comes from hook_menu caching.
+    $expected_hook_menu = array(
+      'views_test_test_dynamic_access_callback', array(FALSE, 1, 2)
+    );
+    $hook_menu = $view->execute_hook_menu('page_1');
+    $this->assertEqual($expected_hook_menu, $hook_menu['test_access_dynamic']['access arguments'][0]);
+
+    $expected_hook_menu = array(
+      'views_test_test_dynamic_access_callback', array(TRUE, 1, 2)
+    );
+    $this->assertTrue(views_access($expected_hook_menu, $argument1, $argument2));
+  }
 
   function view_access_none() {
     $view = new view;
@@ -146,4 +227,56 @@ class ViewsAccessTest extends ViewsSqlTest {
 
     return $view;
   }
+
+  function view_access_dynamic() {
+    $view = new view;
+    $view->name = 'test_access_dynamic';
+    $view->description = '';
+    $view->tag = '';
+    $view->view_php = '';
+    $view->base_table = 'node';
+    $view->is_cacheable = FALSE;
+    $view->api_version = 2;
+    $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+    /* Display: Defaults */
+    $handler = $view->new_display('default', 'Defaults', 'default');
+    $handler->display->display_options['access']['type'] = 'test_dynamic';
+    $handler->display->display_options['cache']['type'] = 'none';
+    $handler->display->display_options['exposed_form']['type'] = 'basic';
+    $handler->display->display_options['pager']['type'] = 'full';
+    $handler->display->display_options['style_plugin'] = 'default';
+    $handler->display->display_options['row_plugin'] = 'fields';
+
+    $handler = $view->new_display('page', 'Page', 'page_1');
+    $handler->display->display_options['path'] = 'test_access_dynamic';
+
+    return $view;
+  }
+
+  function view_access_static() {
+    $view = new view;
+    $view->name = 'test_access_static';
+    $view->description = '';
+    $view->tag = '';
+    $view->view_php = '';
+    $view->base_table = 'node';
+    $view->is_cacheable = FALSE;
+    $view->api_version = 2;
+    $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+    /* Display: Defaults */
+    $handler = $view->new_display('default', 'Defaults', 'default');
+    $handler->display->display_options['access']['type'] = 'test_static';
+    $handler->display->display_options['cache']['type'] = 'none';
+    $handler->display->display_options['exposed_form']['type'] = 'basic';
+    $handler->display->display_options['pager']['type'] = 'full';
+    $handler->display->display_options['style_plugin'] = 'default';
+    $handler->display->display_options['row_plugin'] = 'fields';
+
+    $handler = $view->new_display('page', 'Page', 'page_1');
+    $handler->display->display_options['path'] = 'test_access_static';
+
+    return $view;
+  }
 }
\ No newline at end of file
diff --git tests/views_query.test tests/views_query.test
index 8ce3486..5d86d77 100644
--- tests/views_query.test
+++ tests/views_query.test
@@ -108,9 +108,10 @@ abstract class ViewsSqlTest extends ViewsTestCase {
     foreach ($this->dataSet() as $record) {
       drupal_write_record('views_test', $record);
     }
+    $this->checkPermissions(array(), TRUE);
   }
-  
-   
+
+
   /**
    * This function allows to enable views ui from a higher class which can't change the setup function anymore.
    * 
diff --git tests/views_test.module tests/views_test.module
index 4d83261..a0b25da 100644
--- tests/views_test.module
+++ tests/views_test.module
@@ -31,3 +31,11 @@ function views_test_views_data() {
 function views_test_views_plugins() {
   return variable_get('views_test_views_plugins', array());
 }
+
+function views_test_test_static_access_callback($access) {
+  return $access;
+}
+
+function views_test_test_dynamic_access_callback($access, $argument1, $argument2) {
+  return $access && $argument1 == variable_get('test_dynamic_access_argument1', NULL) && $argument2 == variable_get('test_dynamic_access_argument2', NULL);
+}
\ No newline at end of file
diff --git views.module views.module
index f3556e5..2392c0f 100644
--- views.module
+++ views.module
@@ -553,6 +553,12 @@ function views_access() {
 
     list($callback, $arguments) = $arg;
     $arguments = $arguments ? $arguments : array();
+    // Bring dynamic arguments to the access callback.
+    foreach ($arguments as $key => $value) {
+      if (is_int($value) && isset($args[$value])) {
+        $arguments[$key] = $args[$value];
+      }
+    }
     if (function_exists($callback) && call_user_func_array($callback, $arguments)) {
       return TRUE;
     }
