diff --git a/core/modules/user/src/Plugin/views/access/Permission.php b/core/modules/user/src/Plugin/views/access/Permission.php
index 0dc5165..7e76e64 100644
--- a/core/modules/user/src/Plugin/views/access/Permission.php
+++ b/core/modules/user/src/Plugin/views/access/Permission.php
@@ -8,6 +8,7 @@
 namespace Drupal\user\Plugin\views\access;
 
 use Drupal\Component\Utility\SafeMarkup;
+use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Session\AccountInterface;
@@ -86,7 +87,7 @@ public static function create(ContainerInterface $container, array $configuratio
    * {@inheritdoc}
    */
   public function access(AccountInterface $account) {
-    return $account->hasPermission($this->options['perm']);
+    return AccessResult::allowedIfHasPermission($account, $this->options['perm']);
   }
 
   /**
diff --git a/core/modules/user/src/Plugin/views/access/Role.php b/core/modules/user/src/Plugin/views/access/Role.php
index 4c2b732..9a3fb9e 100644
--- a/core/modules/user/src/Plugin/views/access/Role.php
+++ b/core/modules/user/src/Plugin/views/access/Role.php
@@ -8,6 +8,7 @@
 namespace Drupal\user\Plugin\views\access;
 
 use Drupal\Component\Utility\SafeMarkup;
+use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\user\RoleStorageInterface;
 use Drupal\views\Plugin\CacheablePluginInterface;
@@ -74,7 +75,11 @@ public static function create(ContainerInterface $container, array $configuratio
    * {@inheritdoc}
    */
   public function access(AccountInterface $account) {
-    return array_intersect(array_filter($this->options['role']), $account->getRoles());
+    $access = array_intersect(array_filter($this->options['role']), $account->getRoles());
+    $access = $access ? AccessResult::allowed() : AccessResult::forbidden();
+    $access->addCacheContexts(['user.roles']);
+
+    return $access;
   }
 
   /**
diff --git a/core/modules/user/src/Tests/Views/AccessPermissionTest.php b/core/modules/user/src/Tests/Views/AccessPermissionTest.php
index 3e77e2a..80bebe0 100644
--- a/core/modules/user/src/Tests/Views/AccessPermissionTest.php
+++ b/core/modules/user/src/Tests/Views/AccessPermissionTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\user\Tests\Views;
 
+use Drupal\Core\Access\AccessResultInterface;
 use Drupal\user\Plugin\views\access\Permission;
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
 use Drupal\views\Views;
@@ -37,8 +38,12 @@ function testAccessPerm() {
     $this->assertTrue($access_plugin instanceof Permission, 'Make sure the right class got instantiated.');
     $this->assertEqual($access_plugin->pluginTitle(), t('Permission'));
 
-    $this->assertFalse($view->display_handler->access($this->webUser));
-    $this->assertTrue($view->display_handler->access($this->normalUser));
+    $access = $view->display_handler->access($this->webUser);
+    $this->assertTrue($access instanceof AccessResultInterface);
+    $this->assertFalse($access->isAllowed());
+    $access = $view->display_handler->access($this->normalUser);
+    $this->assertTrue($access instanceof AccessResultInterface);
+    $this->assertTrue($access->isAllowed());
   }
 
   /**
diff --git a/core/modules/views/src/Element/View.php b/core/modules/views/src/Element/View.php
index 38ca26d..baeb44f 100644
--- a/core/modules/views/src/Element/View.php
+++ b/core/modules/views/src/Element/View.php
@@ -56,43 +56,46 @@ public static function preRenderViewElement($element) {
       $view->setResponse($element['#response']);
     }
 
-    if ($view && $view->access($element['#display_id'])) {
-      if (!empty($element['#embed'])) {
-        $element['view_build'] = $view->preview($element['#display_id'], $element['#arguments']);
-      }
-      else {
-        // Add contextual links to the view. We need to attach them to the dummy
-        // $view_array variable, since contextual_preprocess() requires that they
-        // be attached to an array (not an object) in order to process them. For
-        // our purposes, it doesn't matter what we attach them to, since once they
-        // are processed by contextual_preprocess() they will appear in the
-        // $title_suffix variable (which we will then render in
-        // views-view.html.twig).
-        $view->setDisplay($element['#display_id']);
-        // Add the result of the executed view as a child element so any
-        // #pre_render elements for the view will get processed. A #pre_render
-        // element cannot be added to the main element as this is already inside
-        // a #pre_render callback.
-        $element['view_build'] = $view->executeDisplay($element['#display_id'], $element['#arguments']);
-
-        if (isset($element['view_build']['#title'])) {
-          $element['#title'] = &$element['view_build']['#title'];
-        }
+    if (!$view) {
+      return $element;
+    }
+    $access = $view->access($element['#display_id'], NULL, TRUE);
+    $element['#access'] = $access;
+    if (!empty($element['#embed'])) {
+      $element['view_build'] = $view->preview($element['#display_id'], $element['#arguments']);
+    }
+    else {
+      // Add contextual links to the view. We need to attach them to the dummy
+      // $view_array variable, since contextual_preprocess() requires that they
+      // be attached to an array (not an object) in order to process them. For
+      // our purposes, it doesn't matter what we attach them to, since once they
+      // are processed by contextual_preprocess() they will appear in the
+      // $title_suffix variable (which we will then render in
+      // views-view.html.twig).
+      $view->setDisplay($element['#display_id']);
+      // Add the result of the executed view as a child element so any
+      // #pre_render elements for the view will get processed. A #pre_render
+      // element cannot be added to the main element as this is already inside
+      // a #pre_render callback.
+      $element['view_build'] = $view->executeDisplay($element['#display_id'], $element['#arguments']);
 
-        if (empty($view->display_handler->getPluginDefinition()['returns_response'])) {
-          // views_add_contextual_links() needs the following information in
-          // order to be attached to the view.
-          $element['#view_id'] = $view->storage->id();
-          $element['#view_display_show_admin_links'] = $view->getShowAdminLinks();
-          $element['#view_display_plugin_id'] = $view->display_handler->getPluginId();
-          views_add_contextual_links($element, 'view', $view->current_display);
-        }
+      if (isset($element['view_build']['#title'])) {
+        $element['#title'] = &$element['view_build']['#title'];
       }
+
       if (empty($view->display_handler->getPluginDefinition()['returns_response'])) {
-        $element['#attributes']['class'][] = 'views-element-container';
-        $element['#theme_wrappers'] = array('container');
+        // views_add_contextual_links() needs the following information in
+        // order to be attached to the view.
+        $element['#view_id'] = $view->storage->id();
+        $element['#view_display_show_admin_links'] = $view->getShowAdminLinks();
+        $element['#view_display_plugin_id'] = $view->display_handler->getPluginId();
+        views_add_contextual_links($element, 'view', $view->current_display);
       }
     }
+    if (empty($view->display_handler->getPluginDefinition()['returns_response'])) {
+      $element['#attributes']['class'][] = 'views-element-container';
+      $element['#theme_wrappers'] = array('container');
+    }
 
     return $element;
   }
diff --git a/core/modules/views/src/Plugin/views/access/AccessPluginBase.php b/core/modules/views/src/Plugin/views/access/AccessPluginBase.php
index 57481fa..7c22a84 100644
--- a/core/modules/views/src/Plugin/views/access/AccessPluginBase.php
+++ b/core/modules/views/src/Plugin/views/access/AccessPluginBase.php
@@ -12,25 +12,9 @@
 use Symfony\Component\Routing\Route;
 
 /**
- * @defgroup views_access_plugins Views access plugins
- * @{
- * Plugins to handle access checking for views.
- *
- * Access plugins are responsible for controlling access to the view.
- *
- * Access plugins extend \Drupal\views\Plugin\views\access\AccessPluginBase,
- * implementing the access() and alterRouteDefinition() methods. They must be
- * annotated with \Drupal\views\Annotation\ViewsAccess annotation, and they
- * must be in namespace directory Plugin\views\access.
- *
- * @ingroup views_plugins
- * @see plugin_api
- */
-
-/**
  * The base plugin to handle access control.
  */
-abstract class AccessPluginBase extends PluginBase {
+abstract class AccessPluginBase extends PluginBase implements AccessPluginInterface {
 
   /**
    * {@inheritdoc}
@@ -39,30 +23,4 @@ public function summaryTitle() {
     return $this->t('Unknown');
   }
 
-  /**
-   * Determine if the current user has access or not.
-   *
-   * @param \Drupal\Core\Session\AccountInterface $account
-   *   The user who wants to access this view.
-   *
-   * @return TRUE
-   *   Returns whether the user has access to the view.
-   */
-  abstract public function access(AccountInterface $account);
-
-  /**
-   * Allows access plugins to alter the route definition of a view.
-   *
-   * Likely the access plugin will add new requirements, so its custom access
-   * checker can be applied.
-   *
-   * @param \Symfony\Component\Routing\Route $route
-   *   The route to change.
-   */
-  abstract public function alterRouteDefinition(Route $route);
-
 }
-
-/**
- * @}
- */
diff --git a/core/modules/views/src/Plugin/views/access/AccessPluginBase.php b/core/modules/views/src/Plugin/views/access/AccessPluginInterface.php
similarity index 73%
copy from core/modules/views/src/Plugin/views/access/AccessPluginBase.php
copy to core/modules/views/src/Plugin/views/access/AccessPluginInterface.php
index 57481fa..53b2c03 100644
--- a/core/modules/views/src/Plugin/views/access/AccessPluginBase.php
+++ b/core/modules/views/src/Plugin/views/access/AccessPluginInterface.php
@@ -2,13 +2,11 @@
 
 /**
  * @file
- * Contains \Drupal\views\Plugin\views\access\AccessPluginBase.
+ * Contains \Drupal\views\Plugin\views\access\AccessPluginInterface.
  */
 
 namespace Drupal\views\Plugin\views\access;
-
 use Drupal\Core\Session\AccountInterface;
-use Drupal\views\Plugin\views\PluginBase;
 use Symfony\Component\Routing\Route;
 
 /**
@@ -28,16 +26,9 @@
  */
 
 /**
- * The base plugin to handle access control.
+ * Defines a plugin type which handles access checking on a view.
  */
-abstract class AccessPluginBase extends PluginBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function summaryTitle() {
-    return $this->t('Unknown');
-  }
+interface AccessPluginInterface {
 
   /**
    * Determine if the current user has access or not.
@@ -45,10 +36,10 @@ public function summaryTitle() {
    * @param \Drupal\Core\Session\AccountInterface $account
    *   The user who wants to access this view.
    *
-   * @return TRUE
+   * @return \Drupal\Core\Access\AccessResultInterface
    *   Returns whether the user has access to the view.
    */
-  abstract public function access(AccountInterface $account);
+  public function access(AccountInterface $account);
 
   /**
    * Allows access plugins to alter the route definition of a view.
@@ -59,7 +50,7 @@ public function summaryTitle() {
    * @param \Symfony\Component\Routing\Route $route
    *   The route to change.
    */
-  abstract public function alterRouteDefinition(Route $route);
+  public function alterRouteDefinition(Route $route);
 
 }
 
diff --git a/core/modules/views/src/Plugin/views/access/None.php b/core/modules/views/src/Plugin/views/access/None.php
index 0498cf0..fbbfc18 100644
--- a/core/modules/views/src/Plugin/views/access/None.php
+++ b/core/modules/views/src/Plugin/views/access/None.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views\Plugin\views\access;
 
+use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Session\AccountInterface;
 use Symfony\Component\Routing\Route;
 
@@ -35,7 +36,7 @@ public function summaryTitle() {
    */
   public function access(AccountInterface $account) {
     // No access control.
-    return TRUE;
+    return AccessResult::allowed();
   }
 
   /**
diff --git a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
index f9ae57a..717797b 100644
--- a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
+++ b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
@@ -11,6 +11,7 @@
 use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\Unicode;
 use Drupal\Component\Utility\SafeMarkup;
+use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Cache\CacheableMetadata;
 use Drupal\Core\Form\FormStateInterface;
@@ -2234,11 +2235,13 @@ public function access(AccountInterface $account = NULL) {
     $plugin = $this->getPlugin('access');
       /** @var \Drupal\views\Plugin\views\access\AccessPluginBase $plugin */
     if ($plugin) {
-      return $plugin->access($account);
+      $result = $plugin->access($account);
+      assert('$result instanceof \Drupal\Core\Access\AccessResultInterface');
+      return $result;
     }
 
     // Fallback to all access if no plugin.
-    return TRUE;
+    return AccessResult::allowed();
   }
 
   /**
diff --git a/core/modules/views/src/Plugin/views/display/DisplayPluginInterface.php b/core/modules/views/src/Plugin/views/display/DisplayPluginInterface.php
index 780073b..3298170 100644
--- a/core/modules/views/src/Plugin/views/display/DisplayPluginInterface.php
+++ b/core/modules/views/src/Plugin/views/display/DisplayPluginInterface.php
@@ -415,6 +415,9 @@ public function renderArea($area, $empty = FALSE);
 
   /**
    * Determines if the user has access to this display of the view.
+   *
+   * @return \Drupal\Core\Access\AccessResultInterface
+   *   Returns whether the user has access to the view.
    */
   public function access(AccountInterface $account = NULL);
 
diff --git a/core/modules/views/src/Tests/Plugin/AccessTest.php b/core/modules/views/src/Tests/Plugin/AccessTest.php
index 5ee6c98..71f6b34 100644
--- a/core/modules/views/src/Tests/Plugin/AccessTest.php
+++ b/core/modules/views/src/Tests/Plugin/AccessTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views\Tests\Plugin;
 
+use Drupal\Core\Access\AccessResultInterface;
 use Drupal\Core\Cache\Cache;
 use Drupal\views\Tests\ViewTestData;
 use Drupal\views\Views;
@@ -71,8 +72,14 @@ function testAccessNone() {
     $view = Views::getView('test_access_none');
     $view->setDisplay();
 
-    $this->assertTrue($view->display_handler->access($this->webUser));
-    $this->assertTrue($view->display_handler->access($this->normalUser));
+    $access = $view->display_handler->access($this->webUser);
+    $this->assertTrue($access instanceof AccessResultInterface);
+    $this->assertTrue($access->isAllowed());
+
+    $access = $view->display_handler->access($this->normalUser);
+    $this->assertTrue($access);
+    $this->assertTrue($access instanceof AccessResultInterface);
+    $this->assertTrue($access->isAllowed());
   }
 
   /**
@@ -90,7 +97,9 @@ function testStaticAccessPlugin() {
 
     $access_plugin = $view->display_handler->getPlugin('access');
 
-    $this->assertFalse($access_plugin->access($this->normalUser));
+    $access = $access_plugin->access($this->normalUser);
+    $this->assertTrue($access instanceof AccessResultInterface);
+    $this->assertFalse($access->isAllowed());
     $this->drupalGet('test_access_static');
     $this->assertResponse(403);
 
@@ -102,7 +111,9 @@ function testStaticAccessPlugin() {
     // termination event fires. Simulate that here.
     $this->container->get('router.builder')->rebuildIfNeeded();
 
-    $this->assertTrue($access_plugin->access($this->normalUser));
+    $access = $access_plugin->access($this->normalUser);
+    $this->assertTrue($access instanceof AccessResultInterface);
+    $this->assertTrue($access->isAllowed());
 
     $this->drupalGet('test_access_static');
     $this->assertResponse(200);
diff --git a/core/modules/views/src/ViewExecutable.php b/core/modules/views/src/ViewExecutable.php
index 774e63c..fff9488 100644
--- a/core/modules/views/src/ViewExecutable.php
+++ b/core/modules/views/src/ViewExecutable.php
@@ -8,6 +8,7 @@
 namespace Drupal\views;
 
 use Drupal\Component\Utility\Html;
+use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\DependencyInjection\DependencySerializationTrait;
 use Drupal\Core\Form\FormState;
@@ -1617,33 +1618,58 @@ public function attachDisplays() {
   /**
    * Determine if the given user has access to the view. Note that
    * this sets the display handler if it hasn't been.
+   *
+   * @param string[] $displays
+   *   (optional) An array of displays of which all of them are used to
+   *   determine access.
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   (optional) The checked account.
+   *
+   * @param bool $return_as_object
+   *   (optional) Whether an object or boolean value is returned.
+   *
+   * @return bool|\Drupal\Core\Access\AccessResultInterface
+   *   The access result. Returns a boolean if $return_as_object is FALSE (this
+   *   is the default) and otherwise an AccessResultInterface object.
+   *   When a boolean is returned, the result of AccessInterface::isAllowed() is
+   *   returned, i.e. TRUE means access is explicitly allowed, FALSE means
+   *   access is either explicitly forbidden or "no opinion".
    */
-  public function access($displays = NULL, $account = NULL) {
+  public function access($displays = NULL, AccountInterface $account = NULL, $return_as_object = FALSE) {
     // No one should have access to disabled views.
     if (!$this->storage->status()) {
-      return FALSE;
+      return $return_as_object ? AccessResult::forbidden() : FALSE;
     }
 
     if (!isset($this->current_display)) {
       $this->initDisplay();
     }
 
+    if (!isset($displays)) {
+      $displays = [$this->current_display];
+    }
+
     if (!$account) {
       $account = $this->user;
     }
 
     // We can't use choose_display() here because that function
     // calls this one.
+    $access = AccessResult::forbidden();
     $displays = (array)$displays;
     foreach ($displays as $display_id) {
       if ($this->displayHandlers->has($display_id)) {
-        if (($display = $this->displayHandlers->get($display_id)) && $display->access($account)) {
-          return TRUE;
+        if (($display = $this->displayHandlers->get($display_id))) {
+          $display_access = $display->access($account);
+          if ($display_access->isAllowed()) {
+            $access = $display_access;
+            break;
+          }
         }
       }
     }
 
-    return FALSE;
+    return $return_as_object ? $access : $access->isAllowed();
   }
 
   /**
diff --git a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/access/StaticTest.php b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/access/StaticTest.php
index e37bf3a..9812c3e 100644
--- a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/access/StaticTest.php
+++ b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/access/StaticTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views_test_data\Plugin\views\access;
 
+use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\views\Plugin\views\access\AccessPluginBase;
 use Symfony\Component\Routing\Route;
@@ -33,7 +34,7 @@ protected function defineOptions() {
    * {@inheritdoc}
    */
   public function access(AccountInterface $account) {
-    return !empty($this->options['access']);
+    return !empty($this->options['access']) ? AccessResult::allowed() : AccessResult::forbidden();
   }
 
   /**
diff --git a/core/modules/views/tests/src/Unit/ViewExecutableTest.php b/core/modules/views/tests/src/Unit/ViewExecutableTest.php
index fea412b..b48892c 100644
--- a/core/modules/views/tests/src/Unit/ViewExecutableTest.php
+++ b/core/modules/views/tests/src/Unit/ViewExecutableTest.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\Tests\views\Unit;
 
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Access\AccessResultInterface;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\Url;
 use Drupal\Tests\UnitTestCase;
@@ -429,6 +431,143 @@ public function testAttachDisplays() {
   }
 
   /**
+   * @covers ::access
+   */
+  public function testAccessWithDisabledView() {
+    $this->view->expects($this->any())
+      ->method('status')
+      ->willReturn(FALSE);
+    $access = $this->executable->access(NULL, NULL, TRUE);
+
+    $this->assertInstanceOf(AccessResultInterface::CLASS, $access);
+    $this->assertTrue($access->isForbidden());
+  }
+
+  /**
+   * @covers ::access
+   */
+  public function testAccessWithActiveDisplayAccessDenied() {
+    $this->view->expects($this->any())
+      ->method('status')
+      ->willReturn(TRUE);
+
+    $this->displayHandlers->expects($this->any())
+      ->method('has')
+      ->with('page_1')
+      ->willReturn(TRUE);
+
+    $this->displayHandlers->expects($this->any())
+      ->method('get')
+      ->with('page_1')
+      ->willReturn($this->displayHandler);
+
+    $this->executable->current_display = 'page_1';
+
+    $this->displayHandler->expects($this->atLeastOnce())
+      ->method('access')
+      ->willReturn(AccessResult::forbidden());
+
+    $access = $this->executable->access(NULL, NULL, TRUE);
+
+    $this->assertInstanceOf(AccessResultInterface::CLASS, $access);
+    $this->assertFalse($access->isAllowed());
+
+    $access = $this->executable->access(['page_1'], NULL, TRUE);
+
+    $this->assertInstanceOf(AccessResultInterface::CLASS, $access);
+    $this->assertFalse($access->isAllowed());
+  }
+
+  /**
+   * @covers ::access
+   */
+  public function testAccessWithActiveDisplayAccessAllowed() {
+    $this->view->expects($this->any())
+      ->method('status')
+      ->willReturn(TRUE);
+
+    $this->displayHandlers->expects($this->any())
+      ->method('has')
+      ->with('page_1')
+      ->willReturn(TRUE);
+
+    $this->displayHandlers->expects($this->any())
+      ->method('get')
+      ->with('page_1')
+      ->willReturn($this->displayHandler);
+
+    $this->executable->current_display = 'page_1';
+
+    $this->displayHandler->expects($this->atLeastOnce())
+      ->method('access')
+      ->willReturn(AccessResult::allowed());
+
+    $access = $this->executable->access(NULL, NULL, TRUE);
+
+    $this->assertInstanceOf(AccessResultInterface::CLASS, $access);
+    $this->assertTrue($access->isAllowed());
+
+    $access = $this->executable->access(['page_1'], NULL, TRUE);
+
+    $this->assertInstanceOf(AccessResultInterface::CLASS, $access);
+    $this->assertTrue($access->isAllowed());
+  }
+
+  /**
+   * @covers ::access
+   *
+   * @dataProvider providerTestAccessWithMultipleDisplay
+   */
+  public function testAccessWithMultipleDisplay($page_1_access, $page_2_access, $expected) {
+    $this->view->expects($this->any())
+      ->method('status')
+      ->willReturn(TRUE);
+
+    $this->executable->current_display = 'default';
+    $this->displayHandlers->expects($this->any())
+      ->method('has')
+      ->willReturnMap([
+        ['page_1', TRUE],
+        ['page_2', TRUE],
+      ])
+      ->willReturn(TRUE);
+
+    $page_1 = clone $this->displayHandler;
+    $page_2 = clone $this->displayHandler;
+    $this->displayHandlers->expects($this->any())
+      ->method('get')
+      ->willReturnMap([
+        ['page_1', $page_1],
+        ['page_2', $page_2],
+      ]);
+
+    $page_1->expects($this->atLeastOnce())
+      ->method('access')
+      ->willReturn($page_1_access);
+    $page_2->expects($this->atLeastOnce())
+      ->method('access')
+      ->willReturn($page_2_access);
+
+    $access = $this->executable->access(['page_1', 'page_2'], NULL, TRUE);
+
+    $this->assertInstanceOf(AccessResultInterface::CLASS, $access);
+    $this->assertEquals($expected, $access);
+  }
+
+  public function providerTestAccessWithMultipleDisplay() {
+    $data = [
+      'both_allowed' => [AccessResult::allowed(), AccessResult::allowed(), AccessResult::allowed()],
+      'first_neutral' => [AccessResult::neutral(), AccessResult::allowed(), AccessResult::allowed()],
+      'second_neutral' => [AccessResult::allowed(), AccessResult::neutral(), AccessResult::allowed()],
+      'both_neutral' => [AccessResult::neutral(), AccessResult::neutral(), AccessResult::forbidden()],
+      'first_forbidden' => [AccessResult::forbidden(), AccessResult::allowed(), AccessResult::allowed()],
+      'second_forbidden' => [AccessResult::allowed(), AccessResult::forbidden(), AccessResult::allowed()],
+    ];
+
+    return $data;
+  }
+
+  /**
    * Setups a view executable and default display.
    *
    * @return array
