diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp
index 2d1d401cd403b0b709ef794eb29f79b48902f4d7..9b592e79aff156735ed759ab8e377fa6d2b67fc8 100644
--- a/indra/newview/llinventoryitemslist.cpp
+++ b/indra/newview/llinventoryitemslist.cpp
@@ -322,7 +322,7 @@ LLInventoryItemsList::Params::Params()
 LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p)
 :	LLFlatListViewEx(p)
 ,	mNeedsRefresh(false)
-,	mPrevVisibility(false)
+,	mForceRefresh(false)
 {
 	// TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView
 	// but reset to true in all derived classes. This settings might need to
@@ -356,14 +356,13 @@ boost::signals2::connection LLInventoryItemsList::setRefreshCompleteCallback(con
 
 void LLInventoryItemsList::doIdle()
 {
-	bool cur_visibility = getVisible();
-	if(cur_visibility != mPrevVisibility || mNeedsRefresh)
+	if (!mNeedsRefresh) return;
+
+	if (isInVisibleChain() || mForceRefresh)
 	{
 		refresh();
 
 		mRefreshCompleteSignal(this, LLSD());
-
-		mPrevVisibility = getVisible();
 	}
 }
 
@@ -414,6 +413,7 @@ void LLInventoryItemsList::refresh()
 
 	bool needs_refresh = add_limit_exceeded;
 	setNeedsRefresh(needs_refresh);
+	setForceRefresh(needs_refresh);
 }
 
 void LLInventoryItemsList::computeDifference(
diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h
index 60cccc0f4f4f02f562763ebd7adc29d45615ecfc..a3863b511cb3be38cac112fe561004ff6366d165 100644
--- a/indra/newview/llinventoryitemslist.h
+++ b/indra/newview/llinventoryitemslist.h
@@ -221,6 +221,12 @@ class LLInventoryItemsList : public LLFlatListViewEx
 
 	bool getNeedsRefresh(){ return mNeedsRefresh; }
 
+	/**
+	 * Sets the flag indicating that the list needs to be refreshed even if it is
+	 * not currently visible.
+	 */
+	void setForceRefresh(bool force_refresh){ mForceRefresh = force_refresh; }
+
 	/**
 	 * Idle routine used to refresh the list regardless of the current list
 	 * visibility, unlike draw() which is called only for the visible list.
@@ -259,7 +265,7 @@ class LLInventoryItemsList : public LLFlatListViewEx
 					 // Will be used in refresh() to determine added and removed ids
 	bool mNeedsRefresh;
 
-	bool mPrevVisibility;
+	bool mForceRefresh;
 
 	commit_signal_t mRefreshCompleteSignal;
 };
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 12d520342996f081fe56f2ff716b9ca09a2d4f31..43b7e15977089ca17e58d20501b907c3f5c4c84f 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -170,7 +170,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
 		list->setCommitCallback(boost::bind(&LLOutfitsList::onSelectionChange, this, _1));
 
 		// Setting list refresh callback to apply filter on list change.
-		list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onWearableItemsListRefresh, this, _1));
+		list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onFilteredWearableItemsListRefresh, this, _1));
 
 		// Fetch the new outfit contents.
 		cat->fetch();
@@ -178,6 +178,21 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
 		// Refresh the list of outfit items after fetch().
 		// Further list updates will be triggered by the category observer.
 		list->updateList(cat_id);
+
+		// If filter is currently applied we store the initial tab state and
+		// open it to show matched items if any.
+		if (!mFilterSubString.empty())
+		{
+			tab->notifyChildren(LLSD().with("action","store_state"));
+			tab->setDisplayChildren(true);
+
+			// Setting mForceRefresh flag will make the list refresh its contents
+			// even if it is not currently visible. This is required to apply the
+			// filter to the newly added list.
+			list->setForceRefresh(true);
+
+			list->setFilterSubString(mFilterSubString);
+		}
 	}
 
 	// Handle removed tabs.
@@ -327,7 +342,7 @@ void LLOutfitsList::changeOutfitSelection(LLWearableItemsList* list, const LLUUI
 	mSelectedOutfitUUID = category_id;
 }
 
-void LLOutfitsList::onWearableItemsListRefresh(LLUICtrl* ctrl)
+void LLOutfitsList::onFilteredWearableItemsListRefresh(LLUICtrl* ctrl)
 {
 	if (!ctrl || mFilterSubString.empty())
 		return;
@@ -338,7 +353,7 @@ void LLOutfitsList::onWearableItemsListRefresh(LLUICtrl* ctrl)
 		 iter != iter_end; ++iter)
 	{
 		LLAccordionCtrlTab* tab = iter->second;
-		if (tab) continue;
+		if (!tab) continue;
 
 		LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
 		if (list != ctrl) continue;
@@ -395,8 +410,6 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring)
 
 		if (!new_filter_substring.empty())
 		{
-			tab->setDisplayChildren(true);
-
 			std::string title = tab->getTitle();
 			LLStringUtil::toUpper(title);
 
@@ -413,6 +426,18 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring)
 			{
 				tab->setTitle(tab->getTitle(), cur_filter);
 			}
+
+			if (tab->getVisible())
+			{
+				// Open tab if it has passed the filter.
+				tab->setDisplayChildren(true);
+			}
+			else
+			{
+				// Set force refresh flag to refresh not visible list
+				// when some changes occur in it.
+				list->setForceRefresh(true);
+			}
 		}
 		else
 		{
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index bcb393b12a0ca4d08826c3327077968ac0ad1d50..8eaa39e6f1f96693f567b996517099b45198fd1c 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -98,7 +98,7 @@ class LLOutfitsList : public LLPanel, public LLInventoryObserver
 	 * Called upon list refresh event to update tab visibility depending on
 	 * the results of applying filter to the title and list items of the tab.
 	 */
-	void onWearableItemsListRefresh(LLUICtrl* ctrl);
+	void onFilteredWearableItemsListRefresh(LLUICtrl* ctrl);
 
 	/**
 	 * Highlights filtered items and hides tabs which haven't passed filter.