diff --git a/indra/llcommon/lltracerecording.cpp b/indra/llcommon/lltracerecording.cpp
index 2917c217d79b9aeffa80157bfb331b75b8a18514..af7b61dd4e14350b9d757209906a72f217baea04 100644
--- a/indra/llcommon/lltracerecording.cpp
+++ b/indra/llcommon/lltracerecording.cpp
@@ -464,8 +464,62 @@ void PeriodicRecording::appendPeriodicRecording( PeriodicRecording& other )
 	other.setPlayState(other_play_state);
 }
 
+LLUnit<LLUnits::Seconds, F64> PeriodicRecording::getDuration()
+{
+	LLUnit<LLUnits::Seconds, F64> duration;
+	size_t num_periods = mRecordingPeriods.size();
+	for (size_t i = 1; i <= num_periods; i++)
+	{
+		size_t index = (mCurPeriod + num_periods - i) % num_periods;
+		duration += mRecordingPeriods[index].getDuration();
+	}
+	return duration;
+}
 
 
+LLTrace::Recording PeriodicRecording::snapshotCurRecording() const
+{
+	Recording recording_copy(getCurRecording());
+	recording_copy.stop();
+	return recording_copy;
+}
+
+
+Recording& PeriodicRecording::getLastRecording()
+{
+	U32 num_periods = mRecordingPeriods.size();
+	return mRecordingPeriods[(mCurPeriod + num_periods - 1) % num_periods];
+}
+
+const Recording& PeriodicRecording::getLastRecording() const
+{
+	return getPrevRecording(1);
+}
+
+Recording& PeriodicRecording::getCurRecording()
+{
+	return mRecordingPeriods[mCurPeriod];
+}
+
+const Recording& PeriodicRecording::getCurRecording() const
+{
+	return mRecordingPeriods[mCurPeriod];
+}
+
+Recording& PeriodicRecording::getPrevRecording( U32 offset )
+{
+	U32 num_periods = mRecordingPeriods.size();
+	offset = llclamp(offset, 0u, num_periods - 1);
+	return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods];
+}
+
+const Recording& PeriodicRecording::getPrevRecording( U32 offset ) const
+{
+	U32 num_periods = mRecordingPeriods.size();
+	offset = llclamp(offset, 0u, num_periods - 1);
+	return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods];
+}
+
 void PeriodicRecording::start()
 {
 	getCurRecording().start();
@@ -577,6 +631,13 @@ void ExtendableRecording::splitFrom(ExtendableRecording& other)
 // ExtendablePeriodicRecording
 ///////////////////////////////////////////////////////////////////////
 
+
+ExtendablePeriodicRecording::ExtendablePeriodicRecording() 
+:	mAcceptedRecording(0), 
+	mPotentialRecording(0)
+{
+}
+
 void ExtendablePeriodicRecording::extend()
 {
 	// stop recording to get latest data
diff --git a/indra/llcommon/lltracerecording.h b/indra/llcommon/lltracerecording.h
index 23b031b49b9efe7c8a6b8ec2a8039b745ba3839a..84006a10b8592592c18d8734d3c64e8f4e157e67 100644
--- a/indra/llcommon/lltracerecording.h
+++ b/indra/llcommon/lltracerecording.h
@@ -254,49 +254,16 @@ namespace LLTrace
 		void nextPeriod();
 		U32 getNumPeriods() { return mRecordingPeriods.size(); }
 
-		void appendPeriodicRecording(PeriodicRecording& other);
-
-		Recording& getLastRecording()
-		{
-			U32 num_periods = mRecordingPeriods.size();
-			return mRecordingPeriods[(mCurPeriod + num_periods - 1) % num_periods];
-		}
-
-		const Recording& getLastRecording() const
-		{
-			return getPrevRecording(1);
-		}
-
-		Recording& getCurRecording()
-		{
-			return mRecordingPeriods[mCurPeriod];
-		}
-
-		const Recording& getCurRecording() const
-		{
-			return mRecordingPeriods[mCurPeriod];
-		}
-
-		Recording& getPrevRecording(U32 offset)
-		{
-			U32 num_periods = mRecordingPeriods.size();
-			offset = llclamp(offset, 0u, num_periods - 1);
-			return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods];
-		}
+		LLUnit<LLUnits::Seconds, F64> getDuration();
 
-		const Recording& getPrevRecording(U32 offset) const
-		{
-			U32 num_periods = mRecordingPeriods.size();
-			offset = llclamp(offset, 0u, num_periods - 1);
-			return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods];
-		}
-
-		Recording snapshotCurRecording() const
-		{
-			Recording recording_copy(getCurRecording());
-			recording_copy.stop();
-			return recording_copy;
-		}
+		void appendPeriodicRecording(PeriodicRecording& other);
+		Recording& getLastRecording();
+		const Recording& getLastRecording() const;
+		Recording& getCurRecording();
+		const Recording& getCurRecording() const;
+		Recording& getPrevRecording(U32 offset);
+		const Recording& getPrevRecording(U32 offset) const;
+		Recording snapshotCurRecording() const;
 
 		template <typename T>
 		typename T::value_t getPeriodMin(const TraceType<T>& stat, size_t num_periods = U32_MAX) const
@@ -447,10 +414,11 @@ namespace LLTrace
 	:	public LLStopWatchControlsMixin<ExtendablePeriodicRecording>
 	{
 	public:
+		ExtendablePeriodicRecording();
 		void extend();
 
-		PeriodicRecording& getAcceptedRecording() { return mAcceptedRecording; }
-		const PeriodicRecording& getAcceptedRecording() const {return mAcceptedRecording;}
+		PeriodicRecording& getAcceptedRecording()				{ return mAcceptedRecording; }
+		const PeriodicRecording& getAcceptedRecording() const	{return mAcceptedRecording;}
 
 		// implementation for LLStopWatchControlsMixin
 		/*virtual*/ void start();
diff --git a/indra/newview/llscenemonitor.cpp b/indra/newview/llscenemonitor.cpp
index 15fe77f028a4c3276870cefdc3b46b6196c7df6f..7f7e61cc8865b6c9f2df83cb9d33f38026eb1754 100644
--- a/indra/newview/llscenemonitor.cpp
+++ b/indra/newview/llscenemonitor.cpp
@@ -73,7 +73,7 @@ LLSceneMonitor::LLSceneMonitor() :
 	mFrames[0] = NULL;
 	mFrames[1] = NULL;
 
-	mRecording = new LLTrace::ExtendableRecording();
+	mRecording = new LLTrace::ExtendablePeriodicRecording();
 	mRecording->start();
 }
 
diff --git a/indra/newview/llscenemonitor.h b/indra/newview/llscenemonitor.h
index c897b237b65d46c8e10df336251e4719fb637e4d..45a5241924db2839f9d84354b813c8ae7607a55b 100644
--- a/indra/newview/llscenemonitor.h
+++ b/indra/newview/llscenemonitor.h
@@ -63,7 +63,7 @@ class LLSceneMonitor :  public LLSingleton<LLSceneMonitor>
 	bool isEnabled()const {return mEnabled;}
 	bool needsUpdate() const;
 	
-	LLTrace::ExtendableRecording* getRecording() const {return mRecording;}
+	LLTrace::ExtendablePeriodicRecording* getRecording() const {return mRecording;}
 	void dumpToFile(std::string file_name);
 	bool hasResults() const { return !mMonitorResults.empty();}
 
@@ -102,7 +102,7 @@ class LLSceneMonitor :  public LLSingleton<LLSceneMonitor>
 
 	std::vector<LLAnimPauseRequest> mAvatarPauseHandles;
 
-	LLTrace::ExtendableRecording* mRecording;
+	LLTrace::ExtendablePeriodicRecording* mRecording;
 
 	//---------------------------------------
 	typedef struct _monitor_result