diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 498c490..8635336 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -1613,6 +1613,7 @@ function template_preprocess_field_multiple_value_form(&$variables) {
         'class' => array('field-label'),
       ),
       t('Order', array(), array('context' => 'Sort order')),
+      t('Remove', array(), array('context' => 'Remove item')),
     );
     $rows = array();

@@ -1634,15 +1635,17 @@ function template_preprocess_field_multiple_value_form(&$variables) {
     foreach ($items as $item) {
       $item['_weight']['#attributes']['class'] = [$order_class];

-      // Remove weight form element from item render array so it can be rendered
-      // in a separate table column.
+      // Remove weight and remove form element from item render array so they
+      // can be rendered in a separate table columns.
       $delta_element = $item['_weight'];
-      unset($item['_weight']);
+      $remove_element = $item['_remove'];
+      unset($item['_weight'], $item['_remove']);

       $cells = array(
         array('data' => '', 'class' => array('field-multiple-drag')),
         array('data' => $item),
         array('data' => $delta_element, 'class' => array('delta-order')),
+        array('data' => $remove_element, 'class' => array('delta-remove')),
       );
       $rows[] = array(
         'data' => $cells,
diff --git a/core/lib/Drupal/Core/Field/WidgetBase.php b/core/lib/Drupal/Core/Field/WidgetBase.php
index b1579f2..3bdab11 100644
--- a/core/lib/Drupal/Core/Field/WidgetBase.php
+++ b/core/lib/Drupal/Core/Field/WidgetBase.php
@@ -202,6 +202,22 @@ protected function formMultipleElements(FieldItemListInterface $items, array &$f
             '#default_value' => $items[$delta]->_weight ?: $delta,
             '#weight' => 100,
           );
+
+          foreach (Element::children($element) as $key) {
+            $element[$key]['#states'] = [
+              'disabled' => [
+                ':input[name="' . $field_name . '[' . $delta . '][_remove]"]' => ['checked' => TRUE],
+              ],
+            ];
+          }
+
+          $element['_remove'] = [
+            '#title' => $this->t('Remove'),
+            '#title_display' => 'invisible',
+            '#type' => 'checkbox',
+            '#default_value' => $items[$delta]->_remove ?: FALSE,
+            '#weight' => 101,
+          ];
         }

         $elements[$delta] = $element;
@@ -353,6 +369,11 @@ public function extractFormValues(FieldItemListInterface $items, array $form, Fo
         // Remove the 'value' of the 'add more' button.
         unset($values['add_more']);

+        // Filter out removed items.
+        foreach ($values as $delta => $value) {
+          if (!empty($value['_remove'])) unset($values[$delta]);
+        }
+
         // The original delta, before drag-and-drop reordering, is needed to
         // route errors to the correct form element.
         foreach ($values as $delta => &$value) {
@@ -375,7 +396,7 @@ public function extractFormValues(FieldItemListInterface $items, array $form, Fo
       $field_state = static::getWidgetState($form['#parents'], $field_name, $form_state);
       foreach ($items as $delta => $item) {
         $field_state['original_deltas'][$delta] = isset($item->_original_delta) ? $item->_original_delta : $delta;
-        unset($item->_original_delta, $item->_weight);
+        unset($item->_original_delta, $item->_weight, $item->_remove);
       }
       static::setWidgetState($form['#parents'], $field_name, $form_state, $field_state);
     }
