diff --git a/core/modules/block_content/config/install/system.action.block_content_publish_action.yml b/core/modules/block_content/config/install/system.action.block_content_publish_action.yml
new file mode 100644
index 0000000..88f7bd7
--- /dev/null
+++ b/core/modules/block_content/config/install/system.action.block_content_publish_action.yml
@@ -0,0 +1,10 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - block_content
+id: block_content_publish_action
+label: 'Publish block content'
+type: block_content
+plugin: block_content_publish_action
+configuration: {  }
diff --git a/core/modules/block_content/config/install/system.action.block_content_unpublish_action.yml b/core/modules/block_content/config/install/system.action.block_content_unpublish_action.yml
new file mode 100644
index 0000000..a772e2e
--- /dev/null
+++ b/core/modules/block_content/config/install/system.action.block_content_unpublish_action.yml
@@ -0,0 +1,10 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - block_content
+id: block_content_unpublish_action
+label: 'Unpublish block content'
+type: block_content
+plugin: block_content_unpublish_action
+configuration: {  }
diff --git a/core/modules/block_content/config/optional/views.view.block_content.yml b/core/modules/block_content/config/optional/views.view.block_content.yml
index 20fe0bf..a6fc99c 100644
--- a/core/modules/block_content/config/optional/views.view.block_content.yml
+++ b/core/modules/block_content/config/optional/views.view.block_content.yml
@@ -112,6 +112,59 @@ display:
       row:
         type: fields
       fields:
+        block_content_bulk_form:
+          id: block_content_bulk_form
+          table: block_content
+          field: block_content_bulk_form
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          action_title: Action
+          include_exclude: exclude
+          selected_actions: {  }
+          entity_type: block_content
+          plugin_id: block_content_bulk_form
         info:
           id: info
           table: block_content_field_data
@@ -298,6 +351,73 @@ display:
             custom_date_format: ''
             timezone: ''
           plugin_id: field
+        status:
+          id: status
+          table: block_content_field_data
+          field: status
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: Published
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          click_sort_column: value
+          type: boolean
+          settings:
+            format: yes-no
+            format_custom_true: ''
+            format_custom_false: ''
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: block_content
+          entity_field: status
+          plugin_id: field
         operations:
           id: operations
           table: block_content
@@ -431,6 +551,46 @@ display:
           entity_type: block_content
           entity_field: type
           plugin_id: bundle
+        status:
+          id: status
+          table: block_content_field_data
+          field: status
+          relationship: none
+          group_type: group
+          admin_label: ''
+          operator: '='
+          value: All
+          group: 1
+          exposed: true
+          expose:
+            operator_id: ''
+            label: Published
+            description: ''
+            use_operator: false
+            operator: status_op
+            identifier: status
+            required: false
+            remember: false
+            multiple: false
+            remember_roles:
+              authenticated: authenticated
+              anonymous: '0'
+              administrator: '0'
+          is_grouped: false
+          group_info:
+            label: ''
+            description: ''
+            identifier: ''
+            optional: true
+            widget: select
+            multiple: false
+            remember: false
+            default_group: All
+            default_group_multiple: {  }
+            group_items: {  }
+          entity_type: block_content
+          entity_field: status
+          plugin_id: boolean
       sorts: {  }
       title: 'Custom block library'
       header: {  }
diff --git a/core/modules/block_content/config/schema/block_content.schema.yml b/core/modules/block_content/config/schema/block_content.schema.yml
index 2e7c338..cef0999 100644
--- a/core/modules/block_content/config/schema/block_content.schema.yml
+++ b/core/modules/block_content/config/schema/block_content.schema.yml
@@ -16,3 +16,11 @@ block_content.type.*:
     description:
       type: text
       label: 'Description'
+
+action.configuration.block_content_publish_action:
+  type: action_configuration_default
+  label: 'Publish selected block content configuration'
+
+action.configuration.block_content_unpublish_action:
+  type: action_configuration_default
+  label: 'Unpublish selected block content configuration'
diff --git a/core/modules/block_content/config/schema/block_content.views.schema.yml b/core/modules/block_content/config/schema/block_content.views.schema.yml
new file mode 100644
index 0000000..bf4cdf5
--- /dev/null
+++ b/core/modules/block_content/config/schema/block_content.views.schema.yml
@@ -0,0 +1,5 @@
+# Schema for the views plugins of the Block content module.
+
+views.field.block_content_bulk_form:
+  type: views_field_bulk_form
+  label: 'Block content bulk form'
diff --git a/core/modules/block_content/src/BlockContentViewsData.php b/core/modules/block_content/src/BlockContentViewsData.php
index 900c2d0..4a1da45 100644
--- a/core/modules/block_content/src/BlockContentViewsData.php
+++ b/core/modules/block_content/src/BlockContentViewsData.php
@@ -31,6 +31,14 @@ public function getViewsData() {
       ],
     ];
 
+    $data['block_content']['block_content_bulk_form'] = [
+      'title' => $this->t('Block content operations bulk form'),
+      'help' => $this->t('Add a form element that lets you run operations on multiple block content.'),
+      'field' => [
+        'id' => 'block_content_bulk_form',
+      ],
+    ];
+
     // Advertise this table as a possible base table.
     $data['block_content_field_revision']['table']['base']['help'] = $this->t('Block Content revision is a history of changes to block content.');
     $data['block_content_field_revision']['table']['base']['defaults']['title'] = 'info';
diff --git a/core/modules/block_content/src/Plugin/Action/PublishBlockContent.php b/core/modules/block_content/src/Plugin/Action/PublishBlockContent.php
new file mode 100644
index 0000000..abf7186
--- /dev/null
+++ b/core/modules/block_content/src/Plugin/Action/PublishBlockContent.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Drupal\block_content\Plugin\Action;
+
+use Drupal\Core\Field\FieldUpdateActionBase;
+
+/**
+ * Publishes a block content.
+ *
+ * @Action(
+ *   id = "block_content_publish_action",
+ *   label = @Translation("Publish selected block content"),
+ *   type = "block_content"
+ * )
+ */
+class PublishBlockContent extends FieldUpdateActionBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getFieldsToUpdate() {
+    return ['status' => TRUE];
+  }
+}
diff --git a/core/modules/block_content/src/Plugin/Action/UnpublishBlockContent.php b/core/modules/block_content/src/Plugin/Action/UnpublishBlockContent.php
new file mode 100644
index 0000000..e1485b7
--- /dev/null
+++ b/core/modules/block_content/src/Plugin/Action/UnpublishBlockContent.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Drupal\block_content\Plugin\Action;
+
+use Drupal\Core\Field\FieldUpdateActionBase;
+
+/**
+ * Unpublishes a block content.
+ *
+ * @Action(
+ *   id = "block_content_unpublish_action",
+ *   label = @Translation("Unpublish selected block content"),
+ *   type = "block_content"
+ * )
+ */
+class UnpublishBlockContent extends FieldUpdateActionBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getFieldsToUpdate() {
+    return ['status' => FALSE];
+  }
+
+}
diff --git a/core/modules/block_content/src/Plugin/views/field/BlockContentBulkForm.php b/core/modules/block_content/src/Plugin/views/field/BlockContentBulkForm.php
new file mode 100644
index 0000000..8388e67
--- /dev/null
+++ b/core/modules/block_content/src/Plugin/views/field/BlockContentBulkForm.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Drupal\block_content\Plugin\views\field;
+
+use Drupal\system\Plugin\views\field\BulkForm;
+
+/**
+ * Defines a block content operations bulk form element.
+ *
+ * @ViewsField("block_content_bulk_form")
+ */
+class BlockContentBulkForm extends BulkForm {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function emptySelectedMessage() {
+    return $this->t('No block content selected.');
+  }
+
+}
diff --git a/core/modules/block_content/tests/src/Functional/BlockContentListViewsTest.php b/core/modules/block_content/tests/src/Functional/BlockContentListViewsTest.php
index 1c623be..cb0d8fc 100644
--- a/core/modules/block_content/tests/src/Functional/BlockContentListViewsTest.php
+++ b/core/modules/block_content/tests/src/Functional/BlockContentListViewsTest.php
@@ -36,12 +36,18 @@ public function testListing() {
     $element = $this->xpath('//div[@class="layout-content"]//table');
     $this->assertTrue($element, 'Views table found.');
 
-    // Test the table header.
+    // Test the table header contains all 6 items:
+    // - Bulk select checkbox
+    // - Block description
+    // - Block type
+    // - Updated date
+    // - Publishing status
+    // - Operations
     $elements = $this->xpath('//div[@class="layout-content"]//table/thead/tr/th');
-    $this->assertEqual(count($elements), 4, 'Correct number of table header cells found.');
+    $this->assertEqual(count($elements), 6, 'Correct number of table header cells found.');
 
     // Test the contents of each th cell.
-    $expected_items = ['Block description', 'Block type', 'Updated Sort ascending', 'Operations'];
+    $expected_items = ['', 'Block description', 'Block type', 'Updated Sort ascending', 'Published', 'Operations'];
     foreach ($elements as $key => $element) {
       if ($element->find('xpath', 'a')) {
         $this->assertIdentical(trim($element->find('xpath', 'a')->getText()), $expected_items[$key]);
@@ -69,11 +75,9 @@ public function testListing() {
 
     // Check the number of table row cells.
     $elements = $this->xpath('//div[@class="layout-content"]//table/tbody/tr/td');
-    $this->assertEqual(count($elements), 4, 'Correct number of table row cells found.');
-    // Check the contents of each row cell. The first cell contains the label,
-    // the second contains the machine name, and the third contains the
-    // operations list.
-    $this->assertIdentical($elements[0]->find('xpath', 'a')->getText(), $label);
+    $this->assertEqual(count($elements), 6, 'Correct number of table row cells found.');
+    // Check the second cell contains the label.
+    $this->assertIdentical($elements[1]->find('xpath', 'a')->getText(), $label);
 
     // Edit the entity using the operations link.
     $blocks = $this->container
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php
index 993fdf4..5462092 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php
@@ -57,7 +57,7 @@ protected function getEntityCounts() {
       'search_page' => 2,
       'shortcut' => 2,
       'shortcut_set' => 1,
-      'action' => 23,
+      'action' => 25,
       'menu' => 8,
       'taxonomy_term' => 8,
       'taxonomy_vocabulary' => 7,
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php
index 71bc7a5..e05251a 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php
@@ -63,7 +63,7 @@ protected function getEntityCounts() {
       'search_page' => 2,
       'shortcut' => 6,
       'shortcut_set' => 2,
-      'action' => 17,
+      'action' => 19,
       'menu' => 6,
       'taxonomy_term' => 18,
       'taxonomy_vocabulary' => 4,
