diff --git a/src/Element/WebformTermCheckboxes.php b/src/Element/WebformTermCheckboxes.php
new file mode 100644
index 0000000..4b4711c
--- /dev/null
+++ b/src/Element/WebformTermCheckboxes.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace Drupal\webform\Element;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element\Checkboxes;
+
+/**
+ * Provides a webform element for term checkboxes.
+ *
+ * @FormElement("webform_term_checkboxes")
+ */
+class WebformTermCheckboxes extends Checkboxes {
+
+  use WebformEntityTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getInfo() {
+    return [
+      '#vocabulary' => '',
+      '#tree_delimiter' => '-',
+      '#breadcrumb' => FALSE,
+      '#breadcrumb_delimiter' => ' › ',
+      '#tree_delimiter' => '-',
+    ] + parent::getInfo();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function processCheckboxes(&$element, FormStateInterface $form_state, &$complete_form) {
+    self::setOptions($element);
+    $element = parent::processCheckboxes($element, $form_state, $complete_form);
+
+    if (!\Drupal::moduleHandler()->moduleExists('taxonomy')) {
+      return $element;
+    }
+
+    $taxonomy_storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
+    $tree = $taxonomy_storage->loadTree($element['#vocabulary']);
+    $name = $element['#webform_key'];
+    foreach ($tree as $item) {
+      if (!empty($item->parents)) {
+        // We only care about the first parent for adding classes.
+        $parent = $item->parents[0];
+        $element[$item->tid]['#attributes']['class'][] = 'parent-' . $parent;
+        $element[$item->tid]['#states'] = [
+          'visible' => [
+            ":input[name=\"{$name}[{$parent}]\"]" => ['checked' => TRUE],
+          ],
+        ];
+      }
+    }
+
+    return $element;
+  }
+  /**
+   * {@inheritdoc}
+   */
+  public static function setOptions(array &$element) {
+    // This is just here to prevent errors about the #target_type property not
+    // found for an EntityReferenceSelection plugin.
+    $element['#target_type'] = 'taxonomy_term';
+
+    if (!empty($element['#options'])) {
+      return;
+    }
+
+    if (!\Drupal::moduleHandler()->moduleExists('taxonomy')) {
+      return [];
+    }
+
+    if (empty($element['#vocabulary'])) {
+      $element['#options'] = [];
+      return;
+    }
+
+    /** @var \Drupal\taxonomy\TermStorageInterface $taxonomy_storage */
+    $taxonomy_storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
+    $tree = $taxonomy_storage->loadTree($element['#vocabulary']);
+
+    $options = [];
+    if (!empty($element['#breadcrumb'])) {
+      // Build term breadcrumbs.
+      $element += ['#breadcrumb_delimiter' => ' › '];
+      $breadcrumb = [];
+      foreach ($tree as $item) {
+        $breadcrumb[$item->depth] = $item->name;
+        $breadcrumb = array_slice($breadcrumb, 0, $item->depth + 1);
+        $options[$item->tid] = implode($element['#breadcrumb_delimiter'], $breadcrumb);
+      }
+    }
+    else {
+      $element += ['#tree_delimiter' => '-'];
+      // Build hierarchical term tree.
+      foreach ($tree as $item) {
+        $options[$item->tid] = str_repeat($element['#tree_delimiter'], $item->depth) . $item->name;
+      }
+    }
+
+    $element['#options'] = $options;
+  }
+}
diff --git a/src/Plugin/WebformElement/WebformTermCheckboxes.php b/src/Plugin/WebformElement/WebformTermCheckboxes.php
new file mode 100644
index 0000000..085728d
--- /dev/null
+++ b/src/Plugin/WebformElement/WebformTermCheckboxes.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace Drupal\webform\Plugin\WebformElement;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\webform\Element\WebformTermCheckboxes as TermCheckboxesElement;
+
+/**
+ * Provides a 'webform_term_checkboxes' element.
+ *
+ * @WebformElement(
+ *   id = "webform_term_checkboxes",
+ *   label = @Translation("Term checkboxes"),
+ *   description = @Translation("Provides a form element to select a single or multiple terms displayed as hierarchical tree or as breadcrumbs using checkboxes."),
+ *   category = @Translation("Entity reference elements"),
+ * )
+ */
+class WebformTermCheckboxes extends Checkboxes implements WebformEntityReferenceInterface {
+
+  use WebformEntityReferenceTrait;
+  use WebformEntityOptionsTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultProperties() {
+    $properties = parent::getDefaultProperties() + [
+      'vocabulary' => '',
+      'breadcrumb' => FALSE,
+      'breadcrumb_delimiter' => ' › ',
+      'tree_delimiter' => '-',
+    ];
+
+    unset($properties['options']);
+    unset($properties['options_randomize']);
+    return $properties;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRelatedTypes(array $element) {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function form(array $form, FormStateInterface $form_state) {
+    $form = parent::form($form, $form_state);
+
+    $form['term_reference'] = [
+      '#type' => 'fieldset',
+      '#title' => t('Term reference settings'),
+      '#weight' => -40,
+    ];
+    $form['term_reference']['vocabulary'] = [
+      '#type' => 'webform_entity_select',
+      '#title' => $this->t('Vocabulary'),
+      '#target_type' => 'taxonomy_vocabulary',
+      '#selection_handler' => 'default:taxonomy_vocabulary',
+    ];
+    $form['term_reference']['breadcrumb'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Display term hierarchy using breadcrumbs.'),
+      '#return_value' => TRUE,
+    ];
+    $form['term_reference']['breadcrumb_delimiter'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Breadcrumb delimiter'),
+      '#size' => 10,
+      '#states' => [
+        'visible' => [
+          [':input[name="properties[breadcrumb]"]' => ['checked' => TRUE]],
+          'or',
+          [':input[name="properties[format]"]' => ['value' => 'breadcrumb']],
+        ],
+        'required' => [
+          [':input[name="properties[breadcrumb]"]' => ['checked' => TRUE]],
+          'or',
+          [':input[name="properties[format]"]' => ['value' => 'breadcrumb']],
+        ],
+      ],
+    ];
+    $form['term_reference']['tree_delimiter'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Tree delimiter'),
+      '#size' => 10,
+      '#states' => [
+        'visible' => [
+          ':input[name="properties[breadcrumb]"]' => [
+            'checked' => FALSE,
+          ],
+        ],
+        'required' => [
+          ':input[name="properties[breadcrumb]"]' => [
+            'checked' => FALSE,
+          ],
+        ],
+      ],
+    ];
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+    // Overrides: \Drupal\webform\Plugin\WebformElement\WebformEntityReferenceTrait::validateConfigurationForm.
+    parent::validateConfigurationForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getTargetType(array $element) {
+    return 'taxonomy_term';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setOptions(array &$element) {
+    TermCheckboxesElement::setOptions($element);
+  }
+}
