diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp
index 5f866c49e60f009176f42592656aac1212bd3959..6bf13475148c84edd1a4141ad2f26c1896976ce9 100644
--- a/indra/llui/llaccordionctrl.cpp
+++ b/indra/llui/llaccordionctrl.cpp
@@ -66,6 +66,7 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)
  , mAutoScrolling( false )
  , mAutoScrollRate( 0.f )
  , mSelectedTab( NULL )
+ , mTabComparator( NULL )
  , mNoVisibleTabsHelpText(NULL)
 {
 	initNoTabsWidget(params.empty_accordion_text);
@@ -799,6 +800,18 @@ void	LLAccordionCtrl::reset		()
 		mScrollbar->setDocPos(0);
 }
 
+void LLAccordionCtrl::sort()
+{
+	if (!mTabComparator)
+	{
+		llwarns << "No comparator specified for sorting accordion tabs." << llendl;
+		return;
+	}
+
+	std::sort(mAccordionTabs.begin(), mAccordionTabs.end(), LLComparatorAdaptor(*mTabComparator));
+	arrange();
+}
+
 void	LLAccordionCtrl::setFilterSubString(const std::string& filter_string)
 {
 	LLStringUtil::format_map_t args;
diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h
index 2f483eafb2fbf4461f39b8e284b7e83a903eafa4..fc6f2d896c72521e849687b216b1c9ec5c74ce26 100644
--- a/indra/llui/llaccordionctrl.h
+++ b/indra/llui/llaccordionctrl.h
@@ -57,6 +57,19 @@ class LLAccordionCtrl: public LLPanel
 
 
 public:
+	/**
+	 * Abstract comparator for accordion tabs.
+	 */
+	class LLTabComparator
+	{
+	public:
+		LLTabComparator() {};
+		virtual ~LLTabComparator() {};
+
+		/** Returns true if tab1 < tab2, false otherwise */
+		virtual bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const = 0;
+	};
+
 	struct Params 
 		: public LLInitParam::Block<Params, LLPanel::Params>
 	{
@@ -108,6 +121,9 @@ class LLAccordionCtrl: public LLPanel
 
 	void	reset		();
 
+	void	setComparator(const LLTabComparator* comp) { mTabComparator = comp; }
+	void	sort();
+
 	/**
 	 * Sets filter substring as a search_term for help text when there are no any visible tabs.
 	 */
@@ -134,6 +150,21 @@ class LLAccordionCtrl: public LLPanel
 
 	BOOL	autoScroll				(S32 x, S32 y);
 
+	/**
+	 * An adaptor for LLTabComparator
+	 */
+	struct LLComparatorAdaptor
+	{
+		LLComparatorAdaptor(const LLTabComparator& comparator) : mComparator(comparator) {};
+
+		bool operator()(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2)
+		{
+			return mComparator.compare(tab1, tab2);
+		}
+
+		const LLTabComparator& mComparator;
+	};
+
 private:
 	LLRect			mInnerRect;
 	LLScrollbar*	mScrollbar;
@@ -141,9 +172,11 @@ class LLAccordionCtrl: public LLPanel
 	bool			mFitParent;
 	bool			mAutoScrolling;
 	F32				mAutoScrollRate;
-	LLAccordionCtrlTab* mSelectedTab;
 	LLTextBox*		mNoVisibleTabsHelpText;
 	std::string		mNoVisibleTabsOrigString;
+
+	LLAccordionCtrlTab*		mSelectedTab;
+	const LLTabComparator*	mTabComparator;
 };
 
 
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index 83fcc77f2a207ce3ac0736f35161779b662c2d9c..1bc8086a2768296a78ca98a7282559ef8acfd5a9 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -473,7 +473,7 @@ void LLAccordionCtrlTab::setAccordionView(LLView* panel)
 	addChild(panel,0);
 }
 
-std::string LLAccordionCtrlTab::getTitle()
+std::string LLAccordionCtrlTab::getTitle() const
 {
 	LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
 	if (header)
diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h
index be8b464b8e5c61b745bccd127364d97af66e8c66..82e0234bfc32f6990ca6be6fa0ac3f86b604a5a7 100644
--- a/indra/llui/llaccordionctrltab.h
+++ b/indra/llui/llaccordionctrltab.h
@@ -115,7 +115,7 @@ class LLAccordionCtrlTab : public LLUICtrl
 	void		setAccordionView(LLView* panel);
 	LLView*		getAccordionView() { return mContainerPanel; };
 
-	std::string getTitle();
+	std::string getTitle() const;
 
 	// Set text and highlight substring in LLAccordionCtrlTabHeader
 	void setTitle(const std::string& title, const std::string& hl = LLStringUtil::null);
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index a4ae957c76cff093f8d82f3e89af66ee46643d76..e20b2e26be6eb79e45b8533a7bdf2351da69d812 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -53,6 +53,20 @@
 
 static bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y);
 
+static const LLOutfitTabNameComparator OUTFIT_TAB_NAME_COMPARATOR;
+
+/*virtual*/
+bool LLOutfitTabNameComparator::compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const
+{
+	std::string name1 = tab1->getTitle();
+	std::string name2 = tab2->getTitle();
+
+	LLStringUtil::toUpper(name1);
+	LLStringUtil::toUpper(name2);
+
+	return name1 < name2;
+}
+
 //////////////////////////////////////////////////////////////////////////
 
 class OutfitContextMenu : public LLListContextMenu
@@ -158,6 +172,7 @@ LLOutfitsList::~LLOutfitsList()
 BOOL LLOutfitsList::postBuild()
 {
 	mAccordion = getChild<LLAccordionCtrl>("outfits_accordion");
+	mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR);
 
 	return TRUE;
 }
@@ -328,7 +343,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
 		updateOutfitTab(*items_iter);
 	}
 
-	mAccordion->arrange();
+	mAccordion->sort();
 }
 
 void LLOutfitsList::onSelectionChange(LLUICtrl* ctrl)
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index 44f6ec908b61863a7fea65e01f79cd2d72833c15..bb516446d2d12439dfdd3ae94ec4edb00c33a926 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -32,17 +32,33 @@
 #ifndef LL_LLOUTFITSLIST_H
 #define LL_LLOUTFITSLIST_H
 
+#include "llaccordionctrl.h"
 #include "llpanel.h"
 
 // newview
 #include "llinventorymodel.h"
 #include "llinventoryobserver.h"
 
-class LLAccordionCtrl;
 class LLAccordionCtrlTab;
 class LLWearableItemsList;
 class LLListContextMenu;
 
+/**
+ * @class LLOutfitTabNameComparator
+ *
+ * Comparator of outfit tabs.
+ */
+class LLOutfitTabNameComparator : public LLAccordionCtrl::LLTabComparator
+{
+	LOG_CLASS(LLOutfitTabNameComparator);
+
+public:
+	LLOutfitTabNameComparator() {};
+	virtual ~LLOutfitTabNameComparator() {};
+
+	/*virtual*/ bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const;
+};
+
 /**
  * @class LLOutfitsList
  *