diff --git a/core/lib/Drupal/Core/Action/ActionEntityTypeAccessTrait.php b/core/lib/Drupal/Core/Action/ActionEntityTypeAccessTrait.php
new file mode 100644
index 0000000..8c178a4
--- /dev/null
+++ b/core/lib/Drupal/Core/Action/ActionEntityTypeAccessTrait.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * @file
+ * Contains Drupal\Core\Action\ActionEntityTypeAccessTrait.
+ */
+
+namespace Drupal\Core\Action;
+
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Session\AccountInterface;
+
+/**
+ * Provides a methods to check access for an Action over an EntityType.
+ */
+trait ActionEntityTypeAccessTrait {
+
+  /**
+   * Checks EntityType access.
+   *
+   * @param string $entity_type
+   *   The EntityType to execute the action on.
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   (optional) The user for which to check access, or NULL to check access
+   *   for the current user. Defaults to NULL.
+   * @param bool $return_as_object
+   *   (optional) Defaults to FALSE.
+   *
+   * @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 accessEntityType($entity_type, AccountInterface $account = NULL, $return_as_object = FALSE) {
+    return $return_as_object ? AccessResult::neutral() : FALSE;
+  }
+
+}
diff --git a/core/modules/system/src/Plugin/views/field/BulkForm.php b/core/modules/system/src/Plugin/views/field/BulkForm.php
index 9d62e84..1b824f7 100644
--- a/core/modules/system/src/Plugin/views/field/BulkForm.php
+++ b/core/modules/system/src/Plugin/views/field/BulkForm.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\system\Plugin\views\field;
 
+use Drupal\Core\Action\ActionEntityTypeAccessTrait;
 use Drupal\Core\Cache\CacheableDependencyInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
@@ -289,10 +290,23 @@ public function viewsForm(&$form, FormStateInterface $form_state) {
       $form['header'][$this->options['id']] = array(
         '#type' => 'container',
       );
+      $bulk_options = [];
+      foreach ($this->getBulkOptions() as $key => $option) {
+        $plugin = $this->actions[$key]->getPlugin();
+        if (in_array(ActionEntityTypeAccessTrait::class, class_uses($plugin))) {
+          if ($plugin->accessEntityType($this->getEntityType(), $this->view->getUser())) {
+            $bulk_options[$key] = $option;
+          }
+        }
+        else {
+          $bulk_options[$key] = $option;
+        }
+      }
+
       $form['header'][$this->options['id']]['action'] = array(
         '#type' => 'select',
         '#title' => $this->options['action_title'],
-        '#options' => $this->getBulkOptions(),
+        '#options' => $bulk_options,
       );
 
       // Duplicate the form actions into the action container in the header.
