diff --git a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/requirejs-config.js b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/requirejs-config.js
index 18b88cddaab..c384e71b3b4 100644
--- a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/requirejs-config.js
+++ b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/requirejs-config.js
@@ -6,6 +6,12 @@ var config = {
             },
             'Magento_Checkout/js/view/shipping-information': {
                 'Magento_InventoryInStorePickupFrontend/js/view/shipping-information-ext': true
+            },
+            'Magento_Checkout/js/model/checkout-data-resolver': {
+                'Magento_InventoryInStorePickupFrontend/js/model/checkout-data-resolver-ext': true
+            },
+            'Magento_Checkout/js/checkout-data': {
+                'Magento_InventoryInStorePickupFrontend/js/checkout-data-ext': true
             }
         }
     }
diff --git a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/checkout-data-ext.js b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/checkout-data-ext.js
new file mode 100644
index 00000000000..06d69d7ff4e
--- /dev/null
+++ b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/checkout-data-ext.js
@@ -0,0 +1,57 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+define([
+    'Magento_Customer/js/customer-data'
+], function (
+    storage
+) {
+    'use strict';
+
+    return function (checkoutData) {
+
+        var cacheKey = 'checkout-data',
+
+            /**
+             * @param {Object} data
+             */
+            saveData = function (data) {
+                storage.set(cacheKey, data);
+            },
+
+            /**
+             * @return {Object}
+             */
+            getData = function () {
+                //Makes sure that checkout storage is initiated (any method can be used)
+                checkoutData.getSelectedShippingAddress();
+
+                return storage.get(cacheKey)();
+            };
+
+        /**
+         * Save the pickup address in persistence storage
+         *
+         * @param {Object} data
+         */
+        checkoutData.setSelectedPickupAddress = function (data) {
+            var obj = getData();
+
+            obj.selectedPickupAddress = data;
+            saveData(obj);
+        };
+
+        /**
+         * Get the pickup address from persistence storage
+         *
+         * @return {*}
+         */
+        checkoutData.getSelectedPickupAddress = function () {
+            return getData().selectedPickupAddress || null;
+        };
+
+        return checkoutData;
+    };
+});
\ No newline at end of file
diff --git a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/checkout-data-resolver-ext.js b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/checkout-data-resolver-ext.js
new file mode 100644
index 00000000000..4842562c82a
--- /dev/null
+++ b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/checkout-data-resolver-ext.js
@@ -0,0 +1,47 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+define([
+    'mage/utils/wrapper',
+    'Magento_Checkout/js/checkout-data',
+    'Magento_Checkout/js/action/select-shipping-address',
+    'Magento_Checkout/js/model/address-converter',
+    'Magento_InventoryInStorePickupFrontend/js/model/pickup-address-converter'
+], function (
+    wrapper,
+    checkoutData,
+    selectShippingAddress,
+    addressConverter,
+    pickupAddressConverter
+) {
+    'use strict';
+
+    return function (checkoutDataResolver) {
+        checkoutDataResolver.resolveShippingAddress = wrapper.wrapSuper(
+            checkoutDataResolver.resolveShippingAddress,
+            function () {
+                var shippingAddress,
+                    pickUpAddress;
+
+                if (checkoutData.getSelectedPickupAddress() && checkoutData.getSelectedShippingAddress()) {
+                    shippingAddress = addressConverter.formAddressDataToQuoteAddress(
+                        checkoutData.getSelectedPickupAddress()
+                    );
+                    pickUpAddress = pickupAddressConverter.formatAddressToPickupAddress(
+                        shippingAddress
+                    );
+
+                    if (pickUpAddress.getKey() === checkoutData.getSelectedShippingAddress()) {
+                        selectShippingAddress(shippingAddress);
+
+                        return;
+                    }
+                }
+                this._super();
+            });
+
+        return checkoutDataResolver;
+    };
+});
\ No newline at end of file
diff --git a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/pickup-address-converter.js b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/pickup-address-converter.js
index 4a251097421..d840448ccdf 100644
--- a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/pickup-address-converter.js
+++ b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/pickup-address-converter.js
@@ -17,6 +17,12 @@ define(['underscore'], function (_) {
                 'attribute_code': 'sourceCode'
             });
 
+            if (!sourceCode && !_.isEmpty(address.extensionAttributes)) {
+                sourceCode = {
+                    value: address.extensionAttributes['pickup_location_code']
+                };
+            }
+
             if (sourceCode && address.getType() !== 'store-pickup-address') {
                 address = _.extend({}, address, {
                     saveInAddressBook: 0,
diff --git a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/pickup-locations-service.js b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/pickup-locations-service.js
index 96711c42368..ac17d0e8d12 100644
--- a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/pickup-locations-service.js
+++ b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/pickup-locations-service.js
@@ -14,7 +14,8 @@ define([
     'Magento_Checkout/js/action/select-shipping-address',
     'underscore',
     'mage/translate',
-    'mage/url'
+    'mage/url',
+    'Magento_InventoryInStorePickupFrontend/js/model/pickup-address-converter'
 ], function (
     $,
     ko,
@@ -26,7 +27,8 @@ define([
     selectShippingAddressAction,
     _,
     $t,
-    url
+    url,
+    pickupAddressConverter
 ) {
     'use strict';
 
@@ -116,35 +118,19 @@ define([
                     'country_id': location['country_id'],
                     telephone: location.telephone,
                     'region_id': location['region_id'],
-                    'save_in_address_book': 0
-                }),
-                {
-                    /**
-                     * Is address can be used for billing
-                     *
-                     * @return {Boolean}
-                     */
-                    canUseForBilling: function () {
-                        return false;
-                    },
-
-                    /**
-                     * Returns address type
-                     *
-                     * @return {String}
-                     */
-                    getType: function () {
-                        return 'store-pickup-address';
-                    },
+                    'save_in_address_book': 0,
                     'extension_attributes': {
                         'pickup_location_code': location['pickup_location_code']
                     }
-                }
-            );
+                }));
 
+            address = pickupAddressConverter.formatAddressToPickupAddress(address);
             this.selectedLocation(location);
             selectShippingAddressAction(address);
             checkoutData.setSelectedShippingAddress(address.getKey());
+            checkoutData.setSelectedPickupAddress(
+                addressConverter.quoteAddressToFormAddressData(address)
+            );
         },
 
         /**
diff --git a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/quote-ext.js b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/quote-ext.js
index 995da7014db..6ea650b9060 100644
--- a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/quote-ext.js
+++ b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/model/quote-ext.js
@@ -12,6 +12,30 @@ define([
     return function (quote) {
         var shippingAddress = quote.shippingAddress;
 
+        /**
+         * Subscribe to shipping method before it is resolved in checkout-data-resolver.js
+         */
+        quote.shippingMethod.subscribe(
+            function () {
+                var shippingMethod = quote.shippingMethod(),
+                    pickUpAddress,
+                    isStorePickup = shippingMethod !== null &&
+                        shippingMethod['carrier_code'] === 'instore' &&
+                        shippingMethod['method_code'] === 'pickup';
+
+                if (quote.shippingAddress() &&
+                    quote.shippingAddress().getType() !== 'store-pickup-address' &&
+                    isStorePickup
+                ) {
+                    pickUpAddress = pickupAddressConverter.formatAddressToPickupAddress(quote.shippingAddress());
+
+                    if (quote.shippingAddress() !== pickUpAddress) {
+                        quote.shippingAddress(pickUpAddress);
+                    }
+                }
+            }
+        );
+
         /**
          * Makes sure that shipping address gets appropriate type when it points
          * to a store pickup location.
diff --git a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/view/store-pickup.js b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/view/store-pickup.js
index ecd905c0d31..0891457a0d2 100644
--- a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/view/store-pickup.js
+++ b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/view/store-pickup.js
@@ -16,7 +16,11 @@ define([
     'Magento_Checkout/js/model/step-navigator',
     'Magento_Checkout/js/model/shipping-rate-service',
     'Magento_InventoryInStorePickupFrontend/js/model/shipping-rate-processor/store-pickup-address',
-    'Magento_InventoryInStorePickupFrontend/js/model/pickup-locations-service'
+    'Magento_InventoryInStorePickupFrontend/js/model/pickup-locations-service',
+    'Magento_InventoryInStorePickupFrontend/js/model/pickup-address-converter',
+    'Magento_Checkout/js/model/checkout-data-resolver',
+    'Magento_Checkout/js/action/select-shipping-address',
+    'Magento_Customer/js/customer-data'
 ], function (
     Component,
     _,
@@ -30,7 +34,10 @@ define([
     stepNavigator,
     shippingRateService,
     shippingRateProcessor,
-    pickupLocationsService
+    pickupLocationsService,
+    pickupAddressConverter,
+    checkoutDataResolver,
+    selectShippingAddress
 ) {
     'use strict';
 
@@ -49,7 +56,8 @@ define([
             defaultCountry: window.checkoutConfig.defaultCountryId,
             delimiter: window.checkoutConfig.storePickupApiSearchTermDelimiter,
             rates: shippingService.getShippingRates(),
-            inStoreMethod: null
+            inStoreMethod: null,
+            lastSelectedNonPickUpShippingAddress: null
         },
 
         /**
@@ -60,9 +68,6 @@ define([
 
             shippingRateService.registerProcessor('store-pickup-address', shippingRateProcessor);
 
-            quote.shippingAddress.subscribe(function (shippingAddress) {
-                this.convertAddressType(shippingAddress);
-            }, this);
             this.convertAddressType(quote.shippingAddress());
 
             this.isStorePickupSelected.subscribe(function () {
@@ -124,17 +129,19 @@ define([
                     );
                 },
                 this
-            );
+                ),
+                nonPickupShippingAddress;
 
+            checkoutData.setSelectedShippingAddress(this.lastSelectedNonPickUpShippingAddress);
             this.selectShippingMethod(nonPickupShippingMethod);
 
-            registry.async('checkoutProvider')(function (checkoutProvider) {
-                checkoutProvider.set(
-                    'shippingAddress',
-                    quote.shippingAddress()
-                );
-                checkoutProvider.trigger('data.reset');
-            });
+            if (this.isStorePickupAddress(quote.shippingAddress())) {
+                nonPickupShippingAddress = checkoutDataResolver.getShippingAddressFromCustomerAddressList();
+
+                if (nonPickupShippingAddress) {
+                    selectShippingAddress(nonPickupShippingAddress);
+                }
+            }
         },
 
         /**
@@ -150,6 +157,8 @@ define([
                 this
             );
 
+            this.lastSelectedNonPickUpShippingAddress = checkoutData.getSelectedShippingAddress();
+            checkoutData.setSelectedShippingAddress(null);
             this.preselectLocation();
             this.selectShippingMethod(pickupShippingMethod);
         },
@@ -159,9 +168,7 @@ define([
          */
         selectShippingMethod: function (shippingMethod) {
             selectShippingMethodAction(shippingMethod);
-            checkoutData.setSelectedShippingAddress(
-                quote.shippingAddress().getKey()
-            );
+            checkoutData.setSelectedShippingRate(shippingMethod['carrier_code'] + '_' + shippingMethod['method_code']);
         },
 
         /**
@@ -169,31 +176,17 @@ define([
          * @returns void
          */
         convertAddressType: function (shippingAddress) {
+            var pickUpAddress;
+
             if (
                 !this.isStorePickupAddress(shippingAddress) &&
                 this.isStorePickupSelected()
             ) {
-                quote.shippingAddress(
-                    $.extend({}, shippingAddress, {
-                        /**
-                         * Is address can be used for billing
-                         *
-                         * @return {Boolean}
-                         */
-                        canUseForBilling: function () {
-                            return false;
-                        },
+                pickUpAddress = pickupAddressConverter.formatAddressToPickupAddress(shippingAddress);
 
-                        /**
-                         * Returns address type
-                         *
-                         * @return {String}
-                         */
-                        getType: function () {
-                            return 'store-pickup-address';
-                        }
-                    })
-                );
+                if (quote.shippingAddress() !== pickUpAddress) {
+                    quote.shippingAddress(pickUpAddress);
+                }
             }
         },
 
@@ -227,6 +220,12 @@ define([
                 'attribute_code': 'sourceCode'
             });
 
+            if (!selectedSourceCode && !_.isEmpty(shippingAddress.extensionAttributes)) {
+                selectedSourceCode = {
+                    value: shippingAddress.extensionAttributes['pickup_location_code']
+                };
+            }
+
             if (selectedSourceCode) {
                 pickupLocationsService
                     .getLocation(selectedSourceCode.value)
diff --git a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/view/store-selector.js b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/view/store-selector.js
index e27b08ab847..9cc036347fc 100644
--- a/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/view/store-selector.js
+++ b/vendor/magento/module-inventory-in-store-pickup-frontend/view/frontend/web/js/view/store-selector.js
@@ -14,8 +14,7 @@ define([
     'Magento_Checkout/js/model/step-navigator',
     'Magento_Checkout/js/model/address-converter',
     'Magento_Checkout/js/action/set-shipping-information',
-    'Magento_InventoryInStorePickupFrontend/js/model/pickup-locations-service',
-    'Magento_Checkout/js/checkout-data'
+    'Magento_InventoryInStorePickupFrontend/js/model/pickup-locations-service'
 ], function (
     $,
     _,
@@ -27,8 +26,7 @@ define([
     stepNavigator,
     addressConverter,
     setShippingInformationAction,
-    pickupLocationsService,
-    checkoutData
+    pickupLocationsService
 ) {
     'use strict';
 
@@ -92,11 +90,7 @@ define([
          * Set shipping information handler
          */
         setPickupInformation: function () {
-            var shippingAddress = quote.shippingAddress();
-
             if (this.validatePickupInformation()) {
-                shippingAddress = addressConverter.quoteAddressToFormAddressData(shippingAddress);
-                checkoutData.setShippingAddressFromData(shippingAddress);
                 setShippingInformationAction().done(function () {
                     stepNavigator.next();
                 });
