diff --git a/src/Controller/HandlePdfController.php b/src/Controller/HandlePdfController.php
index 9a3fa0cb52c84fc46b053092dbd0ef9047331d58..c0382a8aeb06ae35d68e96fc45cd010e855270c8 100644
--- a/src/Controller/HandlePdfController.php
+++ b/src/Controller/HandlePdfController.php
@@ -141,8 +141,7 @@ class HandlePdfController extends ControllerBase {
 
     $mapped_fields = &$field_mapping['fields'];
     $image_data = &$field_mapping['images'];
-    foreach ($fields as $field) {
-      $pdf_key = $field->pdf_key->value;
+    foreach ($fields as $pdf_key => $field) {
       if ($context['sample']) {
         $mapped_fields[$pdf_key] = $pdf_key;
       }
diff --git a/src/Entity/FillPdfForm.php b/src/Entity/FillPdfForm.php
index 2d89e19358fcf4f96f6c6884e0cd7eb93a00a841..70977c063133f48e8acd8fcf570d878f3f96ed7c 100644
--- a/src/Entity/FillPdfForm.php
+++ b/src/Entity/FillPdfForm.php
@@ -169,7 +169,13 @@ class FillPdfForm extends ContentEntityBase implements FillPdfFormInterface {
       ->condition('fillpdf_form', $this->id())
       ->execute();
     $field_storage = \Drupal::entityTypeManager()->getStorage('fillpdf_form_field');
-    return $field_storage->loadMultiple($field_ids);
+    $fields = $field_storage->loadMultiple($field_ids);
+
+    $keyed_fields = [];
+    foreach ($fields as $field) {
+      $keyed_fields[$field->pdf_key->value] = $field;
+    }
+    return $keyed_fields;
   }
 
   /**
diff --git a/src/FillPdfFormInterface.php b/src/FillPdfFormInterface.php
index b5fbd9cc079134ce319f1948e2032c12b9a88f76..bdf8585f81f35c771735d114cd3cdbac7b5f95bb 100644
--- a/src/FillPdfFormInterface.php
+++ b/src/FillPdfFormInterface.php
@@ -13,7 +13,7 @@ interface FillPdfFormInterface extends ExportableContentEntityInterface {
    * Returns all FillPdfFormFields associated with this FillPdfForm.
    *
    * @return \Drupal\fillpdf\FillPdfFormFieldInterface[]
-   *   An array of FillPdfFormFields.
+   *   Associative array of FillPdfFormFields keyed by the pdf_key.
    */
   public function getFormFields();
 
diff --git a/src/Form/FillPdfFormForm.php b/src/Form/FillPdfFormForm.php
index 95e60718449241125893c5c649521bed23bf1594..832958abd5acbce3a321108b01c7718c97fa3a13 100644
--- a/src/Form/FillPdfFormForm.php
+++ b/src/Form/FillPdfFormForm.php
@@ -442,7 +442,7 @@ class FillPdfFormForm extends ContentEntityForm {
       $message[] = $this->t('Your previous field mappings have been transferred to the new PDF template you uploaded.');
 
       // Import previous form field values over new fields.
-      $non_matching_fields = $this->serializer->importFormFieldsByKey($existing_fields, $form_fields);
+      $non_matching_fields = $this->serializer->importFormFields($existing_fields, $form_fields);
       if (count($non_matching_fields)) {
         $message[] = $this->t("These keys couldn't be found in the new PDF:");
       }
diff --git a/src/Serializer.php b/src/Serializer.php
index 2c0d841bcabc89a1af8393c66e8ea01b49f8d576..002e3964e4ac1a246ba5f0e3afa13b73154a4c74 100644
--- a/src/Serializer.php
+++ b/src/Serializer.php
@@ -68,6 +68,9 @@ class Serializer implements SerializerInterface {
 
     foreach ($field_json as $normalized_field) {
       $field = $this->serializer->denormalize($normalized_field, 'Drupal\fillpdf\Entity\FillPdfFormField');
+      // @todo: Exported fields are now already keyed by PDF key. For now, we're
+      //   not using the array keys to remain compatible with previous exports,
+      //   but should do so that at some later point.
       $decoded_fields[$field->pdf_key->value] = $field;
     }
 
@@ -98,8 +101,8 @@ class Serializer implements SerializerInterface {
    */
   public function importFormFields(array $keyed_fields, array $existing_fields = []) {
     $existing_fields_by_key = [];
-    foreach ($existing_fields as $existing_field) {
-      $existing_fields_by_key[$existing_field->pdf_key->value] = $existing_field;
+    foreach ($existing_fields as $pdf_key => $existing_field) {
+      $existing_fields_by_key[$pdf_key] = $existing_field;
     }
 
     $existing_field_pdf_keys = array_keys($existing_fields_by_key);
@@ -125,15 +128,28 @@ class Serializer implements SerializerInterface {
   }
 
   /**
-   * {@inheritdoc}
+   * Overwrites empty new field values with previous existing values.
+   *
+   * @param \Drupal\fillpdf\FillPdfFormFieldInterface[] $form_fields
+   *   Associative array of saved FillPdfFormField objects keyed by entity ID.
+   * @param string[] $existing_fields
+   *   (optional) Array of existing PDF keys.
+   *
+   * @return string[]
+   *   Array of unmatched PDF keys.
+   *
+   * @deprecated in fillpdf:8.x-4.7 and will be removed from fillpdf:8.x-5.0.
+   *   Field lists are already keyed by pdf_key now, so rekeying them is
+   *   unnecessary. Use ::importFormFields instead.
+   * @see https://www.drupal.org/project/fillpdf/issues/3055097
+   * @see \Drupal\fillpdf\SerializerInterface::importFormFields()
    */
   public function importFormFieldsByKey(array $form_fields, array $existing_fields = []) {
-    // Key form fields by PDF key, then pass to ::importFormFields().
+    @trigger_error('SerializerInterface::importFormFieldsByKey() is deprecated in fillpdf:8.x-4.7 and will be removed before fillpdf:8.x-5.0. Use \Drupal\fillpdf\SerializerInterface::importFormFields() instead. See https://www.drupal.org/project/fillpdf/issues/3055097.', E_USER_DEPRECATED);
     $keyed_fields = [];
     foreach ($form_fields as $form_field) {
       $keyed_fields[$form_field->pdf_key->value] = $form_field;
     }
-
     return $this->importFormFields($keyed_fields, $existing_fields);
   }
 
diff --git a/src/SerializerInterface.php b/src/SerializerInterface.php
index 901b85db9eb488cd142ca3fbdad5544e803998bf..e4809d92634335dc0e62f95b49cca053a76b8c23 100644
--- a/src/SerializerInterface.php
+++ b/src/SerializerInterface.php
@@ -64,19 +64,4 @@ interface SerializerInterface {
    */
   public function importFormFields(array $keyed_fields, array $existing_fields = []);
 
-  /**
-   * Overwrites empty new field values with previous existing values.
-   *
-   * @param \Drupal\fillpdf\FillPdfFormFieldInterface[] $form_fields
-   *   Associative array of saved FillPdfFormField objects keyed by entity ID.
-   * @param string[] $existing_fields
-   *   (optional) Array of existing PDF keys.
-   *
-   * @return string[]
-   *   Array of unmatched PDF keys.
-   *
-   * @see \Drupal\fillpdf\SerializerInterface::importFormFields()
-   */
-  public function importFormFieldsByKey(array $form_fields, array $existing_fields = []);
-
 }
diff --git a/tests/src/Functional/FillPdfFormImportFormTest.php b/tests/src/Functional/FillPdfFormImportFormTest.php
index 3782d53fd14e1569bc35629ecc5e9afbab9dfa77..045bbcc4981739e6848c1dd86640d0916fbbde33 100644
--- a/tests/src/Functional/FillPdfFormImportFormTest.php
+++ b/tests/src/Functional/FillPdfFormImportFormTest.php
@@ -2,8 +2,6 @@
 
 namespace Drupal\Tests\fillpdf\Functional;
 
-use Drupal\fillpdf\Entity\FillPdfForm;
-use Drupal\fillpdf\Entity\FillPdfFormField;
 use Drupal\Tests\BrowserTestBase;
 use Drupal\Tests\fillpdf\Traits\TestFillPdfTrait;
 use Drupal\Core\Url;
@@ -63,9 +61,13 @@ class FillPdfFormImportFormTest extends BrowserTestBase {
     $this->drupalPostForm(Url::fromRoute('entity.fillpdf_form.edit_form', ['fillpdf_form' => $form2_id]), $edit, 'Save');
     $this->assertSession()->pageTextContains("FillPDF Form Duplicate of Test has been updated.");
 
-    // Import again and check the admin_title has been imported as well.
+    // Import again.
     $import_url = Url::fromRoute('entity.fillpdf_form.import_form', ['fillpdf_form' => $form2_id]);
     $this->drupalPostForm($import_url, ['code' => $code], 'Import');
+    // Check none of the mappings failed.
+    $this->assertSession()->pageTextContains('Successfully imported FillPDF form configuration and matching PDF field keys.');
+    $this->assertSession()->pageTextNotContains('but it does not exist on this form. Therefore, it was ignored.');
+    // Check the admin_title has been imported as well.
     $this->assertSession()->fieldValueEquals('admin_title[0][value]', 'Test');
     $this->assertSession()->fieldValueEquals('replacements[0][value]', 'y|Yes');
   }
diff --git a/tests/src/Functional/PdfPopulationTest.php b/tests/src/Functional/PdfPopulationTest.php
index ec2ac0ccdb17d93684af8fd9c36a171a3cd68c7d..2590efe1fff6925f08c1753ba289f6fd7aba8c35 100644
--- a/tests/src/Functional/PdfPopulationTest.php
+++ b/tests/src/Functional/PdfPopulationTest.php
@@ -157,8 +157,8 @@ class PdfPopulationTest extends FillPdfTestBase {
 
     // Get the field definitions from the actually created form and sort.
     $actual_keys = [];
-    foreach ($fillpdf_form->getFormFields() as $form_field) {
-      $actual_keys[] = $form_field->pdf_key->value;
+    foreach (array_keys($fillpdf_form->getFormFields()) as $pdf_key) {
+      $actual_keys[] = $pdf_key;
     }
     sort($actual_keys);
 
@@ -220,8 +220,8 @@ class PdfPopulationTest extends FillPdfTestBase {
    *   Array of FillPdfFormFields.
    */
   protected function mapFillPdfFieldsToNodeFields(array $fields) {
-    foreach ($fields as $field) {
-      switch ($field->pdf_key->value) {
+    foreach ($fields as $pdf_key => $field) {
+      switch ($pdf_key) {
         case 'ImageField':
         case 'Button2':
           $field->value = '[node:field_fillpdf_test_image]';
diff --git a/tests/src/Functional/PdfWebformPopulationTest.php b/tests/src/Functional/PdfWebformPopulationTest.php
index 629a7d72690ab193f8d73e803c24fa5d47c374fe..9ad698bc1bd21694f82f4cce89a8e5025ace0479 100644
--- a/tests/src/Functional/PdfWebformPopulationTest.php
+++ b/tests/src/Functional/PdfWebformPopulationTest.php
@@ -151,8 +151,8 @@ class PdfWebformPopulationTest extends FillPdfTestBase {
    *   Array of FillPdfFormFields.
    */
   protected function mapFillPdfFieldsToWebformFields(array $fields) {
-    foreach ($fields as $field) {
-      switch ($field->pdf_key->value) {
+    foreach ($fields as $pdf_key => $field) {
+      switch ($pdf_key) {
         case 'ImageField':
           $field->value = '[webform_submission:values:image]';
           break;