diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 498c490..01abf88 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -1686,6 +1686,57 @@ function template_preprocess_field_multiple_value_form(&$variables) {
 }
 
 /**
+ * Prepares variables for individual form element templates.
+ *
+ * Default template: field-multiple-value-without-order-form.html.twig.
+ *
+ * Combines multiple values.
+ *
+ * @param array $variables
+ *   An associative array containing:
+ *   - element: A render element representing the form element.
+ */
+function template_preprocess_field_multiple_value_without_order_form(&$variables) {
+  $element = $variables['element'];
+  $variables['multiple'] = $element['#cardinality_multiple'];
+
+  if ($variables['multiple']) {
+    $items = [];
+    $variables['button'] = [];
+    foreach (Element::children($element) as $key) {
+      if ($key === 'add_more') {
+        $variables['button'] = &$element[$key];
+      }
+      else {
+        $items[$key] = &$element[$key];
+        if (isset($items[$key]['_weight'])) {
+          $items[$key]['_weight']['#access'] = FALSE;
+        }
+      }
+    }
+    usort($items, '_field_multiple_value_form_sort_helper');
+
+    $variables['title'] = [];
+    if (!empty($element['#title'])) {
+      $variables['title'] = [
+        '#type' => 'label',
+        '#title' => $element['#title'],
+        '#required' => !empty($element['#required']) ? $element['#required'] : FALSE,
+        '#title_display' => 'before',
+      ];
+    }
+    $variables['items'] = $items;
+    $variables['description'] = $element['#description'];
+  }
+  else {
+    $variables['elements'] = [];
+    foreach (Element::children($element) as $key) {
+      $variables['elements'][] = $element[$key];
+    }
+  }
+}
+
+/**
  * Prepares variables for breadcrumb templates.
  *
  * Default template: breadcrumb.html.twig.
@@ -1865,5 +1916,8 @@ function drupal_common_theme() {
     'field_multiple_value_form' => [
       'render element' => 'element',
     ],
+    'field_multiple_value_without_order_form' => [
+      'render element' => 'element',
+    ],
   ];
 }
diff --git a/core/lib/Drupal/Core/Field/BaseFieldDefinition.php b/core/lib/Drupal/Core/Field/BaseFieldDefinition.php
index 5194d85..97d7385 100644
--- a/core/lib/Drupal/Core/Field/BaseFieldDefinition.php
+++ b/core/lib/Drupal/Core/Field/BaseFieldDefinition.php
@@ -232,6 +232,27 @@ public function setTranslatable($translatable) {
   /**
    * {@inheritdoc}
    */
+  public function isOrderable() {
+    return !empty($this->definition['orderable']);
+  }
+
+  /**
+   * Sets whether the field is orderable.
+   *
+   * @param bool $orderable
+   *   Whether the field is orderable.
+   *
+   * @return $this
+   *   The object itself for chaining.
+   */
+  public function setOrderable($orderable) {
+    $this->definition['orderable'] = $orderable;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function isRevisionable() {
     return !empty($this->definition['revisionable']);
   }
diff --git a/core/lib/Drupal/Core/Field/FieldConfigBase.php b/core/lib/Drupal/Core/Field/FieldConfigBase.php
index 76366bf..60ade18 100644
--- a/core/lib/Drupal/Core/Field/FieldConfigBase.php
+++ b/core/lib/Drupal/Core/Field/FieldConfigBase.php
@@ -103,6 +103,15 @@
   protected $required = FALSE;
 
   /**
+   * Flag indicating whether the field is orderable.
+   *
+   * Defaults to TRUE.
+   *
+   * @var bool
+   */
+  protected $orderable = TRUE;
+
+  /**
    * Flag indicating whether the field is translatable.
    *
    * Defaults to TRUE.
@@ -332,6 +341,23 @@ public function setTranslatable($translatable) {
   /**
    * {@inheritdoc}
    */
+  public function isOrderable() {
+    // Make the default state TRUE even when the cardinality doesn't allow
+    // multiple values.
+    return $this->orderable || $this->getFieldStorageDefinition()->getCardinality() == 1;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setOrderable($orderable) {
+    $this->orderable = $orderable;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getSettings() {
     return $this->settings + $this->getFieldStorageDefinition()->getSettings();
   }
diff --git a/core/lib/Drupal/Core/Field/WidgetBase.php b/core/lib/Drupal/Core/Field/WidgetBase.php
index b1579f2..900e29f 100644
--- a/core/lib/Drupal/Core/Field/WidgetBase.php
+++ b/core/lib/Drupal/Core/Field/WidgetBase.php
@@ -210,7 +210,7 @@ protected function formMultipleElements(FieldItemListInterface $items, array &$f
 
     if ($elements) {
       $elements += [
-        '#theme' => 'field_multiple_value_form',
+        '#theme' => $this->fieldDefinition->isOrderable() ? 'field_multiple_value_form' : 'field_multiple_value_without_order_form',
         '#field_name' => $field_name,
         '#cardinality' => $cardinality,
         '#cardinality_multiple' => $this->fieldDefinition->getFieldStorageDefinition()->isMultiple(),
diff --git a/core/modules/block_content/config/install/field.storage.block_content.body.yml b/core/modules/block_content/config/install/field.storage.block_content.body.yml
index f7c504d..2a73f84 100644
--- a/core/modules/block_content/config/install/field.storage.block_content.body.yml
+++ b/core/modules/block_content/config/install/field.storage.block_content.body.yml
@@ -12,6 +12,7 @@ settings: {  }
 module: text
 locked: false
 cardinality: 1
+orderable: true
 translatable: true
 indexes: {  }
 persist_with_no_fields: true
diff --git a/core/modules/comment/config/install/field.storage.comment.comment_body.yml b/core/modules/comment/config/install/field.storage.comment.comment_body.yml
index 43818a0..488b083 100644
--- a/core/modules/comment/config/install/field.storage.comment.comment_body.yml
+++ b/core/modules/comment/config/install/field.storage.comment.comment_body.yml
@@ -12,6 +12,7 @@ settings: {  }
 module: text
 locked: false
 cardinality: 1
+orderable: true
 translatable: true
 indexes: {  }
 persist_with_no_fields: true
diff --git a/core/modules/field/config/schema/field.schema.yml b/core/modules/field/config/schema/field.schema.yml
index ca182c4..786e434 100644
--- a/core/modules/field/config/schema/field.schema.yml
+++ b/core/modules/field/config/schema/field.schema.yml
@@ -38,6 +38,9 @@ field.storage.*.*:
     translatable:
       type: boolean
       label: 'Translatable'
+    orderable:
+      type: boolean
+      label: 'Orderable'
     indexes:
       type: sequence
       label: 'Indexes'
diff --git a/core/modules/field/src/Entity/FieldConfig.php b/core/modules/field/src/Entity/FieldConfig.php
index af2fcca..eece29d 100644
--- a/core/modules/field/src/Entity/FieldConfig.php
+++ b/core/modules/field/src/Entity/FieldConfig.php
@@ -30,6 +30,7 @@
  *     "bundle",
  *     "label",
  *     "description",
+ *     "orderable",
  *     "required",
  *     "translatable",
  *     "default_value",
diff --git a/core/modules/field/src/Entity/FieldStorageConfig.php b/core/modules/field/src/Entity/FieldStorageConfig.php
index a63e54f..4aba066 100644
--- a/core/modules/field/src/Entity/FieldStorageConfig.php
+++ b/core/modules/field/src/Entity/FieldStorageConfig.php
@@ -34,6 +34,7 @@
  *     "module",
  *     "locked",
  *     "cardinality",
+ *     "orderable",
  *     "translatable",
  *     "indexes",
  *     "persist_with_no_fields",
@@ -119,6 +120,15 @@ class FieldStorageConfig extends ConfigEntityBase implements FieldStorageConfigI
   protected $cardinality = 1;
 
   /**
+   * Flag indicating whether the field is orderable.
+   *
+   * Defaults to TRUE.
+   *
+   * @var int
+   */
+  protected $orderable = TRUE;
+
+  /**
    * Flag indicating whether the field is translatable.
    *
    * Defaults to TRUE.
@@ -589,6 +599,13 @@ public function isTranslatable() {
   /**
    * {@inheritdoc}
    */
+  public function isOrderable() {
+    return $this->orderable;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function isRevisionable() {
     // All configurable fields are revisionable.
     return TRUE;
@@ -605,6 +622,14 @@ public function setTranslatable($translatable) {
   /**
    * {@inheritdoc}
    */
+  public function setOrderable($orderable) {
+    $this->orderable = $orderable;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getProvider() {
     return 'field';
   }
diff --git a/core/modules/field/tests/fixtures/update/field.storage.node.field_ref_autocreate_2412569.yml b/core/modules/field/tests/fixtures/update/field.storage.node.field_ref_autocreate_2412569.yml
index 19e4a6a..2c624ab 100644
--- a/core/modules/field/tests/fixtures/update/field.storage.node.field_ref_autocreate_2412569.yml
+++ b/core/modules/field/tests/fixtures/update/field.storage.node.field_ref_autocreate_2412569.yml
@@ -14,6 +14,7 @@ settings:
 module: core
 locked: false
 cardinality: 1
+orderable: true
 translatable: true
 indexes: {  }
 persist_with_no_fields: false
diff --git a/core/modules/field/tests/fixtures/update/field.storage.node.field_ref_views_select_2429191.yml b/core/modules/field/tests/fixtures/update/field.storage.node.field_ref_views_select_2429191.yml
index 84d8eca..ab3f8f1 100644
--- a/core/modules/field/tests/fixtures/update/field.storage.node.field_ref_views_select_2429191.yml
+++ b/core/modules/field/tests/fixtures/update/field.storage.node.field_ref_views_select_2429191.yml
@@ -14,6 +14,7 @@ settings:
 module: entity_reference
 locked: false
 cardinality: 1
+orderable: true
 translatable: true
 indexes: {  }
 persist_with_no_fields: false
diff --git a/core/modules/field/tests/modules/field_test_config/config/install/field.storage.entity_test.field_test_import.yml b/core/modules/field/tests/modules/field_test_config/config/install/field.storage.entity_test.field_test_import.yml
index f6ca4ab..e38d3ae 100644
--- a/core/modules/field/tests/modules/field_test_config/config/install/field.storage.entity_test.field_test_import.yml
+++ b/core/modules/field/tests/modules/field_test_config/config/install/field.storage.entity_test.field_test_import.yml
@@ -8,6 +8,7 @@ settings:
 module: text
 locked: false
 cardinality: 1
+orderable: true
 translatable: false
 indexes:
   format:
diff --git a/core/modules/field/tests/modules/field_test_config/config/install/field.storage.entity_test.field_test_import_2.yml b/core/modules/field/tests/modules/field_test_config/config/install/field.storage.entity_test.field_test_import_2.yml
index 35f53c5..8802da9 100644
--- a/core/modules/field/tests/modules/field_test_config/config/install/field.storage.entity_test.field_test_import_2.yml
+++ b/core/modules/field/tests/modules/field_test_config/config/install/field.storage.entity_test.field_test_import_2.yml
@@ -8,6 +8,7 @@ settings:
 module: text
 locked: false
 cardinality: 1
+orderable: true
 translatable: false
 indexes:
   format:
diff --git a/core/modules/field/tests/modules/field_test_config/sync/field.storage.entity_test.field_test_import_sync.yml b/core/modules/field/tests/modules/field_test_config/sync/field.storage.entity_test.field_test_import_sync.yml
index 83c9aae..c99036a 100644
--- a/core/modules/field/tests/modules/field_test_config/sync/field.storage.entity_test.field_test_import_sync.yml
+++ b/core/modules/field/tests/modules/field_test_config/sync/field.storage.entity_test.field_test_import_sync.yml
@@ -9,6 +9,7 @@ settings:
 module: text
 locked: '0'
 cardinality: '1'
+orderable: '0'
 translatable: '0'
 indexes:
   format:
diff --git a/core/modules/field/tests/modules/field_test_config/sync/field.storage.entity_test.field_test_import_sync_2.yml b/core/modules/field/tests/modules/field_test_config/sync/field.storage.entity_test.field_test_import_sync_2.yml
index d692f78..57547a0 100644
--- a/core/modules/field/tests/modules/field_test_config/sync/field.storage.entity_test.field_test_import_sync_2.yml
+++ b/core/modules/field/tests/modules/field_test_config/sync/field.storage.entity_test.field_test_import_sync_2.yml
@@ -9,6 +9,7 @@ settings:
 module: text
 locked: '0'
 cardinality: '1'
+orderable: '0'
 translatable: '0'
 indexes:
   format:
diff --git a/core/modules/field_ui/src/Form/FieldConfigEditForm.php b/core/modules/field_ui/src/Form/FieldConfigEditForm.php
index 2895479..7ee7bee 100644
--- a/core/modules/field_ui/src/Form/FieldConfigEditForm.php
+++ b/core/modules/field_ui/src/Form/FieldConfigEditForm.php
@@ -71,6 +71,16 @@ public function form(array $form, FormStateInterface $form_state) {
       '#weight' => -5,
     ];
 
+    if ($this->entity->getFieldStorageDefinition()->getCardinality() != 1) {
+      $form['orderable'] = [
+        '#type' => 'checkbox',
+        '#title' => $this->t('Orderable'),
+        '#default_value' => $this->entity->isOrderable(),
+        '#weight' => -5,
+        '#description' => t('Orderable multiple fields widgets are in a table with drag and drop.'),
+      ];
+    }
+
     // Create an arbitrary entity object (used by the 'default value' widget).
     $ids = (object) [
       'entity_type' => $this->entity->getTargetEntityTypeId(),
diff --git a/core/modules/forum/config/optional/field.storage.node.comment_forum.yml b/core/modules/forum/config/optional/field.storage.node.comment_forum.yml
index df8d243..e97f26a 100644
--- a/core/modules/forum/config/optional/field.storage.node.comment_forum.yml
+++ b/core/modules/forum/config/optional/field.storage.node.comment_forum.yml
@@ -13,6 +13,7 @@ settings:
 module: comment
 locked: false
 cardinality: 1
+orderable: true
 translatable: true
 indexes: {  }
 persist_with_no_fields: false
diff --git a/core/modules/forum/config/optional/field.storage.node.taxonomy_forums.yml b/core/modules/forum/config/optional/field.storage.node.taxonomy_forums.yml
index f37ea9e..7b90165 100644
--- a/core/modules/forum/config/optional/field.storage.node.taxonomy_forums.yml
+++ b/core/modules/forum/config/optional/field.storage.node.taxonomy_forums.yml
@@ -13,6 +13,7 @@ settings:
 module: core
 locked: false
 cardinality: 1
+orderable: true
 translatable: true
 indexes: {  }
 persist_with_no_fields: false
diff --git a/core/modules/forum/config/optional/field.storage.taxonomy_term.forum_container.yml b/core/modules/forum/config/optional/field.storage.taxonomy_term.forum_container.yml
index 786e53d..da5ebec 100644
--- a/core/modules/forum/config/optional/field.storage.taxonomy_term.forum_container.yml
+++ b/core/modules/forum/config/optional/field.storage.taxonomy_term.forum_container.yml
@@ -11,6 +11,7 @@ settings: {  }
 module: core
 locked: true
 cardinality: 1
+orderable: true
 translatable: false
 indexes: {  }
 persist_with_no_fields: false
diff --git a/core/modules/node/config/install/field.storage.node.body.yml b/core/modules/node/config/install/field.storage.node.body.yml
index 73edd16..47a1a3b 100644
--- a/core/modules/node/config/install/field.storage.node.body.yml
+++ b/core/modules/node/config/install/field.storage.node.body.yml
@@ -12,6 +12,7 @@ settings: {  }
 module: text
 locked: false
 cardinality: 1
+orderable: true
 translatable: true
 indexes: {  }
 persist_with_no_fields: true
diff --git a/core/modules/options/tests/options_config_install_test/config/install/field.storage.node.field_options_float.yml b/core/modules/options/tests/options_config_install_test/config/install/field.storage.node.field_options_float.yml
index fc28fa1..1e6786b 100644
--- a/core/modules/options/tests/options_config_install_test/config/install/field.storage.node.field_options_float.yml
+++ b/core/modules/options/tests/options_config_install_test/config/install/field.storage.node.field_options_float.yml
@@ -20,6 +20,7 @@ settings:
 module: options
 locked: false
 cardinality: 1
+orderable: true
 translatable: true
 indexes: {  }
 persist_with_no_fields: false
diff --git a/core/modules/system/templates/field-multiple-value-form.html.twig b/core/modules/system/templates/field-multiple-value-form.html.twig
index 1108d6e..bcc7b89 100644
--- a/core/modules/system/templates/field-multiple-value-form.html.twig
+++ b/core/modules/system/templates/field-multiple-value-form.html.twig
@@ -1,7 +1,7 @@
 {#
 /**
  * @file
- * Default theme implementation for an individual form element.
+ * Theme override for an individual form element.
  *
  * Available variables for all fields:
  * - multiple: Whether there are multiple instances of the field.
@@ -11,21 +11,17 @@
  *
  * Available variables when there are multiple fields.
  * - table: Table of field items.
- * - description: The description element containing the following properties:
- *   - content: The description content of the form element.
- *   - attributes: HTML attributes to apply to the description container.
+ * - description: Description text for the form element.
  * - button: "Add another item" button.
  *
  * @see template_preprocess_field_multiple_value_form()
- *
- * @ingroup themeable
  */
 #}
 {% if multiple %}
   <div class="js-form-item form-item">
     {{ table }}
-    {% if description.content %}
-      <div{{ description.attributes.addClass('description') }} >{{ description.content }}</div>
+    {% if description %}
+      <div class="description">{{ description }}</div>
     {% endif %}
     {% if button %}
       <div class="clearfix">{{ button }}</div>
diff --git a/core/modules/system/templates/field-multiple-value-without-order-form.html.twig b/core/modules/system/templates/field-multiple-value-without-order-form.html.twig
new file mode 100644
index 0000000..673062d
--- /dev/null
+++ b/core/modules/system/templates/field-multiple-value-without-order-form.html.twig
@@ -0,0 +1,48 @@
+{#
+/**
+ * @file
+ * Default theme implementation for an individual form element.
+ *
+ * Available variables for all fields:
+ * - multiple: Whether there are multiple instances of the field.
+ *
+ * Available variables for single cardinality fields:
+ * - elements: Form elements to be rendered.
+ *
+ * Available variables when there are multiple fields.
+ * - table: Table of field items.
+ * - description: The description element containing the following properties:
+ *   - content: The description content of the form element.
+ *   - attributes: HTML attributes to apply to the description container.
+ * - button: "Add another item" button.
+ *
+ * @see template_preprocess_field_multiple_value_form()
+ *
+ * @ingroup themeable
+ */
+#}
+{%
+  set title_classes = [
+    'label',
+    required ? 'js-form-required',
+    required ? 'form-required',
+  ]
+%}
+{% if multiple %}
+  {% if title %}
+    <h4{{ title_attributes.addClass(title_classes) }}>{{ title }}</h4>
+  {% endif %}
+  <div class="js-form-item form-item">
+    {{ items }}
+    {% if description.content %}
+      <div{{ description.attributes.addClass('description') }} >{{ description.content }}</div>
+    {% endif %}
+    {% if button %}
+      <div class="clearfix">{{ button }}</div>
+    {% endif %}
+  </div>
+{% else %}
+  {% for element in elements %}
+    {{ element }}
+  {% endfor %}
+{% endif %}
diff --git a/core/profiles/standard/config/install/field.storage.node.comment.yml b/core/profiles/standard/config/install/field.storage.node.comment.yml
index c5eee2c..6b94161 100644
--- a/core/profiles/standard/config/install/field.storage.node.comment.yml
+++ b/core/profiles/standard/config/install/field.storage.node.comment.yml
@@ -13,6 +13,7 @@ settings:
 module: comment
 locked: false
 cardinality: 1
+orderable: true
 translatable: true
 indexes: {  }
 persist_with_no_fields: false
diff --git a/core/profiles/standard/config/install/field.storage.node.field_image.yml b/core/profiles/standard/config/install/field.storage.node.field_image.yml
index e4da708..58d8a06 100644
--- a/core/profiles/standard/config/install/field.storage.node.field_image.yml
+++ b/core/profiles/standard/config/install/field.storage.node.field_image.yml
@@ -23,6 +23,7 @@ settings:
 module: image
 locked: false
 cardinality: 1
+orderable: true
 translatable: true
 indexes:
   target_id:
diff --git a/core/profiles/standard/config/install/field.storage.node.field_tags.yml b/core/profiles/standard/config/install/field.storage.node.field_tags.yml
index 73f821f..5bba853 100644
--- a/core/profiles/standard/config/install/field.storage.node.field_tags.yml
+++ b/core/profiles/standard/config/install/field.storage.node.field_tags.yml
@@ -13,6 +13,7 @@ settings:
 module: core
 locked: false
 cardinality: -1
+orderable: true
 translatable: true
 indexes: {  }
 persist_with_no_fields: false
diff --git a/core/profiles/standard/config/install/field.storage.user.user_picture.yml b/core/profiles/standard/config/install/field.storage.user.user_picture.yml
index 8253628..12c4e85 100644
--- a/core/profiles/standard/config/install/field.storage.user.user_picture.yml
+++ b/core/profiles/standard/config/install/field.storage.user.user_picture.yml
@@ -23,6 +23,7 @@ settings:
 module: image
 locked: false
 cardinality: 1
+orderable: true
 translatable: true
 indexes:
   target_id:
diff --git a/core/themes/classy/templates/form/field-multiple-value-form.html.twig b/core/themes/classy/templates/form/field-multiple-value-form.html.twig
index 6ac2ddf..bcc7b89 100644
--- a/core/themes/classy/templates/form/field-multiple-value-form.html.twig
+++ b/core/themes/classy/templates/form/field-multiple-value-form.html.twig
@@ -11,9 +11,7 @@
  *
  * Available variables when there are multiple fields.
  * - table: Table of field items.
- * - description: The description element containing the following properties:
- *   - content: The description content of the form element.
- *   - attributes: HTML attributes to apply to the description container.
+ * - description: Description text for the form element.
  * - button: "Add another item" button.
  *
  * @see template_preprocess_field_multiple_value_form()
@@ -22,8 +20,8 @@
 {% if multiple %}
   <div class="js-form-item form-item">
     {{ table }}
-    {% if description.content %}
-      <div{{ description.attributes.addClass('description') }} >{{ description.content }}</div>
+    {% if description %}
+      <div class="description">{{ description }}</div>
     {% endif %}
     {% if button %}
       <div class="clearfix">{{ button }}</div>
diff --git a/core/themes/classy/templates/form/field-multiple-value-without-order-form.html.twig b/core/themes/classy/templates/form/field-multiple-value-without-order-form.html.twig
new file mode 100644
index 0000000..673062d
--- /dev/null
+++ b/core/themes/classy/templates/form/field-multiple-value-without-order-form.html.twig
@@ -0,0 +1,48 @@
+{#
+/**
+ * @file
+ * Default theme implementation for an individual form element.
+ *
+ * Available variables for all fields:
+ * - multiple: Whether there are multiple instances of the field.
+ *
+ * Available variables for single cardinality fields:
+ * - elements: Form elements to be rendered.
+ *
+ * Available variables when there are multiple fields.
+ * - table: Table of field items.
+ * - description: The description element containing the following properties:
+ *   - content: The description content of the form element.
+ *   - attributes: HTML attributes to apply to the description container.
+ * - button: "Add another item" button.
+ *
+ * @see template_preprocess_field_multiple_value_form()
+ *
+ * @ingroup themeable
+ */
+#}
+{%
+  set title_classes = [
+    'label',
+    required ? 'js-form-required',
+    required ? 'form-required',
+  ]
+%}
+{% if multiple %}
+  {% if title %}
+    <h4{{ title_attributes.addClass(title_classes) }}>{{ title }}</h4>
+  {% endif %}
+  <div class="js-form-item form-item">
+    {{ items }}
+    {% if description.content %}
+      <div{{ description.attributes.addClass('description') }} >{{ description.content }}</div>
+    {% endif %}
+    {% if button %}
+      <div class="clearfix">{{ button }}</div>
+    {% endif %}
+  </div>
+{% else %}
+  {% for element in elements %}
+    {{ element }}
+  {% endfor %}
+{% endif %}
