diff --git a/indra/llcommon/lltracerecording.cpp b/indra/llcommon/lltracerecording.cpp
index e4cff551f9ff95592b6d26e5f37ead073d7dcfcc..c44cc8a8a70287de1b3a5a7bba5ffd13c3622188 100644
--- a/indra/llcommon/lltracerecording.cpp
+++ b/indra/llcommon/lltracerecording.cpp
@@ -63,6 +63,12 @@ void Recording::reset()
 	mSamplingTimer.reset();
 }
 
+void Recording::update()
+{
+	mElapsedSeconds = 0.0;
+	mSamplingTimer.reset();
+}
+
 void Recording::resume()
 {
 	if (!mIsStarted)
diff --git a/indra/llcommon/lltracerecording.h b/indra/llcommon/lltracerecording.h
index f9bc6b61b24cfe7f0e25e0849e2d923944874c47..4d53cd9600129bd5bec6f21b1ef4b8e92c943aeb 100644
--- a/indra/llcommon/lltracerecording.h
+++ b/indra/llcommon/lltracerecording.h
@@ -61,6 +61,7 @@ namespace LLTrace
 		void mergeDeltas(const Recording& baseline, const Recording& target);
 
 		void reset();
+		void update();
 
 		bool isStarted() { return mIsStarted; }
 
diff --git a/indra/llcommon/lltracethreadrecorder.cpp b/indra/llcommon/lltracethreadrecorder.cpp
index 9115a52fd1f6ead6c14781fee784a6bc066e32d2..b2c6fe3b80d6b26a099bf86fbcf8b929ddc5ec62 100644
--- a/indra/llcommon/lltracethreadrecorder.cpp
+++ b/indra/llcommon/lltracethreadrecorder.cpp
@@ -68,10 +68,7 @@ void ThreadRecorder::activate( Recording* recording )
 	mPrimaryRecording = &mActiveRecordings.front().mBaseline;
 }
 
-//TODO: consider merging results down the list to one past the buffered item.
-// this would require 2 buffers per sampler, to separate current total from running total
-
-void ThreadRecorder::deactivate( Recording* recording )
+std::list<ThreadRecorder::ActiveRecording>::iterator ThreadRecorder::update( Recording* recording )
 {
 	for (std::list<ActiveRecording>::iterator it = mActiveRecordings.begin(), end_it = mActiveRecordings.end();
 		it != end_it;
@@ -92,10 +89,20 @@ void ThreadRecorder::deactivate( Recording* recording )
 				next_it->mBaseline.makePrimary();
 				mPrimaryRecording = &next_it->mBaseline;
 			}
-			mActiveRecordings.erase(it);
-			break;
+			return it;
 		}
 	}
+
+	return mActiveRecordings.end();
+}
+
+void ThreadRecorder::deactivate( Recording* recording )
+{
+	std::list<ActiveRecording>::iterator it = update(recording);
+	if (it != mActiveRecordings.end())
+	{
+		mActiveRecordings.erase(it);
+	}
 }
 
 ThreadRecorder::ActiveRecording::ActiveRecording( Recording* source, Recording* target ) 
diff --git a/indra/llcommon/lltracethreadrecorder.h b/indra/llcommon/lltracethreadrecorder.h
index 40441d04471e02b74c6ea11fe3b59ca2ae9a210b..42230087c04d080e2d493533c560de0868593b0a 100644
--- a/indra/llcommon/lltracethreadrecorder.h
+++ b/indra/llcommon/lltracethreadrecorder.h
@@ -37,6 +37,8 @@ namespace LLTrace
 {
 	class LL_COMMON_API ThreadRecorder
 	{
+	protected:
+		struct ActiveRecording;
 	public:
 		ThreadRecorder();
 		ThreadRecorder(const ThreadRecorder& other);
@@ -44,6 +46,7 @@ namespace LLTrace
 		virtual ~ThreadRecorder();
 
 		void activate(Recording* recording);
+		std::list<struct ActiveRecording>::iterator update(Recording* recording);
 		void deactivate(Recording* recording);
 
 		virtual void pushToMaster() = 0;