diff --git a/core/includes/form.inc b/core/includes/form.inc
index d99dca2..cc38dc8 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -6,6 +6,7 @@
  */
 
 use Drupal\Component\Utility\UrlHelper;
+use Drupal\Core\Form\FormOptionsHelper;
 use Drupal\Core\Render\Element;
 use Drupal\Core\Render\Element\RenderElement;
 use Drupal\Core\Template\Attribute;
@@ -33,149 +34,27 @@ function template_preprocess_select(&$variables) {
   RenderElement::setAttributes($element, ['form-select']);
 
   $variables['attributes'] = $element['#attributes'];
-  $variables['options'] = form_select_options($element);
+  $variables['options'] = FormOptionsHelper::formSelectOptions($element);
 }
 
 /**
  * Converts an options form element into a structured array for output.
  *
- * This function calls itself recursively to obtain the values for each optgroup
- * within the list of options and when the function encounters an object with
- * an 'options' property inside $element['#options'].
- *
- * @param array $element
- *   An associative array containing the following key-value pairs:
- *   - #multiple: Optional Boolean indicating if the user may select more than
- *     one item.
- *   - #options: An associative array of options to render as HTML. Each array
- *     value can be a string, an array, or an object with an 'option' property:
- *     - A string or integer key whose value is a translated string is
- *       interpreted as a single HTML option element. Do not use placeholders
- *       that sanitize data: doing so will lead to double-escaping. Note that
- *       the key will be visible in the HTML and could be modified by malicious
- *       users, so don't put sensitive information in it.
- *     - A translated string key whose value is an array indicates a group of
- *       options. The translated string is used as the label attribute for the
- *       optgroup. Do not use placeholders to sanitize data: doing so will lead
- *       to double-escaping. The array should contain the options you wish to
- *       group and should follow the syntax of $element['#options'].
- *     - If the function encounters a string or integer key whose value is an
- *       object with an 'option' property, the key is ignored, the contents of
- *       the option property are interpreted as $element['#options'], and the
- *       resulting HTML is added to the output.
- *   - #value: Optional integer, string, or array representing which option(s)
- *     to pre-select when the list is first displayed. The integer or string
- *     must match the key of an option in the '#options' list. If '#multiple' is
- *     TRUE, this can be an array of integers or strings.
- * @param array|null $choices
- *   (optional) Either an associative array of options in the same format as
- *   $element['#options'] above, or NULL. This parameter is only used internally
- *   and is not intended to be passed in to the initial function call.
- *
- * @return mixed[]
- *   A structured, possibly nested, array of options and optgroups for use in a
- *   select form element.
- *   - label: A translated string whose value is the text of a single HTML
- *     option element, or the label attribute for an optgroup.
- *   - options: Optional, array of options for an optgroup.
- *   - selected: A boolean that indicates whether the option is selected when
- *     rendered.
- *   - type: A string that defines the element type. The value can be 'option'
- *     or 'optgroup'.
- *   - value: A string that contains the value attribute for the option.
+ * @deprecated in Drupal 8.5.x, will be removed before Drupal 9.0.0.
+ *   Use \Drupal\Core\Form\FormOptionsHelper::formSelectOptions().
  */
 function form_select_options($element, $choices = NULL) {
-  if (!isset($choices)) {
-    if (empty($element['#options'])) {
-      return [];
-    }
-    $choices = $element['#options'];
-  }
-  // array_key_exists() accommodates the rare event where $element['#value'] is NULL.
-  // isset() fails in this situation.
-  $value_valid = isset($element['#value']) || array_key_exists('#value', $element);
-  $value_is_array = $value_valid && is_array($element['#value']);
-  // Check if the element is multiple select and no value has been selected.
-  $empty_value = (empty($element['#value']) && !empty($element['#multiple']));
-  $options = [];
-  foreach ($choices as $key => $choice) {
-    if (is_array($choice)) {
-      $options[] = [
-        'type' => 'optgroup',
-        'label' => $key,
-        'options' => form_select_options($element, $choice),
-      ];
-    }
-    elseif (is_object($choice) && isset($choice->option)) {
-      $options = array_merge($options, form_select_options($element, $choice->option));
-    }
-    else {
-      $option = [];
-      $key = (string) $key;
-      $empty_choice = $empty_value && $key == '_none';
-      if ($value_valid && ((!$value_is_array && (string) $element['#value'] === $key || ($value_is_array && in_array($key, $element['#value']))) || $empty_choice)) {
-        $option['selected'] = TRUE;
-      }
-      else {
-        $option['selected'] = FALSE;
-      }
-      $option['type'] = 'option';
-      $option['value'] = $key;
-      $option['label'] = $choice;
-      $options[] = $option;
-    }
-  }
-  return $options;
+  return FormOptionsHelper::formSelectOptions($element, $choices);
 }
 
 /**
  * Returns the indexes of a select element's options matching a given key.
  *
- * This function is useful if you need to modify the options that are
- * already in a form element; for example, to remove choices which are
- * not valid because of additional filters imposed by another module.
- * One example might be altering the choices in a taxonomy selector.
- * To correctly handle the case of a multiple hierarchy taxonomy,
- * #options arrays can now hold an array of objects, instead of a
- * direct mapping of keys to labels, so that multiple choices in the
- * selector can have the same key (and label). This makes it difficult
- * to manipulate directly, which is why this helper function exists.
- *
- * This function does not support optgroups (when the elements of the
- * #options array are themselves arrays), and will return FALSE if
- * arrays are found. The caller must either flatten/restore or
- * manually do their manipulations in this case, since returning the
- * index is not sufficient, and supporting this would make the
- * "helper" too complicated and cumbersome to be of any help.
- *
- * As usual with functions that can return array() or FALSE, do not
- * forget to use === and !== if needed.
- *
- * @param $element
- *   The select element to search.
- * @param $key
- *   The key to look for.
- *
- * @return
- *   An array of indexes that match the given $key. Array will be
- *   empty if no elements were found. FALSE if optgroups were found.
+ * @deprecated in Drupal 8.5.x, will be removed before Drupal 9.0.0.
+ *   Use \Drupal\Core\Form\FormOptionsHelper::formGetOptions().
  */
 function form_get_options($element, $key) {
-  $keys = [];
-  foreach ($element['#options'] as $index => $choice) {
-    if (is_array($choice)) {
-      return FALSE;
-    }
-    elseif (is_object($choice)) {
-      if (isset($choice->option[$key])) {
-        $keys[] = $index;
-      }
-    }
-    elseif ($index == $key) {
-      $keys[] = $index;
-    }
-  }
-  return $keys;
+  return FormOptionsHelper::formGetOptions($element, $key);
 }
 
 /**
diff --git a/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php b/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php
index 218131c..42cd3fe 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
+use Drupal\Core\Form\FormOptionsHelper;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Session\AccountInterface;
@@ -63,7 +64,7 @@ public function defaultConfiguration() {
       // equivalent to "no entities from any bundle can be referenced".
       'target_bundles' => NULL,
       'sort' => [
-        'field' => '_none',
+        'field' => FormOptionsHelper::OPTIONS_EMPTY_OPTION,
         'direction' => 'ASC',
       ],
       'auto_create' => FALSE,
@@ -146,8 +147,8 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
         '#type' => 'select',
         '#title' => $this->t('Sort by'),
         '#options' => [
-          '_none' => $this->t('- None -'),
-        ] + $fields,
+            FormOptionsHelper::OPTIONS_EMPTY_OPTION => $this->t('- None -'),
+          ] + $fields,
         '#ajax' => TRUE,
         '#limit_validation_errors' => [],
         '#default_value' => $configuration['sort']['field'],
@@ -159,7 +160,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
         '#process' => [[EntityReferenceItem::class, 'formProcessMergeParent']],
       ];
 
-      if ($configuration['sort']['field'] != '_none') {
+      if ($configuration['sort']['field'] != FormOptionsHelper::OPTIONS_EMPTY_OPTION) {
         $form['sort']['settings']['direction'] = [
           '#type' => 'select',
           '#title' => $this->t('Sort direction'),
@@ -360,7 +361,7 @@ protected function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS')
     $query->addMetaData('entity_reference_selection_handler', $this);
 
     // Add the sort option.
-    if ($configuration['sort']['field'] !== '_none') {
+    if ($configuration['sort']['field'] !== FormOptionsHelper::OPTIONS_EMPTY_OPTION) {
       $query->sort($configuration['sort']['field'], $configuration['sort']['direction']);
     }
 
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 a559d9e..9088e19 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsWidgetBase.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsWidgetBase.php
@@ -7,6 +7,7 @@
 use Drupal\Core\Field\FieldFilteredMarkup;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Form\FormOptionsHelper;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Form\OptGroup;
 
@@ -67,7 +68,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
    *   The form state.
    */
   public static function validateElement(array $element, FormStateInterface $form_state) {
-    if ($element['#required'] && $element['#value'] == '_none') {
+    if ($element['#required'] && $element['#value'] == FormOptionsHelper::OPTIONS_EMPTY_OPTION) {
       $form_state->setError($element, t('@name field is required.', ['@name' => $element['#title']]));
     }
 
@@ -85,7 +86,7 @@ public static function validateElement(array $element, FormStateInterface $form_
 
     // Filter out the 'none' option. Use a strict comparison, because
     // 0 == 'any string'.
-    $index = array_search('_none', $values, TRUE);
+    $index = array_search(FormOptionsHelper::OPTIONS_EMPTY_OPTION, $values, TRUE);
     if ($index !== FALSE) {
       unset($values[$index]);
     }
@@ -117,7 +118,7 @@ protected function getOptions(FieldableEntityInterface $entity) {
 
       // Add an empty option if the widget needs one.
       if ($empty_label = $this->getEmptyLabel()) {
-        $options = ['_none' => $empty_label] + $options;
+        $options = [FormOptionsHelper::OPTIONS_EMPTY_OPTION => $empty_label] + $options;
       }
 
       $module_handler = \Drupal::moduleHandler();
diff --git a/core/lib/Drupal/Core/Form/FormOptionsHelper.php b/core/lib/Drupal/Core/Form/FormOptionsHelper.php
new file mode 100644
index 0000000..1cbbf7d
--- /dev/null
+++ b/core/lib/Drupal/Core/Form/FormOptionsHelper.php
@@ -0,0 +1,157 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Form\FormOptionsHelper.
+ */
+
+namespace Drupal\Core\Form;
+
+/**
+ * Provides common functionality for form element options.
+ */
+class FormOptionsHelper {
+
+  /**
+   * Identifies a 'None' option key.
+   */
+  const OPTIONS_EMPTY_OPTION = '_none';
+
+  /**
+   * Converts an array of options into HTML, for use in select list form
+   * elements.
+   *
+   * This function calls itself recursively to obtain the values for each
+   * optgroup within the list of options and when the function encounters an
+   * object with an 'options' property inside $element['#options'].
+   *
+   * @param array $element
+   *   An associative array containing the following key-value pairs:
+   *   - #multiple: Optional Boolean indicating if the user may select more than
+   *     one item.
+   *   - #options: An associative array of options to render as HTML. Each array
+   *     value can be a string, an array, or an object with an 'option'
+   *     property:
+   *     - A string or integer key whose value is a translated string is
+   *       interpreted as a single HTML option element. Do not use placeholders
+   *       that sanitize data: doing so will lead to double-escaping. Note that
+   *       the key will be visible in the HTML and could be modified by
+   *       malicious users, so don't put sensitive information in it.
+   *     - A translated string key whose value is an array indicates a group of
+   *       options. The translated string is used as the label attribute for the
+   *       optgroup. Do not use placeholders to sanitize data: doing so will
+   *       lead to double-escaping. The array should contain the options you
+   *       wish to group and should follow the syntax of $element['#options'].
+   *     - If the function encounters a string or integer key whose value is an
+   *       object with an 'option' property, the key is ignored, the contents of
+   *       the option property are interpreted as $element['#options'], and the
+   *       resulting HTML is added to the output.
+   *   - #value: Optional integer, string, or array representing which option(s)
+   *     to pre-select when the list is first displayed. The integer or string
+   *     must match the key of an option in the '#options' list. If '#multiple'
+   *     is TRUE, this can be an array of integers or strings.
+   * @param array|null $choices
+   *   (optional) Either an associative array of options in the same format as
+   *   $element['#options'] above, or NULL. This parameter is only used
+   *   internally and is not intended to be passed in to the initial function
+   *   call.
+   *
+   * @return string
+   *   An HTML string of options and optgroups for use in a select form element.
+   */
+  public static function formSelectOptions(array $element, $choices = NULL) {
+    if (!isset($choices)) {
+      if (empty($element['#options'])) {
+        return [];
+      }
+      $choices = $element['#options'];
+    }
+    // array_key_exists() accommodates the rare event where $element['#value']
+    // is NULL. isset() fails in this situation.
+    $value_valid = isset($element['#value']) || array_key_exists('#value', $element);
+    $value_is_array = $value_valid && is_array($element['#value']);
+    // Check if the element is multiple select and no value has been selected.
+    $empty_value = (empty($element['#value']) && !empty($element['#multiple']));
+    $options = [];
+    foreach ($choices as $key => $choice) {
+      if (is_array($choice)) {
+        $options[] = [
+          'type' => 'optgroup',
+          'label' => $key,
+          'options' => static::formSelectOptions($element, $choice),
+        ];
+      }
+      elseif (is_object($choice) && isset($choice->option)) {
+        $options = array_merge($options, static::formSelectOptions($element, $choice->option));
+      }
+      else {
+        $option = [];
+        $key = (string) $key;
+        $empty_choice = $empty_value && $key == static::OPTIONS_EMPTY_OPTION;
+        if ($value_valid && ((!$value_is_array && (string) $element['#value'] === $key || ($value_is_array && in_array($key, $element['#value']))) || $empty_choice)) {
+          $option['selected'] = TRUE;
+        }
+        else {
+          $option['selected'] = FALSE;
+        }
+        $option['type'] = 'option';
+        $option['value'] = $key;
+        $option['label'] = $choice;
+        $options[] = $option;
+      }
+    }
+
+    return $options;
+  }
+
+  /**
+   * Returns the indexes of a select element's options matching a given key.
+   *
+   * This function is useful if you need to modify the options that are already
+   * in a form element; for example, to remove choices which are not valid
+   * because of additional filters imposed by another module. One example might
+   * be altering the choices in a taxonomy selector. To correctly handle the
+   * case of a multiple hierarchy taxonomy, #options arrays can now hold an
+   * array of objects, instead of a direct mapping of keys to labels, so that
+   * multiple choices in the selector can have the same key (and label). This
+   * makes it difficult to manipulate directly, which is why this helper
+   * function exists.
+   *
+   * This function does not support optgroups (when the elements of the #options
+   * array are themselves arrays), and will return FALSE if arrays are found.
+   * The caller must either flatten/restore or manually do their manipulations
+   * in this case, since returning the index is not sufficient, and supporting
+   * this would make the "helper" too complicated and cumbersome to be of any
+   * help.
+   *
+   * As usual with functions that can return array() or FALSE, do not forget to
+   * use === and !== if needed.
+   *
+   * @param $element
+   *   The select element to search.
+   * @param $key
+   *   The key to look for.
+   *
+   * @return array
+   *   An array of indexes that match the given $key. Array will be empty if no
+   *   elements were found. FALSE if optgroups were found.
+   */
+  public static function formGetOptions($element, $key) {
+    $keys = [];
+    foreach ($element['#options'] as $index => $choice) {
+      if (is_array($choice)) {
+        return FALSE;
+      }
+      elseif (is_object($choice)) {
+        if (isset($choice->option[$key])) {
+          $keys[] = $index;
+        }
+      }
+      elseif ($index == $key) {
+        $keys[] = $index;
+      }
+    }
+    return $keys;
+  }
+
+}
diff --git a/core/modules/field/src/Tests/EntityReference/EntityReferenceAdminTest.php b/core/modules/field/src/Tests/EntityReference/EntityReferenceAdminTest.php
index fa68cb6..3c6d12c 100644
--- a/core/modules/field/src/Tests/EntityReference/EntityReferenceAdminTest.php
+++ b/core/modules/field/src/Tests/EntityReference/EntityReferenceAdminTest.php
@@ -3,6 +3,7 @@
 namespace Drupal\field\Tests\EntityReference;
 
 use Drupal\Component\Utility\Unicode;
+use Drupal\Core\Form\FormOptionsHelper;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\field_ui\Tests\FieldUiTestTrait;
@@ -103,7 +104,7 @@ public function testFieldAdminHandler() {
 
     // Test the sort settings.
     // Option 0: no sort.
-    $this->assertFieldByName('settings[handler_settings][sort][field]', '_none');
+    $this->assertFieldByName('settings[handler_settings][sort][field]', FormOptionsHelper::OPTIONS_EMPTY_OPTION);
     $this->assertNoFieldByName('settings[handler_settings][sort][direction]');
     // Option 1: sort by field.
     $this->drupalPostAjaxForm(NULL, ['settings[handler_settings][sort][field]' => 'nid'], 'settings[handler_settings][sort][field]');
@@ -117,7 +118,7 @@ public function testFieldAdminHandler() {
     $this->assertFieldByXPath("//select[@name='settings[handler_settings][sort][field]']/option[@value='body.value']");
 
     // Set back to no sort.
-    $this->drupalPostAjaxForm(NULL, ['settings[handler_settings][sort][field]' => '_none'], 'settings[handler_settings][sort][field]');
+    $this->drupalPostAjaxForm(NULL, ['settings[handler_settings][sort][field]' => FormOptionsHelper::OPTIONS_EMPTY_OPTION], 'settings[handler_settings][sort][field]');
     $this->assertNoFieldByName('settings[handler_settings][sort][direction]');
 
     // Third step: confirm.
@@ -153,7 +154,7 @@ public function testFieldAdminHandler() {
     ];
     $this->drupalPostForm($bundle_path . '/fields/' . $field_name . '/storage', $edit, t('Save field settings'));
     $this->drupalGet($bundle_path . '/fields/' . $field_name);
-    $this->assertFieldByName('settings[handler_settings][filter][type]', '_none');
+    $this->assertFieldByName('settings[handler_settings][filter][type]', FormOptionsHelper::OPTIONS_EMPTY_OPTION);
 
     // Switch the target type to 'node'.
     $field_name = 'node.' . $this->type . '.field_test';
diff --git a/core/modules/field/tests/src/Functional/EntityReference/EntityReferenceFieldDefaultValueTest.php b/core/modules/field/tests/src/Functional/EntityReference/EntityReferenceFieldDefaultValueTest.php
index 4567bd0..f4ea557 100644
--- a/core/modules/field/tests/src/Functional/EntityReference/EntityReferenceFieldDefaultValueTest.php
+++ b/core/modules/field/tests/src/Functional/EntityReference/EntityReferenceFieldDefaultValueTest.php
@@ -5,6 +5,7 @@
 use Drupal\Component\Utility\Unicode;
 use Drupal\Tests\SchemaCheckTestTrait;
 use Drupal\field\Entity\FieldConfig;
+use Drupal\Core\Form\FormOptionsHelper;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\node\Entity\Node;
 use Drupal\Tests\BrowserTestBase;
@@ -66,7 +67,7 @@ public function testEntityReferenceDefaultValue() {
         'handler' => 'default',
         'handler_settings' => [
           'target_bundles' => ['referenced_content'],
-          'sort' => ['field' => '_none'],
+          'sort' => ['field' => FormOptionsHelper::OPTIONS_EMPTY_OPTION],
         ],
       ],
     ]);
@@ -129,7 +130,7 @@ public function testEntityReferenceDefaultConfigValue() {
       'settings' => [
         'handler' => 'default',
         'handler_settings' => [
-          'sort' => ['field' => '_none'],
+          'sort' => ['field' => FormOptionsHelper::OPTIONS_EMPTY_OPTION],
         ],
       ],
     ]);
diff --git a/core/modules/options/options.api.php b/core/modules/options/options.api.php
index 0f52b2b..598a37d 100644
--- a/core/modules/options/options.api.php
+++ b/core/modules/options/options.api.php
@@ -7,6 +7,7 @@
 
 use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\Core\Form\FormOptionsHelper;
 
 /**
  * Alters the list of options to be displayed for a field.
@@ -32,7 +33,7 @@ function hook_options_list_alter(array &$options, array $context) {
   // Check if this is the field we want to change.
   if ($context['fieldDefinition']->id() == 'field_option') {
     // Change the label of the empty option.
-    $options['_none'] = t('== Empty ==');
+    $options[FormOptionsHelper::OPTIONS_EMPTY_OPTION] = t('== Empty ==');
   }
 }
 
diff --git a/core/modules/options/tests/src/Functional/OptionsSelectDynamicValuesTest.php b/core/modules/options/tests/src/Functional/OptionsSelectDynamicValuesTest.php
index b661c0d..8b3bf74 100644
--- a/core/modules/options/tests/src/Functional/OptionsSelectDynamicValuesTest.php
+++ b/core/modules/options/tests/src/Functional/OptionsSelectDynamicValuesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\options\Functional;
 
+use Drupal\Core\Form\FormOptionsHelper;
+
 /**
  * Tests an options select with a dynamic allowed values function.
  *
@@ -25,7 +27,7 @@ public function testSelectListDynamic() {
     $this->assertEqual(count($options), count($this->test) + 1);
     foreach ($options as $option) {
       $value = (string) $option['value'];
-      if ($value != '_none') {
+      if ($value != FormOptionsHelper::OPTIONS_EMPTY_OPTION) {
         $this->assertTrue(array_search($value, $this->test));
       }
     }
diff --git a/core/modules/options/tests/src/Functional/OptionsWidgetsTest.php b/core/modules/options/tests/src/Functional/OptionsWidgetsTest.php
index a2157f1..5fbcda8 100644
--- a/core/modules/options/tests/src/Functional/OptionsWidgetsTest.php
+++ b/core/modules/options/tests/src/Functional/OptionsWidgetsTest.php
@@ -4,6 +4,7 @@
 
 use Drupal\entity_test\Entity\EntityTest;
 use Drupal\field\Entity\FieldConfig;
+use Drupal\Core\Form\FormOptionsHelper;
 use Drupal\field\Tests\FieldTestBase;
 use Drupal\field\Entity\FieldStorageConfig;
 
@@ -125,7 +126,7 @@ public function testRadioButtons() {
     $this->assertNoFieldChecked('edit-card-1-2');
 
     // Unselect option.
-    $edit = ['card_1' => '_none'];
+    $edit = ['card_1' => FormOptionsHelper::OPTIONS_EMPTY_OPTION];
     $this->drupalPostForm(NULL, $edit, t('Save'));
     $this->assertFieldValues($entity_init, 'card_1', []);
 
@@ -255,17 +256,17 @@ public function testSelectListSingle() {
     // Display form.
     $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
     // A required field without any value has a "none" option.
-    $this->assertTrue($this->xpath('//select[@id=:id]//option[@value="_none" and text()=:label]', [':id' => 'edit-card-1', ':label' => t('- Select a value -')]), 'A required select list has a "Select a value" choice.');
+    $this->assertTrue($this->xpath('//select[@id=:id]//option[@value=:value and text()=:label]', [':id' => 'edit-card-1', ':value' => FormOptionsHelper::OPTIONS_EMPTY_OPTION, ':label' => t('- Select a value -')]), 'A required select list has a "Select a value" choice.');
 
     // With no field data, nothing is selected.
-    $this->assertNoOptionSelected('edit-card-1', '_none');
+    $this->assertNoOptionSelected('edit-card-1', FormOptionsHelper::OPTIONS_EMPTY_OPTION);
     $this->assertNoOptionSelected('edit-card-1', 0);
     $this->assertNoOptionSelected('edit-card-1', 1);
     $this->assertNoOptionSelected('edit-card-1', 2);
     $this->assertRaw('Some dangerous &amp; unescaped markup', 'Option text was properly filtered.');
 
     // Submit form: select invalid 'none' option.
-    $edit = ['card_1' => '_none'];
+    $edit = ['card_1' => FormOptionsHelper::OPTIONS_EMPTY_OPTION];
     $this->drupalPostForm(NULL, $edit, t('Save'));
     $this->assertRaw(t('@title field is required.', ['@title' => $field->getName()]), 'Cannot save a required field when selecting "none" from the select list.');
 
@@ -277,7 +278,7 @@ public function testSelectListSingle() {
     // Display form: check that the right options are selected.
     $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
     // A required field with a value has no 'none' option.
-    $this->assertFalse($this->xpath('//select[@id=:id]//option[@value="_none"]', [':id' => 'edit-card-1']), 'A required select list with an actual value has no "none" choice.');
+    $this->assertFalse($this->xpath('//select[@id=:id]//option[@value=:value]', [':id' => 'edit-card-1', ':value' => FormOptionsHelper::OPTIONS_EMPTY_OPTION]), 'A required select list with an actual value has no "none" choice.');
     $this->assertOptionSelected('edit-card-1', 0);
     $this->assertNoOptionSelected('edit-card-1', 1);
     $this->assertNoOptionSelected('edit-card-1', 2);
@@ -289,9 +290,9 @@ public function testSelectListSingle() {
     // Display form.
     $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
     // A non-required field has a 'none' option.
-    $this->assertTrue($this->xpath('//select[@id=:id]//option[@value="_none" and text()=:label]', [':id' => 'edit-card-1', ':label' => t('- None -')]), 'A non-required select list has a "None" choice.');
+    $this->assertTrue($this->xpath('//select[@id=:id]//option[@value=:value and text()=:label]', [':id' => 'edit-card-1', ':value' => FormOptionsHelper::OPTIONS_EMPTY_OPTION, ':label' => t('- None -')]), 'A non-required select list has a "None" choice.');
     // Submit form: Unselect the option.
-    $edit = ['card_1' => '_none'];
+    $edit = ['card_1' => FormOptionsHelper::OPTIONS_EMPTY_OPTION];
     $this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
     $this->assertFieldValues($entity_init, 'card_1', []);
 
@@ -322,7 +323,7 @@ public function testSelectListSingle() {
     $this->assertNoOptionSelected('edit-card-1', 2);
 
     // Submit form: Unselect the option.
-    $edit = ['card_1' => '_none'];
+    $edit = ['card_1' => FormOptionsHelper::OPTIONS_EMPTY_OPTION];
     $this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
     $this->assertFieldValues($entity_init, 'card_1', []);
   }
@@ -353,7 +354,7 @@ public function testSelectListMultiple() {
 
     // Display form: with no field data, nothing is selected.
     $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
-    $this->assertOptionSelected("edit-card-2", '_none');
+    $this->assertOptionSelected("edit-card-2", FormOptionsHelper::OPTIONS_EMPTY_OPTION);
     $this->assertNoOptionSelected('edit-card-2', 0);
     $this->assertNoOptionSelected('edit-card-2', 1);
     $this->assertNoOptionSelected('edit-card-2', 2);
@@ -395,12 +396,12 @@ public function testSelectListMultiple() {
 
     // Check that the 'none' option has no effect if actual options are selected
     // as well.
-    $edit = ['card_2[]' => ['_none' => '_none', 0 => 0]];
+    $edit = ['card_2[]' => [FormOptionsHelper::OPTIONS_EMPTY_OPTION => FormOptionsHelper::OPTIONS_EMPTY_OPTION, 0 => 0]];
     $this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
     $this->assertFieldValues($entity_init, 'card_2', [0]);
 
     // Check that selecting the 'none' option empties the field.
-    $edit = ['card_2[]' => ['_none' => '_none']];
+    $edit = ['card_2[]' => [FormOptionsHelper::OPTIONS_EMPTY_OPTION => FormOptionsHelper::OPTIONS_EMPTY_OPTION]];
     $this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
     $this->assertFieldValues($entity_init, 'card_2', []);
 
@@ -443,7 +444,7 @@ public function testSelectListMultiple() {
     $this->assertNoOptionSelected('edit-card-2', 2);
 
     // Submit form: Unselect the option.
-    $edit = ['card_2[]' => ['_none' => '_none']];
+    $edit = ['card_2[]' => [FormOptionsHelper::OPTIONS_EMPTY_OPTION => FormOptionsHelper::OPTIONS_EMPTY_OPTION]];
     $this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
     $this->assertFieldValues($entity_init, 'card_2', []);
   }
@@ -475,7 +476,7 @@ public function testEmptyValue() {
 
     // Display form: check that _none options are present and has label.
     $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
-    $this->assertTrue($this->xpath('//div[@id=:id]//input[@value=:value]', [':id' => 'edit-card-1', ':value' => '_none']), 'A test radio button has a "None" choice.');
+    $this->assertTrue($this->xpath('//div[@id=:id]//input[@value=:value]', [':id' => 'edit-card-1', ':value' => FormOptionsHelper::OPTIONS_EMPTY_OPTION]), 'A test radio button has a "None" choice.');
     $this->assertTrue($this->xpath('//div[@id=:id]//label[@for=:for and text()=:label]', [':id' => 'edit-card-1', ':for' => 'edit-card-1-none', ':label' => 'N/A']), 'A test radio button has a "N/A" choice.');
 
     // Change it to the select widget.
@@ -488,7 +489,7 @@ public function testEmptyValue() {
     // Display form: check that _none options are present and has label.
     $this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
     // A required field without any value has a "none" option.
-    $this->assertTrue($this->xpath('//select[@id=:id]//option[@value="_none" and text()=:label]', [':id' => 'edit-card-1', ':label' => t('- None -')]), 'A test select has a "None" choice.');
+    $this->assertTrue($this->xpath('//select[@id=:id]//option[@value=:value and text()=:label]', [':id' => 'edit-card-1', ':value' => FormOptionsHelper::OPTIONS_EMPTY_OPTION, ':label' => t('- None -')]), 'A test select has a "None" choice.');
   }
 
 }
diff --git a/core/modules/responsive_image/src/ResponsiveImageStyleForm.php b/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
index 4240473..3048fb2 100644
--- a/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
+++ b/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
@@ -4,6 +4,7 @@
 
 use Drupal\breakpoint\BreakpointManagerInterface;
 use Drupal\Core\Entity\EntityForm;
+use Drupal\Core\Form\FormOptionsHelper;
 use Drupal\Core\Form\FormStateInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -138,9 +139,9 @@ public function form(array $form, FormStateInterface $form_state) {
           '#options' => [
             'sizes' => $this->t('Select multiple image styles and use the sizes attribute.'),
             'image_style' => $this->t('Select a single image style.'),
-            '_none' => $this->t('Do not use this breakpoint.'),
+            FormOptionsHelper::OPTIONS_EMPTY_OPTION => $this->t('Do not use this breakpoint.'),
           ],
-          '#default_value' => isset($image_style_mapping['image_mapping_type']) ? $image_style_mapping['image_mapping_type'] : '_none',
+          '#default_value' => isset($image_style_mapping['image_mapping_type']) ? $image_style_mapping['image_mapping_type'] : FormOptionsHelper::OPTIONS_EMPTY_OPTION,
           '#description' => $description,
         ];
         $form['keyed_styles'][$breakpoint_id][$multiplier]['image_style'] = [
@@ -186,7 +187,7 @@ public function form(array $form, FormStateInterface $form_state) {
         ];
 
         // Expand the details if "do not use this breakpoint" was not selected.
-        if ($form['keyed_styles'][$breakpoint_id][$multiplier]['image_mapping_type']['#default_value'] != '_none') {
+        if ($form['keyed_styles'][$breakpoint_id][$multiplier]['image_mapping_type']['#default_value'] != FormOptionsHelper::OPTIONS_EMPTY_OPTION) {
           $form['keyed_styles'][$breakpoint_id][$multiplier]['#open'] = TRUE;
         }
       }
diff --git a/core/modules/responsive_image/tests/src/Functional/ResponsiveImageAdminUITest.php b/core/modules/responsive_image/tests/src/Functional/ResponsiveImageAdminUITest.php
index eeaf793..b39b0ac 100644
--- a/core/modules/responsive_image/tests/src/Functional/ResponsiveImageAdminUITest.php
+++ b/core/modules/responsive_image/tests/src/Functional/ResponsiveImageAdminUITest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\responsive_image\Functional;
 
+use Drupal\Core\Form\FormOptionsHelper;
 use Drupal\Tests\BrowserTestBase;
 
 /**
@@ -118,7 +119,7 @@ public function testResponsiveImageAdmin() {
     // Check the mapping for multipliers 1x and 2x for the mobile breakpoint.
     $this->assertFieldByName('keyed_styles[responsive_image_test_module.mobile][1x][image_style]', 'thumbnail');
     $this->assertFieldByName('keyed_styles[responsive_image_test_module.mobile][1x][image_mapping_type]', 'image_style');
-    $this->assertFieldByName('keyed_styles[responsive_image_test_module.mobile][2x][image_mapping_type]', '_none');
+    $this->assertFieldByName('keyed_styles[responsive_image_test_module.mobile][2x][image_mapping_type]', FormOptionsHelper::OPTIONS_EMPTY_OPTION);
 
     // Check the mapping for multipliers 1x and 2x for the narrow breakpoint.
     $this->assertFieldByName('keyed_styles[responsive_image_test_module.narrow][1x][image_mapping_type]', 'sizes');
@@ -126,12 +127,12 @@ public function testResponsiveImageAdmin() {
     $this->assertFieldChecked('edit-keyed-styles-responsive-image-test-modulenarrow-1x-sizes-image-styles-large');
     $this->assertFieldChecked('edit-keyed-styles-responsive-image-test-modulenarrow-1x-sizes-image-styles-medium');
     $this->assertNoFieldChecked('edit-keyed-styles-responsive-image-test-modulenarrow-1x-sizes-image-styles-thumbnail');
-    $this->assertFieldByName('keyed_styles[responsive_image_test_module.narrow][2x][image_mapping_type]', '_none');
+    $this->assertFieldByName('keyed_styles[responsive_image_test_module.narrow][2x][image_mapping_type]', FormOptionsHelper::OPTIONS_EMPTY_OPTION);
 
     // Check the mapping for multipliers 1x and 2x for the wide breakpoint.
     $this->assertFieldByName('keyed_styles[responsive_image_test_module.wide][1x][image_style]', 'large');
     $this->assertFieldByName('keyed_styles[responsive_image_test_module.wide][1x][image_mapping_type]', 'image_style');
-    $this->assertFieldByName('keyed_styles[responsive_image_test_module.wide][2x][image_mapping_type]', '_none');
+    $this->assertFieldByName('keyed_styles[responsive_image_test_module.wide][2x][image_mapping_type]', FormOptionsHelper::OPTIONS_EMPTY_OPTION);
 
     // Delete the style.
     $this->drupalGet('admin/config/media/responsive-image-style/style_one/delete');
diff --git a/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php b/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php
index 7f5c5e3..9acb565 100644
--- a/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php
+++ b/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\Core\Form\FormOptionsHelper;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Url;
 use Drupal\field\Entity\FieldStorageConfig;
@@ -263,7 +264,7 @@ protected function createReferenceTestEntities($referenced_entity) {
           'target_bundles' => [
             $referenced_entity->bundle() => $referenced_entity->bundle(),
           ],
-          'sort' => ['field' => '_none'],
+          'sort' => ['field' => FormOptionsHelper::OPTIONS_EMPTY_OPTION],
           'auto_create' => FALSE,
         ],
       ],
diff --git a/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php b/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php
index d06a81c..a0c880f 100644
--- a/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php
+++ b/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php
@@ -8,6 +8,7 @@
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Entity\Plugin\EntityReferenceSelection\DefaultSelection;
 use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Form\FormOptionsHelper;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\user\RoleInterface;
@@ -86,7 +87,7 @@ public static function create(ContainerInterface $container, array $configuratio
   public function defaultConfiguration() {
     return [
       'filter' => [
-        'type' => '_none',
+        'type' => FormOptionsHelper::OPTIONS_EMPTY_OPTION,
         'role' => NULL,
       ],
       'include_anonymous' => TRUE,
@@ -110,7 +111,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
       '#type' => 'select',
       '#title' => $this->t('Filter by'),
       '#options' => [
-        '_none' => $this->t('- None -'),
+        FormOptionsHelper::OPTIONS_EMPTY_OPTION => $this->t('- None -'),
         'role' => $this->t('User role'),
       ],
       '#ajax' => TRUE,
