diff --git a/core/includes/form.inc b/core/includes/form.inc
index dd78e0d..7fc6850 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, array('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.3.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.3.x, will be removed before Drupal 9.0.0.
+ *   Use \Drupal\Core\Form\FormOptionsHelper::formGetOptions().
  */
 function form_get_options($element, $key) {
-  $keys = array();
-  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 9565e77..8ccdcc8 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php
@@ -9,6 +9,7 @@
 use Drupal\Core\Entity\EntityReferenceSelection\SelectionWithAutocreateInterface;
 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\Entity\EntityReferenceSelection\SelectionInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
@@ -114,7 +115,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
       // equivalent to "no entities from any bundle can be referenced".
       'target_bundles' => NULL,
       'sort' => array(
-        'field' => '_none',
+        'field' => FormOptionsHelper::OPTIONS_EMPTY_OPTION,
       ),
       'auto_create' => FALSE,
       'auto_create_bundle' => NULL,
@@ -184,7 +185,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
         '#type' => 'select',
         '#title' => $this->t('Sort by'),
         '#options' => array(
-          '_none' => $this->t('- None -'),
+            FormOptionsHelper::OPTIONS_EMPTY_OPTION => $this->t('- None -'),
         ) + $fields,
         '#ajax' => TRUE,
         '#limit_validation_errors' => array(),
@@ -197,7 +198,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
         '#process' => [[EntityReferenceItem::class, 'formProcessMergeParent']],
       );
 
-      if ($selection_handler_settings['sort']['field'] != '_none') {
+      if ($selection_handler_settings['sort']['field'] != FormOptionsHelper::OPTIONS_EMPTY_OPTION) {
         // Merge-in default values.
         $selection_handler_settings['sort'] += array(
           'direction' => 'ASC',
@@ -407,7 +408,7 @@ protected function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS')
     // Add the sort option.
     if (!empty($handler_settings['sort'])) {
       $sort_settings = $handler_settings['sort'];
-      if ($sort_settings['field'] != '_none') {
+      if ($sort_settings['field'] != FormOptionsHelper::OPTIONS_EMPTY_OPTION) {
         $query->sort($sort_settings['field'], $sort_settings['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 ca00bcc..664efe8 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.', array('@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..537f957
--- /dev/null
+++ b/core/lib/Drupal/Core/Form/FormOptionsHelper.php
@@ -0,0 +1,154 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Form\FormOptionsHelper.
+ */
+
+namespace Drupal\Core\Form;
+
+/**
+ * @todo.
+ */
+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 0324c4a..e27612a 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, array('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, array('settings[handler_settings][sort][field]' => '_none'), 'settings[handler_settings][sort][field]');
+    $this->drupalPostAjaxForm(NULL, array('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/src/Tests/EntityReference/EntityReferenceFieldDefaultValueTest.php b/core/modules/field/src/Tests/EntityReference/EntityReferenceFieldDefaultValueTest.php
index 6433958..b35aeb8 100644
--- a/core/modules/field/src/Tests/EntityReference/EntityReferenceFieldDefaultValueTest.php
+++ b/core/modules/field/src/Tests/EntityReference/EntityReferenceFieldDefaultValueTest.php
@@ -5,6 +5,7 @@
 use Drupal\Component\Utility\Unicode;
 use Drupal\config\Tests\SchemaCheckTestTrait;
 use Drupal\field\Entity\FieldConfig;
+use Drupal\Core\Form\FormOptionsHelper;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\node\Entity\Node;
 use Drupal\simpletest\WebTestBase;
@@ -66,7 +67,7 @@ function testEntityReferenceDefaultValue() {
         'handler' => 'default',
         'handler_settings' => array(
           'target_bundles' => array('referenced_content'),
-          'sort' => array('field' => '_none'),
+          'sort' => array('field' => FormOptionsHelper::OPTIONS_EMPTY_OPTION),
         ),
       ),
     ]);
@@ -129,7 +130,7 @@ function testEntityReferenceDefaultConfigValue() {
       'settings' => array(
         'handler' => 'default',
         'handler_settings' => array(
-          'sort' => array('field' => '_none'),
+          'sort' => array('field' => FormOptionsHelper::OPTIONS_EMPTY_OPTION),
         ),
       ),
     ]);
diff --git a/core/modules/options/options.api.php b/core/modules/options/options.api.php
index a4ac605..592e7ea 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['field']->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/src/Tests/OptionsSelectDynamicValuesTest.php b/core/modules/options/src/Tests/OptionsSelectDynamicValuesTest.php
index df3365c..b37c978 100644
--- a/core/modules/options/src/Tests/OptionsSelectDynamicValuesTest.php
+++ b/core/modules/options/src/Tests/OptionsSelectDynamicValuesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\options\Tests;
 
+use Drupal\Core\Form\FormOptionsHelper;
+
 /**
  * Tests an options select with a dynamic allowed values function.
  *
@@ -25,7 +27,7 @@ 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/src/Tests/OptionsWidgetsTest.php b/core/modules/options/src/Tests/OptionsWidgetsTest.php
index 23f0f0d..809c730 100644
--- a/core/modules/options/src/Tests/OptionsWidgetsTest.php
+++ b/core/modules/options/src/Tests/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 @@ function testRadioButtons() {
     $this->assertNoFieldChecked('edit-card-1-2');
 
     // Unselect option.
-    $edit = array('card_1' => '_none');
+    $edit = array('card_1' => FormOptionsHelper::OPTIONS_EMPTY_OPTION);
     $this->drupalPostForm(NULL, $edit, t('Save'));
     $this->assertFieldValues($entity_init, 'card_1', array());
 
@@ -255,17 +256,17 @@ 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]', array(':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]', array(':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 = array('card_1' => '_none');
+    $edit = array('card_1' => FormOptionsHelper::OPTIONS_EMPTY_OPTION);
     $this->drupalPostForm(NULL, $edit, t('Save'));
     $this->assertRaw(t('@title field is required.', array('@title' => $field->getName())), 'Cannot save a required field when selecting "none" from the select list.');
 
@@ -277,7 +278,7 @@ 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"]', array(':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]', array(':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 @@ 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]', array(':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]', array(':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 = array('card_1' => '_none');
+    $edit = array('card_1' => FormOptionsHelper::OPTIONS_EMPTY_OPTION);
     $this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
     $this->assertFieldValues($entity_init, 'card_1', array());
 
@@ -322,7 +323,7 @@ function testSelectListSingle() {
     $this->assertNoOptionSelected('edit-card-1', 2);
 
     // Submit form: Unselect the option.
-    $edit = array('card_1' => '_none');
+    $edit = array('card_1' => FormOptionsHelper::OPTIONS_EMPTY_OPTION);
     $this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
     $this->assertFieldValues($entity_init, 'card_1', array());
   }
@@ -353,7 +354,7 @@ 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 @@ function testSelectListMultiple() {
 
     // Check that the 'none' option has no effect if actual options are selected
     // as well.
-    $edit = array('card_2[]' => array('_none' => '_none', 0 => 0));
+    $edit = array('card_2[]' => array(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', array(0));
 
     // Check that selecting the 'none' option empties the field.
-    $edit = array('card_2[]' => array('_none' => '_none'));
+    $edit = array('card_2[]' => array(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', array());
 
@@ -443,7 +444,7 @@ function testSelectListMultiple() {
     $this->assertNoOptionSelected('edit-card-2', 2);
 
     // Submit form: Unselect the option.
-    $edit = array('card_2[]' => array('_none' => '_none'));
+    $edit = array('card_2[]' => array(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', array());
   }
@@ -475,7 +476,7 @@ 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]', array(':id' => 'edit-card-1', ':value' => '_none')), 'A test radio button has a "None" choice.');
+    $this->assertTrue($this->xpath('//div[@id=:id]//input[@value=:value]', array(':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]', array(':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 @@ 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]', array(':id' => 'edit-card-1', ':label' => t('- None -'))), 'A test select has a "None" choice.');
+    $this->assertTrue($this->xpath('//select[@id=:id]//option[@value=:none and text()=:label]', array(':id' => 'edit-card-1', ':none' => 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 3e5b051..5cb4284 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;
 
@@ -136,9 +137,9 @@ public function form(array $form, FormStateInterface $form_state) {
           '#options' => array(
             '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'] = array(
@@ -184,7 +185,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/src/Tests/ResponsiveImageAdminUITest.php b/core/modules/responsive_image/src/Tests/ResponsiveImageAdminUITest.php
index 8f8b505..a4cd3a6 100644
--- a/core/modules/responsive_image/src/Tests/ResponsiveImageAdminUITest.php
+++ b/core/modules/responsive_image/src/Tests/ResponsiveImageAdminUITest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\responsive_image\Tests;
 
+use Drupal\Core\Form\FormOptionsHelper;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -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 9ecefad..1466fed 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;
@@ -260,7 +261,7 @@ protected function createReferenceTestEntities($referenced_entity) {
           'target_bundles' => array(
             $referenced_entity->bundle() => $referenced_entity->bundle(),
           ),
-          'sort' => array('field' => '_none'),
+          'sort' => array('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 8dfba39..3c3852b 100644
--- a/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php
+++ b/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php
@@ -7,6 +7,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;
@@ -88,7 +89,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
     // Merge in default values.
     $selection_handler_settings += array(
       'filter' => array(
-        'type' => '_none',
+        'type' => FormOptionsHelper::OPTIONS_EMPTY_OPTION,
       ),
       'include_anonymous' => TRUE,
     );
@@ -104,7 +105,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
       '#type' => 'select',
       '#title' => $this->t('Filter by'),
       '#options' => array(
-        '_none' => $this->t('- None -'),
+        FormOptionsHelper::OPTIONS_EMPTY_OPTION => $this->t('- None -'),
         'role' => $this->t('User role'),
       ),
       '#ajax' => TRUE,
