diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index eb3fcc30eeec2c03602517764a8c4dec7af58ca7..d24d1ebd6d3d091101a3e6af6387a6dae1b86a99 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -10631,6 +10631,17 @@
       <key>Value</key>
       <real>20.0</real>
     </map>
+    <key>TexelPixelRatio</key>
+    <map>
+      <key>Comment</key>
+      <string>texel pixel ratio = texel / pixel</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>F32</string>
+      <key>Value</key>
+      <real>1.0</real>
+    </map>
     <key>TextureCameraMotionThreshold</key>
     <map>
       <key>Comment</key>
@@ -10640,7 +10651,7 @@
       <key>Type</key>
       <string>F32</string>
       <key>Value</key>
-      <integer>0.2</integer>
+      <real>0.2</real>
     </map>
     <key>TextureCameraMotionBoost</key>
     <map>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 3ee53c679f36c5b306b0db636b7588b03b1b17c7..bb6658dc489fd004be15bd4a878bcbb258300961 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1219,15 +1219,7 @@ bool LLAppViewer::mainLoop()
 			if(mem_leak_instance)
 			{
 				mem_leak_instance->idle() ;				
-			}			
-
-			//texture fetching debugger
-			LLFloaterTextureFetchDebugger* tex_fetch_debugger_instance =
-				LLFloaterReg::findTypedInstance<LLFloaterTextureFetchDebugger>("tex_fetch_debugger");
-			if(tex_fetch_debugger_instance)
-			{
-				tex_fetch_debugger_instance->idle() ;				
-			}			
+			}							
 
             // canonical per-frame event
             mainloop.post(newFrame);
@@ -1412,6 +1404,14 @@ bool LLAppViewer::mainLoop()
 					LLLFSThread::sLocal->pause(); 
 				}									
 
+				//texture fetching debugger
+				LLFloaterTextureFetchDebugger* tex_fetch_debugger_instance =
+					LLFloaterReg::findTypedInstance<LLFloaterTextureFetchDebugger>("tex_fetch_debugger");
+				if(tex_fetch_debugger_instance)
+				{
+					tex_fetch_debugger_instance->idle() ;				
+				}		
+
 				if ((LLStartUp::getStartupState() >= STATE_CLEANUP) &&
 					(frameTimer.getElapsedTimeF64() > FRAME_STALL_THRESHOLD))
 				{
diff --git a/indra/newview/llfloatertexturefetchdebugger.cpp b/indra/newview/llfloatertexturefetchdebugger.cpp
index 6756f9bbc184c6645b8ad0fefcce8730ab35f1d6..2b34b720557148beb70c7c214cf96a3f9f62f790 100644
--- a/indra/newview/llfloatertexturefetchdebugger.cpp
+++ b/indra/newview/llfloatertexturefetchdebugger.cpp
@@ -37,9 +37,7 @@
 #include "llviewerwindow.h"
 #include "llappviewer.h"
 #include "lltexturefetch.h"
-
-//static
-F32 LLFloaterTextureFetchDebugger::sTexelPixelRatio = 1.0f;
+#include "llviewercontrol.h"
 
 LLFloaterTextureFetchDebugger::LLFloaterTextureFetchDebugger(const LLSD& key)
 	: LLFloater(key),
@@ -58,6 +56,9 @@ LLFloaterTextureFetchDebugger::LLFloaterTextureFetchDebugger(const LLSD& key)
 	mCommitCallbackRegistrar.add("TexFetchDebugger.HTTPLoad",	boost::bind(&LLFloaterTextureFetchDebugger::onClickHTTPLoad, this));
 	mCommitCallbackRegistrar.add("TexFetchDebugger.Decode",	boost::bind(&LLFloaterTextureFetchDebugger::onClickDecode, this));
 	mCommitCallbackRegistrar.add("TexFetchDebugger.GLTexture",	boost::bind(&LLFloaterTextureFetchDebugger::onClickGLTexture, this));
+
+	mCommitCallbackRegistrar.add("TexFetchDebugger.RefetchVisCache",	boost::bind(&LLFloaterTextureFetchDebugger::onClickRefetchVisCache, this));
+	mCommitCallbackRegistrar.add("TexFetchDebugger.RefetchVisHTTP",	boost::bind(&LLFloaterTextureFetchDebugger::onClickRefetchVisHTTP, this));
 }
 //----------------------------------------------
 
@@ -74,8 +75,14 @@ BOOL LLFloaterTextureFetchDebugger::postBuild(void)
 	mButtonStateMap["http_btn"] = false;
 	mButtonStateMap["decode_btn"] = false;
 	mButtonStateMap["gl_btn"] = false;
+
+	mButtonStateMap["refetchviscache_btn"] = true;
+	mButtonStateMap["refetchvishttp_btn"] = true;
+
 	updateButtons();
 
+	getChild<LLUICtrl>("texel_pixel_ratio")->setValue(gSavedSettings.getF32("TexelPixelRatio"));
+
 	return TRUE ;
 }
 
@@ -109,6 +116,8 @@ void LLFloaterTextureFetchDebugger::disableButtons()
 	childDisable("http_btn");
 	childDisable("decode_btn");
 	childDisable("gl_btn");
+	childDisable("refetchviscache_btn");
+	childDisable("refetchvishttp_btn");
 }
 
 void LLFloaterTextureFetchDebugger::idle()
@@ -142,6 +151,11 @@ void LLFloaterTextureFetchDebugger::idle()
 		case LLTextureFetchDebugger::GL_TEX:
 			updateButtons();
 			break;
+		case LLTextureFetchDebugger::REFETCH_VIS_CACHE:
+			updateButtons();
+		case LLTextureFetchDebugger::REFETCH_VIS_HTTP:
+			updateButtons();
+			break;
 		default:
 			break;
 		}
@@ -151,7 +165,7 @@ void LLFloaterTextureFetchDebugger::idle()
 //----------------------
 void LLFloaterTextureFetchDebugger::onChangeTexelPixelRatio()
 {
-	sTexelPixelRatio = getChild<LLUICtrl>("texel_pixel_ratio")->getValue().asReal();
+	gSavedSettings.setF32("TexelPixelRatio", getChild<LLUICtrl>("texel_pixel_ratio")->getValue().asReal());
 }
 
 void LLFloaterTextureFetchDebugger::onClickStart()
@@ -184,6 +198,8 @@ void LLFloaterTextureFetchDebugger::onClickClear()
 	mButtonStateMap["http_btn"] = false;
 	mButtonStateMap["decode_btn"] = false;
 	mButtonStateMap["gl_btn"] = false;
+	mButtonStateMap["refetchviscache_btn"] = true;
+	mButtonStateMap["refetchvishttp_btn"] = true;
 	updateButtons();
 
 	//stop everything
@@ -226,6 +242,20 @@ void LLFloaterTextureFetchDebugger::onClickGLTexture()
 	mDebugger->debugGLTextureCreation();
 }
 
+void LLFloaterTextureFetchDebugger::onClickRefetchVisCache()
+{
+	disableButtons();
+
+	mDebugger->debugRefetchVisibleFromCache();
+}
+
+void LLFloaterTextureFetchDebugger::onClickRefetchVisHTTP()
+{
+	disableButtons();
+
+	mDebugger->debugRefetchVisibleFromHTTP();
+}
+
 void LLFloaterTextureFetchDebugger::draw()
 {
 	//total number of fetched textures
@@ -257,6 +287,7 @@ void LLFloaterTextureFetchDebugger::draw()
 	{
 		getChild<LLUICtrl>("total_fetched_data_label")->setTextArg("[SIZE1]", llformat("%d", mDebugger->getFetchedData() >> 10));		
 		getChild<LLUICtrl>("total_fetched_data_label")->setTextArg("[SIZE2]", llformat("%d", mDebugger->getDecodedData() >> 10));
+		getChild<LLUICtrl>("total_fetched_data_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getFetchedPixels() / 1000000.f));
 	}
 
 	//total number of visible fetched data
@@ -269,6 +300,7 @@ void LLFloaterTextureFetchDebugger::draw()
 	{
 		getChild<LLUICtrl>("total_fetched_rendered_data_label")->setTextArg("[SIZE1]", llformat("%d", mDebugger->getRenderedData() >> 10));		
 		getChild<LLUICtrl>("total_fetched_rendered_data_label")->setTextArg("[SIZE2]", llformat("%d", mDebugger->getRenderedDecodedData() >> 10));
+		getChild<LLUICtrl>("total_fetched_rendered_data_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getRenderedPixels() / 1000000.f));
 	}
 
 	//total time on cache readings
@@ -326,5 +358,33 @@ void LLFloaterTextureFetchDebugger::draw()
 		getChild<LLUICtrl>("total_time_fetch_label")->setTextArg("[TIME]", llformat("%.3f", mDebugger->getTotalFetchingTime()));
 	}
 
+	//total time on refetching visible textures from cache
+	if(mDebugger->getRefetchVisCacheTime() < 0.f)
+	{
+		getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[TIME]", std::string("----"));
+		getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[SIZE]", std::string("----"));
+		getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[PIXEL]", std::string("----"));
+	}
+	else
+	{
+		getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[TIME]", llformat("%.3f", mDebugger->getRefetchVisCacheTime()));
+		getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[SIZE]", llformat("%d", mDebugger->getRefetchedData() >> 10));
+		getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getRefetchedPixels() / 1000000.f));
+	}
+
+	//total time on refetching visible textures from http
+	if(mDebugger->getRefetchVisHTTPTime() < 0.f)
+	{
+		getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[TIME]", std::string("----"));
+		getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[SIZE]", std::string("----"));
+		getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[PIXEL]", std::string("----"));
+	}
+	else
+	{
+		getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[TIME]", llformat("%.3f", mDebugger->getRefetchVisHTTPTime()));
+		getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[SIZE]", llformat("%d", mDebugger->getRefetchedData() >> 10));
+		getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getRefetchedPixels() / 1000000.f));
+	}
+
 	LLFloater::draw();
 }
diff --git a/indra/newview/llfloatertexturefetchdebugger.h b/indra/newview/llfloatertexturefetchdebugger.h
index 9f2e62fd2ccf4c202c828e0fc3944530a76b4783..33012c6a3dcf67978bd3e49df7fc6173df2ae04c 100644
--- a/indra/newview/llfloatertexturefetchdebugger.h
+++ b/indra/newview/llfloatertexturefetchdebugger.h
@@ -51,6 +51,8 @@ class LLFloaterTextureFetchDebugger : public LLFloater
 	void onClickDecode();
 	void onClickGLTexture();
 
+	void onClickRefetchVisCache();
+	void onClickRefetchVisHTTP();
 public:
 	void idle() ;
 
@@ -60,9 +62,8 @@ class LLFloaterTextureFetchDebugger : public LLFloater
 
 	void updateButtons();
 	void disableButtons();
-private:
-	static F32 sTexelPixelRatio;
 
+private:	
 	LLTextureFetchDebugger* mDebugger;
 	std::map<std::string, bool> mButtonStateMap;
 };
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 8b6f006db196d474e5e9feded7ae3e76a3b66d92..09066267431d0db160862aa421978f4407c69673 100755
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -3175,6 +3175,8 @@ void LLTextureFetchDebugger::init()
 	mHTTPTime = -1.f;
 	mGLCreationTime = -1.f;
 	mTotalFetchingTime = 0.f;
+	mRefetchVisCacheTime = -1.f;
+	mRefetchVisHTTPTime = -1.f;
 
 	mNumFetchedTextures = 0;
 	mNumCacheHits = 0;
@@ -3186,12 +3188,19 @@ void LLTextureFetchDebugger::init()
 	mVisibleDecodedData = 0;
 	mRenderedData = 0;
 	mRenderedDecodedData = 0;
+	mFetchedPixels = 0;
+	mRenderedPixels = 0;
+	mRefetchedData = 0;
+	mRefetchedPixels = 0;
+
+	mFreezeHistory = FALSE;
 }
 
 void LLTextureFetchDebugger::startDebug()
 {
 	//lock the fetcher
 	mFetcher->lockFetcher(true);
+	mFreezeHistory = TRUE;
 
 	//clear the current fetching queue
 	gTextureList.clearFetchingRequests();
@@ -3239,6 +3248,7 @@ void LLTextureFetchDebugger::startDebug()
 			{
 				mRenderedData += mFetchingHistory[i].mFetchedSize;
 				mRenderedDecodedData += mFetchingHistory[i].mDecodedSize;
+				mRenderedPixels += tex->getWidth() * tex->getHeight();
 			}
 		}
 	}
@@ -3290,6 +3300,8 @@ void LLTextureFetchDebugger::stopDebug()
 
 	//unlock the fetcher
 	mFetcher->lockFetcher(false);
+	mFreezeHistory = FALSE;
+	mTotalFetchingTime = gDebugTimers[0].getElapsedTimeF32(); //reset
 }
 
 //called in the main thread and when the fetching queue is empty
@@ -3301,12 +3313,20 @@ void LLTextureFetchDebugger::clearHistory()
 
 void LLTextureFetchDebugger::addHistoryEntry(LLTextureFetchWorker* worker)
 {
+	if(mFreezeHistory)
+	{
+		mRefetchedPixels += worker->mRawImage->getWidth() * worker->mRawImage->getHeight();
+		mRefetchedData += worker->mFormattedImage->getDataSize();
+		return;
+	}
+
 	if(worker->mInCache)
 	{
 		mNumCacheHits++;
 	}
 	mFetchedData += worker->mFormattedImage->getDataSize();
 	mDecodedData += worker->mRawImage->getDataSize();
+	mFetchedPixels += worker->mRawImage->getWidth() * worker->mRawImage->getHeight();
 
 	mFetchingHistory.push_back(FetchEntry(worker->mID, worker->mDesiredSize, worker->mDecodedDiscard, worker->mFormattedImage->getDataSize(), worker->mRawImage->getDataSize()));
 	//mFetchingHistory.push_back(FetchEntry(worker->mID, worker->mDesiredSize, worker->mHaveAllData ? 0 : worker->mLoadedDiscard, worker->mFormattedImage->getComponents(),
@@ -3337,9 +3357,8 @@ void LLTextureFetchDebugger::debugCacheRead()
 	}
 }
 	
-void LLTextureFetchDebugger::debugCacheWrite()
+void LLTextureFetchDebugger::clearCache()
 {
-	//remove from cache
 	S32 size = mFetchingHistory.size();
 	{
 		std::set<LLUUID> deleted_list;
@@ -3352,12 +3371,19 @@ void LLTextureFetchDebugger::debugCacheWrite()
 			}
 		}
 	}
+}
+
+void LLTextureFetchDebugger::debugCacheWrite()
+{
+	//remove from cache
+	clearCache();
 
 	lockCache();
 	llassert_always(mState == IDLE);
 	mTimer.reset();
 	mState = WRITE_CACHE;
 
+	S32 size = mFetchingHistory.size();
 	for(S32 i = 0 ; i < size ; i++)
 	{		
 		mFetchingHistory[i].mCacheHandle = mTextureCache->writeToCache(mFetchingHistory[i].mID, LLWorkerThread::PRIORITY_NORMAL, 
@@ -3503,6 +3529,43 @@ void LLTextureFetchDebugger::debugGLTextureCreation()
 	return;
 }
 
+//clear fetching results of all textures.
+void LLTextureFetchDebugger::clearTextures()
+{
+	S32 size = mFetchingHistory.size();
+	for(S32 i = 0 ; i < size ; i++)
+	{
+		LLViewerFetchedTexture* tex = gTextureList.findImage(mFetchingHistory[i].mID) ;
+		if(tex)
+		{
+			tex->clearFetchedResults() ;
+		}
+	}
+}
+
+void LLTextureFetchDebugger::debugRefetchVisibleFromCache()
+{
+	llassert_always(mState == IDLE);
+	mState = REFETCH_VIS_CACHE;
+
+	clearTextures();
+
+	mTimer.reset();
+	mFetcher->lockFetcher(false);
+}
+
+void LLTextureFetchDebugger::debugRefetchVisibleFromHTTP()
+{
+	llassert_always(mState == IDLE);
+	mState = REFETCH_VIS_HTTP;
+
+	clearCache();
+	clearTextures();
+
+	mTimer.reset();
+	mFetcher->lockFetcher(false);
+}
+
 bool LLTextureFetchDebugger::update()
 {
 	switch(mState)
@@ -3543,6 +3606,22 @@ bool LLTextureFetchDebugger::update()
 	case GL_TEX:
 		mState = IDLE;
 		break;
+	case REFETCH_VIS_CACHE:
+		if (LLAppViewer::getTextureFetch()->getNumRequests() == 0)
+		{
+			mRefetchVisCacheTime = gDebugTimers[0].getElapsedTimeF32() - mTotalFetchingTime;
+			mState = IDLE;
+			mFetcher->lockFetcher(true);
+		}
+		break;
+	case REFETCH_VIS_HTTP:
+		if (LLAppViewer::getTextureFetch()->getNumRequests() == 0)
+		{
+			mRefetchVisHTTPTime = gDebugTimers[0].getElapsedTimeF32() - mTotalFetchingTime;
+			mState = IDLE;
+			mFetcher->lockFetcher(true);
+		}
+		break;
 	default:
 		mState = IDLE;
 		break;
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index 892857c816729dad6ffb22b857a585559b3b619d..1538fd78ab65a9b2b84fc14d02d534413b7eb15c 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -243,6 +243,10 @@ class LLTextureFetchDebugger
 		DECODING,
 		HTTP_FETCHING,
 		GL_TEX,
+		REFETCH_VIS_CACHE,
+		REFETCH_VIS_HTTP,
+		REFETCH_ALL_CACHE,
+		REFETCH_ALL_HTTP,
 		INVALID
 	};
 
@@ -295,14 +299,17 @@ class LLTextureFetchDebugger
 	F32 mHTTPTime;
 	F32 mGLCreationTime;
 
+	F32 mTotalFetchingTime;
+	F32 mRefetchVisCacheTime;
+	F32 mRefetchVisHTTPTime;
+
 	LLTimer mTimer;
 	
 	LLTextureFetch* mFetcher;
 	LLTextureCache* mTextureCache;
 	LLImageDecodeThread* mImageDecodeThread;
 	LLCurlRequest* mCurlGetRequest;
-
-	F32 mTotalFetchingTime;
+	
 	S32 mNumFetchedTextures;
 	S32 mNumCacheHits;
 	S32 mNumVisibleFetchedTextures;
@@ -313,6 +320,12 @@ class LLTextureFetchDebugger
 	U32 mVisibleDecodedData;
 	U32 mRenderedData;
 	U32 mRenderedDecodedData;
+	U32 mFetchedPixels;
+	U32 mRenderedPixels;
+	U32 mRefetchedData;
+	U32 mRefetchedPixels;
+
+	BOOL mFreezeHistory;
 
 	std::string mHTTPUrl;
 	S32 mNbCurlRequests;
@@ -334,6 +347,8 @@ class LLTextureFetchDebugger
 	void debugHTTP();
 	void debugDecoder();
 	void debugGLTextureCreation();
+	void debugRefetchVisibleFromCache();
+	void debugRefetchVisibleFromHTTP();
 
 	void callbackCacheRead(S32 id, bool success, LLImageFormatted* image,
 						   S32 imagesize, BOOL islocal);
@@ -356,6 +371,10 @@ class LLTextureFetchDebugger
 	U32  getVisibleDecodedData()         {return mVisibleDecodedData;}
 	U32  getRenderedData()               {return mRenderedData;}
 	U32  getRenderedDecodedData()        {return mRenderedDecodedData;}
+	U32  getFetchedPixels()              {return mFetchedPixels;}
+	U32  getRenderedPixels()             {return mRenderedPixels;}
+	U32  getRefetchedData()              {return mRefetchedData;}
+	U32  getRefetchedPixels()            {return mRefetchedPixels;}
 
 	F32  getCacheReadTime()     {return mCacheReadTime;}
 	F32  getCacheWriteTime()    {return mCacheWriteTime;}
@@ -363,9 +382,13 @@ class LLTextureFetchDebugger
 	F32  getGLCreationTime()    {return mGLCreationTime;}
 	F32  getHTTPTime()          {return mHTTPTime;}
 	F32  getTotalFetchingTime() {return mTotalFetchingTime;}
+	F32  getRefetchVisCacheTime() {return mRefetchVisCacheTime;}
+	F32  getRefetchVisHTTPTime()  {return mRefetchVisHTTPTime;}
 
 private:
 	void init();
+	void clearTextures();//clear fetching results of all textures.
+	void clearCache();
 
 	void lockFetcher();
 	void unlockFetcher();
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 49faae3fdb6600bb475ef0a7a03b0d84e0b7398d..6137b7176f5d758e60ecf6e6fece5e710e726ab6 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -722,11 +722,14 @@ void LLViewerTexture::forceImmediateUpdate()
 
 void LLViewerTexture::addTextureStats(F32 virtual_size, BOOL needs_gltexture) const 
 {
+	static LLCachedControl<F32>  sTexelPixelRatio(gSavedSettings,"TexelPixelRatio");
+
 	if(needs_gltexture)
 	{
 		mNeedsGLTexture = TRUE ;
 	}
 
+	virtual_size *= sTexelPixelRatio;
 	if(!mMaxVirtualSizeResetCounter)
 	{
 		//flag to reset the values because the old values are used.
@@ -2144,6 +2147,14 @@ bool LLViewerFetchedTexture::updateFetch()
 	return mIsFetching ? true : false;
 }
 
+void LLViewerFetchedTexture::clearFetchedResults()
+{
+	llassert_always(!mNeedsCreateTexture && !mIsFetching);
+	
+	cleanup();
+	destroyGLTexture();
+}
+
 void LLViewerFetchedTexture::forceToDeleteRequest()
 {
 	if (mHasFetcher)
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index d0bc534c5af5aadc7323e1db4388801550fe541a..95896f9d4194ca44a6d966c5f45c13afbb1458f2 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -433,6 +433,8 @@ class LLViewerFetchedTexture : public LLViewerTexture
 
 	bool updateFetch();
 	
+	void clearFetchedResults(); //clear all fetched results, for debug use.
+
 	// Override the computation of discard levels if we know the exact output
 	// size of the image.  Used for UI textures to not decode, even if we have
 	// more data.
diff --git a/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml
index ff7528eeb70e679c5e4f7f2121ffc6323a9468a9..44b6a63bcae5a98b07899f2cbdd4c27ac1b3b655 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml
@@ -2,12 +2,12 @@
 <floater
  legacy_header_height="18"
  can_minimize="false"
- height="480"
+ height="550"
  layout="topleft"
  name="TexFetchDebugger"
  help_topic="texfetchdebugger"
  title="Texture Fetching Debugger"
- width="500">
+ width="540">
   <text
    type="string"
    length="1"
@@ -77,8 +77,8 @@
    left_delta="0"
    name="total_fetched_data_label"
    top_delta="25"
-   width="480">
-    6, Total number of fetched data/Decoded Data: [SIZE1]KB / [SIZE2]KB
+   width="530">
+    6, Total number of fetched data: [SIZE1]KB, Decoded Data: [SIZE2]KB, [PIXEL]MPixels
   </text>
   <text
    type="string"
@@ -90,7 +90,7 @@
    name="total_fetched_vis_data_label"
    top_delta="25"
    width="480">
-    7, Total number of visible fetched data/Decoded Data: [SIZE1]KB / [SIZE2]KB
+    7, Total number of visible data: [SIZE1]KB, Decoded Data: [SIZE2]KB
   </text>
   <text
    type="string"
@@ -101,8 +101,8 @@
    left_delta="0"
    name="total_fetched_rendered_data_label"
    top_delta="25"
-   width="480">
-    8, Total number of rendered fetched data/Decoded Data: [SIZE1]KB / [SIZE2]KB
+   width="530">
+    8, Total number of rendered data: [SIZE1]KB, Decoded Data: [SIZE2]KB, [PIXEL]MPixels
   </text>
   <text
    type="string"
@@ -176,17 +176,42 @@
    width="400">
     14, Total time on entire fetching: [TIME] seconds
   </text>
+  <text
+  type="string"
+  length="1"
+  follows="left|top"
+  height="25"
+  layout="topleft"
+  left_delta="0"
+  name="total_time_refetch_vis_cache_label"
+  top_delta="25"
+  width="540">
+    15, Refetching visibles from cache, Time: [TIME] seconds, Fetched: [SIZE]KB, [PIXEL]MPixels
+  </text>
+  <text
+  type="string"
+  length="1"
+  follows="left|top"
+  height="25"
+  layout="topleft"
+  left_delta="0"
+  name="total_time_refetch_vis_http_label"
+  top_delta="25"
+  width="540">
+    16, Refetching visibles from HTTP, Time: [TIME] seconds, Fetched: [SIZE]KB, [PIXEL]MPixels
+  </text>
   <spinner
-     decimal_digits="1"
+     decimal_digits="2"
      follows="left|top"
      height="20"
-     increment="0.1"
+     increment="0.01"
      initial_value="1.0"
-     label="15, Ratio of Texel/Pixel:"
+     label="17, Ratio of Texel/Pixel:"
      label_width="130"
      layout="topleft"
      left_delta="0"
-     max_val="128.0"
+     max_val="10.0"
+     min_val="0.01"
      name="texel_pixel_ratio"
      top_delta="30"
      width="200">
@@ -289,4 +314,28 @@
     <button.commit_callback
 		function="TexFetchDebugger.GLTexture" />
   </button>
+  <button
+   follows="left|top"
+   height="20"
+   label="Refetch Vis Cache"
+   layout="topleft"
+   left="10"
+   name="refetchviscache_btn"
+   top_delta="30"
+   width="120">
+    <button.commit_callback
+		function="TexFetchDebugger.RefetchVisCache" />
+  </button>
+  <button
+   follows="left|top"
+   height="20"
+   label="Refetch Vis HTTP"
+   layout="topleft"
+   left_pad="7"
+   name="refetchvishttp_btn"
+   top_delta="0"
+   width="120">
+    <button.commit_callback
+		function="TexFetchDebugger.RefetchVisHTTP" />
+  </button>
 </floater>