diff --git a/core/lib/Drupal/Core/Entity/ContentEntityNullStorage.php b/core/lib/Drupal/Core/Entity/ContentEntityNullStorage.php
index 429d185..fa01005 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityNullStorage.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityNullStorage.php
@@ -140,6 +140,13 @@ public function countFieldData($storage_definition, $as_bool = FALSE) {
   /**
    * {@inheritdoc}
    */
+  public function getHighestDelta($storage_definition) {
+    return 0;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function hasData() {
     return FALSE;
   }
diff --git a/core/lib/Drupal/Core/Entity/FieldableEntityStorageInterface.php b/core/lib/Drupal/Core/Entity/FieldableEntityStorageInterface.php
index 80fbf61..240c3c1 100644
--- a/core/lib/Drupal/Core/Entity/FieldableEntityStorageInterface.php
+++ b/core/lib/Drupal/Core/Entity/FieldableEntityStorageInterface.php
@@ -29,4 +29,14 @@
    */
   public function countFieldData($storage_definition, $as_bool = FALSE);
 
+  /**
+   * Get the highest delta for a field.
+   *
+   * @param \Drupal\Core\Field\FieldStorageDefinitionInterface $storage_definition
+   *   The field for which to count data records.
+   *
+   * @return int
+   *   The highest delta for this field.
+   */
+  public function getHighestDelta($storage_definition);
 }
diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
index e1283be..c683819 100644
--- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
+++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
@@ -1688,6 +1688,49 @@ public function countFieldData($storage_definition, $as_bool = FALSE) {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function getHighestDelta($storage_definition) {
+    $table_mapping = $this->getTableMapping();
+
+    if ($table_mapping->requiresDedicatedTableStorage($storage_definition)) {
+      $is_deleted = $this->storageDefinitionIsDeleted($storage_definition);
+      if ($this->entityType->isRevisionable()) {
+        $table_name = $table_mapping->getDedicatedRevisionTableName($storage_definition, $is_deleted);
+      }
+      else {
+        $table_name = $table_mapping->getDedicatedDataTableName($storage_definition, $is_deleted);
+      }
+      $query = $this->database->select($table_name, 't');
+      $query->addExpression('MAX(delta)');
+    }
+    elseif ($table_mapping->allowsSharedTableStorage($storage_definition)) {
+      // Ascertain the table this field is mapped too.
+      $field_name = $storage_definition->getName();
+      try {
+        $table_name = $table_mapping->getFieldTableName($field_name);
+      }
+      catch (SqlContentEntityStorageException $e) {
+        // This may happen when changing field storage schema, since we are not
+        // able to use a table mapping matching the passed storage definition.
+        // @todo Revisit this once we are able to instantiate the table mapping
+        //   properly. See https://www.drupal.org/node/2274017.
+        $table_name = $this->dataTable ?: $this->baseTable;
+      }
+      $query = $this->database->select($table_name, 't');
+      $query->addExpression('MAX(delta)');
+    }
+
+    // @todo Find a way to get field data also for fields having custom
+    //   storage. See https://www.drupal.org/node/2337753.
+    $delta = 0;
+    if (isset($query)) {
+      $delta = $query->execute()->fetchField();
+    }
+    return $delta;
+  }
+
+  /**
    * Determines whether the passed field has been already deleted.
    *
    * @param \Drupal\Core\Field\FieldStorageDefinitionInterface $storage_definition
diff --git a/core/modules/field/src/Entity/FieldStorageConfig.php b/core/modules/field/src/Entity/FieldStorageConfig.php
index 5fff1aa..f6cbc0e 100644
--- a/core/modules/field/src/Entity/FieldStorageConfig.php
+++ b/core/modules/field/src/Entity/FieldStorageConfig.php
@@ -691,6 +691,16 @@ public function hasData() {
   }
 
   /**
+   * Determines the highest delta for a field.
+   *
+   * @return int
+   *   The highest delta.
+   */
+  public function getHighestDelta() {
+    return \Drupal::entityManager()->getStorage($this->entity_type)->getHighestDelta($this, TRUE);
+  }
+
+  /**
    * Implements the magic __sleep() method.
    *
    * Using the Serialize interface and serialize() / unserialize() methods
diff --git a/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php b/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php
index adafcc7..bd6ec31 100644
--- a/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php
+++ b/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php
@@ -153,6 +153,16 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
     if ($form_state->getValue('cardinality') === 'number' && !$form_state->getValue('cardinality_number')) {
       $form_state->setErrorByName('cardinality_number', $this->t('Number of values is required.'));
     }
+
+    // Validate number and current highest delta for this field.
+    if ($form_state->getValue('cardinality') != FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) {
+      $highest_delta = $this->entity->getHighestDelta();
+      // Delta starts from 0.
+      $highest_delta++;
+      if ($$highest_delta > $form_state->getValue('cardinality_number')) {
+        $form_state->setErrorByName('cardinality_number', $this->t('You can not set the cardinality lower than @delta', array('@delta' => $this->entity->getHighestDelta())));
+      }
+    }
   }
 
   /**
diff --git a/core/modules/field_ui/src/Tests/ManageFieldsTest.php b/core/modules/field_ui/src/Tests/ManageFieldsTest.php
index f1db4d4..b1fd7b0 100644
--- a/core/modules/field_ui/src/Tests/ManageFieldsTest.php
+++ b/core/modules/field_ui/src/Tests/ManageFieldsTest.php
@@ -271,6 +271,23 @@ function cardinalitySettings() {
     $this->assertLink(t('Field settings'));
     $this->assertLinkByHref($field_edit_path);
 
+    // Add two entries in the body.
+    $edit = array('title[0][value]' => 'Cardinality', 'body[0][value]' => 'Body 1', 'body[1][value]' => 'Body 2');
+    $this->drupalPostForm('node/add/article', $edit, 'Save');
+    $parts = explode('/', $this->getUrl());
+    $nid = array_pop($parts);
+
+    // Assert that you can't set the cardinality to a lower number then the
+    // highest delta of this field.
+    $edit = array(
+      'cardinality' => 'number',
+      'cardinality_number' => 1,
+    );
+    $this->drupalPostForm($field_edit_path, $edit, t('Save field settings'));
+    $this->assertText('You can not set the cardinality lower than 2');
+    $this->drupalPostForm('node/' . $nid . '/edit', array(), 'Save');
+    $this->assertText('Body 2');
+
     // Set to unlimited.
     $edit = array(
       'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
@@ -280,6 +297,19 @@ function cardinalitySettings() {
     $this->drupalGet($field_edit_path);
     $this->assertFieldByXPath("//select[@name='cardinality']", FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
     $this->assertFieldByXPath("//input[@name='cardinality_number']", 1);
+
+    $edit = array('title[0][value]' => 'Cardinality', 'body[0][value]' => 'Body 1', 'body[1][value]' => 'Body 2');
+    $this->drupalPostForm('node/' . $nid . '/edit', $edit, 'Save');
+    // Assert that you can't set the cardinality to a lower number then the
+    // highest delta of this field.
+    $edit = array(
+      'cardinality' => 'number',
+      'cardinality_number' => 1,
+    );
+    $this->drupalPostForm($field_edit_path, $edit, t('Save field settings'));
+    $this->assertText('You can not set the cardinality lower than 2');
+    $this->drupalPostForm('node/' . $nid . '/edit', array(), 'Save');
+    $this->assertText('Body 2');
   }
 
   /**
