diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index f278fb6a7b767fcfc8f119af6fa915a30b619d7d..d83706de5228812ec9628b4c3cf648d7cd91351d 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -281,7 +281,11 @@ LLCOFWearables::LLCOFWearables() : LLPanel(),
 	mAttachments(NULL),
 	mClothing(NULL),
 	mBodyParts(NULL),
-	mLastSelectedList(NULL)
+	mLastSelectedList(NULL),
+	mClothingTab(NULL),
+	mAttachmentsTab(NULL),
+	mBodyPartsTab(NULL),
+	mLastSelectedTab(NULL)
 {
 	mClothingMenu = new CofClothingContextMenu(this);
 	mAttachmentMenu = new CofAttachmentContextMenu(this);
@@ -319,6 +323,16 @@ BOOL LLCOFWearables::postBuild()
 	mAttachments->setComparator(&WEARABLE_NAME_COMPARATOR);
 	mBodyParts->setComparator(&WEARABLE_NAME_COMPARATOR);
 
+
+	mClothingTab = getChild<LLAccordionCtrlTab>("tab_clothing");
+	mClothingTab->setDropDownStateChangedCallback(boost::bind(&LLCOFWearables::onAccordionTabStateChanged, this, _1, _2));
+
+	mAttachmentsTab = getChild<LLAccordionCtrlTab>("tab_attachments");
+	mAttachmentsTab->setDropDownStateChangedCallback(boost::bind(&LLCOFWearables::onAccordionTabStateChanged, this, _1, _2));
+
+	mBodyPartsTab = getChild<LLAccordionCtrlTab>("tab_body_parts");
+	mBodyPartsTab->setDropDownStateChangedCallback(boost::bind(&LLCOFWearables::onAccordionTabStateChanged, this, _1, _2));
+
 	return LLPanel::postBuild();
 }
 
@@ -338,6 +352,28 @@ void LLCOFWearables::onSelectionChange(LLFlatListView* selected_list)
 	onCommit();
 }
 
+void LLCOFWearables::onAccordionTabStateChanged(LLUICtrl* ctrl, const LLSD& expanded)
+{
+	bool had_selected_items = mClothing->numSelected() || mAttachments->numSelected() || mBodyParts->numSelected();
+	mClothing->resetSelection(true);
+	mAttachments->resetSelection(true);
+	mBodyParts->resetSelection(true);
+
+	bool tab_selection_changed = false;
+	LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl);
+	if (tab && tab != mLastSelectedTab)
+	{
+		mLastSelectedTab = tab;
+		tab_selection_changed = true;
+	}
+
+	if (had_selected_items || tab_selection_changed)
+	{
+		//sending commit signal to indicate selection changes
+		onCommit();
+	}
+}
+
 void LLCOFWearables::refresh()
 {
 	typedef std::vector<LLSD> values_vector_t;
@@ -617,6 +653,30 @@ LLAssetType::EType LLCOFWearables::getExpandedAccordionAssetType()
 	return result;
 }
 
+LLAssetType::EType LLCOFWearables::getSelectedAccordionAssetType()
+{
+	//*TODO share the code with ::getExpandedAccordionAssetType(...)
+	static LLAccordionCtrl* accordion_ctrl = getChild<LLAccordionCtrl>("cof_wearables_accordion");
+	const LLAccordionCtrlTab* selected_tab = accordion_ctrl->getSelectedTab();
+	
+	if (selected_tab == mClothingTab)
+	{
+		return LLAssetType::AT_CLOTHING;
+	} 
+	else if (selected_tab == mAttachmentsTab)
+	{
+		return LLAssetType::AT_OBJECT;
+	}
+	else if (selected_tab == mBodyPartsTab)
+	{
+		return LLAssetType::AT_BODYPART;
+	}
+	else
+	{
+		return LLAssetType::AT_NONE;
+	}
+}
+
 void LLCOFWearables::onListRightClick(LLUICtrl* ctrl, S32 x, S32 y, LLListContextMenu* menu)
 {
 	if(menu)
diff --git a/indra/newview/llcofwearables.h b/indra/newview/llcofwearables.h
index 62f4cfc69276f9dc1ef537fa4a8c31ba2b21e396..de148e0d46c6f9b89ebd20b4783929e06f7fb65d 100644
--- a/indra/newview/llcofwearables.h
+++ b/indra/newview/llcofwearables.h
@@ -40,6 +40,7 @@
 #include "llappearancemgr.h"
 #include "llinventorymodel.h"
 
+class LLAccordionCtrlTab;
 class LLListContextMenu;
 class LLPanelClothingListItem;
 class LLPanelBodyPartsListItem;
@@ -84,6 +85,7 @@ class LLCOFWearables : public LLPanel
 	void clear();
 
 	LLAssetType::EType getExpandedAccordionAssetType();
+	LLAssetType::EType getSelectedAccordionAssetType();
 
 	LLCOFCallbacks& getCOFCallbacks() { return mCOFCallbacks; }
 
@@ -94,6 +96,7 @@ class LLCOFWearables : public LLPanel
 	
 	void addClothingTypesDummies(const LLAppearanceMgr::wearables_by_type_t& clothing_by_type);
 	void onSelectionChange(LLFlatListView* selected_list);
+	void onAccordionTabStateChanged(LLUICtrl* ctrl, const LLSD& expanded);
 
 	LLPanelClothingListItem* buildClothingListItem(LLViewerInventoryItem* item, bool first, bool last);
 	LLPanelBodyPartsListItem* buildBodypartListItem(LLViewerInventoryItem* item);
@@ -107,6 +110,12 @@ class LLCOFWearables : public LLPanel
 
 	LLFlatListView* mLastSelectedList;
 
+	LLAccordionCtrlTab* mClothingTab;
+	LLAccordionCtrlTab* mAttachmentsTab;
+	LLAccordionCtrlTab* mBodyPartsTab;
+
+	LLAccordionCtrlTab* mLastSelectedTab;
+
 	LLCOFCallbacks mCOFCallbacks;
 
 	LLListContextMenu* mClothingMenu;
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 289fe8c570f323e83b7a62ef8a35799d8c7849c6..c397dd509243db67548a2023c87b55be1dfb727c 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -731,12 +731,19 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void)
 	bool more_than_one_selected = ids.size() > 1;
 	bool is_dummy_item = (ids.size() && dynamic_cast<LLPanelDummyClothingListItem*>(mCOFWearables->getSelectedItem()));
 
-	//expanded accordion tab determines filtering when no item is selected
+	//selected and expanded accordion tabs determine filtering when no item is selected
 	if (nothing_selected)
 	{
 		showWearablesListView();
 
-		switch (mCOFWearables->getExpandedAccordionAssetType())
+		//selected accordion tab is more priority than expanded tab when determining filtering
+		LLAssetType::EType type = mCOFWearables->getSelectedAccordionAssetType();
+		if (type == LLAssetType::AT_NONE)
+		{
+			type = mCOFWearables->getExpandedAccordionAssetType();
+		}
+
+		switch (type)
 		{
 		case LLAssetType::AT_OBJECT:
 			applyListViewFilter(LVIT_ATTACHMENT);