diff --git a/.hgpatchinfo/Appearance-MixedViewers.dep b/.hgpatchinfo/Appearance-MixedViewers.dep
new file mode 100644
index 0000000000000000000000000000000000000000..4c5ae37c8bbbb8852db3f8b81409402c0f059ded
--- /dev/null
+++ b/.hgpatchinfo/Appearance-MixedViewers.dep
@@ -0,0 +1 @@
+c5730f8d056e8f7a9f0a7416787ed9cb9bc77fc8
\ No newline at end of file
diff --git a/.hgpatchinfo/Appearance-MixedViewers.desc b/.hgpatchinfo/Appearance-MixedViewers.desc
new file mode 100644
index 0000000000000000000000000000000000000000..be6e017a7dbff0af6c85c6bb1399b240968e09f3
--- /dev/null
+++ b/.hgpatchinfo/Appearance-MixedViewers.desc
@@ -0,0 +1,4 @@
+[Appearance/MixedViewers]
+- fixed : "Worn items in Viewer 2 and Viewer 1.x aren't synchronized" (http://jira.secondlife.com/browse/VWR-17594)
+    -> current fix compares *only* the wearables in COF with the wearables specified by AgentWearablesUpdate
+- fixed : minor memory leak in LLInitialWearablesFetch::processWearablesMessage()
diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp
index 1edc96e1652200861bc4e909d2888b19d2a3cd9b..2bc18e0857fe847a7da0d649c897f3b1cd086116 100644
--- a/indra/newview/llagentwearablesfetch.cpp
+++ b/indra/newview/llagentwearablesfetch.cpp
@@ -119,8 +119,42 @@ void LLInitialWearablesFetch::processContents()
 	gInventory.collectDescendentsIf(mComplete.front(), cat_array, wearable_array, 
 									LLInventoryModel::EXCLUDE_TRASH, is_wearable);
 
+// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-05-18 (Catznip-2.1.2a) | Modified: Catznip-2.0.0h
+	// NOTE: don't use the current COF contents if 'wearable_array' is empty (ie first logon with 2.0 or some other problem)
+	bool fUpdateFromCOF = !wearable_array.empty();
+	if (fUpdateFromCOF)
+	{
+		LLAppearanceMgr::wearables_by_type_t items_by_type(LLWearableType::WT_COUNT);
+		LLAppearanceMgr::sortItemsByActualDescription(wearable_array);
+		LLAppearanceMgr::divvyWearablesByType(wearable_array, items_by_type);
+
+		// Compare the COF wearables against the initial wearables
+		for (initial_wearable_data_vec_t::const_iterator itWearableData = mAgentInitialWearables.begin();
+				(itWearableData != mAgentInitialWearables.end()) && (fUpdateFromCOF);  ++itWearableData)
+		{
+			const LLUUID& idItem = itWearableData->mItemID; bool fFound = false;
+
+			// TODO-Catznip: [SL-2.1.0] Bit of a hack until LL supports changing the descriptions of links
+			for (S32 idxItem = 0, cntItem = items_by_type[itWearableData->mType].size(); idxItem < cntItem; idxItem++)
+			{
+				const LLViewerInventoryItem* pCOFItem = items_by_type[itWearableData->mType].get(idxItem);
+				if (idItem == pCOFItem->getLinkedUUID())
+				{
+					fFound = true;
+					break;
+				}
+			}
+			if (!fFound)
+				fUpdateFromCOF = false;
+		}
+	}
+// [/SL:KB]
+
 	LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true);
-	if (wearable_array.count() > 0)
+//	if (wearable_array.count() > 0)
+// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-04-28 (Catznip-2.1.2a) | Modified: Catznip-2.0.0e
+	if (fUpdateFromCOF)
+// [/SL:KB]
 	{
 		gAgentWearables.notifyLoadingStarted();
 		LLAppearanceMgr::instance().updateAppearanceFromCOF();
@@ -147,7 +181,7 @@ public:
 	virtual void done()
 	{
 		gInventory.removeObserver(this);
-
+/*
 		// Link to all fetched items in COF.
 		LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
 		for (uuid_vec_t::iterator it = mIDs.begin();
@@ -170,7 +204,33 @@ public:
 								LLAssetType::AT_LINK,
 								link_waiter);
 		}
+*/
+// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-08-14 (Catznip-2.1.2a) | Added: Catznip-2.1.1d
+		doOnIdleOneTime(boost::bind(&LLFetchAndLinkObserver::doneIdle, this));
+// [/SL:KB]
+	}
+
+// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-04-02 (Catznip-2.1.2a) | Added: Catznip-2.0.0a
+	void doneIdle()
+	{
+		// NOTE: the code above makes the assumption that COF is empty which won't be the case the way it's used now
+		LLInventoryModel::item_array_t initial_items;
+		for (uuid_vec_t::iterator itItem = mIDs.begin(); itItem != mIDs.end(); ++itItem)
+		{
+			LLViewerInventoryItem* pItem = gInventory.getItem(*itItem);
+			if (!pItem)
+			{
+				llwarns << "fetch failed!" << llendl;
+				continue;
+			}
+			initial_items.push_back(pItem);
+		}
+
+		LLAppearanceMgr::instance().updateAppearanceFromInitialWearables(initial_items);
+
+		delete this;
 	}
+// [/SL:KB]
 };
 
 void LLInitialWearablesFetch::processWearablesMessage()
@@ -182,7 +242,11 @@ void LLInitialWearablesFetch::processWearablesMessage()
 		for (U8 i = 0; i < mAgentInitialWearables.size(); ++i)
 		{
 			// Populate the current outfit folder with links to the wearables passed in the message
-			InitialWearableData *wearable_data = new InitialWearableData(mAgentInitialWearables[i]); // This will be deleted in the callback.
+//			InitialWearableData *wearable_data = new InitialWearableData(mAgentInitialWearables[i]); // This will be deleted in the callback.
+// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-05-02 (Catznip-2.1.2a) | Added: Catznip-2.0.0f
+			// Fixes minor leak: since COF is used onInitialWearableAssetArrived() will never get called and "wearable_data" leaks
+			InitialWearableData* wearable_data = &mAgentInitialWearables[i];
+// [/SL:KB]
 			
 			if (wearable_data->mAssetID.notNull())
 			{
@@ -192,7 +256,7 @@ void LLInitialWearablesFetch::processWearablesMessage()
 			{
 				llinfos << "Invalid wearable, type " << wearable_data->mType << " itemID "
 				<< wearable_data->mItemID << " assetID " << wearable_data->mAssetID << llendl;
-				delete wearable_data;
+//				delete wearable_data;
 			}
 		}
 
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 7159d89d21d09b201e214794a6e4d9928977e5f2..467c8550c3d4a0e814015f2ce3fa4b4cae68d96c 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -1773,6 +1773,21 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering)
 	}
 }
 
+// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-04-02 (Catznip-2.1.2a) | Added: Catznip-2.0.0a
+void LLAppearanceMgr::updateAppearanceFromInitialWearables(LLInventoryModel::item_array_t& initial_items)
+{
+	const LLUUID& idCOF = getCOF();
+
+	// Remove current COF contents
+	purgeCategory(idCOF, false);
+	gInventory.notifyObservers();
+
+	// Create links to new COF contents
+	LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
+	linkAll(idCOF, initial_items, link_waiter);
+}
+// [/SL:KB]
+
 void LLAppearanceMgr::getDescendentsOfAssetType(const LLUUID& category,
 													LLInventoryModel::item_array_t& items,
 													LLAssetType::EType type,
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index c65d9dc9eeda8448d3c3042fb336a14d2d095fa4..99e7c56de7a30d58b075639accea5a9bb84e30b4 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -51,6 +51,9 @@ public:
 	typedef std::vector<LLInventoryModel::item_array_t> wearables_by_type_t;
 
 	void updateAppearanceFromCOF(bool update_base_outfit_ordering = false);
+// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-04-02 (Catznip-2.1.2a) | Added: Catznip-2.0.0a
+	void updateAppearanceFromInitialWearables(LLInventoryModel::item_array_t& initial_items);
+// [/SL:KB]
 	bool needToSaveCOF();
 	void updateCOF(const LLUUID& category, bool append = false);
 	void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append);