diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index bbbb4afb54071ef1bbea78a2a5371191718d2b6c..d7ba47c9f52111bf7e4811f30890788f094b7e98 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -765,7 +765,7 @@ void LLFolderView::removeSelectedItems()
 			}
 			else
 			{
-				LL_INFOS() << "Cannot delete " << item->getName() << LL_ENDL;
+				LL_DEBUGS() << "Cannot delete " << item->getName() << LL_ENDL;
 				return;
 			}
 		}
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index 551a60e097a1507273584d988b1bcca55ac461ab..0f115607909962105e3b1f52f2e8dd7c8545c372 100644
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -170,7 +170,7 @@ class LLFolderViewModelItem : public LLRefCount
 	virtual BOOL isItemMovable( void ) const = 0;		// Can be moved to another folder
 	virtual void move( LLFolderViewModelItem* parent_listener ) = 0;
 
-	virtual BOOL isItemRemovable( void ) const = 0;		// Can be destroyed
+	virtual BOOL isItemRemovable( bool check_worn = true ) const = 0;		// Can be destroyed
 	virtual BOOL removeItem() = 0;
 	virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch) = 0;
 
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 8010b84c204e49cbfd4ffbade59b5ae1f9bb950e..61b86d6a4a252ceaf240115f3a572f37c3e926e7 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -3176,6 +3176,7 @@ void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id, LLPointer<LLInve
 			{
 				// Immediate delete
 				remove_inventory_item(item->getUUID(), cb, true);
+				remove_inventory_item(item->getUUID(), cb, true);
 				gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
 			}
 			else
@@ -4117,7 +4118,7 @@ void LLAppearanceMgr::wearBaseOutfit()
 	updateCOF(base_outfit_id);
 }
 
-void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove)
+void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove, nullary_func_t post_update_func)
 {
 	LL_DEBUGS("UIUsage") << "removeItemsFromAvatar" << LL_ENDL;
 	LLUIUsage::instance().logCommand("Avatar.RemoveItem");
@@ -4127,7 +4128,7 @@ void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove)
 		LL_WARNS() << "called with empty list, nothing to do" << LL_ENDL;
 		return;
 	}
-	LLPointer<LLInventoryCallback> cb = new LLUpdateAppearanceOnDestroy;
+	LLPointer<LLInventoryCallback> cb = new LLUpdateAppearanceOnDestroy(true, true, post_update_func);
 	for (uuid_vec_t::const_iterator it = ids_to_remove.begin(); it != ids_to_remove.end(); ++it)
 	{
 		const LLUUID& id_to_remove = *it;
@@ -4146,11 +4147,11 @@ void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove)
 	}
 }
 
-void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove)
+void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove, nullary_func_t post_update_func)
 {
 	uuid_vec_t ids_to_remove;
 	ids_to_remove.push_back(id_to_remove);
-	removeItemsFromAvatar(ids_to_remove);
+	removeItemsFromAvatar(ids_to_remove, post_update_func);
 }
 
 
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 43839e47a647ebd00cb1f1029362cd17d164b817..80d6587ad37a75c5a4627e7dc1f5bfc25246f705 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -195,8 +195,8 @@ class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
 	bool updateBaseOutfit();
 
 	//Remove clothing or detach an object from the agent (a bodypart cannot be removed)
-	void removeItemsFromAvatar(const uuid_vec_t& item_ids);
-	void removeItemFromAvatar(const LLUUID& item_id);
+	void removeItemsFromAvatar(const uuid_vec_t& item_ids, nullary_func_t post_update_func = no_op);
+	void removeItemFromAvatar(const LLUUID& item_id, nullary_func_t post_update_func = no_op);
 
 
 	void onOutfitFolderCreated(const LLUUID& folder_id, bool show_panel);
diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index aa2ba752b76f756458c4d00e89aaa739d2aaee3a..b138db48b50a6e2fdcdb3d58b2760d8194113aa1 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -142,7 +142,7 @@ class CofAttachmentContextMenu : public CofContextMenu
 
 		registrar.add("Attachment.Touch", boost::bind(handleMultiple, handle_attachment_touch, mUUIDs));
 		registrar.add("Attachment.Edit", boost::bind(handleMultiple, handle_item_edit, mUUIDs));
-		registrar.add("Attachment.Detach", boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));
+		registrar.add("Attachment.Detach", boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs, no_op));
 
 		LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
 		enable_registrar.add("Attachment.OnEnable", boost::bind(&CofAttachmentContextMenu::onEnable, this, _2));
@@ -195,7 +195,7 @@ class CofClothingContextMenu : public CofContextMenu
 		LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
 		LLUUID selected_id = mUUIDs.back();
 
-		registrar.add("Clothing.TakeOff", boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));
+		registrar.add("Clothing.TakeOff", boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs, no_op));
 		registrar.add("Clothing.Replace", boost::bind(replaceWearable, selected_id));
 		registrar.add("Clothing.Edit", boost::bind(LLAgentWearables::editWearable, selected_id));
 		registrar.add("Clothing.Create", boost::bind(&CofClothingContextMenu::createNew, this, selected_id));
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index 3f607d434ec77e0d3cf7be6050745a7b91e55627..6b2fecdc613b63bb3cfc0bd388d10090ad04ba01 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -82,7 +82,7 @@ class LLConversationItem : public LLFolderViewModelItemCommon
 	virtual BOOL isItemRenameable() const { return TRUE; }
 	virtual BOOL renameItem(const std::string& new_name) { mName = new_name; mNeedsRefresh = true; return TRUE; }
 	virtual BOOL isItemMovable( void ) const { return FALSE; }
-	virtual BOOL isItemRemovable( void ) const { return FALSE; }
+	virtual BOOL isItemRemovable(bool check_worn = true) const { return FALSE; }
 	virtual BOOL isItemInTrash( void) const { return FALSE; }
 	virtual BOOL removeItem() { return FALSE; }
 	virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch) { }
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index c41a4c568658393698dc64362bfd0e614abf309a..4d7fc41ae351dfaab2f474737f592a92a9e4b5ba 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -309,9 +309,9 @@ void LLInvFVBridge::setCreationDate(time_t creation_date_utc)
 
 
 // Can be destroyed (or moved to trash)
-BOOL LLInvFVBridge::isItemRemovable() const
+BOOL LLInvFVBridge::isItemRemovable(bool check_worn) const
 {
-	return get_is_item_removable(getInventoryModel(), mUUID);
+	return get_is_item_removable(getInventoryModel(), mUUID, check_worn);
 }
 
 // Can be moved to another folder
@@ -1063,7 +1063,7 @@ void LLInvFVBridge::addDeleteContextMenuOptions(menuentry_vec_t &items,
 
 	items.push_back(std::string("Delete"));
 
-	if (!isItemRemovable() || isPanelActive("Favorite Items"))
+	if (!isItemRemovable(false) || isPanelActive("Favorite Items"))
 	{
 		disabled_items.push_back(std::string("Delete"));
 	}
@@ -2405,20 +2405,21 @@ void LLFolderBridge::update()
 class LLIsItemRemovable : public LLFolderViewFunctor
 {
 public:
-	LLIsItemRemovable() : mPassed(TRUE) {}
+	LLIsItemRemovable(bool check_worn = true) : mPassed(TRUE), mCheckWorn(check_worn) {}
 	virtual void doFolder(LLFolderViewFolder* folder)
 	{
-		mPassed &= folder->getViewModelItem()->isItemRemovable();
+		mPassed &= folder->getViewModelItem()->isItemRemovable(mCheckWorn);
 	}
 	virtual void doItem(LLFolderViewItem* item)
 	{
-		mPassed &= item->getViewModelItem()->isItemRemovable();
+		mPassed &= item->getViewModelItem()->isItemRemovable(mCheckWorn);
 	}
 	BOOL mPassed;
+    bool mCheckWorn;
 };
 
 // Can be destroyed (or moved to trash)
-BOOL LLFolderBridge::isItemRemovable() const
+BOOL LLFolderBridge::isItemRemovable(bool check_worn) const
 {
 	if (!get_is_category_removable(getInventoryModel(), mUUID))
 	{
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index decaee7db3cd5369005a236d6c0d28edd5b76d25..62e26b2f285e63f21aa9996d48a696116d95066e 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -114,7 +114,7 @@ class LLInvFVBridge : public LLFolderViewModelItemInventory
 	virtual BOOL isItemRenameable() const { return TRUE; }
 	virtual BOOL isMultiPreviewAllowed() { return TRUE; }
 	//virtual BOOL renameItem(const std::string& new_name) {}
-	virtual BOOL isItemRemovable() const;
+	virtual BOOL isItemRemovable(bool check_worn = true) const;
 	virtual BOOL isItemMovable() const;
 	virtual BOOL isItemInTrash() const;
     virtual bool isItemInOutfits() const;
@@ -321,7 +321,7 @@ class LLFolderBridge : public LLInvFVBridge
 							void* cargo_data,
 							std::string& tooltip_msg);
 
-	virtual BOOL isItemRemovable() const;
+	virtual BOOL isItemRemovable(bool check_worn = true) const;
 	virtual BOOL isItemMovable() const ;
 	virtual BOOL isUpToDate() const;
     virtual bool isItemCopyable(bool can_copy_as_link = true) const;
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 4aeacae6edc613d6d37f87758a815cdf85437252..109dffae6bc4150ed003860925f855c573df3d05 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -682,17 +682,17 @@ BOOL get_can_item_be_worn(const LLUUID& id)
 	return FALSE;
 }
 
-BOOL get_is_item_removable(const LLInventoryModel* model, const LLUUID& id)
+bool get_is_item_removable(const LLInventoryModel* model, const LLUUID& id, bool check_worn)
 {
 	if (!model)
 	{
-		return FALSE;
+		return false;
 	}
 
 	// Can't delete an item that's in the library.
 	if (!model->isObjectDescendentOf(id, gInventory.getRootFolderID()))
 	{
-		return FALSE;
+		return false;
 	}
 
 	// Disable delete from COF folder; have users explicitly choose "detach/take off",
@@ -701,20 +701,20 @@ BOOL get_is_item_removable(const LLInventoryModel* model, const LLUUID& id)
 	{
 		if (get_is_item_worn(id))
 		{
-			return FALSE;
+			return false;
 		}
 	}
 
 	const LLInventoryObject *obj = model->getItem(id);
 	if (obj && obj->getIsLinkType())
 	{
-		return TRUE;
+		return true;
 	}
-	if (get_is_item_worn(id))
+	if (check_worn && get_is_item_worn(id))
 	{
-		return FALSE;
+		return false;
 	}
-	return TRUE;
+	return true;
 }
 
 bool get_is_item_editable(const LLUUID& inv_item_id)
@@ -2759,7 +2759,7 @@ bool LLFindNonRemovableObjects::operator()(LLInventoryCategory* cat, LLInventory
 {
 	if (item)
 	{
-		return !get_is_item_removable(&gInventory, item->getUUID());
+		return !get_is_item_removable(&gInventory, item->getUUID(), true);
 	}
 	if (cat)
 	{
@@ -3024,6 +3024,8 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
 	{
 		const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
 		bool marketplacelistings_item = false;
+        bool worn_item = false;
+        bool needs_replacement = false;
 		LLAllDescendentsPassedFilter f;
 		for (std::set<LLFolderViewItem*>::iterator it = selected_items.begin(); (it != selected_items.end()) && (f.allDescendentsPassedFilter()); ++it)
 		{
@@ -3037,9 +3039,32 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
 				marketplacelistings_item = true;
 				break;
 			}
+            if (get_is_item_worn(viewModel->getUUID()))
+            {
+                worn_item = true;
+                LLWearableType::EType type = viewModel->getWearableType();
+                if (type == LLWearableType::WT_SHAPE
+                    || type == LLWearableType::WT_SKIN
+                    || type == LLWearableType::WT_HAIR
+                    || type == LLWearableType::WT_EYES)
+                {
+                    needs_replacement = true;
+                    break;
+                }
+            }
 		}
 		// Fall through to the generic confirmation if the user choose to ignore the specialized one
-		if ( (!f.allDescendentsPassedFilter()) && !marketplacelistings_item && (!LLNotifications::instance().getIgnored("DeleteFilteredItems")) )
+        if (needs_replacement)
+        {
+            LLNotificationsUtil::add("CantDeleteRequiredClothing");
+        }
+        else if (worn_item)
+        {
+            LLSD payload;
+            payload["has_worn"] = true;
+            LLNotificationsUtil::add("DeleteWornItems", LLSD(), payload, boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root->getHandle()));
+        }
+		else if ( (!f.allDescendentsPassedFilter()) && !marketplacelistings_item && (!LLNotifications::instance().getIgnored("DeleteFilteredItems")) )
 		{
 			LLNotificationsUtil::add("DeleteFilteredItems", LLSD(), LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root->getHandle()));
 		}
@@ -3356,17 +3381,55 @@ void LLInventoryAction::removeItemFromDND(LLFolderView* root)
         }
     }
 }
-
 void LLInventoryAction::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root)
 {
 	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0 && !root.isDead() && !root.get()->isDead())
 	{
+        bool has_worn = notification["payload"]["has_worn"].asBoolean();
 		LLFolderView* folder_root = root.get();
 		//Need to remove item from DND before item is removed from root folder view
 		//because once removed from root folder view the item is no longer a selected item
 		removeItemFromDND(folder_root);
-		folder_root->removeSelectedItems();
+
+        // removeSelectedItems will change selection, collect worn items beforehand
+        uuid_vec_t worn;
+        if (has_worn)
+        {
+            //Get selected items
+            LLFolderView::selected_items_t selectedItems = folder_root->getSelectedItems();
+
+            //If user is in DND and deletes item, make sure the notification is not displayed by removing the notification
+            //from DND history and .xml file. Once this is done, upon exit of DND mode the item deleted will not show a notification.
+            for (LLFolderView::selected_items_t::iterator it = selectedItems.begin(); it != selectedItems.end(); ++it)
+            {
+                LLObjectBridge* view_model = dynamic_cast<LLObjectBridge*>((*it)->getViewModelItem());
+
+                if (view_model && get_is_item_worn(view_model->getUUID()))
+                {
+                    worn.push_back(view_model->getUUID());
+                }
+            }
+        }
+
+        // removeSelectedItems will check if items are worn before deletion,
+        // don't 'unwear' yet to prevent a race condition from unwearing
+        // and removing simultaneously
+        folder_root->removeSelectedItems();
+
+        // unwear then delete the rest
+        if (!worn.empty())
+        {
+            // should fire once after every item gets detached
+            LLAppearanceMgr::instance().removeItemsFromAvatar(worn,
+                                                              [worn]()
+                                                              {
+                                                                  for (const LLUUID& id : worn)
+                                                                  {
+                                                                      remove_inventory_item(id, NULL);
+                                                                  }
+                                                              });
+        }
 
 		// Update the marketplace listings that have been affected by the operation
 		updateMarketplaceFolders();
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 925217dda35127572b62551eb090854b29f831dd..cac1d77f5e8b72e60d75db62a1897201d4716676 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -51,7 +51,7 @@ BOOL get_is_item_worn(const LLUUID& id);
 // Could this item be worn (correct type + not already being worn)
 BOOL get_can_item_be_worn(const LLUUID& id);
 
-BOOL get_is_item_removable(const LLInventoryModel* model, const LLUUID& id);
+bool get_is_item_removable(const LLInventoryModel* model, const LLUUID& id, bool check_worn);
 
 // Performs the appropiate edit action (if one exists) for this item
 bool get_is_item_editable(const LLUUID& inv_item_id);
diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp
index d4ca58f778ac61833d03e1645ae0adf04e7344d7..9074c8466aae14a2bc904a58332a3020ec6b1e60 100644
--- a/indra/newview/llinventorygallery.cpp
+++ b/indra/newview/llinventorygallery.cpp
@@ -1685,7 +1685,7 @@ BOOL LLInventoryGallery::canCut() const
                 return FALSE;
             }
         }
-        else if (!get_is_item_removable(&gInventory, id))
+        else if (!get_is_item_removable(&gInventory, id, true))
         {
             return FALSE;
         }
@@ -1880,7 +1880,7 @@ void LLInventoryGallery::onDelete(const LLSD& notification, const LLSD& response
             }
             else
             {
-                if (get_is_item_removable(&gInventory, id))
+                if (get_is_item_removable(&gInventory, id, true))
                 {
                     gInventory.removeItem(id);
                 }
@@ -1925,7 +1925,7 @@ bool LLInventoryGallery::canDeleteSelection()
                 return false;
             }
         }
-        else if (!get_is_item_removable(&gInventory, id))
+        else if (!get_is_item_removable(&gInventory, id, true))
         {
             return false;
         }
diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp
index 5f4b816b99b6715cc2be45fbe33ae68b40eef78d..50eefc7d2580b61c23d7eda003f04b58ffe5f226 100644
--- a/indra/newview/llinventorygallerymenu.cpp
+++ b/indra/newview/llinventorygallerymenu.cpp
@@ -577,7 +577,7 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
                 {
                     items.push_back(std::string("Delete"));
                 }
-                if(!get_is_item_removable(&gInventory, selected_id))
+                if(!get_is_item_removable(&gInventory, selected_id, true))
                 {
                     disabled_items.push_back(std::string("Delete"));
                     disabled_items.push_back(std::string("Cut"));
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index a3bbd00601447d2e57a39d7cd9617c8a28378d7c..922dccf7be22509caf3d6cc1790f175bbbe39411 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -129,7 +129,7 @@ class LLTaskInvFVBridge : public LLFolderViewModelItemInventory
 	virtual BOOL isItemRenameable() const;
 	virtual BOOL renameItem(const std::string& new_name);
 	virtual BOOL isItemMovable() const;
-	virtual BOOL isItemRemovable() const;
+	virtual BOOL isItemRemovable(bool check_worn = true) const;
 	virtual BOOL removeItem();
 	virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch);
 	virtual void move(LLFolderViewModelItem* parent_listener);	
@@ -335,7 +335,7 @@ BOOL LLTaskInvFVBridge::isItemMovable() const
 	return TRUE;
 }
 
-BOOL LLTaskInvFVBridge::isItemRemovable() const
+BOOL LLTaskInvFVBridge::isItemRemovable(bool check_worn) const
 {
 	const LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
 	if(object
@@ -587,7 +587,7 @@ class LLTaskCategoryBridge : public LLTaskInvFVBridge
 	virtual BOOL isItemRenameable() const;
 	// virtual BOOL isItemCopyable() const { return FALSE; }
 	virtual BOOL renameItem(const std::string& new_name);
-	virtual BOOL isItemRemovable() const;
+	virtual BOOL isItemRemovable(bool check_worn = true) const;
 	virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
 	virtual bool hasChildren() const;
 	virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
@@ -647,7 +647,7 @@ BOOL LLTaskCategoryBridge::renameItem(const std::string& new_name)
 	return FALSE;
 }
 
-BOOL LLTaskCategoryBridge::isItemRemovable() const
+BOOL LLTaskCategoryBridge::isItemRemovable(bool check_worn) const
 {
 	return FALSE;
 }
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index bfdb0fbc88ed61f4175875d1dc77e570d6f37f70..35eba16afe7d07da0fb8d6b33315dc39d1ff26ce 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -110,9 +110,9 @@ class LLWearingContextMenu : public LLListContextMenu
 		registrar.add("Wearing.EditOutfit", boost::bind(&edit_outfit));
 		registrar.add("Wearing.ShowOriginal", boost::bind(show_item_original, mUUIDs.front()));
 		registrar.add("Wearing.TakeOff",
-					  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));
+					  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs, no_op));
 		registrar.add("Wearing.Detach", 
-					  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));
+					  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs, no_op));
 		LLContextMenu* menu = createFromFile("menu_wearing_tab.xml");
 
 		updateMenuItemsVisibility(menu);
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index 948fe55e0dfd8ab2ba7ca109b82b9b8867a3f5ab..49c35c7ad517cb795be18153d3b4b7f09593bb29 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -925,17 +925,17 @@ LLContextMenu* LLWearableItemsList::ContextMenu::createMenu()
 	registrar.add("Wearable.CreateNew", boost::bind(createNewWearable, selected_id));
 	registrar.add("Wearable.ShowOriginal", boost::bind(show_item_original, selected_id));
 	registrar.add("Wearable.TakeOffDetach", 
-				  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids));
+				  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids, no_op));
 
 	// Register handlers for clothing.
 	registrar.add("Clothing.TakeOff", 
-				  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids));
+				  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids, no_op));
 
 	// Register handlers for body parts.
 
 	// Register handlers for attachments.
 	registrar.add("Attachment.Detach", 
-				  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids));
+				  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids, no_op));
 	registrar.add("Attachment.Touch", boost::bind(handle_attachment_touch, selected_id));
 	registrar.add("Attachment.Profile", boost::bind(show_item_profile, selected_id));
 	registrar.add("Object.Attach", boost::bind(LLViewerAttachMenu::attachObjects, ids, _2));
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index ac63786b15ad27fa2487c05e525ed4eec6934971..5115bcb27ffad83632a6bf61a556863409fe0ec8 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -6153,6 +6153,33 @@ Are you sure you want to delete them?
      notext="Cancel"
      yestext="OK"/>
   </notification>
+    
+  <notification
+   icon="alertmodal.tga"
+   name="DeleteWornItems"
+   type="alertmodal">
+    <unique/>
+Some item(s) you wish to delete are being worn on your avatar.
+Remove these items from your avatar?
+    <tag>confirm</tag>
+    <usetemplate
+     name="okcancelbuttons"
+     notext="Cancel"
+     yestext="Remove item(s) and delete"/>
+  </notification>
+    
+  <notification
+   icon="alertmodal.tga"
+   name="CantDeleteRequiredClothing"
+   type="alertmodal">
+    <unique/>
+Some item(s) you wish to delete are required clothing layers (skin, shape, hair, eyes).
+You must replace those layers before deleting them.
+    <tag>confirm</tag>
+    <usetemplate
+     name="okbutton"
+     yestext="OK"/>
+  </notification>
 
   <notification
    icon="alertmodal.tga"