diff --git a/config/install/views.view.scheduler_scheduled_content.yml b/config/install/views.view.scheduler_scheduled_content.yml
index 8e70d4d..24c58c3 100644
--- a/config/install/views.view.scheduler_scheduled_content.yml
+++ b/config/install/views.view.scheduler_scheduled_content.yml
@@ -16,9 +16,7 @@ display:
   default:
     display_options:
       access:
-        type: perm
-        options:
-          perm: 'access content overview'
+        type: scheduler
       cache:
         type: tag
       query:
diff --git a/scheduler.services.yml b/scheduler.services.yml
index 12fb233..6baa6bf 100644
--- a/scheduler.services.yml
+++ b/scheduler.services.yml
@@ -6,3 +6,8 @@ services:
     class: Drupal\Core\Logger\LoggerChannel
     factory: logger.factory:get
     arguments: ['scheduler']
+  access_checker.scheduler_content:
+    class: Drupal\scheduler\Access\ScheduledListAccess
+    arguments: ['@current_user']
+    tags:
+      - { name: access_check }
diff --git a/src/Access/ScheduledListAccess.php b/src/Access/ScheduledListAccess.php
new file mode 100644
index 0000000..706fe2f
--- /dev/null
+++ b/src/Access/ScheduledListAccess.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\scheduler\Access\ScheduledListAccess.
+ */
+
+namespace Drupal\scheduler\Access;
+
+use Drupal\Core\Access\AccessCheckInterface;
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Session\AccountInterface;
+use Symfony\Component\Routing\Route;
+
+/**
+ * Checks access for displaying the scheduler list of scheduled nodes.
+ */
+class ScheduledListAccess implements AccessCheckInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function applies(Route $route) {
+    return $route->hasRequirement('_access_scheduler_content');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function access(AccountInterface $account) {
+    // All Scheduler users can see their own scheduled content via their user
+    // page. In addition, if they have 'view scheduled content' permission they
+    // will be able to see all scheduled content by all authors.
+    return ($account->hasPermission('view scheduled content') || (\Drupal::currentUser()->id() == $account->id() && $account->hasPermission('schedule publishing of nodes'))) ? AccessResult::allowed(): AccessResult::forbidden() ;
+  }
+
+}
diff --git a/src/Plugin/views/access/Scheduler.php b/src/Plugin/views/access/Scheduler.php
new file mode 100644
index 0000000..d6f88ed
--- /dev/null
+++ b/src/Plugin/views/access/Scheduler.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Drupal\scheduler\Plugin\views\access;
+
+use Drupal\Core\Cache\Cache;
+use Drupal\Core\Cache\CacheableDependencyInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\views\Plugin\views\access\AccessPluginBase;
+use Symfony\Component\Routing\Route;
+
+/**
+ * Access plugin that provides access control for Scheduler.
+ *
+ * @ingroup views_access_plugins
+ *
+ * @ViewsAccess(
+ *   id = "scheduler",
+ *   title = @Translation("Scheduler list access"),
+ *   help = @Translation("All Scheduler users can see their own scheduled content via their user page. In addition, if they have 'view scheduled content' permission they will be able to see all scheduled content by all authors."),
+ * )
+ */
+class Scheduler extends AccessPluginBase implements CacheableDependencyInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function access(AccountInterface $account) {
+    return \Drupal::service('access_checker.scheduler_content')->access($account);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function alterRouteDefinition(Route $route) {
+    $route->setRequirement('_access_scheduler_content', 'TRUE');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheContexts() {
+    return ['user'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheTags() {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheMaxAge() {
+    return Cache::PERMANENT;
+  }
+
+}
diff --git a/src/Tests/SchedulerScheduledContentListAccessTest.php b/src/Tests/SchedulerScheduledContentListAccessTest.php
new file mode 100644
index 0000000..61e9c9d
--- /dev/null
+++ b/src/Tests/SchedulerScheduledContentListAccessTest.php
@@ -0,0 +1,117 @@
+<?php
+
+namespace Drupal\scheduler\Tests;
+
+/**
+ * Tests access to the scheduled content overview page and user tab.
+ *
+ * @group scheduler
+ */
+class SchedulerScheduledContentListAccessTest extends SchedulerTestBase {
+
+  /**
+   * Additional modules required. SchedulerTestBase loads 'node' and 'scheduler'
+   */
+  public static $modules = ['views'];
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+
+    $type = $this->nodetype->get('type');
+    $base_permissions = [
+      'access content',
+      'create ' . $type . ' content',
+      'view own unpublished content',
+    ];
+
+    $this->editorUser = $this->drupalCreateUser(array_merge($base_permissions, ['access content overview']));
+    $this->schedulerUser = $this->drupalCreateUser(array_merge($base_permissions, ['schedule publishing of nodes']));
+    $this->schedulerManager = $this->drupalCreateUser(array_merge($base_permissions, ['view scheduled content']));
+
+    // Create nodes scheduled for publishing and for unpublishing.
+    $this->node1 = $this->drupalCreateNode(['title' => 'Node created by Scheduler User for publishing', 'uid' => $this->schedulerUser->id(), 'status' => FALSE, 'type' => $type, 'publish_on' => strtotime('+1 week')]);
+    $this->node2 = $this->drupalCreateNode(['title' => 'Node created by Scheduler User for unpublishing', 'uid' => $this->schedulerUser->id(), 'status' => TRUE, 'type' => $type, 'unpublish_on' => strtotime('+1 week')]);
+    $this->node3 = $this->drupalCreateNode(['title' => 'Node created by Scheduler Manager for publishing', 'uid' => $this->schedulerManager->id(), 'status' => FALSE, 'type' => $type, 'publish_on' => strtotime('+1 week')]);
+    $this->node4 = $this->drupalCreateNode(['title' => 'Node created by Scheduler Manager for unpublishing', 'uid' => $this->schedulerManager->id(), 'status' => TRUE, 'type' => $type, 'unpublish_on' => strtotime('+1 week')]);
+  }
+
+  /**
+   * Tests the scheduled content tab on the user page.
+   */
+  public function testViewScheduledContentUser() {
+    // Access a scheduled content user tab as an anonymous visitor.
+    $this->drupalGet("user/{$this->schedulerUser->id()}/scheduled");
+    $this->assertResponse(403, 'An anonymous visitor cannot access a user\'s scheduled content tab.');
+
+    // Access a users own scheduled content tab as "Editor" without any
+    // scheduler permissions.
+    $this->drupalLogin($this->editorUser);
+    $this->drupalGet("user/{$this->editorUser->id()}/scheduled");
+    $this->assertResponse(403, '"Editor" cannot access a scheduled content user tab.');
+
+    // Access a users own scheduled content tab as "Scheduler User" with only
+    // 'schedule publishing of nodes' permission.
+    $this->drupalLogin($this->schedulerUser);
+    $this->drupalGet("user/{$this->schedulerUser->id()}/scheduled");
+    $this->assertResponse(200, '"Scheduler User" can access their scheduled content user tab.');
+    $this->assertText('Node created by Scheduler User for publishing');
+    $this->assertText('Node created by Scheduler User for unpublishing');
+    $this->assertNoText('Node created by Scheduler Manager for unpublishing');
+
+    // Access another users scheduled content tab as "Scheduler User"
+    $this->drupalGet("user/{$this->schedulerManager->id()}/scheduled");
+    $this->assertResponse(403, '"Scheduler User" cannot access the scheduled content user tab for "Scheduler Manager"');
+
+    // Access the users own scheduled content tab as "Scheduler Manager" with
+    // only 'view scheduled content' permission.
+    $this->drupalLogin($this->schedulerManager);
+    $this->drupalGet("user/{$this->schedulerManager->id()}/scheduled");
+    $this->assertResponse(200, 'Scheduler Manager can access their own scheduled content user tab.');
+    $this->assertText('Node created by Scheduler Manager for publishing');
+    $this->assertText('Node created by Scheduler Manager for unpublishing');
+    $this->assertNoText('Node created by Scheduler User for unpublishing');
+
+    // Access another users scheduled content tab as "Scheduler Manager".
+    // The published and unpublished content should be listed.
+    $this->drupalGet("user/{$this->schedulerUser->id()}/scheduled");
+    $this->assertResponse(200, '"Scheduler Manager" can access the scheduled content user tab for "Scheduler User"');
+    $this->assertText('Node created by Scheduler User for publishing');
+    $this->assertText('Node created by Scheduler User for unpublishing');
+  }
+
+  /**
+   * Tests the scheduled content overview.
+   */
+  public function testViewScheduledContentOverview() {
+    // Access the scheduled content overview as anonymous visitor.
+    $this->drupalGet('admin/content/scheduled');
+    $this->assertResponse(403, 'An anonymous visitor cannot access the scheduled content overview.');
+
+    // Access the scheduled content overview as "Editor" without any
+    // scheduler permissions.
+    $this->drupalLogin($this->editorUser);
+    $this->drupalGet('admin/content/scheduled');
+    $this->assertResponse(403, '"Editor" cannot access the scheduled content overview.');
+
+    // Access the scheduled content overview as "Scheduler User" with only
+    // 'schedule publishing of nodes' permission.
+    $this->drupalLogin($this->schedulerUser);
+    $this->drupalGet('admin/content/scheduled');
+    $this->assertResponse(403, '"Scheduler User" cannot access the scheduled content overview.');
+
+    // Access the scheduled content overview as "Scheduler Manager" with only
+    // 'view scheduled content' permission. They should be able to see the
+    // scheduled published and unpublished content by all users.
+    $this->drupalLogin($this->schedulerManager);
+    $this->drupalGet('admin/content/scheduled');
+    $this->assertResponse(200, 'Scheduler Manager can access the scheduled content overview.');
+    $this->assertText('Node created by Scheduler User for publishing');
+    $this->assertText('Node created by Scheduler User for unpublishing');
+    $this->assertText('Node created by Scheduler Manager for publishing');
+    $this->assertText('Node created by Scheduler Manager for unpublishing');
+  }
+
+}
