diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 3923749e641c0728fecb665745338f5782a2e3bb..66866618e130be0065ad5462d7aa50b368633e38 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -47,6 +47,7 @@
 #include "llinventorypanel.h"
 #include "llmd5.h"
 #include "llnotificationsutil.h"
+#include "lloutfitobserver.h"
 #include "llpaneloutfitsinventory.h"
 #include "llsidepanelappearance.h"
 #include "llsidetray.h"
@@ -179,6 +180,13 @@ void LLAgentWearables::cleanup()
 {
 }
 
+// static
+void LLAgentWearables::initClass()
+{
+	// this can not be called from constructor because its instance is global and is created too early.
+	LLOutfitObserver::instance().addCOFSavedCallback(boost::bind(&LLAgentWearables::notifyLoadingFinished, &gAgentWearables));
+}
+
 void LLAgentWearables::setAvatarObject(LLVOAvatarSelf *avatar)
 { 
 	if (avatar)
@@ -931,6 +939,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
 
 	// notify subscribers that wearables started loading. See EXT-7777
 	// *TODO: find more proper place to not be called from deprecated method.
+	// Seems such place is found: LLInitialWearablesFetch::processContents()
 	gAgentWearables.notifyLoadingStarted();
 
 	mInitialWearablesUpdateReceived = true;
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 05913825dd1a9bff62f6ace6bee685766a646895..8122971db6c76f8d8d8f3888e2cd574464e65dae 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -33,9 +33,13 @@
 #ifndef LL_LLAGENTWEARABLES_H
 #define LL_LLAGENTWEARABLES_H
 
+// libraries
 #include "llmemory.h"
+#include "llui.h"
 #include "lluuid.h"
 #include "llinventory.h"
+
+// newview
 #include "llinventorymodel.h"
 #include "llviewerinventory.h"
 #include "llvoavatardefines.h"
@@ -47,7 +51,7 @@ class LLInitialWearablesFetch;
 class LLViewerObject;
 class LLTexLayerTemplate;
 
-class LLAgentWearables
+class LLAgentWearables : public LLInitClass<LLAgentWearables>
 {
 	//--------------------------------------------------------------------
 	// Constructors / destructors / Initializers
@@ -61,6 +65,9 @@ class LLAgentWearables
 	void			createStandardWearables(BOOL female); 
 	void			cleanup();
 	void			dump();
+
+	// LLInitClass interface
+	static void initClass();
 protected:
 	void			createStandardWearablesDone(S32 type, U32 index/* = 0*/);
 	void			createStandardWearablesAllDone();
diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp
index ef0b97d376a71fe84cba87b4c6dea83a6c00d1d6..931aba1d416255959645917026f10358b1d7f0d7 100644
--- a/indra/newview/llagentwearablesfetch.cpp
+++ b/indra/newview/llagentwearablesfetch.cpp
@@ -121,6 +121,7 @@ void LLInitialWearablesFetch::processContents()
 	LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true);
 	if (wearable_array.count() > 0)
 	{
+		gAgentWearables.notifyLoadingStarted();
 		LLAppearanceMgr::instance().updateAppearanceFromCOF();
 	}
 	else
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 4e96372da93ed2339dd1ba6f476da3bf5da391d5..405cc5b282fe763fb0398496382c391d79d10777 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -177,7 +177,13 @@ class LLUpdateDirtyState: public LLInventoryCallback
 {
 public:
 	LLUpdateDirtyState() {}
-	virtual ~LLUpdateDirtyState(){ LLAppearanceMgr::getInstance()->updateIsDirty(); }
+	virtual ~LLUpdateDirtyState()
+	{
+		if (LLAppearanceMgr::instanceExists())
+		{
+			LLAppearanceMgr::getInstance()->updateIsDirty();
+		}
+	}
 	virtual void fire(const LLUUID&) {}
 };
 
@@ -2150,6 +2156,8 @@ bool LLAppearanceMgr::updateBaseOutfit()
 	}
 	setOutfitLocked(true);
 
+	gAgentWearables.notifyLoadingStarted();
+
 	const LLUUID base_outfit_id = getBaseOutfitUUID();
 	if (base_outfit_id.isNull()) return false;
 
@@ -2309,6 +2317,7 @@ class LLShowCreatedOutfit: public LLInventoryCallback
 		}
 
 		LLAppearanceMgr::getInstance()->updateIsDirty();
+		gAgentWearables.notifyLoadingFinished(); // New outfit is saved.
 		LLAppearanceMgr::getInstance()->updatePanelOutfitName("");
 	}
 
@@ -2324,6 +2333,8 @@ LLUUID LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, b
 {
 	if (!isAgentAvatarValid()) return LLUUID::null;
 
+	gAgentWearables.notifyLoadingStarted();
+
 	// First, make a folder in the My Outfits directory.
 	const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
 	LLUUID folder_id = gInventory.createNewCategory(
@@ -2530,7 +2541,9 @@ void LLAppearanceMgr::registerAttachment(const LLUUID& item_id)
 
 	   if (mAttachmentInvLinkEnabled)
 	   {
-		   LLAppearanceMgr::addCOFItemLink(item_id, false);  // Add COF link for item.
+		   // we have to pass do_update = true to call LLAppearanceMgr::updateAppearanceFromCOF.
+		   // it will trigger gAgentWariables.notifyLoadingFinished()
+		   LLAppearanceMgr::addCOFItemLink(item_id, true);  // Add COF link for item.
 	   }
 	   else
 	   {
@@ -2560,7 +2573,7 @@ void LLAppearanceMgr::linkRegisteredAttachments()
 		 ++it)
 	{
 		LLUUID item_id = *it;
-		addCOFItemLink(item_id, false);
+		addCOFItemLink(item_id, true);
 	}
 	mRegisteredAttachments.clear();
 }
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 8da7432e0a97347375457d60e906b73d7e4e8482..5fac7efb84ce115f823279c6d3e5f7765911fa2b 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -60,6 +60,7 @@
 #include "llinventorybridge.h"
 #include "llinventorymodel.h"
 #include "llinventorymodelbackgroundfetch.h"
+#include "llloadingindicator.h"
 #include "llpaneloutfitsinventory.h"
 #include "lluiconstants.h"
 #include "llsaveoutfitcombobtn.h"
@@ -262,6 +263,9 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()
 	observer.addBOFChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this));
 	observer.addOutfitLockChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this));
 	observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitEdit::update, this));
+
+	gAgentWearables.addLoadingStartedCallback(boost::bind(&LLPanelOutfitEdit::onOutfitChanging, this, true));
+	gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitEdit::onOutfitChanging, this, false));
 	
 	mFolderViewItemTypes.reserve(NUM_FOLDER_VIEW_ITEM_TYPES);
 	for (U32 i = 0; i < NUM_FOLDER_VIEW_ITEM_TYPES; i++)
@@ -902,6 +906,27 @@ void LLPanelOutfitEdit::showFilteredWearablesListView(LLWearableType::EType type
 	applyListViewFilter((EListViewItemType) (LVIT_SHAPE + type));
 }
 
+static void update_status_widget_rect(LLView * widget, S32 right_border)
+{
+	LLRect rect = widget->getRect();
+	rect.mRight = right_border;
 
+	widget->setShape(rect);
+}
+
+void LLPanelOutfitEdit::onOutfitChanging(bool started)
+{
+	static LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("edit_outfit_loading_indicator");
+	static LLView* status_panel = getChild<LLView>("outfit_name_and_status");
+	static S32 indicator_delta = status_panel->getRect().getWidth() - indicator->getRect().mLeft;
+
+	S32 delta = started ? indicator_delta : 0;
+	S32 right_border = status_panel->getRect().getWidth() - delta;
+
+	update_status_widget_rect(mCurrentOutfitName, right_border);
+	update_status_widget_rect(mStatus, right_border);
+
+	indicator->setVisible(started);
+}
 
 // EOF
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
index 1705e3043b6abe1542d09b68bac73d53fde40660..484f3fcb9f4eb2e1ed0706344b31da149699c81f 100644
--- a/indra/newview/llpaneloutfitedit.h
+++ b/indra/newview/llpaneloutfitedit.h
@@ -191,6 +191,7 @@ class LLPanelOutfitEdit : public LLPanel
 	void onGearButtonClick(LLUICtrl* clicked_button);
 	void onAddMoreButtonClicked();
 	void showFilteredWearablesListView(LLWearableType::EType type);
+	void onOutfitChanging(bool started);
 
 
 	LLTextBox*			mCurrentOutfitName;
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index 03a0c464d2fcde93632ec9d953c12ef395423a95..1ed73e6c1598b3855581c28bd1f076104c14be39 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -106,7 +106,7 @@
             <panel
              bevel_style="none"
              follows="top|right"
-             height="38"
+             height="37"
              layout="topleft"
              left_pad="5"
              name="outfit_name_and_status"
@@ -122,18 +122,26 @@
                  top="2"
                  value="Now editing..."
                  use_ellipses="true"
-                 width="270" /> 
+                 width="245" /> 
                 <text
                  follows="bottom|left|right"
                  font="SansSerifLargeBold"
-                 height="26"
+                 height="18"
                  layout="topleft"
                  name="curr_outfit_name"
                  text_color="LtGray"
                  top_pad="2"
                  value="[Current Outfit]"
                  use_ellipses="true"
-                 width="270" /> 
+                 width="245" /> 
+                <loading_indicator
+                 follows="right|top"
+                 height="24"
+                 layout="topleft"
+                 right="-2"
+                 name="edit_outfit_loading_indicator"
+                 top="6"
+                 width="24" />
             </panel>
     </panel>