diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestFieldMethodInvocationOrder.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestFieldMethodInvocationOrder.php
new file mode 100644
index 0000000..3db79e1
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestFieldMethodInvocationOrder.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Drupal\entity_test\Entity;
+
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Field\BaseFieldDefinition;
+
+/**
+ * Defines the test entity class.
+ *
+ * @ContentEntityType(
+ *   id = "entity_test_field_methods",
+ *   label = @Translation("Test entity - data table"),
+ *   handlers = {
+ *     "view_builder" = "Drupal\entity_test\EntityTestViewBuilder",
+ *     "access" = "Drupal\entity_test\EntityTestAccessControlHandler",
+ *     "form" = {
+ *       "default" = "Drupal\entity_test\EntityTestForm",
+ *       "delete" = "Drupal\entity_test\EntityTestDeleteForm"
+ *     },
+ *     "route_provider" = {
+ *       "html" = "Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider",
+ *     },
+ *     "translation" = "Drupal\content_translation\ContentTranslationHandler",
+ *     "views_data" = "Drupal\views\EntityViewsData"
+ *   },
+ *   base_table = "entity_test_field_methods",
+ *   data_table = "entity_test_field_methods_property",
+ *   translatable = TRUE,
+ *   entity_keys = {
+ *     "id" = "id",
+ *     "uuid" = "uuid",
+ *     "bundle" = "type",
+ *     "label" = "name",
+ *     "langcode" = "langcode"
+ *   },
+ *   links = {
+ *     "add-form" = "/entity_test_field_methods/add",
+ *     "canonical" = "/entity_test_field_methods/manage/{entity_test_field_methods}",
+ *     "edit-form" = "/entity_test_field_methods/manage/{entity_test_field_methods}/edit",
+ *     "delete-form" = "/entity_test_field_methods/delete/entity_test_field_methods/{entity_test_field_methods}",
+ *   },
+ *   field_ui_base_route = "entity.entity_test_field_methods.admin_form",
+ * )
+ */
+class EntityTestFieldMethods extends EntityTestMul {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
+    $fields = parent::baseFieldDefinitions($entity_type);
+
+    $fields['test_invocation_order'] = BaseFieldDefinition::create('auto_incrementing_test')
+      ->setLabel(t('Test field method invocation order.'))
+      ->setTranslatable(TRUE);
+
+    return $fields;
+  }
+
+}
diff --git a/core/modules/system/tests/modules/entity_test/src/Plugin/Field/FieldType/AutoIncrementingTestItem.php b/core/modules/system/tests/modules/entity_test/src/Plugin/Field/FieldType/AutoIncrementingTestItem.php
new file mode 100644
index 0000000..3c5121d
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test/src/Plugin/Field/FieldType/AutoIncrementingTestItem.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Drupal\entity_test\Plugin\Field\FieldType;
+
+use Drupal\Core\Field\Plugin\Field\FieldType\IntegerItem;
+
+/**
+ * Defines the 'field_method_invocation_order_test' entity field type.
+ *
+ * @FieldType(
+ *   id = "auto_incrementing_test",
+ *   label = @Translation("Auto incrementing test field item"),
+ *   description = @Translation("An entity field designed to test the field method invocation order."),
+ *   category = @Translation("Number"),
+ *   no_ui = TRUE,
+ * )
+ */
+class AutoIncrementingTestItem extends IntegerItem {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function preSave() {
+    parent::preSave();
+    $this->value = static::getIncrementedFieldValue();
+  }
+
+  /**
+   * Gets an incremented field value.
+   * 
+   * @return int
+   *   The incremented field value.
+   */
+  private static function getIncrementedFieldValue() {
+    $current_value = &drupal_static(__METHOD__, 0);
+    return ++$current_value;
+  }
+
+}
diff --git a/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityFieldMethodInvocationOrderTest.php b/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityFieldMethodInvocationOrderTest.php
new file mode 100644
index 0000000..5e25c90
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityFieldMethodInvocationOrderTest.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Drupal\KernelTests\Core\Entity;
+
+use Drupal\language\Entity\ConfigurableLanguage;
+
+/**
+ * Tests correct field method invocation order.
+ *
+ * @group Entity
+ */
+class ContentEntityFieldMethodInvocationOrderTest extends EntityKernelTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['language', 'system', 'entity_test'];
+
+  /**
+   * The EntityTest entity type storage.
+   *
+   * @var \Drupal\Core\Entity\ContentEntityStorageInterface
+   */
+  protected $entityTestFieldMethodsStorage;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Enable an additional language.
+    ConfigurableLanguage::createFromLangcode('de')->save();
+    ConfigurableLanguage::createFromLangcode('fr')->save();
+
+    $this->installEntitySchema('entity_test_field_methods');
+
+    $this->entityTestFieldMethodsStorage = $this->entityManager->getStorage('entity_test_field_methods');
+  }
+
+  /**
+   * Tests correct field method invocation order.
+   */
+  public function testFieldMethodInvocationOrder() {
+
+    // Create a test entity.
+    $entity = $this->entityTestFieldMethodsStorage->create([
+      'name' => $this->randomString(),
+      'langcode' => 'de',
+    ]);
+    $entity->save();
+
+    $entity->addTranslation('fr')
+      ->save();
+
+    // Reset the current value of the test field.
+    foreach (['de', 'fr'] as $langcode) {
+      $entity->getTranslation($langcode)->test_invocation_order->value = 0;
+    }
+    $entity->getTranslation('de')
+      ->save();
+    $this->assertTrue($entity->getTranslation('fr')->test_invocation_order->value > $entity->getTranslation('de')->test_invocation_order->value, 'The field presave method has been invoked in the correct entity translation order.');
+
+    // Reset the current value of the test field.
+    foreach (['de', 'fr'] as $langcode) {
+      $entity->getTranslation($langcode)->test_invocation_order->value = 0;
+    }
+    $entity->getTranslation('fr')
+      ->save();
+    $this->assertTrue($entity->getTranslation('de')->test_invocation_order->value > $entity->getTranslation('fr')->test_invocation_order->value, 'The field presave method has been invoked in the correct entity translation order.');
+  }
+
+}
