diff --git a/core/modules/taxonomy/config/install/system.action.taxonomy_term_publish_action.yml b/core/modules/taxonomy/config/install/system.action.taxonomy_term_publish_action.yml
new file mode 100644
index 0000000..1c08029
--- /dev/null
+++ b/core/modules/taxonomy/config/install/system.action.taxonomy_term_publish_action.yml
@@ -0,0 +1,10 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - taxonomy
+id: taxonomy_term_publish_action
+label: 'Publish taxonomy term'
+type: taxonomy_term
+plugin: taxonomy_term_publish_action
+configuration: {  }
diff --git a/core/modules/taxonomy/config/install/system.action.taxonomy_term_unpublish_action.yml b/core/modules/taxonomy/config/install/system.action.taxonomy_term_unpublish_action.yml
new file mode 100644
index 0000000..d561e0b
--- /dev/null
+++ b/core/modules/taxonomy/config/install/system.action.taxonomy_term_unpublish_action.yml
@@ -0,0 +1,10 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - taxonomy
+id: taxonomy_term_unpublish_action
+label: 'Unpublish taxonomy term'
+type: taxonomy_term
+plugin: taxonomy_term_unpublish_action
+configuration: {  }
diff --git a/core/modules/taxonomy/config/schema/taxonomy.schema.yml b/core/modules/taxonomy/config/schema/taxonomy.schema.yml
index efa08e1..4ea23c5 100644
--- a/core/modules/taxonomy/config/schema/taxonomy.schema.yml
+++ b/core/modules/taxonomy/config/schema/taxonomy.schema.yml
@@ -37,3 +37,11 @@ taxonomy.vocabulary.*:
 field.formatter.settings.entity_reference_rss_category:
   type: mapping
   label: 'Taxonomy format settings'
+
+action.configuration.taxonomy_term_publish_action:
+  type: action_configuration_default
+  label: 'Publish selected taxonomy term configuration'
+
+action.configuration.taxonomy_term_unpublish_action:
+  type: action_configuration_default
+  label: 'Unpublish selected taxonomy term configuration'
diff --git a/core/modules/taxonomy/config/schema/taxonomy.views.schema.yml b/core/modules/taxonomy/config/schema/taxonomy.views.schema.yml
index 9ec9758..3fd7097 100644
--- a/core/modules/taxonomy/config/schema/taxonomy.views.schema.yml
+++ b/core/modules/taxonomy/config/schema/taxonomy.views.schema.yml
@@ -160,3 +160,7 @@ views.relationship.node_term_data:
       sequence:
         type: string
         label: 'Vocabulary'
+
+views.field.taxonomy_term_bulk_form:
+  type: views_field_bulk_form
+  label: 'Taxonomy term bulk form'
diff --git a/core/modules/taxonomy/src/Entity/Term.php b/core/modules/taxonomy/src/Entity/Term.php
index 03491ab..b6be05a 100644
--- a/core/modules/taxonomy/src/Entity/Term.php
+++ b/core/modules/taxonomy/src/Entity/Term.php
@@ -4,6 +4,8 @@
 
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityChangedTrait;
+use Drupal\Core\Entity\EntityPublishedInterface;
+use Drupal\Core\Entity\EntityPublishedTrait;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Field\BaseFieldDefinition;
@@ -37,6 +39,8 @@
  *     "bundle" = "vid",
  *     "label" = "name",
  *     "langcode" = "langcode",
+ *     "status" = "status",
+ *     "published" = "status",
  *     "uuid" = "uuid"
  *   },
  *   bundle_entity_type = "taxonomy_vocabulary",
@@ -51,9 +55,10 @@
  *   permission_granularity = "bundle"
  * )
  */
-class Term extends ContentEntityBase implements TermInterface {
+class Term extends ContentEntityBase implements TermInterface, EntityPublishedInterface {
 
   use EntityChangedTrait;
+  use EntityPublishedTrait;
 
   /**
    * {@inheritdoc}
@@ -104,12 +109,24 @@ public function postSave(EntityStorageInterface $storage, $update = TRUE) {
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     /** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */
     $fields = parent::baseFieldDefinitions($entity_type);
+    // Add the published field.
+    $fields += static::publishedBaseFieldDefinitions($entity_type);
 
     $fields['tid']->setLabel(t('Term ID'))
       ->setDescription(t('The term ID.'));
 
     $fields['uuid']->setDescription(t('The term UUID.'));
 
+    $fields['status']
+      ->setDisplayOptions('form', [
+        'type' => 'boolean_checkbox',
+        'settings' => [
+          'display_label' => TRUE,
+        ],
+        'weight' => 120,
+      ])
+      ->setDisplayConfigurable('form', TRUE);
+
     $fields['vid']->setLabel(t('Vocabulary'))
       ->setDescription(t('The vocabulary to which the term is assigned.'));
 
diff --git a/core/modules/taxonomy/src/Plugin/Action/PublishTaxonomyTerm.php b/core/modules/taxonomy/src/Plugin/Action/PublishTaxonomyTerm.php
new file mode 100644
index 0000000..20a342b
--- /dev/null
+++ b/core/modules/taxonomy/src/Plugin/Action/PublishTaxonomyTerm.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Drupal\taxonomy\Plugin\Action;
+
+use Drupal\Core\Action\ActionBase;
+use Drupal\Core\Session\AccountInterface;
+
+/**
+ * Publishes a taxonomy term.
+ *
+ * @Action(
+ *   id = "taxonomy_term_publish_action",
+ *   label = @Translation("Publish selected taxonomy term"),
+ *   type = "taxonomy_term"
+ * )
+ */
+class PublishTaxonomyTerm extends ActionBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function execute($entity = NULL) {
+     if ($entity->isPublished()) {
+      return;
+    }
+    $entity->setPublished()->save();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
+    /** @var \Drupal\taxonomy_term\BlockContentInterface $object */
+    $result = $object->access('update', $account, TRUE)
+      ->andIf($object->status->access('edit', $account, TRUE));
+
+    return $return_as_object ? $result : $result->isAllowed();
+  }
+
+}
diff --git a/core/modules/taxonomy/src/Plugin/Action/UnpublishTaxonomyTerm.php b/core/modules/taxonomy/src/Plugin/Action/UnpublishTaxonomyTerm.php
new file mode 100644
index 0000000..d24de53
--- /dev/null
+++ b/core/modules/taxonomy/src/Plugin/Action/UnpublishTaxonomyTerm.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Drupal\taxonomy\Plugin\Action;
+
+use Drupal\Core\Action\ActionBase;
+use Drupal\Core\Session\AccountInterface;
+
+/**
+ * Unpublishes a node.
+ *
+ * @Action(
+ *   id = "taxonomy_term_unpublish_action",
+ *   label = @Translation("Unpublish selected taxonomy term"),
+ *   type = "taxonomy_term"
+ * )
+ */
+class UnpublishTaxonomyTerm extends ActionBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function execute($entity = NULL) {
+    if (!$entity->isPublished()) {
+      return;
+    }
+    $entity->setUnpublished()->save();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
+    /** @var \Drupal\taxonomy_term\BlockContentInterface $object */
+    $access = $object->access('update', $account, TRUE)
+      ->andIf($object->status->access('edit', $account, TRUE));
+
+    return $return_as_object ? $access : $access->isAllowed();
+  }
+
+}
diff --git a/core/modules/taxonomy/src/Plugin/views/field/TaxonomyTermBulkForm.php b/core/modules/taxonomy/src/Plugin/views/field/TaxonomyTermBulkForm.php
new file mode 100644
index 0000000..5c57fec
--- /dev/null
+++ b/core/modules/taxonomy/src/Plugin/views/field/TaxonomyTermBulkForm.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Drupal\taxonomy\Plugin\views\field;
+
+use Drupal\system\Plugin\views\field\BulkForm;
+
+/**
+ * Defines a taxonomy term operations bulk form element.
+ *
+ * @ViewsField("taxonomy_term_bulk_form")
+ */
+class TaxonomyTermBulkForm extends BulkForm {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function emptySelectedMessage() {
+    return $this->t('No taxonomy term selected.');
+  }
+
+}
diff --git a/core/modules/taxonomy/src/TermForm.php b/core/modules/taxonomy/src/TermForm.php
index 1eae95a..34d0e60 100644
--- a/core/modules/taxonomy/src/TermForm.php
+++ b/core/modules/taxonomy/src/TermForm.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Entity\ContentEntityForm;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\taxonomy\TermInterface;
 
 /**
  * Base for handler for taxonomy term edit forms.
@@ -85,7 +86,13 @@ public function form(array $form, FormStateInterface $form_state) {
       '#value' => $term->id(),
     ];
 
-    return parent::form($form, $form_state);
+    $form = parent::form($form, $form_state);
+
+    $form['#entity_builders']['update_status'] = '::updateStatus';
+
+    $form['status']['#group'] = 'footer';
+
+    return $form;
   }
 
   /**
@@ -120,7 +127,6 @@ public function buildEntity(array $form, FormStateInterface $form_state) {
    */
   public function save(array $form, FormStateInterface $form_state) {
     $term = $this->entity;
-
     $result = $term->save();
 
     $edit_link = $term->link($this->t('Edit'), 'edit-form');
@@ -130,6 +136,7 @@ public function save(array $form, FormStateInterface $form_state) {
         drupal_set_message($this->t('Created new term %term.', ['%term' => $view_link]));
         $this->logger('taxonomy')->notice('Created new term %term.', ['%term' => $term->getName(), 'link' => $edit_link]);
         break;
+
       case SAVED_UPDATED:
         drupal_set_message($this->t('Updated term %term.', ['%term' => $view_link]));
         $this->logger('taxonomy')->notice('Updated term %term.', ['%term' => $term->getName(), 'link' => $edit_link]);
@@ -144,8 +151,8 @@ public function save(array $form, FormStateInterface $form_state) {
       $form_state->setValue('parent', []);
     }
 
-    // If the number of parents has been reduced to one or none, do a check on the
-    // parents of every term in the vocabulary value.
+    // If the number of parents has been reduced to one or none, do a check
+    // on the parents of every term in the vocabulary value.
     $vocabulary = $form_state->get(['taxonomy', 'vocabulary']);
     if ($current_parent_count < $previous_parent_count && $current_parent_count < 2) {
       taxonomy_check_vocabulary_hierarchy($vocabulary, $form_state->getValues());
@@ -161,4 +168,30 @@ public function save(array $form, FormStateInterface $form_state) {
     $form_state->set('tid', $term->id());
   }
 
+  /**
+   * Entity builder updating the block content status with the submitted value.
+   *
+   * @param string $entity_type_id
+   *   The entity type identifier.
+   * @param \Drupal\taxonomy\TermInterface $term
+   *   The taxonomy term updated with the submitted values.
+   * @param array $form
+   *   The complete form array.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   *
+   * @see \Drupal\taxonomy\TermForm::form()
+   */
+  public function updateStatus($entity_type_id, TermInterface $term, array $form, FormStateInterface $form_state) {
+    $element = $form_state->getTriggeringElement();
+    if (isset($element['#published_status'])) {
+      if ($element['#published_status'] == TRUE) {
+        $term->setPublished();
+      }
+      else {
+        $term->setUnPublished();
+      }
+    }
+  }
+
 }
diff --git a/core/modules/taxonomy/src/TermViewsData.php b/core/modules/taxonomy/src/TermViewsData.php
index 5e98bfe..e6d5999 100644
--- a/core/modules/taxonomy/src/TermViewsData.php
+++ b/core/modules/taxonomy/src/TermViewsData.php
@@ -133,6 +133,14 @@ public function getViewsData() {
       ],
     ];
 
+    $data['taxonomy_term_field_data']['taxonomy_term_bulk_form'] = [
+      'title' => $this->t('Taxonomy term operations bulk form'),
+      'help' => $this->t('Add a form element that lets you run operations on multiple taxonomy terms.'),
+      'field' => [
+        'id' => 'taxonomy_term_bulk_form',
+      ],
+    ];
+
     $data['taxonomy_index']['table']['group']  = $this->t('Taxonomy term');
 
     $data['taxonomy_index']['table']['join'] = [
