diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index b2fcfb625067cf9e7e5c2f58f9900fc219eeefa2..232bf3e478322023a5df3184a61807ffea1be57f 100755
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -239,6 +239,9 @@ void LLVOAvatarSelf::initInstance()
 
 bool LLVOAvatarSelf::checkStuckAppearance()
 {
+	const F32 CONDITIONAL_UNSTICK_INTERVAL = 300.0;
+	const F32 UNCONDITIONAL_UNSTICK_INTERVAL = 600.0;
+	
 	if (gAgentWearables.isCOFChangeInProgress())
 	{
 		LL_DEBUGS("Avatar") << "checking for stuck appearance" << llendl;
@@ -248,6 +251,12 @@ bool LLVOAvatarSelf::checkStuckAppearance()
 		LL_DEBUGS("Avatar") << "active holding patterns " << active_hp << " seconds" << llendl;
 		S32 active_copies = LLAppearanceMgr::instance().getActiveCopyOperations();
 		LL_DEBUGS("Avatar") << "active copy operations " << active_copies << llendl;
+
+		if ((change_time > CONDITIONAL_UNSTICK_INTERVAL && active_copies == 0) ||
+			(change_time > UNCONDITIONAL_UNSTICK_INTERVAL))
+		{
+			gAgentWearables.notifyLoadingFinished();
+		}
 	}
 
 	// Return false to continue running check periodically.