diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 067369d54df9ca0a5954328c0105093a9fb210ee..4a61096ad8a0fb734ec0a502ff346e0b895107f6 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1676,7 +1676,7 @@ bool LLAppViewer::initThreads()
 	// Image decoding
 	LLAppViewer::sImageDecodeThread = new LLImageDecodeThread(enable_threads && true);
 	LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true);
-	LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && false);
+	LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && true);
 	LLImage::initClass();
 
 	if (LLFastTimer::sLog || LLFastTimer::sMetricLog)
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index eeedf385437d2fa9418cdee9d8756b2410ff5239..5ce6884239021ae386106baa92fbf55a6f5f9431 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -495,8 +495,8 @@ void LLTextureFetchWorker::setupPacketData()
 U32 LLTextureFetchWorker::calcWorkPriority()
 {
 // 	llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerTexture::maxDecodePriority());
-	F32 priority_scale = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerFetchedTexture::maxDecodePriority();
-	mWorkPriority = (U32)(mImagePriority * priority_scale);
+	static F32 PRIORITY_SCALE = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerFetchedTexture::maxDecodePriority();
+	mWorkPriority = (U32)(mImagePriority * PRIORITY_SCALE);
 	return mWorkPriority;
 }
 
@@ -574,7 +574,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
 {
 	LLMutexLock lock(&mWorkMutex);
 
-	if ((mFetcher->isQuitting() || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED)))
+	if ((mFetcher->isQuitting() || mImagePriority < 1.0f || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED)))
 	{
 		if (mState < WRITE_TO_CACHE)
 		{
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 1edaeec848e914b0f8c402999a84023507e98d85..ad993bc05624f3994bc65a5f2f68a81a5ddbcf3c 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1513,16 +1513,20 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
 		{
 			desired_discard -= 2;
 		}
-		else if (!isJustBound() && mCachedRawImageReady && !mBoostLevel)
+		else if (!isJustBound() && mCachedRawImageReady)
 		{
-			// We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is
-			desired_discard = cur_discard;
-		}
-		else if (mGLTexturep.notNull() && !mGLTexturep->getBoundRecently() && mBoostLevel == LLViewerTexture::BOOST_NONE)
-		{
-			// We haven't rendered this in a while, de-prioritize it
-			desired_discard += 2;
+			if(mBoostLevel < BOOST_HIGH)
+			{
+				// We haven't rendered this in a while, de-prioritize it
+				desired_discard += 2;
+			}
+			//else
+			//{
+			//	// We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is
+			//	desired_discard = cur_discard;
+			//}
 		}
+
 		S32 ddiscard = cur_discard - desired_discard;
 		ddiscard = llclamp(ddiscard, 0, 4);
 		priority = (ddiscard+1)*100000.f;
@@ -1629,7 +1633,7 @@ bool LLViewerFetchedTexture::updateFetch()
 	S32 desired_discard = getDesiredDiscardLevel();
 	F32 decode_priority = getDecodePriority();
 	decode_priority = llmax(decode_priority, 0.0f);
-	
+
 	if (mIsFetching)
 	{
 		// Sets mRawDiscardLevel, mRawImage, mAuxRawImage
@@ -1772,10 +1776,10 @@ bool LLViewerFetchedTexture::updateFetch()
 	{
 		make_request = false;
 	}
-	else if (!isJustBound() && mCachedRawImageReady)
-	{
-		make_request = false;
-	}
+	//else if (!isJustBound() && mCachedRawImageReady)
+	//{
+	//	make_request = false;
+	//}
 	else
 	{
 		if (mIsFetching)
@@ -1847,12 +1851,12 @@ BOOL LLViewerFetchedTexture::forceFetch()
 	{
 		return false ;
 	}
-	if(mDesiredSavedRawDiscardLevel < getDiscardLevel())
+	//if(mDesiredSavedRawDiscardLevel < getDiscardLevel())
 	{
 		//no need to force fetching. normal fetching flow will do the work.
 		//return false ;
 	}
-	if (mNeedsCreateTexture)
+	//if (mNeedsCreateTexture)
 	{
 		// We may be fetching still (e.g. waiting on write)
 		// but don't check until we've processed the raw data we have
@@ -1888,7 +1892,8 @@ BOOL LLViewerFetchedTexture::forceFetch()
 		h = getHeight(0);
 		c = getComponents();
 	}
-	fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), maxDecodePriority(),
+	setDecodePriority(maxDecodePriority()) ;
+	fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), getDecodePriority(),
 																		  w, h, c, desired_discard, needsAux());
 
 	if (fetch_request_created)
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 6aaaa4021b5476ddf067a418d68636cdb530ec77..79d9c4e7bb71207a93a74821f492644d08d97763 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -384,8 +384,6 @@ class LLViewerFetchedTexture : public LLViewerTexture
 	
 	void updateVirtualSize() ;
 
-	// setDesiredDiscardLevel is only used by LLViewerTextureList
-	void setDesiredDiscardLevel(S32 discard) { mDesiredDiscardLevel = discard; }
 	S32  getDesiredDiscardLevel()			 { return mDesiredDiscardLevel; }
 	void setMinDiscardLevel(S32 discard) 	{ mMinDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel,(S8)discard); }