diff --git a/modules/order/src/AddressBook.php b/modules/order/src/AddressBook.php
index 55155813..1e124445 100644
--- a/modules/order/src/AddressBook.php
+++ b/modules/order/src/AddressBook.php
@@ -97,23 +97,30 @@ class AddressBook implements AddressBookInterface {
       return;
     }
 
-    if ($this->allowsMultiple($profile->bundle())) {
-      $address_book_profile = $profile->createDuplicate();
-      $address_book_profile->setOwnerId($customer->id());
-      $address_book_profile->unsetData('copy_to_address_book');
-      $address_book_profile->save();
+    // Check if there is an existing address book profile to update.
+    // This can happen in two scenarios:
+    // 1) The profile was already copied to the address book once.
+    // 2) The customer is only allowed to have a single address book profile.
+    $address_book_profile = NULL;
+    $address_book_profile_id = $profile->getData('address_book_profile_id');
+    if ($address_book_profile_id) {
+      /** @var \Drupal\profile\Entity\ProfileInterface $address_book_profile */
+      $address_book_profile = $this->profileStorage->load($address_book_profile_id);
     }
-    else {
+    if (!$address_book_profile && !$this->allowsMultiple($profile->bundle())) {
       $address_book_profile = $this->profileStorage->loadDefaultByUser($customer, $profile->bundle());
-      if (!$address_book_profile) {
-        $address_book_profile = $this->profileStorage->create([
-          'type' => $profile->bundle(),
-          'uid' => $customer->id(),
-        ]);
-      }
+    }
+
+    if ($address_book_profile) {
       $address_book_profile->populateFromProfile($profile);
       $address_book_profile->save();
     }
+    else {
+      $address_book_profile = $profile->createDuplicate();
+      $address_book_profile->setOwnerId($customer->id());
+      $address_book_profile->unsetData('copy_to_address_book');
+      $address_book_profile->save();
+    }
 
     $profile->unsetData('copy_to_address_book');
     $profile->setData('address_book_profile_id', $address_book_profile->id());
diff --git a/modules/order/src/AddressBookInterface.php b/modules/order/src/AddressBookInterface.php
index e698348f..42b082b0 100644
--- a/modules/order/src/AddressBookInterface.php
+++ b/modules/order/src/AddressBookInterface.php
@@ -88,9 +88,12 @@ interface AddressBookInterface {
    * Copies the profile to the customer's address book.
    *
    * If the customer is allowed to have multiple profiles of this type,
-   * the given profile is duplicated and assigned to them.
-   * Otherwise, the default profile is loaded (created if missing),
-   * and then updated with values from the given profile.
+   * the given profile will be duplicated and assigned to them.
+   * If the given profile was already copied to the customer's address book
+   * once, the matching address book profile will be updated instead.
+   *
+   * If the customer is only allowed to have a single profile of this type,
+   * the default profile will be loaded (created if missing) and updated.
    *
    * @param \Drupal\profile\Entity\ProfileInterface $profile
    *   The profile.
diff --git a/modules/order/tests/src/Kernel/AddressBookTest.php b/modules/order/tests/src/Kernel/AddressBookTest.php
index 87466231..81885038 100644
--- a/modules/order/tests/src/Kernel/AddressBookTest.php
+++ b/modules/order/tests/src/Kernel/AddressBookTest.php
@@ -181,6 +181,24 @@ class AddressBookTest extends CommerceKernelTestBase {
     $this->orderProfile = $this->reloadEntity($this->orderProfile);
     $this->assertNull($this->orderProfile->getData('copy_to_address_book'));
     $this->assertEquals($new_profile->id(), $this->orderProfile->getData('address_book_profile_id'));
+
+    // Confirm that copying the profile again updates the address book profile.
+    $order_address = [
+      'country_code' => 'US',
+      'postal_code' => '53177',
+      'locality' => 'Milwaukee',
+      'address_line1' => 'Pabst Blue Ribbon Dr',
+      'administrative_area' => 'WI',
+      'given_name' => 'Frederick',
+      'family_name' => 'Pabst Jr.',
+    ];
+    $this->orderProfile->set('address', $order_address);
+    $this->orderProfile->save();
+    $this->addressBook->copy($this->orderProfile, $this->user);
+    $new_profile = $this->reloadEntity($new_profile);
+    $this->assertEquals($order_address, array_filter($new_profile->get('address')->first()->getValue()));
+    $non_expected_profile = Profile::load(4);
+    $this->assertEmpty($non_expected_profile);
   }
 
   /**
