diff --git a/core/modules/block_content/block_content.install b/core/modules/block_content/block_content.install
index c6556e7..5b22319 100644
--- a/core/modules/block_content/block_content.install
+++ b/core/modules/block_content/block_content.install
@@ -138,3 +138,236 @@ function block_content_update_8400() {
     $definition_update_manager->uninstallFieldStorageDefinition($content_translation_status);
   }
 }
+
+/**
+ * Update block_content view to reflect publishable block_content blocks.
+ */
+function block_content_update_8600() {
+
+  $view = \Drupal::service('config.factory')->getEditable('views.view.block_content');
+
+  // Get existing field configuration.
+  $fields = $view->get("display.default.display_options.fields");
+  // Add bulk form and status fields.
+  $block_content_bulk_form = [
+    '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',
+    ]
+  ];
+  // Merge new field with existing fields.
+  $combined_fields = $block_content_bulk_form + $fields;
+  $status = [
+    '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',
+    ]
+  ];
+  // Insert the status field before the 'operations' field.
+  $position = array_search('operations', array_keys($combined_fields));
+  $fields_to_set = array_merge(array_slice($combined_fields, 0, $position), $status, array_slice($combined_fields, $position));
+  $view->set('display.default.display_options.fields', $fields_to_set);
+
+  // Add exposed status filter.
+  $status_filter = [
+    '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',
+  ];
+  $view->set('display.default.display_options.filters.status', $status_filter);
+  $view->save();
+
+  // Add publish action.
+  $publish_action = \Drupal::service('config.factory')->getEditable('system.action.block_content_publish_action');
+  $config_data_publish = [
+    "langcode" => "en",
+    "status" => true,
+    "dependencies" => [
+      "module" => [
+          "block_content"
+        ]
+    ],
+    "id" => "block_content_publish_action",
+    "label" => "Publish block content",
+    "type" => "block_content",
+    "plugin" => "entity:publish_action:block_content",
+    "configuration" => []
+  ];
+  $publish_action->setData($config_data_publish);
+  $publish_action->save();
+
+  // Add unpublish action.
+  $unpublish_action = \Drupal::service('config.factory')->getEditable('system.action.block_content_unpublish_action');
+  $config_data_unpublish = [
+    "langcode" => "en",
+    "status" => true,
+    "dependencies" => [
+      "module" => [
+        "block_content"
+      ]
+    ],
+    "id" => "block_content_unpublish_action",
+    "label" => "Unpublish block content",
+    "type" => "block_content",
+    "plugin" => "entity:unpublish_action:block_content",
+    "configuration" => []
+  ];
+  $unpublish_action->setData($config_data_unpublish);
+  $unpublish_action->save();
+}
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..b3123da
--- /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: entity:publish_action:block_content
+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..cc613d2
--- /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: entity:unpublish_action:block_content
+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 1be5a04..e793fac 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.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 010ede0..4a1da45 100644
--- a/core/modules/block_content/src/BlockContentViewsData.php
+++ b/core/modules/block_content/src/BlockContentViewsData.php
@@ -30,6 +30,15 @@ public function getViewsData() {
         'id' => 'block_content_listing_empty',
       ],
     ];
+
+    $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/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/block_content/tests/src/Functional/Update/BlockContentUpdateTest.php b/core/modules/block_content/tests/src/Functional/Update/BlockContentUpdateTest.php
index f2653b7..626af81 100644
--- a/core/modules/block_content/tests/src/Functional/Update/BlockContentUpdateTest.php
+++ b/core/modules/block_content/tests/src/Functional/Update/BlockContentUpdateTest.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\FunctionalTests\Update\UpdatePathTestBase;
+use Drupal\views\Entity\View;
 
 /**
  * Tests update functions for the Block Content module.
@@ -66,4 +67,75 @@ public function testStatusFieldAddition() {
     $this->assertFalse($schema->fieldExists('block_content_field_data', 'content_translation_status'));
   }
 
+  /**
+   * Tests updating the block_content view for publishable block_content blocks.
+   *
+   * @see block_content_update_8600()
+   */
+  public function testBlockContentPublishableUIUpdate() {
+    $this->runUpdates();
+
+    // Load and initialize the block_content view.
+    $view = View::load('block_content');
+    $data = $view->toArray();
+    // Check that new fields exist and that they are in the correct order.
+    $view_fields = $data['display']['default']['display_options']['fields'];
+    $this->assertArrayHasKey('block_content_bulk_form', $view_fields);
+    $this->assertArrayHasKey('status', $view_fields);
+    $block_content_bulk_form_position = array_search('block_content_bulk_form', array_keys($view_fields));
+    $this->assertEqual($block_content_bulk_form_position, 0, "The block_content_bulk_form field is in the correct position");
+    $expected_status_position = array_search('operations', array_keys($view_fields)) - 1;
+    $status_position = array_search('status', array_keys($view_fields));
+    $this->assertEqual($status_position, $expected_status_position, "The status field is in the correct position");
+    // Check that the new filter exists and is exposed.
+    $this->assertArrayHasKey('status', $data['display']['default']['display_options']['filters']);
+    $this->assertTrue($data['display']['default']['display_options']['filters']['status']['exposed'], "The status filter is exposed");
+
+    // Check the new actions were created and work as expected.
+    $user =  $this->drupalCreateUser(['administer blocks', 'administer block_content display']);
+    $this->drupalLogin($user);
+    // Create a block.
+    $block_title = 'Test Block';
+    $edit = [];
+    $edit['info[0][value]'] = $block_title;
+    $edit['body[0][value]'] = $this->randomMachineName(16);
+    $this->drupalPostForm('block/add/basic', $edit, t('Save'));
+
+    // Check that the new block is displayed and showing its published status.
+    $this->drupalGet('admin/structure/block/block-content');
+    $this->assertText($block_title);
+    $this->assertText('Yes', "Block displayed as published");
+
+    // Unpublish the block using the new unpublish action.
+    $edit =[];
+    $edit['action'] = 'block_content_unpublish_action';
+    $edit['block_content_bulk_form[0]'] = TRUE;
+    $this->drupalPostForm('admin/structure/block/block-content', $edit, t('Apply to selected items'));
+    $this->assertText('Unpublish block content was applied to 1 item.');
+    $this->assertText($block_title);
+    $this->assertText('No', "Block displayed as unpublished");
+
+    // Filter by unpublished to show only unpublished blocks.
+    $edit =[];
+    $edit['status'] = 0;
+    $this->drupalPostForm('admin/structure/block/block-content', $edit, t('Apply'));
+    $this->assertText($block_title);
+    $this->assertText('No', "Block displayed as unpublished");
+
+    // Publish the block using the new publish action.
+    $edit =[];
+    $edit['action'] = 'block_content_publish_action';
+    $edit['block_content_bulk_form[0]'] = TRUE;
+    $this->drupalPostForm('admin/structure/block/block-content', $edit, t('Apply to selected items'));
+    $this->assertText('Publish block content was applied to 1 item.');
+    $this->assertText('Yes', "Block displayed as unpublished");
+
+    // Filter by published to show only published blocks.
+    $edit =[];
+    $edit['status'] = 1;
+    $this->drupalPostForm('admin/structure/block/block-content', $edit, t('Apply'));
+    $this->assertText($block_title);
+    $this->assertText('Yes', "Block displayed as published");
+  }
+
 }
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 71eebe8..c75d1d6 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
@@ -78,7 +78,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 385a4e5..e9c2c40 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
@@ -78,7 +78,7 @@ protected function getEntityCounts() {
       'search_page' => 2,
       'shortcut' => 6,
       'shortcut_set' => 2,
-      'action' => 17,
+      'action' => 19,
       'menu' => 6,
       'taxonomy_term' => 18,
       'taxonomy_vocabulary' => 4,
