diff --git a/frontend/src/metabase/query_builder/actions.js b/frontend/src/metabase/query_builder/actions.js
index 9bc1d769b6a914f252739cf215bab36c481a6efa..b7b755ee9eb82c5684a918e07c9258dd7a7db459 100644
--- a/frontend/src/metabase/query_builder/actions.js
+++ b/frontend/src/metabase/query_builder/actions.js
@@ -164,15 +164,15 @@ export const initializeQB = createThunkAction(INITIALIZE_QB, (location, params)
                 card = serializedCard ? deserializeCardFromUrl(serializedCard) : {}
 
                 // load the card either from `cardId` parameter or the serialized card
-                const cardId = params.cardId || card.id
-                if (cardId) {
-                    const loadedCard = await loadCard(cardId);
-
+                if (params.cardId) {
+                    card = await loadCard(params.cardId);
                     // when we are loading from a card id we want an explicit clone of the card we loaded which is unmodified
-                    originalCard = Utils.copy(loadedCard);
-
-                    // the serialized card often differs from the card stored in db so merge the properties to fetched card if needed
-                    card = {...loadedCard, ...card};
+                    originalCard = Utils.copy(card);
+                } else if (card.id) {
+                    // deserialized card contains the card id, so just populate originalCard
+                    originalCard = await loadCard(card.id);
+                    // strip the card id from the deserialized card so that we have a correct url and show lineage correctly
+                    card = _.omit(card, "id");
                 }
 
                 MetabaseAnalytics.trackEvent("QueryBuilder", "Query Loaded", card.dataset_query.type);