diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index d91b9d7ea431e6b03948cba209a7b06145bbb682..c06098689db5def39e6b985112f270c88d4f41bd 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -574,29 +574,32 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
 	linkAll(cof, obj_items, link_waiter);
 	linkAll(cof, gest_items, link_waiter);
 
-	LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
 	// Add link to outfit if category is an outfit. 
 	LLViewerInventoryCategory* catp = gInventory.getCategory(category);
-	if (!append && catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
+	if (!append)
 	{
-		link_inventory_item(gAgent.getID(), category, cof, catp->getName(),
-							LLAssetType::AT_LINK_FOLDER, link_waiter);
-
-		// Update the current outfit name of the appearance sidepanel.
-		if (panel_appearance)
+		std::string new_outfit_name = "";
+		if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
 		{
-			panel_appearance->refreshCurrentOutfitName(catp->getName());
+			link_inventory_item(gAgent.getID(), category, cof, catp->getName(),
+								LLAssetType::AT_LINK_FOLDER, link_waiter);
+			new_outfit_name = catp->getName();
 		}
+		updatePanelOutfitName(new_outfit_name);
 	}
-	else
+}
+
+void LLAppearanceManager::updatePanelOutfitName(const std::string& name)
+{
+	LLSidepanelAppearance* panel_appearance =
+		dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+	if (panel_appearance)
 	{
-		if (panel_appearance)
-		{
-			panel_appearance->refreshCurrentOutfitName("");
-		}
+		panel_appearance->refreshCurrentOutfitName(name);
 	}
 }
 
+
 void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append)
 {
 	lldebugs << "updateAgentWearables()" << llendl;
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 7038d1a35b7a35c627c4b5df4d73c7230093faad..b625d42a50fb0a7b6545f9050ad6a6e9ff09dc53 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -64,6 +64,9 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	// Finds the folder link to the currently worn outfit
 	const LLViewerInventoryItem *getCurrentOutfitLink();
 
+	// Update the displayed outfit name in UI.
+	void updatePanelOutfitName(const std::string& name);
+
 	void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
 
 	// For debugging - could be moved elsewhere.
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index d5f01418c61c9ffc4fb219f414bd7d2ede794a80..eb3695a3719a75487fa2921532e50bffab7dc3d2 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -67,6 +67,26 @@ class LLCurrentlyWornFetchObserver : public LLInventoryFetchObserver
 	LLSidepanelAppearance *mPanel;
 };
 
+class LLWatchForOutfitRenameObserver : public LLInventoryObserver
+{
+public:
+	LLWatchForOutfitRenameObserver(LLSidepanelAppearance *panel) :
+		mPanel(panel)
+	{}
+	virtual void changed(U32 mask);
+	
+private:
+	LLSidepanelAppearance *mPanel;
+};
+
+void LLWatchForOutfitRenameObserver::changed(U32 mask)
+{
+	if (mask & LABEL)
+	{
+		mPanel->refreshCurrentOutfitName();
+	}
+}
+	
 LLSidepanelAppearance::LLSidepanelAppearance() :
 	LLPanel(),
 	mFilterSubString(LLStringUtil::null),
@@ -76,6 +96,8 @@ LLSidepanelAppearance::LLSidepanelAppearance() :
 {
 	//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_appearance.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
 	mFetchWorn = new LLCurrentlyWornFetchObserver(this);
+	
+	mOutfitRenameWatcher = new LLWatchForOutfitRenameObserver(this);
 }
 
 LLSidepanelAppearance::~LLSidepanelAppearance()
@@ -135,6 +157,8 @@ BOOL LLSidepanelAppearance::postBuild()
 	
 	mCurrOutfitPanel = getChild<LLPanel>("panel_currentlook");
 
+	gInventory.addObserver(mOutfitRenameWatcher);
+
 	return TRUE;
 }
 
@@ -299,7 +323,7 @@ void LLSidepanelAppearance::updateVerbs()
 	}
 }
 
-void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string name)
+void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)
 {
 	if (name == "")
 	{
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index b335fd910d9e2a9bc50b28bd3b61b4b2aa055fc2..9c870f631a9fad7aa0f766d156928e9f29cc3aee 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -40,6 +40,7 @@
 
 class LLFilterEditor;
 class LLCurrentlyWornFetchObserver;
+class LLWatchForOutfitRenameObserver;
 class LLPanelEditWearable;
 class LLWearable;
 class LLPanelOutfitsInventory;
@@ -53,7 +54,7 @@ class LLSidepanelAppearance : public LLPanel
 	/*virtual*/ BOOL postBuild();
 	/*virtual*/ void onOpen(const LLSD& key);
 
-	void refreshCurrentOutfitName(const std::string name = "");
+	void refreshCurrentOutfitName(const std::string& name = "");
 
 	static void editWearable(LLWearable *wearable, void *data);
 
@@ -91,6 +92,9 @@ class LLSidepanelAppearance : public LLPanel
 	// Used to make sure the user's inventory is in memory.
 	LLCurrentlyWornFetchObserver* mFetchWorn;
 
+	// Used to update title when currently worn outfit gets renamed.
+	LLWatchForOutfitRenameObserver* mOutfitRenameWatcher;
+
 	// Search string for filtering landmarks and teleport
 	// history locations
 	std::string					mFilterSubString;