diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsWidgetBase.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsWidgetBase.php
index d23eb44c82f6486a69a21b24755d47d4ec16fcf2..92ec779d4176a618db8b33bfac511d5528207776 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsWidgetBase.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsWidgetBase.php
@@ -108,7 +108,7 @@ public static function validateElement(array $element, FormStateInterface $form_
     foreach ($values as $value) {
       $items[] = array($element['#key_column'] => $value);
     }
-    form_set_value($element, $items, $form_state);
+    $form_state->setValueForElement($element, $items);
   }
 
   /**
diff --git a/core/modules/config/src/Form/ConfigSingleImportForm.php b/core/modules/config/src/Form/ConfigSingleImportForm.php
index debd1cb2f18f4769e9520465d80b1ccdc7ff2355..58156b094bce9c77d1af0cfd069bafc99df3431b 100644
--- a/core/modules/config/src/Form/ConfigSingleImportForm.php
+++ b/core/modules/config/src/Form/ConfigSingleImportForm.php
@@ -227,7 +227,7 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
     }
 
     // Store the decoded version of the submitted import.
-    form_set_value($form['import'], $data, $form_state);
+    $form_state->setValueForElement($form['import'], $data);
   }
 
   /**
diff --git a/core/modules/entity_reference/entity_reference.module b/core/modules/entity_reference/entity_reference.module
index 33516d77659a3046bef3c077c82df12d56143272..6d4280be70189e9dc1ebd4d1491229eec1cc465f 100644
--- a/core/modules/entity_reference/entity_reference.module
+++ b/core/modules/entity_reference/entity_reference.module
@@ -150,7 +150,7 @@ function _entity_reference_form_process_merge_parent($element) {
  */
 function _entity_reference_element_validate_filter(&$element, FormStateInterface $form_state) {
   $element['#value'] = array_filter($element['#value']);
-  form_set_value($element, $element['#value'], $form_state);
+  $form_state->setValueForElement($element, $element['#value']);
 }
 
 /**
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 b289a0641cd4a9cc5cf163272a54590176935fba..c77245cd3c341a2dea19c1c1b8d2c9977290ce34 100644
--- a/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteTagsWidget.php
+++ b/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteTagsWidget.php
@@ -80,9 +80,9 @@ public function elementValidate($element, FormStateInterface $form_state, $form)
         }
       }
     };
-    // Change the element['#parents'], so in form_set_value() we
-    // populate the correct key.
+    // Change the element['#parents'], so in setValueForElement() we populate
+    // the correct key.
     array_pop($element['#parents']);
-    form_set_value($element, $value, $form_state);
+    $form_state->setValueForElement($element, $value);
   }
 }
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 ef9e6eac5cc96f3e26bf26227d63b1267864e6a6..207910f8e57399010c8ae1c2d9c044f0cdde610e 100644
--- a/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteWidget.php
+++ b/core/modules/entity_reference/src/Plugin/Field/FieldWidget/AutocompleteWidget.php
@@ -89,11 +89,11 @@ public function elementValidate($element, FormStateInterface $form_state, $form)
           // Keep the weight property.
           '_weight' => $element['#weight'],
         );
-        // Change the element['#parents'], so in form_set_value() we
+        // Change the element['#parents'], so in setValueForElement() we
         // populate the correct key.
         array_pop($element['#parents']);
       }
     }
-    form_set_value($element, $value, $form_state);
+    $form_state->setValueForElement($element, $value);
   }
 }
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 be2ab055db0cc7ab5b0e6ee936179e90d26c719b..b8a0dd2e21e263af3f1c3522a0b6c93ef75c5148 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
@@ -94,7 +94,7 @@ public static function multipleValidate($element, FormStateInterface $form_state
     foreach ($values as $value) {
       $items[] = array('value' => $value);
     }
-    form_set_value($element, $items, $form_state);
+    $form_state->setValueForElement($element, $items);
   }
 
   /**
diff --git a/core/modules/field_ui/src/FieldOverview.php b/core/modules/field_ui/src/FieldOverview.php
index 312832f071397afc1ea98422e1b9502ec36170da..290d65500df490fdb707fcec9eaa35b7dfe02e60 100644
--- a/core/modules/field_ui/src/FieldOverview.php
+++ b/core/modules/field_ui/src/FieldOverview.php
@@ -318,7 +318,7 @@ protected function validateAddNew(array $form, FormStateInterface $form_state) {
 
         // Add the field prefix.
         $field_name = \Drupal::config('field_ui.settings')->get('field_prefix') . $field_name;
-        form_set_value($form['fields']['_add_new_field']['field_name'], $field_name, $form_state);
+        $form_state->setValueForElement($form['fields']['_add_new_field']['field_name'], $field_name);
       }
 
       // Missing field type.
diff --git a/core/modules/field_ui/src/Form/EntityDisplayModeAddForm.php b/core/modules/field_ui/src/Form/EntityDisplayModeAddForm.php
index cd207de62b672d5ba1bfc96f318fbe9a637cdb3c..0d6f8bbc0a6b85a4d92535d1d6c3db6665189357 100644
--- a/core/modules/field_ui/src/Form/EntityDisplayModeAddForm.php
+++ b/core/modules/field_ui/src/Form/EntityDisplayModeAddForm.php
@@ -41,7 +41,7 @@ public function buildForm(array $form, FormStateInterface $form_state, $entity_t
   public function validate(array $form, FormStateInterface $form_state) {
     parent::validate($form, $form_state);
 
-    form_set_value($form['id'], $this->targetEntityTypeId . '.' . $form_state->getValue('id'), $form_state);
+    $form_state->setValueForElement($form['id'], $this->targetEntityTypeId . '.' . $form_state->getValue('id'));
   }
 
   /**
diff --git a/core/modules/file/file.module b/core/modules/file/file.module
index 93a49d8fd81b2f593824aa639cb8c5c0df3e1867..e8a565e91456bc139c68cbd352b3b724d2e43abb 100644
--- a/core/modules/file/file.module
+++ b/core/modules/file/file.module
@@ -1117,7 +1117,7 @@ function file_managed_file_submit($form, FormStateInterface $form_state) {
     // FormState::$input must be updated so that
     // \Drupal\file\Element\ManagedFile::valueCallback() has correct information
     // during the rebuild.
-    form_set_value($element['fids'], implode(' ', $fids), $form_state);
+    $form_state->setValueForElement($element['fids'], implode(' ', $fids));
     NestedArray::setValue($form_state->getUserInput(), $element['fids']['#parents'], implode(' ', $fids));
   }
 
diff --git a/core/modules/file/src/Plugin/Field/FieldType/FileItem.php b/core/modules/file/src/Plugin/Field/FieldType/FileItem.php
index 930766716f3ed46abe7aa67f11df819156b69ff4..1c00e76f7f7f2eb522944140066ed82371ee601b 100644
--- a/core/modules/file/src/Plugin/Field/FieldType/FileItem.php
+++ b/core/modules/file/src/Plugin/Field/FieldType/FileItem.php
@@ -214,7 +214,7 @@ public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
   public static function validateDirectory($element, FormStateInterface $form_state) {
     // Strip slashes from the beginning and end of $element['file_directory'].
     $value = trim($element['#value'], '\\/');
-    form_set_value($element, $value, $form_state);
+    $form_state->setValueForElement($element, $value);
   }
 
   /**
@@ -236,7 +236,7 @@ public static function validateExtensions($element, FormStateInterface $form_sta
         $form_state->setError($element, t('The list of allowed extensions is not valid, be sure to exclude leading dots and to separate extensions with a comma or space.'));
       }
       else {
-        form_set_value($element, $extensions, $form_state);
+        $form_state->setValueForElement($element, $extensions);
       }
     }
   }
diff --git a/core/modules/filter/src/FilterFormatFormBase.php b/core/modules/filter/src/FilterFormatFormBase.php
index b6abf1add3f3389be42fb8c633f6339ee34963a5..e784836325cae548b59c78bf226e309a75a9c40f 100644
--- a/core/modules/filter/src/FilterFormatFormBase.php
+++ b/core/modules/filter/src/FilterFormatFormBase.php
@@ -218,8 +218,8 @@ public function validate(array $form, FormStateInterface $form_state) {
     $format_name = trim($form_state->getValue('name'));
 
     // Ensure that the values to be saved later are exactly the ones validated.
-    form_set_value($form['format'], $format_format, $form_state);
-    form_set_value($form['name'], $format_name, $form_state);
+    $form_state->setValueForElement($form['format'], $format_format);
+    $form_state->setValueForElement($form['name'], $format_name);
 
     $format_exists = $this->queryFactory
       ->get('filter_format')
diff --git a/core/modules/image/src/Plugin/Field/FieldType/ImageItem.php b/core/modules/image/src/Plugin/Field/FieldType/ImageItem.php
index 24c392763b99dd4c4a44600e9cd5acc15d3e7dd1..067fecdba9cbc0e422e7baed0c596cdd0b29eb15 100644
--- a/core/modules/image/src/Plugin/Field/FieldType/ImageItem.php
+++ b/core/modules/image/src/Plugin/Field/FieldType/ImageItem.php
@@ -379,10 +379,10 @@ public static function validateResolution($element, FormStateInterface $form_sta
           return;
         }
       }
-      form_set_value($element, $element['x']['#value'] . 'x' . $element['y']['#value'], $form_state);
+      $form_state->setValueForElement($element, $element['x']['#value'] . 'x' . $element['y']['#value']);
     }
     else {
-      form_set_value($element, '', $form_state);
+      $form_state->setValueForElement($element, '');
     }
   }
 
diff --git a/core/modules/node/node.api.php b/core/modules/node/node.api.php
index d42f74811da58e6e1b9e4296a773360dfad0a655..759c5cda8ae992a18ef2b96179b424574eddb6ae 100644
--- a/core/modules/node/node.api.php
+++ b/core/modules/node/node.api.php
@@ -416,7 +416,7 @@ function hook_node_update_index(\Drupal\node\NodeInterface $node, $langcode) {
  * Note: Changes made to the $node object within your hook implementation will
  * have no effect.  The preferred method to change a node's content is to use
  * hook_node_presave() instead. If it is really necessary to change the node at
- * the validate stage, you can use form_set_value().
+ * the validate stage, you can use setValueForElement().
  *
  * @param \Drupal\node\NodeInterface $node
  *   The node being validated.
diff --git a/core/modules/system/src/Form/SiteInformationForm.php b/core/modules/system/src/Form/SiteInformationForm.php
index fec470c5ea9d0f53b2e62a23560f9487d736bda1..f2efcd513315928f42d94d4a865ab60938e50e80 100644
--- a/core/modules/system/src/Form/SiteInformationForm.php
+++ b/core/modules/system/src/Form/SiteInformationForm.php
@@ -148,11 +148,11 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
     // Check for empty front page path.
     if ($form_state->isValueEmpty('site_frontpage')) {
       // Set to default "user/login".
-      form_set_value($form['front_page']['site_frontpage'], 'user/login', $form_state);
+      $form_state->setValueForElement($form['front_page']['site_frontpage'], 'user/login');
     }
     else {
       // Get the normal path of the front page.
-      form_set_value($form['front_page']['site_frontpage'], $this->aliasManager->getPathByAlias($form_state->getValue('site_frontpage')), $form_state);
+      $form_state->setValueForElement($form['front_page']['site_frontpage'], $this->aliasManager->getPathByAlias($form_state->getValue('site_frontpage')));
     }
     // Validate front page path.
     if (!$this->pathValidator->isValid($form_state->getValue('site_frontpage'))) {
@@ -160,10 +160,10 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
     }
     // Get the normal paths of both error pages.
     if (!$form_state->isValueEmpty('site_403')) {
-      form_set_value($form['error_page']['site_403'], $this->aliasManager->getPathByAlias($form_state->getValue('site_403')), $form_state);
+      $form_state->setValueForElement($form['error_page']['site_403'], $this->aliasManager->getPathByAlias($form_state->getValue('site_403')));
     }
     if (!$form_state->isValueEmpty('site_404')) {
-      form_set_value($form['error_page']['site_404'], $this->aliasManager->getPathByAlias($form_state->getValue('site_404')), $form_state);
+      $form_state->setValueForElement($form['error_page']['site_404'], $this->aliasManager->getPathByAlias($form_state->getValue('site_404')));
     }
     // Validate 403 error path.
     if (!$form_state->isValueEmpty('site_403') && !$this->pathValidator->isValid($form_state->getValue('site_403'))) {
diff --git a/core/modules/system/src/Tests/Form/ValidationTest.php b/core/modules/system/src/Tests/Form/ValidationTest.php
index 607db5cfb4a092c47a6b1e451b9fedef7ec99570..7b6c9e84234cdcffea7de7ee21d196026a8f2225 100644
--- a/core/modules/system/src/Tests/Form/ValidationTest.php
+++ b/core/modules/system/src/Tests/Form/ValidationTest.php
@@ -25,7 +25,7 @@ class ValidationTest extends WebTestBase {
   public static $modules = array('form_test');
 
   /**
-   * Tests form alterations by #element_validate, #validate, and form_set_value().
+   * Tests #element_validate and #validate.
    */
   function testValidate() {
     $this->drupalGet('form-test/validate');
@@ -36,7 +36,7 @@ function testValidate() {
     );
     $this->drupalPostForm(NULL, $edit, 'Save');
     $this->assertFieldByName('name', '#value changed by #element_validate', 'Form element #value was altered.');
-    $this->assertText('Name value: value changed by form_set_value() in #element_validate', 'Form element value in $form_state was altered.');
+    $this->assertText('Name value: value changed by setValueForElement() in #element_validate', 'Form element value in $form_state was altered.');
 
     // Verify that #validate handlers can alter the form and submitted
     // form values.
@@ -45,7 +45,7 @@ function testValidate() {
     );
     $this->drupalPostForm(NULL, $edit, 'Save');
     $this->assertFieldByName('name', '#value changed by #validate', 'Form element #value was altered.');
-    $this->assertText('Name value: value changed by form_set_value() in #validate', 'Form element value in $form_state was altered.');
+    $this->assertText('Name value: value changed by setValueForElement() in #validate', 'Form element value in $form_state was altered.');
 
     // Verify that #element_validate handlers can make form elements
     // inaccessible, but values persist.
@@ -70,7 +70,7 @@ function testValidate() {
     );
     $this->drupalPostForm(NULL, $edit, 'Save');
     $this->assertNoFieldByName('name', '#value changed by #validate', 'Form element #value was not altered.');
-    $this->assertNoText('Name value: value changed by form_set_value() in #validate', 'Form element value in $form_state was not altered.');
+    $this->assertNoText('Name value: value changed by setValueForElement() in #validate', 'Form element value in $form_state was not altered.');
     $this->assertText('The form has become outdated. Copy any unsaved work in the form below');
   }
 
diff --git a/core/modules/system/tests/modules/form_test/src/Callbacks.php b/core/modules/system/tests/modules/form_test/src/Callbacks.php
index 3edf0fa910ae60309699b7b5373bbdafcef0ef6c..3d45894e848e56a24bc79e4ccc683bb8cdfda99a 100644
--- a/core/modules/system/tests/modules/form_test/src/Callbacks.php
+++ b/core/modules/system/tests/modules/form_test/src/Callbacks.php
@@ -23,7 +23,7 @@ public function validateName(&$element, FormStateInterface $form_state) {
       // Alter the form element.
       $element['#value'] = '#value changed by #element_validate';
       // Alter the submitted value in $form_state.
-      form_set_value($element, 'value changed by form_set_value() in #element_validate', $form_state);
+      $form_state->setValueForElement($element, 'value changed by setValueForElement() in #element_validate');
 
       $triggered = TRUE;
     }
@@ -36,7 +36,7 @@ public function validateName(&$element, FormStateInterface $form_state) {
     }
     elseif ($form_state->has('form_test_name')) {
       // To simplify this test, just take over the element's value into $form_state.
-      form_set_value($element, $form_state->get('form_test_name'), $form_state);
+      $form_state->setValueForElement($element, $form_state->get('form_test_name'));
 
       $triggered = TRUE;
     }
diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestValidateForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestValidateForm.php
index 7da8f5df7ad24720f12bb3811cb477819c932cfe..e403887ee617131c18d4bb5fba05844ffe697186 100644
--- a/core/modules/system/tests/modules/form_test/src/Form/FormTestValidateForm.php
+++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestValidateForm.php
@@ -16,8 +16,8 @@
  *
  * Serves for testing form processing and alterations by form validation
  * handlers, especially for the case of a validation error:
- * - form_set_value() should be able to alter submitted values in
- *   $form_state->getValues() without affecting the form element.
+ * - $form_state->setValueForElement() should be able to alter submitted values
+ *   in $form_state->getValues() without affecting the form element.
  * - #element_validate handlers should be able to alter the $element in the form
  *   structure and the alterations should be contained in the rebuilt form.
  * - #validate handlers should be able to alter the $form and the alterations
@@ -64,7 +64,7 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
       // Alter the form element.
       $form['name']['#value'] = '#value changed by #validate';
       // Alter the submitted value in $form_state.
-      form_set_value($form['name'], 'value changed by form_set_value() in #validate', $form_state);
+      $form_state->setValueForElement($form['name'], 'value changed by setValueForElement() in #validate');
       // Output the element's value from $form_state.
       drupal_set_message(t('@label value: @value', array('@label' => $form['name']['#title'], '@value' => $form_state->getValue('name'))));
 
diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module
index 1c38a78bf3a59641db3c5ebe97e6df47c2cc3d12..9df30d9bf5202826f89f72df3a0494f7243d50a3 100644
--- a/core/modules/taxonomy/taxonomy.module
+++ b/core/modules/taxonomy/taxonomy.module
@@ -629,7 +629,7 @@ function taxonomy_autocomplete_validate($element, FormStateInterface $form_state
   if ($tags = $element['#value']) {
     $typed_terms = Tags::explode($tags);
   }
-  form_set_value($element, $typed_terms, $form_state);
+  $form_state->setValueForElement($element, $typed_terms);
 }
 
 /**
diff --git a/core/modules/user/src/Form/UserPasswordForm.php b/core/modules/user/src/Form/UserPasswordForm.php
index f06ba2923ff5c9333ec0559b030a92ef454b4b8b..4d5a012a0ac4dfa7a682334508a4462c32ac1e2f 100644
--- a/core/modules/user/src/Form/UserPasswordForm.php
+++ b/core/modules/user/src/Form/UserPasswordForm.php
@@ -118,7 +118,7 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
     }
     $account = reset($users);
     if ($account && $account->id()) {
-      form_set_value(array('#parents' => array('account')), $account, $form_state);
+      $form_state->setValueForElement(array('#parents' => array('account')), $account);
     }
     else {
       $form_state->setErrorByName('name', $this->t('Sorry, %name is not recognized as a username or an email address.', array('%name' => $name)));
diff --git a/core/modules/views/src/Plugin/entity_reference/selection/ViewsSelection.php b/core/modules/views/src/Plugin/entity_reference/selection/ViewsSelection.php
index 7802113d86ed041282ebc026302ecab8ffe419d9..139f2f666905a37b670ee46755cf185cf1fd883e 100644
--- a/core/modules/views/src/Plugin/entity_reference/selection/ViewsSelection.php
+++ b/core/modules/views/src/Plugin/entity_reference/selection/ViewsSelection.php
@@ -239,7 +239,7 @@ public function settingsFormValidate($element, FormStateInterface $form_state, $
     }
 
     $value = array('view_name' => $view, 'display_name' => $display, 'arguments' => $arguments);
-    form_set_value($element, $value, $form_state);
+    $form_state->setValueForElement($element, $value);
   }
 
 }
diff --git a/core/modules/views/src/Plugin/views/query/Sql.php b/core/modules/views/src/Plugin/views/query/Sql.php
index f3796bb7f8ec700a78a19cecc19cc6043fac5f44..48856cfbeb2ff862305690527118fd97dbba1819 100644
--- a/core/modules/views/src/Plugin/views/query/Sql.php
+++ b/core/modules/views/src/Plugin/views/query/Sql.php
@@ -242,7 +242,7 @@ public function submitOptionsForm(&$form, FormStateInterface $form_state) {
     $element = array('#parents' => array('query', 'options', 'query_tags'));
     $value = explode(',', NestedArray::getValue($form_state->getValues(), $element['#parents']));
     $value = array_filter(array_map('trim', $value));
-    form_set_value($element, $value, $form_state);
+    $form_state->setValueForElement($element, $value);
   }
 
   /**
diff --git a/core/modules/views_ui/admin.inc b/core/modules/views_ui/admin.inc
index 73566257555926dfd9157bc64d8587cd57f1c4bb..61bd9a81ad47b66a35d4f9e02fb3bd1047021452 100644
--- a/core/modules/views_ui/admin.inc
+++ b/core/modules/views_ui/admin.inc
@@ -252,7 +252,7 @@ function views_ui_taxonomy_autocomplete_validate($element, FormStateInterface $f
       $value['vocabulary'] = array_pop($vocabularies);
     }
   }
-  form_set_value($element, $value, $form_state);
+  $form_state->setValueForElement($element, $value);
 }
 
 /**