diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index fc4be98fbd46ed01bc812c58e76fe3a6c3f3c2cb..046e8290705a1d2ee50df9dd87b145b6c359a4c0 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -1227,11 +1227,12 @@ void LLWearableHoldingPattern::onWearableAssetFetch(LLViewerWearable *wearable)
 		return;
 	}
 
+	U32 use_count = 0;
 	for (LLWearableHoldingPattern::found_list_t::iterator iter = getFoundList().begin();
-		 iter != getFoundList().end(); ++iter)
+		iter != getFoundList().end(); ++iter)
 	{
 		LLFoundData& data = *iter;
-		if(wearable->getAssetID() == data.mAssetID)
+		if (wearable->getAssetID() == data.mAssetID)
 		{
 			// Failing this means inventory or asset server are corrupted in a way we don't handle.
 			if ((data.mWearableType >= LLWearableType::WT_COUNT) || (wearable->getType() != data.mWearableType))
@@ -1240,9 +1241,45 @@ void LLWearableHoldingPattern::onWearableAssetFetch(LLViewerWearable *wearable)
 				break;
 			}
 
-			data.mWearable = wearable;
+			if (use_count == 0)
+			{
+				data.mWearable = wearable;
+				use_count++;
+			}
+			else if (wearable->getPermissions().allowModifyBy(gAgent.getID()))
+			{
+				// We can't edit and do some other interactions with same asset twice, copy it
+				LLViewerWearable* new_wearable = LLWearableList::instance().createCopy(wearable, wearable->getName());
+				data.mWearable = new_wearable;
+				data.mAssetID = new_wearable->getAssetID();
+
+				LLViewerInventoryItem* item = gInventory.getItem(data.mItemID);
+				if (item)
+				{
+					// Update existing inventory item
+					item->setAssetUUID(new_wearable->getAssetID());
+					item->setTransactionID(new_wearable->getTransactionID());
+					gInventory.updateItem(item, LLInventoryObserver::INTERNAL);
+					item->updateServer(FALSE);
+				}
+				use_count++;
+			}
+			else
+			{
+				// Note: technically a bug, LLViewerWearable can identify only one item id at a time,
+				// yet we are tying it to multiple items here.
+				// LLViewerWearable need to support more then one item.
+				LL_WARNS() << "Same LLViewerWearable is used by multiple items! " << wearable->getAssetID() << LL_ENDL;
+				data.mWearable = wearable;
+			}
 		}
 	}
+
+	if (use_count > 1)
+	{
+		LL_WARNS() << "Copying wearable, multiple asset id uses! " << wearable->getAssetID() << LL_ENDL;
+		gInventory.notifyObservers();
+	}
 }
 
 static void onWearableAssetFetch(LLViewerWearable* wearable, void* data)