diff --git a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldWidget/OptionsWidgetBase.php b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldWidget/OptionsWidgetBase.php
index c23de90..9db74c3 100644
--- a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldWidget/OptionsWidgetBase.php
+++ b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldWidget/OptionsWidgetBase.php
@@ -82,19 +82,16 @@ public static function validateElement(array $element, array &$form_state) {
     if ($element['#required'] && $element['#value'] == '_none') {
       \Drupal::formBuilder()->setError($element, $form_state, t('!name field is required.', array('!name' => $element['#title'])));
     }
+  }
 
-    // Massage submitted form values.
+  /**
+   * {@inheritdoc}
+   */
+  public function massageFormValues(array $values, array $form, array &$form_state) {
     // Drupal\Core\Field\WidgetBase::submit() expects values as
     // an array of values keyed by delta first, then by column, while our
     // widgets return the opposite.
 
-    if (is_array($element['#value'])) {
-      $values = array_values($element['#value']);
-    }
-    else {
-      $values = array($element['#value']);
-    }
-
     // Filter out the 'none' option. Use a strict comparison, because
     // 0 == 'any string'.
     $index = array_search('_none', $values, TRUE);
@@ -105,9 +102,10 @@ public static function validateElement(array $element, array &$form_state) {
     // Transpose selections from field => delta to delta => field.
     $items = array();
     foreach ($values as $value) {
-      $items[] = array($element['#key_column'] => $value);
+      $items[] = array($this->column => $value);
     }
-    form_set_value($element, $items, $form_state);
+
+    return $items;
   }
 
   /**
