diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EmailDefaultWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EmailDefaultWidget.php
index ce60ebc..62f3841 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EmailDefaultWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EmailDefaultWidget.php
@@ -8,7 +8,7 @@
 namespace Drupal\Core\Field\Plugin\Field\FieldWidget;
 
 use Drupal\Core\Field\FieldItemListInterface;
-use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Field\WidgetBaseSingle;
 use Drupal\Core\Form\FormStateInterface;
 
 /**
@@ -22,7 +22,7 @@
  *   }
  * )
  */
-class EmailDefaultWidget extends WidgetBase {
+class EmailDefaultWidget extends WidgetBaseSingle {
 
   /**
    * {@inheritdoc}
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/NumberWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/NumberWidget.php
index 50f8006..73967f4 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/NumberWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/NumberWidget.php
@@ -8,7 +8,7 @@
 namespace Drupal\Core\Field\Plugin\Field\FieldWidget;
 
 use Drupal\Core\Field\FieldItemListInterface;
-use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Field\WidgetBaseSingle;
 use Drupal\Core\Form\FormStateInterface;
 use Symfony\Component\Validator\ConstraintViolationInterface;
 
@@ -25,7 +25,7 @@
  *   }
  * )
  */
-class NumberWidget extends WidgetBase {
+class NumberWidget extends WidgetBaseSingle {
 
   /**
    * {@inheritdoc}
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/StringTextareaWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/StringTextareaWidget.php
index 8658dd0..352cd3e 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/StringTextareaWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/StringTextareaWidget.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Field\WidgetBaseSingle;
 use Drupal\Core\Form\FormStateInterface;
 
 /**
@@ -22,7 +23,7 @@
  *   }
  * )
  */
-class StringTextareaWidget extends WidgetBase {
+class StringTextareaWidget extends WidgetBaseSingle {
 
   /**
    * {@inheritdoc}
diff --git a/core/lib/Drupal/Core/Field/WidgetBase.php b/core/lib/Drupal/Core/Field/WidgetBase.php
index 3589ac5..a8142f4 100644
--- a/core/lib/Drupal/Core/Field/WidgetBase.php
+++ b/core/lib/Drupal/Core/Field/WidgetBase.php
@@ -8,7 +8,6 @@
 namespace Drupal\Core\Field;
 
 use Drupal\Component\Utility\NestedArray;
-use Drupal\Component\Utility\SortArray;
 use Drupal\Component\Utility\String;
 use Drupal\Core\Form\FormStateInterface;
 use Symfony\Component\Validator\ConstraintViolationInterface;
@@ -59,6 +58,24 @@ public function __construct($plugin_id, $plugin_definition, FieldDefinitionInter
   }
 
   /**
+   * Get the form element for a single $delta.
+   */
+  protected function formDeltaElement(FieldItemListInterface $items, array &$form, FormStateInterface $form_state) {
+    $delta = isset($get_delta) ? $get_delta : 0;
+    $element = array(
+      '#title' => String::checkPlain($this->fieldDefinition->getLabel()),
+      '#description' => field_filter_xss(\Drupal::token()->replace($this->fieldDefinition->getDescription())),
+    );
+    $element = $this->formSingleElement($items, $delta, $element, $form, $form_state);
+
+    if ($element) {
+      // If we are processing a specific delta value for a field where the
+      // field module handles multiples, set the delta in the result.
+      return array($delta => $element);
+    }
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function form(FieldItemListInterface $items, array &$form, FormStateInterface $form_state, $get_delta = NULL) {
@@ -73,38 +90,13 @@ public function form(FieldItemListInterface $items, array &$form, FormStateInter
       );
       static::setWidgetState($parents, $field_name, $form_state, $field_state);
     }
-
-    // Collect widget elements.
-    $elements = array();
-
-    // If the widget is handling multiple values (e.g Options), or if we are
-    // displaying an individual element, just get a single form element and make
-    // it the $delta value.
-    if ($this->handlesMultipleValues() || isset($get_delta)) {
-      $delta = isset($get_delta) ? $get_delta : 0;
-      $element = array(
-        '#title' => String::checkPlain($this->fieldDefinition->getLabel()),
-        '#description' => $this->fieldFilterXss(\Drupal::token()->replace($this->fieldDefinition->getDescription())),
-      );
-      $element = $this->formSingleElement($items, $delta, $element, $form, $form_state);
-
-      if ($element) {
-        if (isset($get_delta)) {
-          // If we are processing a specific delta value for a field where the
-          // field module handles multiples, set the delta in the result.
-          $elements[$delta] = $element;
-        }
-        else {
-          // For fields that handle their own processing, we cannot make
-          // assumptions about how the field is structured, just merge in the
-          // returned element.
-          $elements = $element;
-        }
-      }
+    if (isset($get_delta)) {
+      // If we are displaying an individual element, just get a single form
+      // element and make it the $delta value.
+      $elements = $this->formDeltaElement($items, $form, $form_state);
     }
-    // If the widget does not handle multiple values itself, (and we are not
-    // displaying an individual element), process the multiple value form.
     else {
+      // Delegate the multiple element generation to the children classes.
       $elements = $this->formMultipleElements($items, $form, $form_state);
     }
 
@@ -136,105 +128,6 @@ public function form(FieldItemListInterface $items, array &$form, FormStateInter
   }
 
   /**
-   * Special handling to create form elements for multiple values.
-   *
-   * Handles generic features for multiple fields:
-   * - number of widgets
-   * - AHAH-'add more' button
-   * - table display and drag-n-drop value reordering
-   */
-  protected function formMultipleElements(FieldItemListInterface $items, array &$form, FormStateInterface $form_state) {
-    $field_name = $this->fieldDefinition->getName();
-    $cardinality = $this->fieldDefinition->getFieldStorageDefinition()->getCardinality();
-    $parents = $form['#parents'];
-
-    // Determine the number of widgets to display.
-    switch ($cardinality) {
-      case FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED:
-        $field_state = static::getWidgetState($parents, $field_name, $form_state);
-        $max = $field_state['items_count'];
-        $is_multiple = TRUE;
-        break;
-
-      default:
-        $max = $cardinality - 1;
-        $is_multiple = ($cardinality > 1);
-        break;
-    }
-
-    $title = String::checkPlain($this->fieldDefinition->getLabel());
-    $description = $this->fieldFilterXss(\Drupal::token()->replace($this->fieldDefinition->getDescription()));
-
-    $elements = array();
-
-    for ($delta = 0; $delta <= $max; $delta++) {
-      // For multiple fields, title and description are handled by the wrapping
-      // table.
-      $element = array(
-        '#title' => $is_multiple ? '' : $title,
-        '#description' => $is_multiple ? '' : $description,
-      );
-      $element = $this->formSingleElement($items, $delta, $element, $form, $form_state);
-
-      if ($element) {
-        // Input field for the delta (drag-n-drop reordering).
-        if ($is_multiple) {
-          // We name the element '_weight' to avoid clashing with elements
-          // defined by widget.
-          $element['_weight'] = array(
-            '#type' => 'weight',
-            '#title' => t('Weight for row @number', array('@number' => $delta + 1)),
-            '#title_display' => 'invisible',
-            // Note: this 'delta' is the FAPI #type 'weight' element's property.
-            '#delta' => $max,
-            '#default_value' => $items[$delta]->_weight ?: $delta,
-            '#weight' => 100,
-          );
-        }
-
-        $elements[$delta] = $element;
-      }
-    }
-
-    if ($elements) {
-      $elements += array(
-        '#theme' => 'field_multiple_value_form',
-        '#field_name' => $field_name,
-        '#cardinality' => $cardinality,
-        '#cardinality_multiple' => $this->fieldDefinition->getFieldStorageDefinition()->isMultiple(),
-        '#required' => $this->fieldDefinition->isRequired(),
-        '#title' => $title,
-        '#description' => $description,
-        '#max_delta' => $max,
-      );
-
-      // Add 'add more' button, if not working with a programmed form.
-      if ($cardinality == FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED && !$form_state->isProgrammed()) {
-        $id_prefix = implode('-', array_merge($parents, array($field_name)));
-        $wrapper_id = drupal_html_id($id_prefix . '-add-more-wrapper');
-        $elements['#prefix'] = '<div id="' . $wrapper_id . '">';
-        $elements['#suffix'] = '</div>';
-
-        $elements['add_more'] = array(
-          '#type' => 'submit',
-          '#name' => strtr($id_prefix, '-', '_') . '_add_more',
-          '#value' => t('Add another item'),
-          '#attributes' => array('class' => array('field-add-more-submit')),
-          '#limit_validation_errors' => array(array_merge($parents, array($field_name))),
-          '#submit' => array(array(get_class($this), 'addMoreSubmit')),
-          '#ajax' => array(
-            'callback' => array(get_class($this), 'addMoreAjax'),
-            'wrapper' => $wrapper_id,
-            'effect' => 'fade',
-          ),
-        );
-      }
-    }
-
-    return $elements;
-  }
-
-  /**
    * After-build handler for field elements in a form.
    *
    * This stores the final location of the field within the form structure so
@@ -295,6 +188,16 @@ public static function addMoreAjax(array $form, FormStateInterface $form_state)
     return $element;
   }
 
+    /**
+     * Special handling to create form elements for multiple values.
+     *
+     * Handles generic features for multiple fields:
+     * - number of widgets
+     * - AHAH-'add more' button
+     * - table display and drag-n-drop value reordering
+     */
+  abstract protected function formMultipleElements(FieldItemListInterface $items, array &$form, FormStateInterface $form_state);
+
   /**
    * Generates the form element for a single copy of the widget.
    */
@@ -327,6 +230,13 @@ protected function formSingleElement(FieldItemListInterface $items, $delta, arra
   }
 
   /**
+   * Massage the form values to unset 'add_more' and reorder form values.
+   *
+   * @param $values
+   */
+  protected function massageMultipleFormValues(&$values) { }
+
+  /**
    * {@inheritdoc}
    */
   public function extractFormValues(FieldItemListInterface $items, array $form, FormStateInterface $form_state) {
@@ -339,21 +249,7 @@ public function extractFormValues(FieldItemListInterface $items, array $form, Fo
 
     if ($key_exists) {
       // Account for drag-and-drop reordering if needed.
-      if (!$this->handlesMultipleValues()) {
-        // Remove the 'value' of the 'add more' button.
-        unset($values['add_more']);
-
-        // The original delta, before drag-and-drop reordering, is needed to
-        // route errors to the correct form element.
-        foreach ($values as $delta => &$value) {
-          $value['_original_delta'] = $delta;
-        }
-
-        usort($values, function ($a, $b) {
-          return SortArray::sortByKeyInt($a, $b, '_weight');
-        });
-      }
-
+      $this->massageMultipleFormValues($values);
       // Let the widget massage the submitted values.
       $values = $this->massageFormValues($values, $form, $form_state);
 
@@ -372,6 +268,19 @@ public function extractFormValues(FieldItemListInterface $items, array $form, Fo
   }
 
   /**
+   * Flags the error in the appropriate form element.
+   *
+   * @param array $element
+   *   Form element containing the error.
+   * @param int $original_delta
+   *   Delta item in the form element that causes the error.
+   *
+   * @return array
+   *   Form element that gets the error flag.
+   */
+  abstract protected function deltaViolationElement(array $element, $original_delta);
+
+  /**
    * {@inheritdoc}
    */
   public function flagErrors(FieldItemListInterface $items, ConstraintViolationListInterface $violations, array $form, FormStateInterface $form_state) {
@@ -416,13 +325,12 @@ public function flagErrors(FieldItemListInterface $items, ConstraintViolationLis
           // Pass violations to the main element:
           // - if this is a multiple-value widget,
           // - or if the violations are at the ItemList level.
-          if ($handles_multiple || !is_numeric($delta)) {
+          if (!is_numeric($delta)) {
             $delta_element = $element;
           }
-          // Otherwise, pass errors by delta to the corresponding sub-element.
           else {
-            $original_delta = $field_state['original_deltas'][$delta];
-            $delta_element = $element[$original_delta];
+            $original_delta = isset($field_state['original_deltas'][$delta]) ? $field_state['original_deltas'][$delta] : 0;
+            $delta_element = $this->deltaViolationElement($element, $original_delta);
           }
           foreach ($delta_violations as $violation) {
             // @todo: Pass $violation->arrayPropertyPath as property path.
@@ -520,18 +428,6 @@ protected function getFieldSetting($setting_name) {
   }
 
   /**
-   * Returns whether the widget handles multiple values.
-   *
-   * @return bool
-   *   TRUE if a single copy of formElement() can handle multiple field values,
-   *   FALSE if multiple values require separate copies of formElement().
-   */
-  protected function handlesMultipleValues() {
-    $definition = $this->getPluginDefinition();
-    return $definition['multiple_values'];
-  }
-
-  /**
    * {@inheritdoc}
    */
   public static function isApplicable(FieldDefinitionInterface $field_definition) {
diff --git a/core/modules/comment/src/Plugin/Field/FieldWidget/CommentWidget.php b/core/modules/comment/src/Plugin/Field/FieldWidget/CommentWidget.php
index 679137b..5cdefc5 100644
--- a/core/modules/comment/src/Plugin/Field/FieldWidget/CommentWidget.php
+++ b/core/modules/comment/src/Plugin/Field/FieldWidget/CommentWidget.php
@@ -9,7 +9,7 @@
 
 use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface;
 use Drupal\Core\Field\FieldItemListInterface;
-use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Field\WidgetBaseSingle;
 use Drupal\Core\Form\FormStateInterface;
 
 /**
@@ -23,7 +23,7 @@
  *   }
  * )
  */
-class CommentWidget extends WidgetBase {
+class CommentWidget extends WidgetBaseSingle {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeDatelistWidget.php b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeDatelistWidget.php
index d460416..7a51f7b 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeDatelistWidget.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeDatelistWidget.php
@@ -7,6 +7,7 @@
 namespace Drupal\datetime\Plugin\Field\FieldWidget;
 
 use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Field\WidgetBaseSingle;
 use Drupal\Core\Form\FormStateInterface;
 
 /**
diff --git a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeDefaultWidget.php b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeDefaultWidget.php
index 8d436a0..1816e77 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeDefaultWidget.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeDefaultWidget.php
@@ -9,6 +9,7 @@
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Field\WidgetBaseSingle;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
diff --git a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php
index 32d3668..fced240 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php
@@ -10,13 +10,14 @@
 use Drupal\Core\Datetime\DrupalDateTime;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Field\WidgetBaseSingle;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
 
 /**
  * Base class for the 'datetime_*' widgets.
  */
-class DateTimeWidgetBase extends WidgetBase {
+class DateTimeWidgetBase extends WidgetBaseSingle {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteTagsWidget.php b/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteTagsWidget.php
index b289a06..6034268 100644
--- a/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteTagsWidget.php
+++ b/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteTagsWidget.php
@@ -8,6 +8,11 @@
 namespace Drupal\entity_reference\Plugin\Field\FieldWidget;
 
 use Drupal\Component\Utility\Tags;
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Field\WidgetBaseMultiple;
+use Drupal\user\EntityOwnerInterface;
+use Symfony\Component\Validator\ConstraintViolationInterface;
+
 use Drupal\Core\Form\FormStateInterface;
 
 /**
@@ -20,10 +25,9 @@
  *   field_types = {
  *     "entity_reference"
  *   },
- *   multiple_values = TRUE
  * )
  */
-class AutocompleteTagsWidget extends AutocompleteWidgetBase {
+class AutocompleteTagsWidget extends WidgetBaseMultiple {
 
   /**
    * {@inheritdoc}
@@ -85,4 +89,203 @@ public function elementValidate($element, FormStateInterface $form_state, $form)
     array_pop($element['#parents']);
     form_set_value($element, $value, $form_state);
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, FormStateInterface $form_state) {
+    $element['match_operator'] = array(
+      '#type' => 'radios',
+      '#title' => t('Autocomplete matching'),
+      '#default_value' => $this->getSetting('match_operator'),
+      '#options' => array(
+        'STARTS_WITH' => t('Starts with'),
+        'CONTAINS' => t('Contains'),
+      ),
+      '#description' => t('Select the method used to collect autocomplete suggestions. Note that <em>Contains</em> can cause performance issues on sites with thousands of entities.'),
+    );
+    $element['size'] = array(
+      '#type' => 'number',
+      '#title' => t('Size of textfield'),
+      '#default_value' => $this->getSetting('size'),
+      '#min' => 1,
+      '#required' => TRUE,
+    );
+    $element['placeholder'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Placeholder'),
+      '#default_value' => $this->getSetting('placeholder'),
+      '#description' => t('Text that will be shown inside the field until a value is entered. This hint is usually a sample value or a brief description of the expected format.'),
+    );
+    return $element;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsSummary() {
+    $summary = array();
+
+    $summary[] = t('Autocomplete matching: @match_operator', array('@match_operator' => $this->getSetting('match_operator')));
+    $summary[] = t('Textfield size: !size', array('!size' => $this->getSetting('size')));
+    $placeholder = $this->getSetting('placeholder');
+    if (!empty($placeholder)) {
+      $summary[] = t('Placeholder: @placeholder', array('@placeholder' => $placeholder));
+    }
+    else {
+      $summary[] = t('No placeholder');
+    }
+
+    return $summary;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
+    $entity = $items->getEntity();
+
+    // Prepare the autocomplete route parameters.
+    $autocomplete_route_parameters = array(
+      'type' => $this->getSetting('autocomplete_type'),
+      'field_name' => $this->fieldDefinition->getName(),
+      'entity_type' => $entity->getEntityTypeId(),
+      'bundle_name' => $entity->bundle(),
+    );
+
+    if ($entity_id = $entity->id()) {
+      $autocomplete_route_parameters['entity_id'] = $entity_id;
+    }
+
+    $element += array(
+      '#type' => 'textfield',
+      '#maxlength' => 1024,
+      '#default_value' => implode(', ', $this->getLabels($items, $delta)),
+      '#autocomplete_route_name' => 'entity_reference.autocomplete',
+      '#autocomplete_route_parameters' => $autocomplete_route_parameters,
+      '#size' => $this->getSetting('size'),
+      '#placeholder' => $this->getSetting('placeholder'),
+      '#element_validate' => array(array($this, 'elementValidate')),
+      '#autocreate_uid' => ($entity instanceof EntityOwnerInterface) ? $entity->getOwnerId() : \Drupal::currentUser()->id(),
+    );
+
+    return array('target_id' => $element);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function errorElement(array $element, ConstraintViolationInterface $error, array $form, FormStateInterface $form_state) {
+    return $element['target_id'];
+  }
+
+  /**
+   * Gets the entity labels.
+   */
+  protected function getLabels(FieldItemListInterface $items, $delta) {
+    if ($items->isEmpty()) {
+      return array();
+    }
+
+    $entity_labels = array();
+
+    // Load those entities and loop through them to extract their labels.
+    $entities = entity_load_multiple($this->getFieldSetting('target_type'), $this->getEntityIds($items, $delta));
+
+    foreach ($entities as $entity_id => $entity_item) {
+      $label = $entity_item->label();
+      $key = "$label ($entity_id)";
+      // Labels containing commas or quotes must be wrapped in quotes.
+      $key = Tags::encode($key);
+      $entity_labels[] = $key;
+    }
+    return $entity_labels;
+  }
+
+  /**
+   * Builds an array of entity IDs for which to get the entity labels.
+   *
+   * @param \Drupal\Core\Field\FieldItemListInterface $items
+   *   Array of default values for this field.
+   * @param int $delta
+   *   The order of a field item in the array of subelements (0, 1, 2, etc).
+   *
+   * @return array
+   *   An array of entity IDs.
+   */
+  protected function getEntityIds(FieldItemListInterface $items, $delta) {
+    $entity_ids = array();
+
+    foreach ($items as $item) {
+      $entity_ids[] = $item->target_id;
+    }
+
+    return $entity_ids;
+  }
+
+  /**
+   * Creates a new entity from a label entered in the autocomplete input.
+   *
+   * @param string $label
+   *   The entity label.
+   * @param int $uid
+   *   The entity uid.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface
+   */
+  protected function createNewEntity($label, $uid) {
+    $entity_manager = \Drupal::entityManager();
+    $target_type = $this->getFieldSetting('target_type');
+    $target_bundles = $this->getSelectionHandlerSetting('target_bundles');
+
+    // Get the bundle.
+    if (!empty($target_bundles)) {
+      $bundle = reset($target_bundles);
+    }
+    else {
+      $bundles = entity_get_bundles($target_type);
+      $bundle = reset($bundles);
+    }
+
+    $entity_type = $entity_manager->getDefinition($target_type);
+    $bundle_key = $entity_type->getKey('bundle');
+    $label_key = $entity_type->getKey('label');
+
+    $entity = $entity_manager->getStorage($target_type)->create(array(
+      $label_key => $label,
+      $bundle_key => $bundle,
+    ));
+
+    if ($entity instanceof EntityOwnerInterface) {
+      $entity->setOwnerId($uid);
+    }
+
+    return $entity;
+  }
+
+  /**
+   * Returns the value of a setting for the entity reference selection handler.
+   *
+   * @param string $setting_name
+   *   The setting name.
+   *
+   * @return mixed
+   *   The setting value.
+   */
+  protected function getSelectionHandlerSetting($setting_name) {
+    $settings = $this->getFieldSetting('handler_settings');
+    return isset($settings[$setting_name]) ? $settings[$setting_name] : NULL;
+  }
+
+  /**
+   * Checks whether a content entity is referenced.
+   *
+   * @return bool
+   */
+  protected function isContentReferenced() {
+    $target_type = $this->getFieldSetting('target_type');
+    $target_type_info = \Drupal::entityManager()->getDefinition($target_type);
+    return $target_type_info->isSubclassOf('\Drupal\Core\Entity\ContentEntityInterface');
+  }
+
 }
diff --git a/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteWidget.php b/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteWidget.php
index ef9e6ea..84c4368 100644
--- a/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteWidget.php
+++ b/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteWidget.php
@@ -8,6 +8,11 @@
 namespace Drupal\entity_reference\Plugin\Field\FieldWidget;
 
 use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Component\Utility\Tags;
+use Drupal\Core\Field\WidgetBaseSingle;
+use Drupal\user\EntityOwnerInterface;
+use Symfony\Component\Validator\ConstraintViolationInterface;
+
 use Drupal\Core\Form\FormStateInterface;
 
 /**
@@ -27,7 +32,7 @@
  *   }
  * )
  */
-class AutocompleteWidget extends AutocompleteWidgetBase {
+class AutocompleteWidget extends WidgetBaseSingle {
 
   protected $usesOptions = TRUE;
 
@@ -96,4 +101,182 @@ public function elementValidate($element, FormStateInterface $form_state, $form)
     }
     form_set_value($element, $value, $form_state);
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, FormStateInterface $form_state) {
+    $element['match_operator'] = array(
+      '#type' => 'radios',
+      '#title' => t('Autocomplete matching'),
+      '#default_value' => $this->getSetting('match_operator'),
+      '#options' => array(
+        'STARTS_WITH' => t('Starts with'),
+        'CONTAINS' => t('Contains'),
+      ),
+      '#description' => t('Select the method used to collect autocomplete suggestions. Note that <em>Contains</em> can cause performance issues on sites with thousands of entities.'),
+    );
+    $element['size'] = array(
+      '#type' => 'number',
+      '#title' => t('Size of textfield'),
+      '#default_value' => $this->getSetting('size'),
+      '#min' => 1,
+      '#required' => TRUE,
+    );
+    $element['placeholder'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Placeholder'),
+      '#default_value' => $this->getSetting('placeholder'),
+      '#description' => t('Text that will be shown inside the field until a value is entered. This hint is usually a sample value or a brief description of the expected format.'),
+    );
+    return $element;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsSummary() {
+    $summary = array();
+
+    $summary[] = t('Autocomplete matching: @match_operator', array('@match_operator' => $this->getSetting('match_operator')));
+    $summary[] = t('Textfield size: !size', array('!size' => $this->getSetting('size')));
+    $placeholder = $this->getSetting('placeholder');
+    if (!empty($placeholder)) {
+      $summary[] = t('Placeholder: @placeholder', array('@placeholder' => $placeholder));
+    }
+    else {
+      $summary[] = t('No placeholder');
+    }
+
+    return $summary;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
+    $entity = $items->getEntity();
+
+    // Prepare the autocomplete route parameters.
+    $autocomplete_route_parameters = array(
+      'type' => $this->getSetting('autocomplete_type'),
+      'field_name' => $this->fieldDefinition->getName(),
+      'entity_type' => $entity->getEntityTypeId(),
+      'bundle_name' => $entity->bundle(),
+    );
+
+    if ($entity_id = $entity->id()) {
+      $autocomplete_route_parameters['entity_id'] = $entity_id;
+    }
+
+    $element += array(
+      '#type' => 'textfield',
+      '#maxlength' => 1024,
+      '#default_value' => implode(', ', $this->getLabels($items, $delta)),
+      '#autocomplete_route_name' => 'entity_reference.autocomplete',
+      '#autocomplete_route_parameters' => $autocomplete_route_parameters,
+      '#size' => $this->getSetting('size'),
+      '#placeholder' => $this->getSetting('placeholder'),
+      '#element_validate' => array(array($this, 'elementValidate')),
+      '#autocreate_uid' => ($entity instanceof EntityOwnerInterface) ? $entity->getOwnerId() : \Drupal::currentUser()->id(),
+    );
+
+    return array('target_id' => $element);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function errorElement(array $element, ConstraintViolationInterface $error, array $form, FormStateInterface $form_state) {
+    return $element['target_id'];
+  }
+
+  /**
+   * Gets the entity labels.
+   */
+  protected function getLabels(FieldItemListInterface $items, $delta) {
+    if ($items->isEmpty()) {
+      return array();
+    }
+
+    $entity_labels = array();
+
+    // Load those entities and loop through them to extract their labels.
+    $entities = entity_load_multiple($this->getFieldSetting('target_type'), $this->getEntityIds($items, $delta));
+
+    foreach ($entities as $entity_id => $entity_item) {
+      $label = $entity_item->label();
+      $key = "$label ($entity_id)";
+      // Labels containing commas or quotes must be wrapped in quotes.
+      $key = Tags::encode($key);
+      $entity_labels[] = $key;
+    }
+    return $entity_labels;
+  }
+
+  /**
+   * Creates a new entity from a label entered in the autocomplete input.
+   *
+   * @param string $label
+   *   The entity label.
+   * @param int $uid
+   *   The entity uid.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface
+   */
+  protected function createNewEntity($label, $uid) {
+    $entity_manager = \Drupal::entityManager();
+    $target_type = $this->getFieldSetting('target_type');
+    $target_bundles = $this->getSelectionHandlerSetting('target_bundles');
+
+    // Get the bundle.
+    if (!empty($target_bundles)) {
+      $bundle = reset($target_bundles);
+    }
+    else {
+      $bundles = entity_get_bundles($target_type);
+      $bundle = reset($bundles);
+    }
+
+    $entity_type = $entity_manager->getDefinition($target_type);
+    $bundle_key = $entity_type->getKey('bundle');
+    $label_key = $entity_type->getKey('label');
+
+    $entity = $entity_manager->getStorage($target_type)->create(array(
+      $label_key => $label,
+      $bundle_key => $bundle,
+    ));
+
+    if ($entity instanceof EntityOwnerInterface) {
+      $entity->setOwnerId($uid);
+    }
+
+    return $entity;
+  }
+
+  /**
+   * Returns the value of a setting for the entity reference selection handler.
+   *
+   * @param string $setting_name
+   *   The setting name.
+   *
+   * @return mixed
+   *   The setting value.
+   */
+  protected function getSelectionHandlerSetting($setting_name) {
+    $settings = $this->getFieldSetting('handler_settings');
+    return isset($settings[$setting_name]) ? $settings[$setting_name] : NULL;
+  }
+
+  /**
+   * Checks whether a content entity is referenced.
+   *
+   * @return bool
+   */
+  protected function isContentReferenced() {
+    $target_type = $this->getFieldSetting('target_type');
+    $target_type_info = \Drupal::entityManager()->getDefinition($target_type);
+    return $target_type_info->isSubclassOf('\Drupal\Core\Entity\ContentEntityInterface');
+  }
+
 }
diff --git a/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteWidgetBase.php b/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteWidgetBase.php
deleted file mode 100644
index 975ec4f..0000000
--- a/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteWidgetBase.php
+++ /dev/null
@@ -1,225 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\entity_reference\Plugin\Field\FieldWidget\AutocompleteWidgetBase.
- */
-
-namespace Drupal\entity_reference\Plugin\Field\FieldWidget;
-
-use Drupal\Component\Utility\Tags;
-use Drupal\Core\Field\FieldItemListInterface;
-use Drupal\Core\Field\WidgetBase;
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\user\EntityOwnerInterface;
-use Symfony\Component\Validator\ConstraintViolationInterface;
-
-/**
- * Parent plugin for entity reference autocomplete widgets.
- */
-abstract class AutocompleteWidgetBase extends WidgetBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function settingsForm(array $form, FormStateInterface $form_state) {
-    $element['match_operator'] = array(
-      '#type' => 'radios',
-      '#title' => t('Autocomplete matching'),
-      '#default_value' => $this->getSetting('match_operator'),
-      '#options' => array(
-        'STARTS_WITH' => t('Starts with'),
-        'CONTAINS' => t('Contains'),
-      ),
-      '#description' => t('Select the method used to collect autocomplete suggestions. Note that <em>Contains</em> can cause performance issues on sites with thousands of entities.'),
-    );
-    $element['size'] = array(
-      '#type' => 'number',
-      '#title' => t('Size of textfield'),
-      '#default_value' => $this->getSetting('size'),
-      '#min' => 1,
-      '#required' => TRUE,
-    );
-    $element['placeholder'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Placeholder'),
-      '#default_value' => $this->getSetting('placeholder'),
-      '#description' => t('Text that will be shown inside the field until a value is entered. This hint is usually a sample value or a brief description of the expected format.'),
-    );
-    return $element;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function settingsSummary() {
-    $summary = array();
-
-    $summary[] = t('Autocomplete matching: @match_operator', array('@match_operator' => $this->getSetting('match_operator')));
-    $summary[] = t('Textfield size: !size', array('!size' => $this->getSetting('size')));
-    $placeholder = $this->getSetting('placeholder');
-    if (!empty($placeholder)) {
-      $summary[] = t('Placeholder: @placeholder', array('@placeholder' => $placeholder));
-    }
-    else {
-      $summary[] = t('No placeholder');
-    }
-
-    return $summary;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
-    $entity = $items->getEntity();
-
-    // Prepare the autocomplete route parameters.
-    $autocomplete_route_parameters = array(
-      'type' => $this->getSetting('autocomplete_type'),
-      'field_name' => $this->fieldDefinition->getName(),
-      'entity_type' => $entity->getEntityTypeId(),
-      'bundle_name' => $entity->bundle(),
-    );
-
-    if ($entity_id = $entity->id()) {
-      $autocomplete_route_parameters['entity_id'] = $entity_id;
-    }
-
-    $element += array(
-      '#type' => 'textfield',
-      '#maxlength' => 1024,
-      '#default_value' => implode(', ', $this->getLabels($items, $delta)),
-      '#autocomplete_route_name' => 'entity_reference.autocomplete',
-      '#autocomplete_route_parameters' => $autocomplete_route_parameters,
-      '#size' => $this->getSetting('size'),
-      '#placeholder' => $this->getSetting('placeholder'),
-      '#element_validate' => array(array($this, 'elementValidate')),
-      '#autocreate_uid' => ($entity instanceof EntityOwnerInterface) ? $entity->getOwnerId() : \Drupal::currentUser()->id(),
-    );
-
-    return array('target_id' => $element);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function errorElement(array $element, ConstraintViolationInterface $error, array $form, FormStateInterface $form_state) {
-    return $element['target_id'];
-  }
-
-  /**
-   * Validates an element.
-   */
-  public function elementValidate($element, FormStateInterface $form_state, $form) { }
-
-  /**
-   * Gets the entity labels.
-   */
-  protected function getLabels(FieldItemListInterface $items, $delta) {
-    if ($items->isEmpty()) {
-      return array();
-    }
-
-    $entity_labels = array();
-
-    // Load those entities and loop through them to extract their labels.
-    $entities = entity_load_multiple($this->getFieldSetting('target_type'), $this->getEntityIds($items, $delta));
-
-    foreach ($entities as $entity_id => $entity_item) {
-      $label = $entity_item->label();
-      $key = "$label ($entity_id)";
-      // Labels containing commas or quotes must be wrapped in quotes.
-      $key = Tags::encode($key);
-      $entity_labels[] = $key;
-    }
-    return $entity_labels;
-  }
-
-  /**
-   * Builds an array of entity IDs for which to get the entity labels.
-   *
-   * @param \Drupal\Core\Field\FieldItemListInterface $items
-   *   Array of default values for this field.
-   * @param int $delta
-   *   The order of a field item in the array of subelements (0, 1, 2, etc).
-   *
-   * @return array
-   *   An array of entity IDs.
-   */
-  protected function getEntityIds(FieldItemListInterface $items, $delta) {
-    $entity_ids = array();
-
-    foreach ($items as $item) {
-      $entity_ids[] = $item->target_id;
-    }
-
-    return $entity_ids;
-  }
-
-  /**
-   * Creates a new entity from a label entered in the autocomplete input.
-   *
-   * @param string $label
-   *   The entity label.
-   * @param int $uid
-   *   The entity uid.
-   *
-   * @return \Drupal\Core\Entity\EntityInterface
-   */
-  protected function createNewEntity($label, $uid) {
-    $entity_manager = \Drupal::entityManager();
-    $target_type = $this->getFieldSetting('target_type');
-    $target_bundles = $this->getSelectionHandlerSetting('target_bundles');
-
-    // Get the bundle.
-    if (!empty($target_bundles)) {
-      $bundle = reset($target_bundles);
-    }
-    else {
-      $bundles = entity_get_bundles($target_type);
-      $bundle = reset($bundles);
-    }
-
-    $entity_type = $entity_manager->getDefinition($target_type);
-    $bundle_key = $entity_type->getKey('bundle');
-    $label_key = $entity_type->getKey('label');
-
-    $entity = $entity_manager->getStorage($target_type)->create(array(
-      $label_key => $label,
-      $bundle_key => $bundle,
-    ));
-
-    if ($entity instanceof EntityOwnerInterface) {
-      $entity->setOwnerId($uid);
-    }
-
-    return $entity;
-  }
-
-  /**
-   * Returns the value of a setting for the entity reference selection handler.
-   *
-   * @param string $setting_name
-   *   The setting name.
-   *
-   * @return mixed
-   *   The setting value.
-   */
-  protected function getSelectionHandlerSetting($setting_name) {
-    $settings = $this->getFieldSetting('handler_settings');
-    return isset($settings[$setting_name]) ? $settings[$setting_name] : NULL;
-  }
-
-  /**
-   * Checks whether a content entity is referenced.
-   *
-   * @return bool
-   */
-  protected function isContentReferenced() {
-    $target_type = $this->getFieldSetting('target_type');
-    $target_type_info = \Drupal::entityManager()->getDefinition($target_type);
-    return $target_type_info->isSubclassOf('\Drupal\Core\Entity\ContentEntityInterface');
-  }
-
-}
diff --git a/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldWidget/TestFieldWidget.php b/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldWidget/TestFieldWidget.php
index 71b8afa..d8d744f 100644
--- a/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldWidget/TestFieldWidget.php
+++ b/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldWidget/TestFieldWidget.php
@@ -8,7 +8,7 @@
 namespace Drupal\field_test\Plugin\Field\FieldWidget;
 
 use Drupal\Core\Field\FieldItemListInterface;
-use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Field\WidgetBaseSingle;
 use Drupal\Core\Form\FormStateInterface;
 use Symfony\Component\Validator\ConstraintViolationInterface;
 
@@ -25,7 +25,7 @@
  *   weight = -10
  * )
  */
-class TestFieldWidget extends WidgetBase {
+class TestFieldWidget extends WidgetBaseSingle {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldWidget/TestFieldWidgetMultiple.php b/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldWidget/TestFieldWidgetMultiple.php
index be2ab05..b2fe88a 100644
--- a/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldWidget/TestFieldWidgetMultiple.php
+++ b/core/modules/field/tests/modules/field_test/src/Plugin/Field/FieldWidget/TestFieldWidgetMultiple.php
@@ -9,7 +9,7 @@
 
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldItemListInterface;
-use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Field\WidgetBaseMultiple;
 use Drupal\Core\Form\FormStateInterface;
 use Symfony\Component\Validator\ConstraintViolationInterface;
 
@@ -24,11 +24,10 @@
  * @FieldWidget(
  *   id = "test_field_widget_multiple",
  *   label = @Translation("Test widget - multiple"),
- *   multiple_values = TRUE,
  *   weight = 10
  * )
  */
-class TestFieldWidgetMultiple extends WidgetBase {
+class TestFieldWidgetMultiple extends WidgetBaseMultiple {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/file/src/Plugin/Field/FieldWidget/FileWidget.php b/core/modules/file/src/Plugin/Field/FieldWidget/FileWidget.php
index f9becf4..92b4cd5 100644
--- a/core/modules/file/src/Plugin/Field/FieldWidget/FileWidget.php
+++ b/core/modules/file/src/Plugin/Field/FieldWidget/FileWidget.php
@@ -11,9 +11,10 @@
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
-use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\Element;
+use Drupal\Core\Field\WidgetBaseSingle;
 
 /**
  * Plugin implementation of the 'file_generic' widget.
@@ -26,8 +27,7 @@
  *   }
  * )
  */
-class FileWidget extends WidgetBase {
-
+class FileWidget extends WidgetBaseSingle {
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php b/core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php
index 21e078f..62c9980 100644
--- a/core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php
+++ b/core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php
@@ -8,7 +8,7 @@
 namespace Drupal\link\Plugin\Field\FieldWidget;
 
 use Drupal\Core\Field\FieldItemListInterface;
-use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Field\WidgetBaseSingle;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\link\LinkItemInterface;
 
@@ -23,7 +23,7 @@
  *   }
  * )
  */
-class LinkWidget extends WidgetBase {
+class LinkWidget extends WidgetBaseSingle {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/options/src/Plugin/Field/FieldWidget/ButtonsWidget.php b/core/modules/options/src/Plugin/Field/FieldWidget/ButtonsWidget.php
index 906b8fd..c550f8c 100644
--- a/core/modules/options/src/Plugin/Field/FieldWidget/ButtonsWidget.php
+++ b/core/modules/options/src/Plugin/Field/FieldWidget/ButtonsWidget.php
@@ -22,7 +22,6 @@
  *     "list_float",
  *     "list_string",
  *   },
- *   multiple_values = TRUE
  * )
  */
 class ButtonsWidget extends OptionsWidgetBase {
diff --git a/core/modules/options/src/Plugin/Field/FieldWidget/OptionsWidgetBase.php b/core/modules/options/src/Plugin/Field/FieldWidget/OptionsWidgetBase.php
index d690625..180d188 100644
--- a/core/modules/options/src/Plugin/Field/FieldWidget/OptionsWidgetBase.php
+++ b/core/modules/options/src/Plugin/Field/FieldWidget/OptionsWidgetBase.php
@@ -10,7 +10,7 @@
 use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldItemListInterface;
-use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Field\WidgetBaseMultiple;
 use Drupal\Core\Form\FormStateInterface;
 
 /**
@@ -23,7 +23,7 @@
  *
  * @see \Drupal\Core\TypedData\OptionsProviderInterface
  */
-abstract class OptionsWidgetBase extends WidgetBase {
+abstract class OptionsWidgetBase extends WidgetBaseMultiple {
 
   /**
    * Identifies a 'None' option.
diff --git a/core/modules/options/src/Plugin/Field/FieldWidget/SelectWidget.php b/core/modules/options/src/Plugin/Field/FieldWidget/SelectWidget.php
index 09e9d37..f970cec 100644
--- a/core/modules/options/src/Plugin/Field/FieldWidget/SelectWidget.php
+++ b/core/modules/options/src/Plugin/Field/FieldWidget/SelectWidget.php
@@ -22,7 +22,6 @@
  *     "list_float",
  *     "list_string"
  *   },
- *   multiple_values = TRUE
  * )
  */
 class SelectWidget extends OptionsWidgetBase {
diff --git a/core/modules/taxonomy/src/Plugin/Field/FieldWidget/TaxonomyAutocompleteWidget.php b/core/modules/taxonomy/src/Plugin/Field/FieldWidget/TaxonomyAutocompleteWidget.php
index b3500fa..dad9209 100644
--- a/core/modules/taxonomy/src/Plugin/Field/FieldWidget/TaxonomyAutocompleteWidget.php
+++ b/core/modules/taxonomy/src/Plugin/Field/FieldWidget/TaxonomyAutocompleteWidget.php
@@ -8,7 +8,7 @@
 namespace Drupal\taxonomy\Plugin\Field\FieldWidget;
 
 use Drupal\Core\Field\FieldItemListInterface;
-use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Field\WidgetBaseMultiple;
 use Drupal\Core\Form\FormStateInterface;
 
 /**
@@ -20,10 +20,9 @@
  *   field_types = {
  *     "taxonomy_term_reference"
  *   },
- *   multiple_values = TRUE
  * )
  */
-class TaxonomyAutocompleteWidget extends WidgetBase {
+class TaxonomyAutocompleteWidget extends WidgetBaseMultiple {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/telephone/src/Plugin/Field/FieldWidget/TelephoneDefaultWidget.php b/core/modules/telephone/src/Plugin/Field/FieldWidget/TelephoneDefaultWidget.php
index 2be36da..9a0b2a4 100644
--- a/core/modules/telephone/src/Plugin/Field/FieldWidget/TelephoneDefaultWidget.php
+++ b/core/modules/telephone/src/Plugin/Field/FieldWidget/TelephoneDefaultWidget.php
@@ -8,7 +8,7 @@
 namespace Drupal\telephone\Plugin\Field\FieldWidget;
 
 use Drupal\Core\Field\FieldItemListInterface;
-use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Field\WidgetBaseSingle;
 use Drupal\Core\Form\FormStateInterface;
 
 /**
@@ -22,7 +22,7 @@
  *   }
  * )
  */
-class TelephoneDefaultWidget extends WidgetBase {
+class TelephoneDefaultWidget extends WidgetBaseSingle {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/text/src/Plugin/Field/FieldWidget/TextareaWidget.php b/core/modules/text/src/Plugin/Field/FieldWidget/TextareaWidget.php
index 0ac3151..b1cfaae 100644
--- a/core/modules/text/src/Plugin/Field/FieldWidget/TextareaWidget.php
+++ b/core/modules/text/src/Plugin/Field/FieldWidget/TextareaWidget.php
@@ -8,6 +8,7 @@
 namespace Drupal\text\Plugin\Field\FieldWidget;
 
 use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Field\WidgetBaseSingle;
 use Drupal\Core\Field\Plugin\Field\FieldWidget\StringTextareaWidget;
 use Drupal\Core\Form\FormStateInterface;
 use Symfony\Component\Validator\ConstraintViolationInterface;
@@ -23,6 +24,7 @@
  *   }
  * )
  */
+
 class TextareaWidget extends StringTextareaWidget {
 
   /**
