diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index d74b4fe7b263e050a353bc7e5bae875e1f3ac6d0..86a7cdae0292d8720f19cb39647f7a0f896fdb7f 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -260,8 +260,6 @@ class LLVOAvatar :
 	S32				mFullyLoadedFrameCounter;
 	LLFrameTimer	mFullyLoadedTimer;
 	LLFrameTimer	mRuthTimer;
-	LLFrameTimer	mRuthDebugTimer; // For tracking how long it takes for av to rez
-	LLFrameTimer	mDebugExistenceTimer; // Debugging for how long the avatar has been in memory.
 	
 /**                    State
  **                                                                            **
@@ -894,6 +892,9 @@ class LLVOAvatar :
  **                    DIAGNOSTICS
  **/
 	
+	//--------------------------------------------------------------------
+	// General
+	//--------------------------------------------------------------------
 public:
 	static void			dumpArchetypeXML(void*);
 	static void			dumpBakedStatus();
@@ -913,6 +914,14 @@ class LLVOAvatar :
 	F32					mAdjustedPixelArea;
 	std::string  		mDebugText;
 
+
+	//--------------------------------------------------------------------
+	// Avatar Rez Metrics
+	//--------------------------------------------------------------------
+protected:
+	LLFrameTimer	mRuthDebugTimer; // For tracking how long it takes for av to rez
+	LLFrameTimer	mDebugExistenceTimer; // Debugging for how long the avatar has been in memory.
+
 /**                    Diagnostics
  **                                                                            **
  *******************************************************************************/
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 8bf082ad459ac914043ed4767809fccf83cabf9c..f329ec83b00112600a71a04734d2dd89869b9eeb 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -49,12 +49,14 @@
 #include "llhudeffecttrail.h"
 #include "llhudmanager.h"
 #include "llinventoryfunctions.h"
+#include "llnotificationsutil.h"
 #include "llselectmgr.h"
 #include "lltoolgrab.h"	// for needsRenderBeam
 #include "lltoolmgr.h" // for needsRenderBeam
 #include "lltoolmorph.h"
 #include "lltrans.h"
 #include "llviewercamera.h"
+#include "llviewercontrol.h"
 #include "llviewermenu.h"
 #include "llviewerobjectlist.h"
 #include "llviewerstats.h"
@@ -149,7 +151,7 @@ void LLVOAvatarSelf::initInstance()
 	LLVOAvatar::initInstance();
 
 	llinfos << "Self avatar object created. Starting timer." << llendl;
-	mSelfLoadTimer.reset();
+	mDebugSelfLoadTimer.reset();
 	// clear all times to -1 for debugging
 	for (U32 i =0; i < LLVOAvatarDefines::TEX_NUM_INDICES; ++i)
 	{
@@ -1396,6 +1398,7 @@ void LLVOAvatarSelf::invalidateAll()
 	{
 		invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, TRUE);
 	}
+	mDebugSelfLoadTimer.reset();
 }
 
 //-----------------------------------------------------------------------------
@@ -1780,7 +1783,7 @@ if (index < 0 || index >= TEX_NUM_INDICES)
 
 	if (discard_level >=0 && discard_level <= MAX_DISCARD_LEVEL) // ignore discard level -1, as it means we have no data.
 	{
-		mTextureLoadTimes[(U32)index][(U32)discard_level] = mSelfLoadTimer.getElapsedTimeF32();
+		mTextureLoadTimes[(U32)index][(U32)discard_level] = mDebugSelfLoadTimer.getElapsedTimeF32();
 	}
 	if (final)
 	{
@@ -1795,7 +1798,7 @@ void LLVOAvatarSelf::bakedTextureUpload(EBakedTextureIndex index, BOOL finished)
 	{
 		done = 1;
 	}
-	mBakedTextureTimes[index][done] = mSelfLoadTimer.getElapsedTimeF32();
+	mBakedTextureTimes[index][done] = mDebugSelfLoadTimer.getElapsedTimeF32();
 }
 
 const LLUUID& LLVOAvatarSelf::grabLocalTexture(ETextureIndex type, U32 index) const
@@ -1969,42 +1972,56 @@ void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )
 	if (!hasPendingBakedUploads())
 	{
 		gAgent.sendAgentSetAppearance();
-		F32 final_time = mSelfLoadTimer.getElapsedTimeF32();
-		llinfos << "REZTIME: Myself rez stats:" << llendl;
-		llinfos << "\t Time from avatar creation to load wearables: " << (S32)mTimeWearablesLoaded << llendl;
-		llinfos << "\t Time from avatar creation to de-cloud: " << (S32)mTimeAvatarVisible << llendl;
-		llinfos << "\t Time from avatar creation to de-cloud for others: " << (S32)final_time << llendl;
-		llinfos << "\t Load time for each texture: " << llendl;
-		for (U32 i = 0; i < LLVOAvatarDefines::TEX_NUM_INDICES; ++i)
-		{
-			std::stringstream out;
-			out << "\t\t (" << i << ") ";
-			U32 j=0;
-			for (j=0; j <= MAX_DISCARD_LEVEL; j++)
-			{
-				out << "\t";
-				S32 load_time = (S32)mTextureLoadTimes[i][j];
-				if (load_time == -1)
-				{
-					out << "*";
-					if (j == 0)
-						break;
-				}
-				else
-				{
-					out << load_time;
-				}
-			}
 
-			// Don't print out non-existent textures.
-			if (j != 0)
-				llinfos << out.str() << llendl;
+		if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
+		{
+			LLSD args;
+			args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32());
+			args["TIME"] = (U32)mDebugSelfLoadTimer.getElapsedTimeF32();
+			LLNotificationsUtil::add("AvatarRezSelfNotification",args);
 		}
-		llinfos << "\t Time points for each upload (start / finish)" << llendl;
-		for (U32 i = 0; i < LLVOAvatarDefines::BAKED_NUM_INDICES; ++i)
+
+		outputRezDiagnostics();
+	}
+}
+
+void LLVOAvatarSelf::outputRezDiagnostics() const
+{
+	const F32 final_time = mDebugSelfLoadTimer.getElapsedTimeF32();
+	llinfos << "REZTIME: Myself rez stats:" << llendl;
+	llinfos << "\t Time from avatar creation to load wearables: " << (S32)mTimeWearablesLoaded << llendl;
+	llinfos << "\t Time from avatar creation to de-cloud: " << (S32)mTimeAvatarVisible << llendl;
+	llinfos << "\t Time from avatar creation to de-cloud for others: " << (S32)final_time << llendl;
+	llinfos << "\t Load time for each texture: " << llendl;
+	for (U32 i = 0; i < LLVOAvatarDefines::TEX_NUM_INDICES; ++i)
+	{
+		std::stringstream out;
+		out << "\t\t (" << i << ") ";
+		U32 j=0;
+		for (j=0; j <= MAX_DISCARD_LEVEL; j++)
 		{
-			llinfos << "\t\t (" << i << ") \t" << (S32)mBakedTextureTimes[i][0] << " / " << (S32)mBakedTextureTimes[i][1] << llendl;
+			out << "\t";
+			S32 load_time = (S32)mTextureLoadTimes[i][j];
+			if (load_time == -1)
+			{
+				out << "*";
+				if (j == 0)
+					break;
+			}
+			else
+			{
+				out << load_time;
+			}
 		}
+
+		// Don't print out non-existent textures.
+		if (j != 0)
+			llinfos << out.str() << llendl;
+	}
+	llinfos << "\t Time points for each upload (start / finish)" << llendl;
+	for (U32 i = 0; i < LLVOAvatarDefines::BAKED_NUM_INDICES; ++i)
+	{
+		llinfos << "\t\t (" << i << ") \t" << (S32)mBakedTextureTimes[i][0] << " / " << (S32)mBakedTextureTimes[i][1] << llendl;
 	}
 }
 
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 03856b3a3b33358286682f72c81e930919d0bce8..9dc38c953e2bedbd8fecd464d30d30c6d3b47011 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -126,25 +126,14 @@ class LLVOAvatarSelf :
 	/*virtual*/ BOOL    getIsCloud();
 	void bakedTextureUpload(LLVOAvatarDefines::EBakedTextureIndex index, BOOL finished);
 	static void		onTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
-	void wearablesLoaded() { mTimeWearablesLoaded = mSelfLoadTimer.getElapsedTimeF32(); }
-	void avatarVisible() { mTimeAvatarVisible = mSelfLoadTimer.getElapsedTimeF32(); }
-
-private:
 
 	//--------------------------------------------------------------------
 	// Region state
 	//--------------------------------------------------------------------
+private:
 	U64				mLastRegionHandle;
 	LLFrameTimer	mRegionCrossingTimer;
 	S32				mRegionCrossingCount;
-	LLFrameTimer    mSelfLoadTimer;
-	F32				mTimeWearablesLoaded;
-	F32 			mTimeAvatarVisible;
-	F32 			mTextureLoadTimes[LLVOAvatarDefines::TEX_NUM_INDICES][MAX_DISCARD_LEVEL+1]; // stores load time for each texture,
-																		  // at each discard level
-	F32 			mBakedTextureTimes[LLVOAvatarDefines::BAKED_NUM_INDICES][2]; // stores time to start upload and finish upload of each baked texture
-
-	void		timingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
 	
 /**                    State
  **                                                                            **
@@ -336,11 +325,29 @@ class LLVOAvatarSelf :
  **                    DIAGNOSTICS
  **/
 
+	//--------------------------------------------------------------------
+	// General
+	//--------------------------------------------------------------------
 public:	
 	static void		dumpTotalLocalTextureByteCount();
 	void			dumpLocalTextures() const;
 	static void		dumpScratchTextureByteCount();
 
+	//--------------------------------------------------------------------
+	// Avatar Rez Metrics
+	//--------------------------------------------------------------------
+public:	
+	void wearablesLoaded() { mTimeWearablesLoaded = mDebugSelfLoadTimer.getElapsedTimeF32(); }
+	void avatarVisible() { mTimeAvatarVisible = mDebugSelfLoadTimer.getElapsedTimeF32(); }
+	void outputRezDiagnostics() const;
+private:
+	LLFrameTimer    mDebugSelfLoadTimer;
+	F32				mTimeWearablesLoaded;
+	F32 			mTimeAvatarVisible;
+	F32 			mTextureLoadTimes[LLVOAvatarDefines::TEX_NUM_INDICES][MAX_DISCARD_LEVEL+1]; // load time for each texture at each discard level
+	F32 			mBakedTextureTimes[LLVOAvatarDefines::BAKED_NUM_INDICES][2]; // time to start upload and finish upload of each baked texture
+	void			timingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
+
 /**                    Diagnostics
  **                                                                            **
  *******************************************************************************/
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 300437b3c98495ba5d90c658051f4b59af469f43..999f804e7191c0d4d8308411eb4a12b1288265d4 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -6129,15 +6129,24 @@ Deed to group failed.
    icon="notifytip.tga"
    name="AvatarRezNotification"
    type="notifytip">
-( [EXISTENCE] seconds )
-Avatar '[NAME]' rezzed in [TIME] seconds.
+( [EXISTENCE] seconds alive )
+Avatar '[NAME]' declouded in [TIME] seconds.
   </notification>
 
+  <notification
+   icon="notifytip.tga"
+   name="AvatarRezSelfNotification"
+   type="notifytip">
+( [EXISTENCE] seconds alive )
+You finished baking your outfit in [TIME] seconds.
+  </notification>
+
+
   <notification
    icon="notifytip.tga"
    name="AvatarRezCloudNotification"
    type="notifytip">
-( [EXISTENCE] seconds )
+( [EXISTENCE] seconds alive )
 Avatar '[NAME]' became cloud.
   </notification>
 
@@ -6145,7 +6154,7 @@ Avatar '[NAME]' became cloud.
    icon="notifytip.tga"
    name="AvatarRezArrivedNotification"
    type="notifytip">
-( [EXISTENCE] seconds )
+( [EXISTENCE] seconds alive )
 Avatar '[NAME]' appeared.
   </notification>
 
@@ -6153,7 +6162,7 @@ Avatar '[NAME]' appeared.
    icon="notifytip.tga"
    name="AvatarRezLeftCloudNotification"
    type="notifytip">
-( [EXISTENCE] seconds )
+( [EXISTENCE] seconds alive )
 Avatar '[NAME]' left after [TIME] seconds as cloud.
   </notification>
 
@@ -6161,7 +6170,7 @@ Avatar '[NAME]' left after [TIME] seconds as cloud.
    icon="notifytip.tga"
    name="AvatarRezEnteredAppearanceNotification"
    type="notifytip">
-( [EXISTENCE] seconds )
+( [EXISTENCE] seconds alive )
 Avatar '[NAME]' entered appearance mode.
   </notification>
 
@@ -6169,7 +6178,7 @@ Avatar '[NAME]' entered appearance mode.
    icon="notifytip.tga"
    name="AvatarRezLeftAppearanceNotification"
    type="notifytip">
-( [EXISTENCE] seconds )
+( [EXISTENCE] seconds alive )
 Avatar '[NAME]' left appearance mode.
   </notification>
 
@@ -6177,7 +6186,7 @@ Avatar '[NAME]' left appearance mode.
    icon="notifytip.tga"
    name="AvatarRezLeftNotification"
    type="notifytip">
-( [EXISTENCE] seconds )
+( [EXISTENCE] seconds alive )
 Avatar '[NAME]' left as fully loaded.
   </notification>