diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 4ab0e3336a2869be47bace4bd095c1f17f26803d..559f427de642acd1176c8dbe25b0b4a7d601c23b 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -4278,10 +4278,6 @@ void LLAppViewer::idle()
 				gObjectList.mNumUnknownUpdates = 0;
 			}
 
-			// ViewerMetrics FPS piggy-backing on the debug timer.
-			// The 5-second interval is nice for this purpose.  If the object debug
-			// bit moves or is disabled, please give this a suitable home.
-			LLViewerAssetStatsFF::record_fps_main(gFPSClamped);
 			LLViewerAssetStatsFF::record_avatar_stats();
 		}
 	}
@@ -5220,17 +5216,7 @@ void LLAppViewer::metricsUpdateRegion(U64 region_handle)
 {
 	if (0 != region_handle)
 	{
-		LLViewerAssetStatsFF::set_region_main(region_handle);
-		if (LLAppViewer::sTextureFetch)
-		{
-			// Send a region update message into 'thread1' to get the new region.
-			LLAppViewer::sTextureFetch->commandSetRegion(region_handle);
-		}
-		else
-		{
-			// No 'thread1', a.k.a. TextureFetch, so update directly
-			LLViewerAssetStatsFF::set_region_thread1(region_handle);
-		}
+		LLViewerAssetStatsFF::set_region(region_handle);
 	}
 }
 
@@ -5241,7 +5227,7 @@ void LLAppViewer::metricsUpdateRegion(U64 region_handle)
  */
 void LLAppViewer::metricsSend(bool enable_reporting)
 {
-	if (! gViewerAssetStatsMain)
+	if (! gViewerAssetStats)
 		return;
 
 	if (LLAppViewer::sTextureFetch)
@@ -5254,7 +5240,7 @@ void LLAppViewer::metricsSend(bool enable_reporting)
 
 			// Make a copy of the main stats to send into another thread.
 			// Receiving thread takes ownership.
-			LLViewerAssetStats * main_stats(new LLViewerAssetStats(*gViewerAssetStatsMain));
+			LLViewerAssetStats * main_stats(new LLViewerAssetStats(*gViewerAssetStats));
 			
 			// Send a report request into 'thread1' to get the rest of the data
 			// and provide some additional parameters while here.
@@ -5273,6 +5259,6 @@ void LLAppViewer::metricsSend(bool enable_reporting)
 	// Reset even if we can't report.  Rather than gather up a huge chunk of
 	// data, we'll keep to our sampling interval and retain the data
 	// resolution in time.
-	gViewerAssetStatsMain->reset();
+	gViewerAssetStats->reset();
 }
 
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 8ddaac5cc880640c2b2ed4b9c40f88408930c9c4..903fd6acee8ee3bbc6c0d56a34a8df6db1dc611d 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -368,15 +368,15 @@ class HTTPGetResponder : public LLCurl::Responder
 
 			if (worker->mMetricsStartTime)
 			{
-				LLViewerAssetStatsFF::record_response_thread1(LLViewerAssetType::AT_TEXTURE,
-															  true,
-															  LLImageBase::TYPE_AVATAR_BAKE == worker->mType,
-															  LLViewerAssetStatsFF::get_timestamp() - worker->mMetricsStartTime);
+				LLViewerAssetStatsFF::record_response(LLViewerAssetType::AT_TEXTURE,
+													true,
+													LLImageBase::TYPE_AVATAR_BAKE == worker->mType,
+													LLViewerAssetStatsFF::get_timestamp() - worker->mMetricsStartTime);
 				worker->mMetricsStartTime = 0;
 			}
-			LLViewerAssetStatsFF::record_dequeue_thread1(LLViewerAssetType::AT_TEXTURE,
-														 true,
-														 LLImageBase::TYPE_AVATAR_BAKE == worker->mType);
+			LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE,
+												true,
+												LLImageBase::TYPE_AVATAR_BAKE == worker->mType);
 		}
 		else
 		{
@@ -400,109 +400,6 @@ class HTTPGetResponder : public LLCurl::Responder
 	bool mFollowRedir;
 };
 
-//////////////////////////////////////////////////////////////////////////////
-
-// Cross-thread messaging for asset metrics.
-
-/**
- * @brief Base class for cross-thread requests made of the fetcher
- *
- * I believe the intent of the LLQueuedThread class was to
- * have these operations derived from LLQueuedThread::QueuedRequest
- * but the texture fetcher has elected to manage the queue
- * in its own manner.  So these are free-standing objects which are
- * managed in simple FIFO order on the mCommands queue of the
- * LLTextureFetch object.
- *
- * What each represents is a simple command sent from an
- * outside thread into the TextureFetch thread to be processed
- * in order and in a timely fashion (though not an absolute
- * higher priority than other operations of the thread).
- * Each operation derives a new class from the base customizing
- * members, constructors and the doWork() method to effect
- * the command.
- *
- * The flow is one-directional.  There are two global instances
- * of the LLViewerAssetStats collector, one for the main program's
- * thread pointed to by gViewerAssetStatsMain and one for the
- * TextureFetch thread pointed to by gViewerAssetStatsThread1.
- * Common operations has each thread recording metrics events
- * into the respective collector unconcerned with locking and
- * the state of any other thread.  But when the agent moves into
- * a different region or the metrics timer expires and a report
- * needs to be sent back to the grid, messaging across threads
- * is required to distribute data and perform global actions.
- * In pseudo-UML, it looks like:
- *
- *                       Main                 Thread1
- *                        .                      .
- *                        .                      .
- *                     +-----+                   .
- *                     | AM  |                   .
- *                     +--+--+                   .
- *      +-------+         |                      .
- *      | Main  |      +--+--+                   .
- *      |       |      | SRE |---.               .
- *      | Stats |      +-----+    \              .
- *      |       |         |        \  (uuid)  +-----+
- *      | Coll. |      +--+--+      `-------->| SR  |
- *      +-------+      | MSC |                +--+--+
- *         | ^         +-----+                   |
- *         | |  (uuid)  / .                   +-----+ (uuid)
- *         |  `--------'  .                   | MSC |---------.
- *         |              .                   +-----+         |
- *         |           +-----+                   .            v
- *         |           | TE  |                   .        +-------+
- *         |           +--+--+                   .        | Thd1  |
- *         |              |                      .        |       |
- *         |           +-----+                   .        | Stats |
- *          `--------->| RSC |                   .        |       |
- *                     +--+--+                   .        | Coll. |
- *                        |                      .        +-------+
- *                     +--+--+                   .            |
- *                     | SME |---.               .            |
- *                     +-----+    \              .            |
- *                        .        \ (clone)  +-----+         |
- *                        .         `-------->| SM  |         |
- *                        .                   +--+--+         |
- *                        .                      |            |
- *                        .                   +-----+         |
- *                        .                   | RSC |<--------'
- *                        .                   +-----+
- *                        .                      |
- *                        .                   +-----+
- *                        .                   | CP  |--> HTTP POST
- *                        .                   +-----+
- *                        .                      .
- *                        .                      .
- *
- *
- * Key:
- *
- * SRE - Set Region Enqueued.  Enqueue a 'Set Region' command in
- *       the other thread providing the new UUID of the region.
- *       TFReqSetRegion carries the data.
- * SR  - Set Region.  New region UUID is sent to the thread-local
- *       collector.
- * SME - Send Metrics Enqueued.  Enqueue a 'Send Metrics' command
- *       including an ownership transfer of a cloned LLViewerAssetStats.
- *       TFReqSendMetrics carries the data.
- * SM  - Send Metrics.  Global metrics reporting operation.  Takes
- *       the cloned stats from the command, merges it with the
- *       thread's local stats, converts to LLSD and sends it on
- *       to the grid.
- * AM  - Agent Moved.  Agent has completed some sort of move to a
- *       new region.
- * TE  - Timer Expired.  Metrics timer has expired (on the order
- *       of 10 minutes).
- * CP  - CURL Post
- * MSC - Modify Stats Collector.  State change in the thread-local
- *       collector.  Typically a region change which affects the
- *       global pointers used to find the 'current stats'.
- * RSC - Read Stats Collector.  Extract collector data cloning it
- *       (i.e. deep copy) when necessary.
- *
- */
 class LLTextureFetch::TFRequest // : public LLQueuedThread::QueuedRequest
 {
 public:
@@ -521,36 +418,6 @@ class LLTextureFetch::TFRequest // : public LLQueuedThread::QueuedRequest
 namespace 
 {
 
-/**
- * @brief Implements a 'Set Region' cross-thread command.
- *
- * When an agent moves to a new region, subsequent metrics need
- * to be binned into a new or existing stats collection in 1:1
- * relationship with the region.  We communicate this region
- * change across the threads involved in the communication with
- * this message.
- *
- * Corresponds to LLTextureFetch::commandSetRegion()
- */
-class TFReqSetRegion : public LLTextureFetch::TFRequest
-{
-public:
-	TFReqSetRegion(U64 region_handle)
-		: LLTextureFetch::TFRequest(),
-		  mRegionHandle(region_handle)
-		{}
-	TFReqSetRegion & operator=(const TFReqSetRegion &);	// Not defined
-
-	virtual ~TFReqSetRegion()
-		{}
-
-	virtual bool doWork(LLTextureFetch * fetcher);
-		
-public:
-	const U64 mRegionHandle;
-};
-
-
 /**
  * @brief Implements a 'Send Metrics' cross-thread command.
  *
@@ -1104,9 +971,9 @@ bool LLTextureFetchWorker::doWork(S32 param)
 			{
 				mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
 			}
-			LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE,
-														 false,
-														 LLImageBase::TYPE_AVATAR_BAKE == mType);
+			LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE,
+												false,
+												LLImageBase::TYPE_AVATAR_BAKE == mType);
 			setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
 			
 			return false;
@@ -1121,7 +988,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
 			//{
 			//   mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
 			//}
-			//LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE, false,
+			//LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false,
 			//                                             LLImageBase::TYPE_AVATAR_BAKE == mType);
 			//setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
 			return false;
@@ -1150,15 +1017,15 @@ bool LLTextureFetchWorker::doWork(S32 param)
 
 			if (mMetricsStartTime)
 			{
-				LLViewerAssetStatsFF::record_response_thread1(LLViewerAssetType::AT_TEXTURE,
-															  false,
-															  LLImageBase::TYPE_AVATAR_BAKE == mType,
-															  LLViewerAssetStatsFF::get_timestamp() - mMetricsStartTime);
+				LLViewerAssetStatsFF::record_response(LLViewerAssetType::AT_TEXTURE,
+													false,
+													LLImageBase::TYPE_AVATAR_BAKE == mType,
+													LLViewerAssetStatsFF::get_timestamp() - mMetricsStartTime);
 				mMetricsStartTime = 0;
 			}
-			LLViewerAssetStatsFF::record_dequeue_thread1(LLViewerAssetType::AT_TEXTURE,
-														 false,
-														 LLImageBase::TYPE_AVATAR_BAKE == mType);
+			LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE,
+												false,
+												LLImageBase::TYPE_AVATAR_BAKE == mType);
 		}
 		else
 		{
@@ -1167,9 +1034,9 @@ bool LLTextureFetchWorker::doWork(S32 param)
 			{
 				mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
 			}
-			LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE,
-														 false,
-														 LLImageBase::TYPE_AVATAR_BAKE == mType);
+			LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE,
+												false,
+												LLImageBase::TYPE_AVATAR_BAKE == mType);
 			setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
 		}
 		return false;
@@ -1226,9 +1093,9 @@ bool LLTextureFetchWorker::doWork(S32 param)
 				{
 					mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
 				}
-				LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE,
-															 true,
-															 LLImageBase::TYPE_AVATAR_BAKE == mType);
+				LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE,
+													true,
+													LLImageBase::TYPE_AVATAR_BAKE == mType);
 
 				// Will call callbackHttpGet when curl request completes
 				std::vector<std::string> headers;
@@ -2848,13 +2715,6 @@ void LLTextureFetch::dump()
 
 // cross-thread command methods
 
-void LLTextureFetch::commandSetRegion(U64 region_handle)
-{
-	TFReqSetRegion * req = new TFReqSetRegion(region_handle);
-
-	cmdEnqueue(req);
-}
-
 void LLTextureFetch::commandSendMetrics(const std::string & caps_url,
 										const LLUUID & session_id,
 										const LLUUID & agent_id,
@@ -2922,19 +2782,6 @@ void LLTextureFetch::cmdDoWork()
 namespace
 {
 
-/**
- * Implements the 'Set Region' command.
- *
- * Thread:  Thread1 (TextureFetch)
- */
-bool
-TFReqSetRegion::doWork(LLTextureFetch *)
-{
-	LLViewerAssetStatsFF::set_region_thread1(mRegionHandle);
-
-	return true;
-}
-
 
 TFReqSendMetrics::~TFReqSendMetrics()
 {
diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp
index 44e4c5414206156f3fcf8684715df81ae4d0ff67..cc15d6433f8f2a40dc40c23baa47446f6da8dc3c 100755
--- a/indra/newview/llviewerassetstats.cpp
+++ b/indra/newview/llviewerassetstats.cpp
@@ -82,95 +82,7 @@
 // ------------------------------------------------------
 // Global data definitions
 // ------------------------------------------------------
-LLViewerAssetStats * gViewerAssetStatsMain(0);
-LLViewerAssetStats * gViewerAssetStatsThread1(0);
-LLTrace::Count<> LLViewerAssetStats::sEnqueued[EVACCount] = {LLTrace::Count<>("enqueuedassetrequeststemptexturehttp", "Number of temporary texture asset http requests enqueued"),
-																LLTrace::Count<>("enqueuedassetrequeststemptextureudp", "Number of temporary texture asset udp requests enqueued"),
-																LLTrace::Count<>("enqueuedassetrequestsnontemptexturehttp", "Number of texture asset http requests enqueued"),
-																LLTrace::Count<>("enqueuedassetrequestsnontemptextureudp", "Number of texture asset udp requests enqueued"),
-																LLTrace::Count<>("enqueuedassetrequestswearableudp", "Number of wearable asset requests enqueued"),
-																LLTrace::Count<>("enqueuedassetrequestssoundudp", "Number of sound asset requests enqueued"),
-																LLTrace::Count<>("enqueuedassetrequestsgestureudp", "Number of gesture asset requests enqueued"),
-																LLTrace::Count<>("enqueuedassetrequestsother", "Number of other asset requests enqueued")};
-LLTrace::Count<> LLViewerAssetStats::sDequeued[EVACCount] = {LLTrace::Count<>("dequeuedassetrequeststemptexturehttp", "Number of temporary texture asset http requests dequeued"),
-																LLTrace::Count<>("dequeuedassetrequeststemptextureudp", "Number of temporary texture asset udp requests dequeued"),
-																LLTrace::Count<>("dequeuedassetrequestsnontemptexturehttp", "Number of texture asset http requests dequeued"),
-																LLTrace::Count<>("dequeuedassetrequestsnontemptextureudp", "Number of texture asset udp requests dequeued"),
-																LLTrace::Count<>("dequeuedassetrequestswearableudp", "Number of wearable asset requests dequeued"),
-																LLTrace::Count<>("dequeuedassetrequestssoundudp", "Number of sound asset requests dequeued"),
-																LLTrace::Count<>("dequeuedassetrequestsgestureudp", "Number of gesture asset requests dequeued"),
-																LLTrace::Count<>("dequeuedassetrequestsother", "Number of other asset requests dequeued")};
-LLTrace::Measurement<LLTrace::Seconds> LLViewerAssetStats::sResponse[EVACCount] = {LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimestemptexturehttp", "Time spent responding to temporary texture asset http requests"),
-																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimestemptextureudp", "Time spent responding to temporary texture asset udp requests"),
-																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesnontemptexturehttp", "Time spent responding to texture asset http requests"),
-																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesnontemptextureudp", "Time spent responding to texture asset udp requests"),
-																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimeswearableudp", "Time spent responding to wearable asset requests"),
-																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimessoundudp", "Time spent responding to sound asset requests"),
-																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesgestureudp", "Time spent responding to gesture asset requests"),
-																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesother", "Time spent responding to other asset requests")};
-
-
-// ------------------------------------------------------
-// Local declarations
-// ------------------------------------------------------
-namespace
-{
-
-static LLViewerAssetStats::EViewerAssetCategories
-asset_type_to_category(const LLViewerAssetType::EType at, bool with_http, bool is_temp);
-
-}
-
-// ------------------------------------------------------
-// LLViewerAssetStats::PerRegionStats struct definition
-// ------------------------------------------------------
-void
-LLViewerAssetStats::PerRegionStats::reset()
-{
-	for (int i(0); i < LL_ARRAY_SIZE(mRequests); ++i)
-	{
-		mRequests[i].mEnqueued.reset();
-		mRequests[i].mDequeued.reset();
-		mRequests[i].mResponse.reset();
-	}
-	mFPS.reset();
-	
-	mTotalTime = 0;
-	mStartTimestamp = LLViewerAssetStatsFF::get_timestamp();
-}
-
-
-void
-LLViewerAssetStats::PerRegionStats::merge(const LLViewerAssetStats::PerRegionStats & src)
-{
-	// mRegionHandle, mTotalTime, mStartTimestamp are left alone.
-	
-	// mFPS
-	if (src.mFPS.getCount() && mFPS.getCount())
-	{
-		mFPS.merge(src.mFPS);
-	}
-
-	// Avatar stats - data all comes from main thread, so leave alone.
-
-	// Requests
-	for (int i = 0; i < LL_ARRAY_SIZE(mRequests); ++i)
-	{
-		mRequests[i].mEnqueued.merge(src.mRequests[i].mEnqueued);
-		mRequests[i].mDequeued.merge(src.mRequests[i].mDequeued);
-		mRequests[i].mResponse.merge(src.mRequests[i].mResponse);
-	}
-
-}
-
-
-void
-LLViewerAssetStats::PerRegionStats::accumulateTime(duration_t now)
-{
-	mTotalTime += (now - mStartTimestamp);
-	mStartTimestamp = now;
-}
-
+LLViewerAssetStats * gViewerAssetStats(0);
 
 // ------------------------------------------------------
 // LLViewerAssetStats class definition
@@ -183,47 +95,25 @@ LLViewerAssetStats::LLViewerAssetStats()
 
 
 LLViewerAssetStats::LLViewerAssetStats(const LLViewerAssetStats & src)
-	: mRegionHandle(src.mRegionHandle),
-	  mResetTimestamp(src.mResetTimestamp),
-	  mPhaseStats(src.mPhaseStats),
-	  mAvatarRezStates(src.mAvatarRezStates)
+:	mRegionHandle(src.mRegionHandle),
+	mPhaseStats(src.mPhaseStats),
+	mAvatarRezStates(src.mAvatarRezStates),
+	mRegionRecordings(src.mRegionRecordings)
 {
-	const PerRegionContainer::const_iterator it_end(src.mRegionStats.end());
-	for (PerRegionContainer::const_iterator it(src.mRegionStats.begin()); it_end != it; ++it)
-	{
-		mRegionStats[it->first] = new PerRegionStats(*it->second);
-	}
-	mCurRegionStats = mRegionStats[mRegionHandle];
+	mCurRecording = &mRegionRecordings[mRegionHandle];
 }
 
 
-void
-LLViewerAssetStats::reset()
+void LLViewerAssetStats::reset()
 {
 	// Empty the map of all region stats
-	mRegionStats.clear();
-
-	// If we have a current stats, reset it, otherwise, as at construction,
-	// create a new one as we must always have a current stats block.
-	if (mCurRegionStats)
-	{
-		mCurRegionStats->reset();
-	}
-	else
-	{
-		mCurRegionStats = new PerRegionStats(mRegionHandle);
-	}
+	mRegionRecordings.clear();
 
-	// And add reference to map
-	mRegionStats[mRegionHandle] = mCurRegionStats;
-
-	// Start timestamp consistent with per-region collector
-	mResetTimestamp = mCurRegionStats->mStartTimestamp;
+	// initialize new recording for current region
+	mCurRecording = &mRegionRecordings[mRegionHandle];
 }
 
-
-void
-LLViewerAssetStats::setRegion(region_handle_t region_handle)
+void LLViewerAssetStats::setRegion(region_handle_t region_handle)
 {
 	if (region_handle == mRegionHandle)
 	{
@@ -231,207 +121,386 @@ LLViewerAssetStats::setRegion(region_handle_t region_handle)
 		return;
 	}
 
-	// Get duration for current set
-	const duration_t now = LLViewerAssetStatsFF::get_timestamp();
-	mCurRegionStats->accumulateTime(now);
+	mCurRecording->stop();
+	mCurRecording = &mRegionRecordings[region_handle];
+	mCurRecording->start();
 
-	// Prepare new set
-	PerRegionContainer::iterator new_stats = mRegionStats.find(region_handle);
-	if (mRegionStats.end() == new_stats)
-	{
-		// Haven't seen this region_id before, create a new block and make it current.
-		mCurRegionStats = new PerRegionStats(region_handle);
-		mRegionStats[region_handle] = mCurRegionStats;
-	}
-	else
-	{
-		mCurRegionStats = new_stats->second;
-	}
-	mCurRegionStats->mStartTimestamp = now;
 	mRegionHandle = region_handle;
 }
 
-
-void
-LLViewerAssetStats::recordGetEnqueued(LLViewerAssetType::EType at, bool with_http, bool is_temp)
+void LLViewerAssetStats::recordAvatarStats()
 {
-	const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp));
-	
-	++(mCurRegionStats->mRequests[int(eac)].mEnqueued);
-	sEnqueued[int(eac)].add(1);
+	LLVOAvatar::getNearbyRezzedStats(mAvatarRezStates);
+	mPhaseStats.clear();
+	mPhaseStats["cloud"] = LLViewerStats::PhaseMap::getPhaseStats("cloud");
+	mPhaseStats["cloud-or-gray"] = LLViewerStats::PhaseMap::getPhaseStats("cloud-or-gray");
 }
+
+struct AssetRequestType : public LLInitParam::Block<AssetRequestType>
+{
+	Optional<S32>	enqueued,
+					dequeued,
+					resp_count;
+	Optional<F64>	resp_min,
+					resp_max,
+					resp_mean;
 	
-void
-LLViewerAssetStats::recordGetDequeued(LLViewerAssetType::EType at, bool with_http, bool is_temp)
+	AssetRequestType()
+	:	enqueued("enqueued"),
+		dequeued("dequeued"),
+		resp_count("resp_count"),
+		resp_min("resp_min"),
+		resp_max("resp_max"),
+		resp_mean("resp_mean")
+	{}
+};
+
+struct FPSStats : public LLInitParam::Block<FPSStats>
 {
-	const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp));
+	Optional<S32>	count;
+	Optional<F64>	min,
+					max,
+					mean;
+	FPSStats()
+	:	count("count"),
+		min("min"),
+		max("max"),
+		mean("mean")
+	{}
+};
+
+struct RegionStats : public LLInitParam::Block<RegionStats>
+{
+	Optional<AssetRequestType>	get_texture_temp_http,
+								get_texture_temp_udp,
+								get_texture_non_temp_http,
+								get_texture_non_temp_udp,
+								get_wearable_udp,
+								get_sound_udp,
+								get_gesture_udp,
+								get_other;
+	Optional<FPSStats>			fps;
+	Mandatory<S32>				grid_x,
+								grid_y;
+	Mandatory<F64>				duration;
+
+	RegionStats()
+	:	get_texture_temp_http("get_texture_temp_http"),
+		get_texture_temp_udp("get_texture_temp_udp"),
+		get_texture_non_temp_http("get_texture_non_temp_http"),
+		get_texture_non_temp_udp("get_texture_non_temp_udp"),
+		get_wearable_udp("get_wearable_udp"),
+		get_sound_udp("get_sound_udp"),
+		get_gesture_udp("get_gesture_udp"),
+		get_other("get_other"),
+		fps("fps"),
+		grid_x("grid_x"),
+		grid_y("grid_y"),
+		duration("duration")
+	{}
+};
+
+struct AvatarRezState : public LLInitParam::Block<AvatarRezState>
+{
+	Mandatory<S32>	cloud,
+					gray,
+					textured;
+	AvatarRezState()
+	:	cloud("cloud"),
+		gray("gray"),
+		textured("textured")
+	{}
+};
+
+struct AvatarPhaseStats : public LLInitParam::Block<AvatarPhaseStats>
+{
+	Mandatory<LLSD>	cloud,
+					cloud_or_gray;
 
-	++(mCurRegionStats->mRequests[int(eac)].mDequeued);
-	sDequeued[int(eac)].add(1);
-}
+	AvatarPhaseStats()
+	:	cloud("cloud"),
+		cloud_or_gray("cloud-or-gray")
+	{}
+};
 
-void
-LLViewerAssetStats::recordGetServiced(LLViewerAssetType::EType at, bool with_http, bool is_temp, duration_t duration)
+struct AvatarInfo : public LLInitParam::Block<AvatarInfo>
 {
-	const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp));
+	Mandatory<AvatarRezState> nearby;
+	Mandatory<AvatarPhaseStats> phase_stats;
 
-	mCurRegionStats->mRequests[int(eac)].mResponse.record(duration);
-	sResponse[int(eac)].sample<LLTrace::Seconds>(duration);
-}
+	AvatarInfo()
+	:	nearby("nearby"),
+		phase_stats("phase_stats")
+	{}
+};
 
-void
-LLViewerAssetStats::recordFPS(F32 fps)
+struct AssetStats : public LLInitParam::Block<AssetStats>
 {
-	mCurRegionStats->mFPS.record(fps);
-}
+	Multiple<RegionStats>	regions;
+	Mandatory<F64>			duration;
+
+	AssetStats()
+	:	regions("regions"),
+		duration("duration")
+	{}
+
+};
+
+//LLSD LLViewerAssetStats::asLLSD(bool compact_output)
+//{
+//	// Top-level tags
+//	static const LLSD::String tags[LLViewerAssetStatsFF::EVACCount] = 
+//		{
+//			LLSD::String("get_texture_temp_http"),
+//			LLSD::String("get_texture_temp_udp"),
+//			LLSD::String("get_texture_non_temp_http"),
+//			LLSD::String("get_texture_non_temp_udp"),
+//			LLSD::String("get_wearable_udp"),
+//			LLSD::String("get_sound_udp"),
+//			LLSD::String("get_gesture_udp"),
+//			LLSD::String("get_other")
+//		};
+//
+//	// Stats Group Sub-tags.
+//	static const LLSD::String enq_tag("enqueued");
+//	static const LLSD::String deq_tag("dequeued");
+//	static const LLSD::String rcnt_tag("resp_count");
+//	static const LLSD::String rmin_tag("resp_min");
+//	static const LLSD::String rmax_tag("resp_max");
+//	static const LLSD::String rmean_tag("resp_mean");
+//
+//	// MMM Group Sub-tags.
+//	static const LLSD::String cnt_tag("count");
+//	static const LLSD::String min_tag("min");
+//	static const LLSD::String max_tag("max");
+//	static const LLSD::String mean_tag("mean");
+//
+//	// Avatar sub-tags
+//	static const LLSD::String avatar_tag("avatar");
+//	static const LLSD::String avatar_nearby_tag("nearby");
+//	static const LLSD::String avatar_phase_stats_tag("phase_stats");
+//	
+//	const duration_t now = LLViewerAssetStatsFF::get_timestamp();
+//	mCurRegionStats->accumulateTime(now);
+//
+//	LLSD regions = LLSD::emptyArray();
+//	for (PerRegionContainer::iterator it = mRegionStats.begin();
+//		 mRegionStats.end() != it;
+//		 ++it)
+//	{
+//		if (0 == it->first)
+//		{
+//			// Never emit NULL UUID/handle in results.
+//			continue;
+//		}
+//
+//		PerRegionStats & stats = *it->second;
+//		
+//		LLSD reg_stat = LLSD::emptyMap();
+//		
+//		for (int i = 0; i < LL_ARRAY_SIZE(tags); ++i)
+//		{
+//			PerRegionStats::prs_group & group(stats.mRequests[i]);
+//			
+//			if ((! compact_output) ||
+//				group.mEnqueued.getCount() ||
+//				group.mDequeued.getCount() ||
+//				group.mResponse.getCount())
+//			{
+//				LLSD & slot = reg_stat[tags[i]];
+//				slot = LLSD::emptyMap();
+//				slot[enq_tag] = LLSD(S32(stats.mRequests[i].mEnqueued.getCount()));
+//				slot[deq_tag] = LLSD(S32(stats.mRequests[i].mDequeued.getCount()));
+//				slot[rcnt_tag] = LLSD(S32(stats.mRequests[i].mResponse.getCount()));
+//				slot[rmin_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMin() * 1.0e-6));
+//				slot[rmax_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMax() * 1.0e-6));
+//				slot[rmean_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMean() * 1.0e-6));
+//			}
+//		}
+//
+//		if ((! compact_output) || stats.mFPS.getCount())
+//		{
+//			LLSD & slot = reg_stat["fps"];
+//			slot = LLSD::emptyMap();
+//			slot[cnt_tag] = LLSD(S32(stats.mFPS.getCount()));
+//			slot[min_tag] = LLSD(F64(stats.mFPS.getMin()));
+//			slot[max_tag] = LLSD(F64(stats.mFPS.getMax()));
+//			slot[mean_tag] = LLSD(F64(stats.mFPS.getMean()));
+//		}
+//		U32 grid_x(0), grid_y(0);
+//		grid_from_region_handle(it->first, &grid_x, &grid_y);
+//		reg_stat["grid_x"] = LLSD::Integer(grid_x);
+//		reg_stat["grid_y"] = LLSD::Integer(grid_y);
+//		reg_stat["duration"] = LLSD::Real(stats.mTotalTime * 1.0e-6);		
+//		regions.append(reg_stat);
+//	}
+//
+//	LLSD ret = LLSD::emptyMap();
+//	ret["regions"] = regions;
+//	ret["duration"] = LLSD::Real((now - mResetTimestamp) * 1.0e-6);
+//	LLSD avatar_info;
+//	avatar_info[avatar_nearby_tag] = LLSD::emptyArray();
+//	for (S32 rez_stat=0; rez_stat < mAvatarRezStates.size(); ++rez_stat)
+//	{
+//		std::string rez_status_name = LLVOAvatar::rezStatusToString(rez_stat);
+//		avatar_info[avatar_nearby_tag][rez_status_name] = mAvatarRezStates[rez_stat];
+//	}
+//	avatar_info[avatar_phase_stats_tag]["cloud"] = mPhaseStats["cloud"].asLLSD();
+//	avatar_info[avatar_phase_stats_tag]["cloud-or-gray"] = mPhaseStats["cloud-or-gray"].asLLSD();
+//	ret[avatar_tag] = avatar_info;
+//	
+//	return ret;
+//}
 
-void
-LLViewerAssetStats::recordAvatarStats()
-{
-	std::vector<S32> rez_counts;
-	LLVOAvatar::getNearbyRezzedStats(rez_counts);
-	mAvatarRezStates = rez_counts;
-	mPhaseStats.clear();
-	mPhaseStats["cloud"] = LLViewerStats::PhaseMap::getPhaseStats("cloud");
-	mPhaseStats["cloud-or-gray"] = LLViewerStats::PhaseMap::getPhaseStats("cloud-or-gray");
-}
+// ------------------------------------------------------
+// Global free-function definitions (LLViewerAssetStatsFF namespace)
+// ------------------------------------------------------
 
-LLSD
-LLViewerAssetStats::asLLSD(bool compact_output)
+namespace LLViewerAssetStatsFF
 {
-	// Top-level tags
-	static const LLSD::String tags[EVACCount] = 
+	static EViewerAssetCategories asset_type_to_category(const LLViewerAssetType::EType at, bool with_http, bool is_temp)
+	{
+		// For statistical purposes, we divide GETs into several
+		// populations of asset fetches:
+		//  - textures which are de-prioritized in the asset system
+		//  - wearables (clothing, bodyparts) which directly affect
+		//    user experiences when they log in
+		//  - sounds
+		//  - gestures
+		//  - everything else.
+		//
+		llassert_always(50 == LLViewerAssetType::AT_COUNT);
+
+		// Multiple asset definitions are floating around so this requires some
+		// maintenance and attention.
+		static const EViewerAssetCategories asset_to_bin_map[LLViewerAssetType::AT_COUNT] =
 		{
-			LLSD::String("get_texture_temp_http"),
-			LLSD::String("get_texture_temp_udp"),
-			LLSD::String("get_texture_non_temp_http"),
-			LLSD::String("get_texture_non_temp_udp"),
-			LLSD::String("get_wearable_udp"),
-			LLSD::String("get_sound_udp"),
-			LLSD::String("get_gesture_udp"),
-			LLSD::String("get_other")
+			EVACTextureTempHTTPGet,			// (0) AT_TEXTURE
+			EVACSoundUDPGet,				// AT_SOUND
+			EVACOtherGet,					// AT_CALLINGCARD
+			EVACOtherGet,					// AT_LANDMARK
+			EVACOtherGet,					// AT_SCRIPT
+			EVACWearableUDPGet,				// AT_CLOTHING
+			EVACOtherGet,					// AT_OBJECT
+			EVACOtherGet,					// AT_NOTECARD
+			EVACOtherGet,					// AT_CATEGORY
+			EVACOtherGet,					// AT_ROOT_CATEGORY
+			EVACOtherGet,					// (10) AT_LSL_TEXT
+			EVACOtherGet,					// AT_LSL_BYTECODE
+			EVACOtherGet,					// AT_TEXTURE_TGA
+			EVACWearableUDPGet,				// AT_BODYPART
+			EVACOtherGet,					// AT_TRASH
+			EVACOtherGet,					// AT_SNAPSHOT_CATEGORY
+			EVACOtherGet,					// AT_LOST_AND_FOUND
+			EVACSoundUDPGet,				// AT_SOUND_WAV
+			EVACOtherGet,					// AT_IMAGE_TGA
+			EVACOtherGet,					// AT_IMAGE_JPEG
+			EVACGestureUDPGet,				// (20) AT_ANIMATION
+			EVACGestureUDPGet,				// AT_GESTURE
+			EVACOtherGet,					// AT_SIMSTATE
+			EVACOtherGet,					// AT_FAVORITE
+			EVACOtherGet,					// AT_LINK
+			EVACOtherGet,					// AT_LINK_FOLDER
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// (30)
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// (40)
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					//
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// 
+			EVACOtherGet,					// AT_MESH
+			// (50)
 		};
 
-	// Stats Group Sub-tags.
-	static const LLSD::String enq_tag("enqueued");
-	static const LLSD::String deq_tag("dequeued");
-	static const LLSD::String rcnt_tag("resp_count");
-	static const LLSD::String rmin_tag("resp_min");
-	static const LLSD::String rmax_tag("resp_max");
-	static const LLSD::String rmean_tag("resp_mean");
-
-	// MMM Group Sub-tags.
-	static const LLSD::String cnt_tag("count");
-	static const LLSD::String min_tag("min");
-	static const LLSD::String max_tag("max");
-	static const LLSD::String mean_tag("mean");
-
-	// Avatar sub-tags
-	static const LLSD::String avatar_tag("avatar");
-	static const LLSD::String avatar_nearby_tag("nearby");
-	static const LLSD::String avatar_phase_stats_tag("phase_stats");
-	
-	const duration_t now = LLViewerAssetStatsFF::get_timestamp();
-	mCurRegionStats->accumulateTime(now);
-
-	LLSD regions = LLSD::emptyArray();
-	for (PerRegionContainer::iterator it = mRegionStats.begin();
-		 mRegionStats.end() != it;
-		 ++it)
-	{
-		if (0 == it->first)
+		if (at < 0 || at >= LLViewerAssetType::AT_COUNT)
 		{
-			// Never emit NULL UUID/handle in results.
-			continue;
+			return EVACOtherGet;
 		}
-
-		PerRegionStats & stats = *it->second;
-		
-		LLSD reg_stat = LLSD::emptyMap();
-		
-		for (int i = 0; i < LL_ARRAY_SIZE(tags); ++i)
+		EViewerAssetCategories ret(asset_to_bin_map[at]);
+		if (EVACTextureTempHTTPGet == ret)
 		{
-			PerRegionStats::prs_group & group(stats.mRequests[i]);
-			
-			if ((! compact_output) ||
-				group.mEnqueued.getCount() ||
-				group.mDequeued.getCount() ||
-				group.mResponse.getCount())
+			// Indexed with [is_temp][with_http]
+			static const EViewerAssetCategories texture_bin_map[2][2] =
 			{
-				LLSD & slot = reg_stat[tags[i]];
-				slot = LLSD::emptyMap();
-				slot[enq_tag] = LLSD(S32(stats.mRequests[i].mEnqueued.getCount()));
-				slot[deq_tag] = LLSD(S32(stats.mRequests[i].mDequeued.getCount()));
-				slot[rcnt_tag] = LLSD(S32(stats.mRequests[i].mResponse.getCount()));
-				slot[rmin_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMin() * 1.0e-6));
-				slot[rmax_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMax() * 1.0e-6));
-				slot[rmean_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMean() * 1.0e-6));
-			}
-		}
-
-		if ((! compact_output) || stats.mFPS.getCount())
-		{
-			LLSD & slot = reg_stat["fps"];
-			slot = LLSD::emptyMap();
-			slot[cnt_tag] = LLSD(S32(stats.mFPS.getCount()));
-			slot[min_tag] = LLSD(F64(stats.mFPS.getMin()));
-			slot[max_tag] = LLSD(F64(stats.mFPS.getMax()));
-			slot[mean_tag] = LLSD(F64(stats.mFPS.getMean()));
-		}
-		U32 grid_x(0), grid_y(0);
-		grid_from_region_handle(it->first, &grid_x, &grid_y);
-		reg_stat["grid_x"] = LLSD::Integer(grid_x);
-		reg_stat["grid_y"] = LLSD::Integer(grid_y);
-		reg_stat["duration"] = LLSD::Real(stats.mTotalTime * 1.0e-6);		
-		regions.append(reg_stat);
-	}
-
-	LLSD ret = LLSD::emptyMap();
-	ret["regions"] = regions;
-	ret["duration"] = LLSD::Real((now - mResetTimestamp) * 1.0e-6);
-	LLSD avatar_info;
-	avatar_info[avatar_nearby_tag] = LLSD::emptyArray();
-	for (S32 rez_stat=0; rez_stat < mAvatarRezStates.size(); ++rez_stat)
-	{
-		std::string rez_status_name = LLVOAvatar::rezStatusToString(rez_stat);
-		avatar_info[avatar_nearby_tag][rez_status_name] = mAvatarRezStates[rez_stat];
-	}
-	avatar_info[avatar_phase_stats_tag]["cloud"] = mPhaseStats["cloud"].asLLSD();
-	avatar_info[avatar_phase_stats_tag]["cloud-or-gray"] = mPhaseStats["cloud-or-gray"].asLLSD();
-	ret[avatar_tag] = avatar_info;
-	
-	return ret;
-}
-
-void
-LLViewerAssetStats::merge(const LLViewerAssetStats & src)
-{
-	// mRegionHandle, mCurRegionStats and mResetTimestamp are left untouched.
-	// Just merge the stats bodies
+				{
+					EVACTextureNonTempUDPGet,
+					EVACTextureNonTempHTTPGet,
+				},
+				{
+					EVACTextureTempUDPGet,
+					EVACTextureTempHTTPGet,
+				}
+			};
 
-	const PerRegionContainer::const_iterator it_end(src.mRegionStats.end());
-	for (PerRegionContainer::const_iterator it(src.mRegionStats.begin()); it_end != it; ++it)
-	{
-		PerRegionContainer::iterator dst(mRegionStats.find(it->first));
-		if (mRegionStats.end() == dst)
-		{
-			// Destination is missing data, just make a private copy
-			mRegionStats[it->first] = new PerRegionStats(*it->second);
-		}
-		else
-		{
-			dst->second->merge(*it->second);
+			ret = texture_bin_map[is_temp][with_http];
 		}
+		return ret;
 	}
-}
-
-
-// ------------------------------------------------------
-// Global free-function definitions (LLViewerAssetStatsFF namespace)
-// ------------------------------------------------------
-
-namespace LLViewerAssetStatsFF
-{
+static LLTrace::Count<> sEnqueued[EVACCount] = {LLTrace::Count<>("enqueuedassetrequeststemptexturehttp", 
+														"Number of temporary texture asset http requests enqueued"),
+													LLTrace::Count<>("enqueuedassetrequeststemptextureudp", 
+														"Number of temporary texture asset udp requests enqueued"),
+													LLTrace::Count<>("enqueuedassetrequestsnontemptexturehttp", 
+														"Number of texture asset http requests enqueued"),
+													LLTrace::Count<>("enqueuedassetrequestsnontemptextureudp", 
+														"Number of texture asset udp requests enqueued"),
+													LLTrace::Count<>("enqueuedassetrequestswearableudp", 
+														"Number of wearable asset requests enqueued"),
+													LLTrace::Count<>("enqueuedassetrequestssoundudp", 
+														"Number of sound asset requests enqueued"),
+													LLTrace::Count<>("enqueuedassetrequestsgestureudp", 
+														"Number of gesture asset requests enqueued"),
+													LLTrace::Count<>("enqueuedassetrequestsother", 
+														"Number of other asset requests enqueued")};
+
+static LLTrace::Count<> sDequeued[EVACCount] = {LLTrace::Count<>("dequeuedassetrequeststemptexturehttp", 
+													"Number of temporary texture asset http requests dequeued"),
+												LLTrace::Count<>("dequeuedassetrequeststemptextureudp", 
+													"Number of temporary texture asset udp requests dequeued"),
+												LLTrace::Count<>("dequeuedassetrequestsnontemptexturehttp", 
+													"Number of texture asset http requests dequeued"),
+												LLTrace::Count<>("dequeuedassetrequestsnontemptextureudp", 
+													"Number of texture asset udp requests dequeued"),
+												LLTrace::Count<>("dequeuedassetrequestswearableudp", 
+													"Number of wearable asset requests dequeued"),
+												LLTrace::Count<>("dequeuedassetrequestssoundudp", 
+													"Number of sound asset requests dequeued"),
+												LLTrace::Count<>("dequeuedassetrequestsgestureudp", 
+													"Number of gesture asset requests dequeued"),
+												LLTrace::Count<>("dequeuedassetrequestsother", 
+													"Number of other asset requests dequeued")};
+static LLTrace::Measurement<LLTrace::Seconds> sResponse[EVACCount] = {LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimestemptexturehttp", 
+																			"Time spent responding to temporary texture asset http requests"),
+																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimestemptextureudp", 
+																			"Time spent responding to temporary texture asset udp requests"),
+																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesnontemptexturehttp", 
+																			"Time spent responding to texture asset http requests"),
+																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesnontemptextureudp", 
+																			"Time spent responding to texture asset udp requests"),
+																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimeswearableudp", 
+																			"Time spent responding to wearable asset requests"),
+																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimessoundudp", 
+																			"Time spent responding to sound asset requests"),
+																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesgestureudp", 
+																			"Time spent responding to gesture asset requests"),
+																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesother", 
+																			"Time spent responding to other asset requests")};
 
 //
 // Target thread is elaborated in the function name.  This could
@@ -452,227 +521,59 @@ namespace LLViewerAssetStatsFF
 
 // 'main' thread - initial program thread
 
-void
-set_region_main(LLViewerAssetStats::region_handle_t region_handle)
+void set_region(LLViewerAssetStats::region_handle_t region_handle)
 {
-	if (! gViewerAssetStatsMain)
+	if (! gViewerAssetStats)
 		return;
 
-	gViewerAssetStatsMain->setRegion(region_handle);
+	gViewerAssetStats->setRegion(region_handle);
 }
 
-void
-record_enqueue_main(LLViewerAssetType::EType at, bool with_http, bool is_temp)
+void record_enqueue(LLViewerAssetType::EType at, bool with_http, bool is_temp)
 {
-	if (! gViewerAssetStatsMain)
-		return;
-
-	gViewerAssetStatsMain->recordGetEnqueued(at, with_http, is_temp);
-}
-
-void
-record_dequeue_main(LLViewerAssetType::EType at, bool with_http, bool is_temp)
-{
-	if (! gViewerAssetStatsMain)
-		return;
-
-	gViewerAssetStatsMain->recordGetDequeued(at, with_http, is_temp);
-}
-
-void
-record_response_main(LLViewerAssetType::EType at, bool with_http, bool is_temp, LLViewerAssetStats::duration_t duration)
-{
-	if (! gViewerAssetStatsMain)
-		return;
-
-	gViewerAssetStatsMain->recordGetServiced(at, with_http, is_temp, duration);
-}
-
-void
-record_fps_main(F32 fps)
-{
-	if (! gViewerAssetStatsMain)
-		return;
-
-	gViewerAssetStatsMain->recordFPS(fps);
-}
-
-void
-record_avatar_stats()
-{
-	if (! gViewerAssetStatsMain)
-		return;
+	const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp));
 
-	gViewerAssetStatsMain->recordAvatarStats();
+	sEnqueued[int(eac)].add(1);
 }
 
-// 'thread1' - should be for TextureFetch thread
-
-void
-set_region_thread1(LLViewerAssetStats::region_handle_t region_handle)
+void record_dequeue(LLViewerAssetType::EType at, bool with_http, bool is_temp)
 {
-	if (! gViewerAssetStatsThread1)
-		return;
-
-	gViewerAssetStatsThread1->setRegion(region_handle);
-}
-
-void
-record_enqueue_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp)
-{
-	if (! gViewerAssetStatsThread1)
-		return;
+	const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp));
 
-	gViewerAssetStatsThread1->recordGetEnqueued(at, with_http, is_temp);
+	sDequeued[int(eac)].add(1);
 }
 
-void
-record_dequeue_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp)
+void record_response(LLViewerAssetType::EType at, bool with_http, bool is_temp, LLViewerAssetStats::duration_t duration)
 {
-	if (! gViewerAssetStatsThread1)
-		return;
+	const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp));
 
-	gViewerAssetStatsThread1->recordGetDequeued(at, with_http, is_temp);
+	sResponse[int(eac)].sample<LLTrace::Seconds>(duration);
 }
 
-void
-record_response_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp, LLViewerAssetStats::duration_t duration)
+void record_avatar_stats()
 {
-	if (! gViewerAssetStatsThread1)
+	if (! gViewerAssetStats)
 		return;
 
-	gViewerAssetStatsThread1->recordGetServiced(at, with_http, is_temp, duration);
+	gViewerAssetStats->recordAvatarStats();
 }
 
-
-void
-init()
+void init()
 {
-	if (! gViewerAssetStatsMain)
+	if (! gViewerAssetStats)
 	{
-		gViewerAssetStatsMain = new LLViewerAssetStats();
-	}
-	if (! gViewerAssetStatsThread1)
-	{
-		gViewerAssetStatsThread1 = new LLViewerAssetStats();
+		gViewerAssetStats = new LLViewerAssetStats();
 	}
 }
 
 void
 cleanup()
 {
-	delete gViewerAssetStatsMain;
-	gViewerAssetStatsMain = 0;
-
-	delete gViewerAssetStatsThread1;
-	gViewerAssetStatsThread1 = 0;
+	delete gViewerAssetStats;
+	gViewerAssetStats = 0;
 }
 
 
 } // namespace LLViewerAssetStatsFF
 
 
-// ------------------------------------------------------
-// Local function definitions
-// ------------------------------------------------------
-
-namespace
-{
-
-LLViewerAssetStats::EViewerAssetCategories
-asset_type_to_category(const LLViewerAssetType::EType at, bool with_http, bool is_temp)
-{
-	// For statistical purposes, we divide GETs into several
-	// populations of asset fetches:
-	//  - textures which are de-prioritized in the asset system
-	//  - wearables (clothing, bodyparts) which directly affect
-	//    user experiences when they log in
-	//  - sounds
-	//  - gestures
-	//  - everything else.
-	//
-	llassert_always(50 == LLViewerAssetType::AT_COUNT);
-
-	// Multiple asset definitions are floating around so this requires some
-	// maintenance and attention.
-	static const LLViewerAssetStats::EViewerAssetCategories asset_to_bin_map[LLViewerAssetType::AT_COUNT] =
-		{
-			LLViewerAssetStats::EVACTextureTempHTTPGet,			// (0) AT_TEXTURE
-			LLViewerAssetStats::EVACSoundUDPGet,				// AT_SOUND
-			LLViewerAssetStats::EVACOtherGet,					// AT_CALLINGCARD
-			LLViewerAssetStats::EVACOtherGet,					// AT_LANDMARK
-			LLViewerAssetStats::EVACOtherGet,					// AT_SCRIPT
-			LLViewerAssetStats::EVACWearableUDPGet,				// AT_CLOTHING
-			LLViewerAssetStats::EVACOtherGet,					// AT_OBJECT
-			LLViewerAssetStats::EVACOtherGet,					// AT_NOTECARD
-			LLViewerAssetStats::EVACOtherGet,					// AT_CATEGORY
-			LLViewerAssetStats::EVACOtherGet,					// AT_ROOT_CATEGORY
-			LLViewerAssetStats::EVACOtherGet,					// (10) AT_LSL_TEXT
-			LLViewerAssetStats::EVACOtherGet,					// AT_LSL_BYTECODE
-			LLViewerAssetStats::EVACOtherGet,					// AT_TEXTURE_TGA
-			LLViewerAssetStats::EVACWearableUDPGet,				// AT_BODYPART
-			LLViewerAssetStats::EVACOtherGet,					// AT_TRASH
-			LLViewerAssetStats::EVACOtherGet,					// AT_SNAPSHOT_CATEGORY
-			LLViewerAssetStats::EVACOtherGet,					// AT_LOST_AND_FOUND
-			LLViewerAssetStats::EVACSoundUDPGet,				// AT_SOUND_WAV
-			LLViewerAssetStats::EVACOtherGet,					// AT_IMAGE_TGA
-			LLViewerAssetStats::EVACOtherGet,					// AT_IMAGE_JPEG
-			LLViewerAssetStats::EVACGestureUDPGet,				// (20) AT_ANIMATION
-			LLViewerAssetStats::EVACGestureUDPGet,				// AT_GESTURE
-			LLViewerAssetStats::EVACOtherGet,					// AT_SIMSTATE
-			LLViewerAssetStats::EVACOtherGet,					// AT_FAVORITE
-			LLViewerAssetStats::EVACOtherGet,					// AT_LINK
-			LLViewerAssetStats::EVACOtherGet,					// AT_LINK_FOLDER
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// (30)
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// (40)
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					//
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// 
-			LLViewerAssetStats::EVACOtherGet,					// AT_MESH
-																// (50)
-		};
-	
-	if (at < 0 || at >= LLViewerAssetType::AT_COUNT)
-	{
-		return LLViewerAssetStats::EVACOtherGet;
-	}
-	LLViewerAssetStats::EViewerAssetCategories ret(asset_to_bin_map[at]);
-	if (LLViewerAssetStats::EVACTextureTempHTTPGet == ret)
-	{
-		// Indexed with [is_temp][with_http]
-		static const LLViewerAssetStats::EViewerAssetCategories texture_bin_map[2][2] =
-			{
-				{
-					LLViewerAssetStats::EVACTextureNonTempUDPGet,
-					LLViewerAssetStats::EVACTextureNonTempHTTPGet,
-				},
-				{
-					LLViewerAssetStats::EVACTextureTempUDPGet,
-					LLViewerAssetStats::EVACTextureTempHTTPGet,
-				}
-			};
-
-		ret = texture_bin_map[is_temp][with_http];
-	}
-	return ret;
-}
-
-} // anonymous namespace
diff --git a/indra/newview/llviewerassetstats.h b/indra/newview/llviewerassetstats.h
index a750db2cc24df1f2a624802ad000678e6fb18e42..469609ea1f9819fc8d71a828351a5bdda724d481 100755
--- a/indra/newview/llviewerassetstats.h
+++ b/indra/newview/llviewerassetstats.h
@@ -77,20 +77,6 @@
 class LLViewerAssetStats
 {
 public:
-	enum EViewerAssetCategories
-	{
-		EVACTextureTempHTTPGet,			//< Texture GETs - temp/baked, HTTP
-		EVACTextureTempUDPGet,			//< Texture GETs - temp/baked, UDP
-		EVACTextureNonTempHTTPGet,		//< Texture GETs - perm, HTTP
-		EVACTextureNonTempUDPGet,		//< Texture GETs - perm, UDP
-		EVACWearableUDPGet,				//< Wearable GETs
-		EVACSoundUDPGet,				//< Sound GETs
-		EVACGestureUDPGet,				//< Gesture GETs
-		EVACOtherGet,					//< Other GETs
-		
-		EVACCount						// Must be last
-	};
-
 	/**
 	 * Type for duration and other time values in the metrics.  Selected
 	 * for compatibility with the pre-existing timestamp on the texture
@@ -105,61 +91,6 @@ class LLViewerAssetStats
 	 */
 	typedef U64 region_handle_t;
 
-	/**
-	 * @brief Collected data for a single region visited by the avatar.
-	 *
-	 * Fairly simple, for each asset bin enumerated above a count
-	 * of enqueue and dequeue operations and simple stats on response
-	 * times for completed requests.
-	 */
-	class PerRegionStats : public LLRefCount
-	{
-	public:
-		PerRegionStats(const region_handle_t region_handle)
-			: LLRefCount(),
-			  mRegionHandle(region_handle)
-			{
-				reset();
-			}
-
-		PerRegionStats(const PerRegionStats & src)
-			: LLRefCount(),
-			  mRegionHandle(src.mRegionHandle),
-			  mTotalTime(src.mTotalTime),
-			  mStartTimestamp(src.mStartTimestamp),
-			  mFPS(src.mFPS)
-			{
-				for (int i = 0; i < LL_ARRAY_SIZE(mRequests); ++i)
-				{
-					mRequests[i] = src.mRequests[i];
-				}
-			}
-
-		// Default assignment and destructor are correct.
-		
-		void reset();
-
-		void merge(const PerRegionStats & src);
-		
-		// Apply current running time to total and reset start point.
-		// Return current timestamp as a convenience.
-		void accumulateTime(duration_t now);
-		
-	public:
-		region_handle_t		mRegionHandle;
-		duration_t			mTotalTime;
-		duration_t			mStartTimestamp;
-		LLSimpleStatMMM<>	mFPS;
-		
-		struct prs_group
-		{
-			LLSimpleStatCounter			mEnqueued;
-			LLSimpleStatCounter			mDequeued;
-			LLSimpleStatMMM<duration_t>	mResponse;
-		}
-		mRequests [EVACCount];
-	};
-
 public:
 	LLViewerAssetStats();
 	LLViewerAssetStats(const LLViewerAssetStats &);
@@ -175,26 +106,9 @@ class LLViewerAssetStats
 	// collection calls.
 	void setRegion(region_handle_t region_handle);
 
-	// Asset GET Requests
-	void recordGetEnqueued(LLViewerAssetType::EType at, bool with_http, bool is_temp);
-	void recordGetDequeued(LLViewerAssetType::EType at, bool with_http, bool is_temp);
-	void recordGetServiced(LLViewerAssetType::EType at, bool with_http, bool is_temp, duration_t duration);
-
-	// Frames-Per-Second Samples
-	void recordFPS(F32 fps);
-
 	// Avatar-related statistics
 	void recordAvatarStats();
 
-	// Merge a source instance into a destination instance.  This is
-	// conceptually an 'operator+=()' method:
-	// - counts are added
-	// - minimums are min'd
-	// - maximums are max'd
-	// - other scalars are ignored ('this' wins)
-	//
-	void merge(const LLViewerAssetStats & src);
-	
 	// Retrieve current metrics for all visited regions (NULL region UUID/handle excluded)
     // Returned LLSD is structured as follows:
 	//
@@ -240,7 +154,6 @@ class LLViewerAssetStats
 	LLSD asLLSD(bool compact_output);
 
 protected:
-	typedef std::map<region_handle_t, LLPointer<PerRegionStats> > PerRegionContainer;
 	typedef std::map<region_handle_t, LLTrace::Recording > PerRegionRecordingContainer;
 
 	// Region of the currently-active region.  Always valid but may
@@ -248,22 +161,12 @@ class LLViewerAssetStats
 	// by a reset() call.
 	region_handle_t mRegionHandle;
 
-	// Pointer to metrics collection for currently-active region.  Always
-	// valid and unchanged after reset() though contents will be changed.
-	// Always points to a collection contained in mRegionStats.
-	LLPointer<PerRegionStats> mCurRegionStats;
-
-	static LLTrace::Count<> sEnqueued[EVACCount];
-	static LLTrace::Count<> sDequeued[EVACCount];
-	static LLTrace::Measurement<LLTrace::Seconds> sResponse[EVACCount];
+	// Pointer to metrics collection for currently-active region.  
+	LLTrace::Recording*			mCurRecording;
 
 	// Metrics data for all regions during one collection cycle
-	PerRegionContainer mRegionStats;
 	PerRegionRecordingContainer mRegionRecordings;
 
-	// Time of last reset
-	duration_t mResetTimestamp;
-
 	// Nearby avatar stats
 	std::vector<S32> mAvatarRezStates;
 	LLViewerStats::phase_stats_t mPhaseStats;
@@ -284,12 +187,24 @@ class LLViewerAssetStats
  *  - Main:  main() program execution thread
  *  - Thread1:  TextureFetch worker thread
  */
-extern LLViewerAssetStats * gViewerAssetStatsMain;
-
-extern LLViewerAssetStats * gViewerAssetStatsThread1;
+extern LLViewerAssetStats * gViewerAssetStats;
 
 namespace LLViewerAssetStatsFF
 {
+	enum EViewerAssetCategories
+	{
+		EVACTextureTempHTTPGet,			//< Texture GETs - temp/baked, HTTP
+		EVACTextureTempUDPGet,			//< Texture GETs - temp/baked, UDP
+		EVACTextureNonTempHTTPGet,		//< Texture GETs - perm, HTTP
+		EVACTextureNonTempUDPGet,		//< Texture GETs - perm, UDP
+		EVACWearableUDPGet,				//< Wearable GETs
+		EVACSoundUDPGet,				//< Sound GETs
+		EVACGestureUDPGet,				//< Gesture GETs
+		EVACOtherGet,					//< Other GETs
+
+		EVACCount						// Must be last
+	};
+
 /**
  * @brief Allocation and deallocation of globals.
  *
@@ -314,31 +229,17 @@ inline LLViewerAssetStats::duration_t get_timestamp()
 /**
  * Region context, event and duration loggers for the Main thread.
  */
-void set_region_main(LLViewerAssetStats::region_handle_t region_handle);
+void set_region(LLViewerAssetStats::region_handle_t region_handle);
 
-void record_enqueue_main(LLViewerAssetType::EType at, bool with_http, bool is_temp);
+void record_enqueue(LLViewerAssetType::EType at, bool with_http, bool is_temp);
 
-void record_dequeue_main(LLViewerAssetType::EType at, bool with_http, bool is_temp);
+void record_dequeue(LLViewerAssetType::EType at, bool with_http, bool is_temp);
 
-void record_response_main(LLViewerAssetType::EType at, bool with_http, bool is_temp,
+void record_response(LLViewerAssetType::EType at, bool with_http, bool is_temp,
 						  LLViewerAssetStats::duration_t duration);
 
-void record_fps_main(F32 fps);
-
 void record_avatar_stats();
 
-/**
- * Region context, event and duration loggers for Thread 1.
- */
-void set_region_thread1(LLViewerAssetStats::region_handle_t region_handle);
-
-void record_enqueue_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp);
-
-void record_dequeue_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp);
-
-void record_response_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp,
-						  LLViewerAssetStats::duration_t duration);
-
 } // namespace LLViewerAssetStatsFF
 
 #endif // LL_LLVIEWERASSETSTATUS_H
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index d042f6283086783baa01118b6f0a44ae69c3cb47..6f41abbd8a89fee5c48065ede0d60d5508dba92a 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -73,8 +73,8 @@ class LLViewerAssetRequest : public LLAssetRequest
 			{
 				// Okay, it appears this request was used for useful things.  Record
 				// the expected dequeue and duration of request processing.
-				LLViewerAssetStatsFF::record_dequeue_main(mType, false, false);
-				LLViewerAssetStatsFF::record_response_main(mType, false, false,
+				LLViewerAssetStatsFF::record_dequeue(mType, false, false);
+				LLViewerAssetStatsFF::record_response(mType, false, false,
 														   (LLViewerAssetStatsFF::get_timestamp()
 															- mMetricsStartTime));
 				mMetricsStartTime = 0;
@@ -373,7 +373,7 @@ void LLViewerAssetStorage::_queueDataRequest(
 			LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(mUpstreamHost, LLTCT_ASSET);
 			ttcp->requestTransfer(spa, tpvf, 100.f + (is_priority ? 1.f : 0.f));
 
-			LLViewerAssetStatsFF::record_enqueue_main(atype, false, false);
+			LLViewerAssetStatsFF::record_enqueue(atype, false, false);
 		}
 	}
 	else
diff --git a/indra/newview/tests/llviewerassetstats_test.cpp b/indra/newview/tests/llviewerassetstats_test.cpp
index 4a190fbe23122c3e1a4d15ae09c0de529fedaf08..e0126ce8d30dea54999a391aa0f9a5a6a0cfb7d0 100755
--- a/indra/newview/tests/llviewerassetstats_test.cpp
+++ b/indra/newview/tests/llviewerassetstats_test.cpp
@@ -243,11 +243,11 @@ namespace tut
 		// Check that helpers aren't bothered by missing global stats
 		ensure("Global gViewerAssetStatsMain should be NULL", (NULL == gViewerAssetStatsMain));
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false, false);
 
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, false, false);
 
-		LLViewerAssetStatsFF::record_response_main(LLViewerAssetType::AT_GESTURE, false, false, 12300000ULL);
+		LLViewerAssetStatsFF::record_response(LLViewerAssetType::AT_GESTURE, false, false, 12300000ULL);
 	}
 
 	// Create a non-global instance and check the structure
@@ -326,13 +326,13 @@ namespace tut
 	void tst_viewerassetstats_index_object_t::test<4>()
 	{
 		gViewerAssetStatsMain = new LLViewerAssetStats();
-		LLViewerAssetStatsFF::set_region_main(region1_handle);
+		LLViewerAssetStatsFF::set_region(region1_handle);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false, false);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, false, false);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, false);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, false);
 
 		LLSD sd = gViewerAssetStatsMain->asLLSD(false);
 		ensure("Correct single-key LLSD map root", is_triple_key_map(sd, "regions", "duration", "avatar"));
@@ -364,13 +364,13 @@ namespace tut
 	{
 		gViewerAssetStatsThread1 = new LLViewerAssetStats();
 		gViewerAssetStatsMain = new LLViewerAssetStats();
-		LLViewerAssetStatsFF::set_region_main(region1_handle);
+		LLViewerAssetStatsFF::set_region(region1_handle);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false, false);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, false, false);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, false);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, false);
 
 		LLSD sd = gViewerAssetStatsThread1->asLLSD(false);
 		ensure("Other collector is empty", is_no_stats_map(sd));
@@ -393,8 +393,6 @@ namespace tut
 		
 		delete gViewerAssetStatsMain;
 		gViewerAssetStatsMain = NULL;
-		delete gViewerAssetStatsThread1;
-		gViewerAssetStatsThread1 = NULL;
 
 		ensure("sd[get_texture_non_temp_udp][enqueued] is reset", (0 == sd["get_texture_non_temp_udp"]["enqueued"].asInteger()));
 		ensure("sd[get_gesture_udp][dequeued] is reset", (0 == sd["get_gesture_udp"]["dequeued"].asInteger()));
@@ -406,20 +404,20 @@ namespace tut
 	{
 		gViewerAssetStatsMain = new LLViewerAssetStats();
 
-		LLViewerAssetStatsFF::set_region_main(region1_handle);
+		LLViewerAssetStatsFF::set_region(region1_handle);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false, false);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, false, false);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, false);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, false);
 
-		LLViewerAssetStatsFF::set_region_main(region2_handle);
+		LLViewerAssetStatsFF::set_region(region2_handle);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);
 
 		LLSD sd = gViewerAssetStatsMain->asLLSD(false);
 
@@ -465,35 +463,35 @@ namespace tut
 	{
 		gViewerAssetStatsMain = new LLViewerAssetStats();
 
-		LLViewerAssetStatsFF::set_region_main(region1_handle);
+		LLViewerAssetStatsFF::set_region(region1_handle);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false, false);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, false, false);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, false);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, false);
 
-		LLViewerAssetStatsFF::set_region_main(region2_handle);
+		LLViewerAssetStatsFF::set_region(region2_handle);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);
 
-		LLViewerAssetStatsFF::set_region_main(region1_handle);
+		LLViewerAssetStatsFF::set_region(region1_handle);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, true, true);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, true, true);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, true, true);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, true, true);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, false);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, false);
 
-		LLViewerAssetStatsFF::set_region_main(region2_handle);
+		LLViewerAssetStatsFF::set_region(region2_handle);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);
 
 		LLSD sd = gViewerAssetStatsMain->asLLSD(false);
 
@@ -538,30 +536,30 @@ namespace tut
 	{
 		gViewerAssetStatsThread1 = new LLViewerAssetStats();
 		gViewerAssetStatsMain = new LLViewerAssetStats();
-		LLViewerAssetStatsFF::set_region_main(region1_handle);
+		LLViewerAssetStatsFF::set_region(region1_handle);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false, false);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, false, false);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, false);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, false);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, true);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, true);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, true);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, true);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, true, false);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, true, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, true, false);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, true, false);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, true, true);
-		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, true, true);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, true, true);
+		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, true, true);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_LSL_BYTECODE, false, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_LSL_BYTECODE, false, false);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_LSL_BYTECODE, false, true);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_LSL_BYTECODE, false, true);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_LSL_BYTECODE, true, false);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_LSL_BYTECODE, true, false);
 
-		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
 
 		LLSD sd = gViewerAssetStatsThread1->asLLSD(false);
 		ensure("Other collector is empty", is_no_stats_map(sd));