diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index 9a33324129eb286fc84d90725d28c43fe8c8b2b4..59e28948f57cd955b096e268d92f7769635cb61a 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -406,6 +406,10 @@ LLCondition::~LLCondition()
 
 void LLCondition::wait()
 {
+	if (!isLocked())
+	{ //mAPRMutexp MUST be locked before calling apr_thread_cond_wait
+		apr_thread_mutex_lock(mAPRMutexp);
+	}
 	apr_thread_cond_wait(mAPRCondp, mAPRMutexp);
 }
 
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index f85cfa902fa7fd430dd3601b596246e528ae150c..55a1d3ef418129526687dd7e68ad696f1eb81e56 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -2912,11 +2912,18 @@ bool LLImageTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width
 S32	 LLImageTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
 {
 	LLUIImagePtr image = mStyle->getImage();
+	
+	if (image.isNull())
+	{
+		return 1;
+	}
+
 	S32 image_width = image->getWidth();
 	if(line_offset == 0 || num_pixels>image_width + IMAGE_HPAD)
 	{
 		return 1;
 	}
+
 	return 0;
 }
 
@@ -2926,18 +2933,21 @@ F32	LLImageTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 select
 	{
 		LLColor4 color = LLColor4::white % mEditor.getDrawContext().mAlpha;
 		LLUIImagePtr image = mStyle->getImage();
-		S32 style_image_height = image->getHeight();
-		S32 style_image_width = image->getWidth();
-		// Text is drawn from the top of the draw_rect downward
-		
-		S32 text_center = draw_rect.mTop - (draw_rect.getHeight() / 2);
-		// Align image to center of draw rect
-		S32 image_bottom = text_center - (style_image_height / 2);
-		image->draw(draw_rect.mLeft, image_bottom, 
-			style_image_width, style_image_height, color);
-		
-		const S32 IMAGE_HPAD = 3;
-		return draw_rect.mLeft + style_image_width + IMAGE_HPAD;
+		if (image.notNull())
+		{
+			S32 style_image_height = image->getHeight();
+			S32 style_image_width = image->getWidth();
+			// Text is drawn from the top of the draw_rect downward
+			
+			S32 text_center = draw_rect.mTop - (draw_rect.getHeight() / 2);
+			// Align image to center of draw rect
+			S32 image_bottom = text_center - (style_image_height / 2);
+			image->draw(draw_rect.mLeft, image_bottom, 
+				style_image_width, style_image_height, color);
+			
+			const S32 IMAGE_HPAD = 3;
+			return draw_rect.mLeft + style_image_width + IMAGE_HPAD;
+		}
 	}
 	return 0.0;
 }
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 1885b48812fb0308984d13ea7f6729f2f3ee5007..94ed2697c55ed00d65233ff559d57ec4d1195447 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -103,16 +103,36 @@ U32 get_volume_memory_size(const LLVolume* volume)
 	return indices*2+vertices*11+sizeof(LLVolume)+sizeof(LLVolumeFace)*volume->getNumVolumeFaces();
 }
 
-std::string scrub_host_name(std::string http_url, const LLHost& host)
+std::string scrub_host_name(std::string http_url)
 { //curl loves to abuse the DNS cache, so scrub host names out of urls where trivial to prevent DNS timeouts
-	std::string ip_string = host.getIPString();
-	std::string host_string = host.getHostName();
+	
+	if (!http_url.empty())
+	{
+		std::string::size_type begin_host = http_url.find("://")+3;
+		std::string host_string = http_url.substr(begin_host);
 
-	std::string::size_type idx = http_url.find(host_string);
+		std::string::size_type end_host = host_string.find(":");
+		if (end_host == std::string::npos)
+		{
+			end_host = host_string.find("/");
+		}
 
-	if (!ip_string.empty() && !host_string.empty() && idx != std::string::npos)
-	{
-		http_url.replace(idx, host_string.length(), ip_string);
+		host_string = host_string.substr(0, end_host);
+		
+		std::string::size_type idx = http_url.find(host_string);
+
+		hostent* ent = gethostbyname(host_string.c_str());
+
+		if (ent && ent->h_length > 0)
+		{
+			U8* addr = (U8*) ent->h_addr_list[0];
+
+			std::string ip_string = llformat("%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
+			if (!ip_string.empty() && !host_string.empty() && idx != std::string::npos)
+			{
+				http_url.replace(idx, host_string.length(), ip_string);
+			}
+		}
 	}
 
 	return http_url;
@@ -571,10 +591,8 @@ void LLMeshRepoThread::run()
 				mPhysicsShapeRequests = incomplete;
 			}
 
-
+			mCurlRequest->process();
 		}
-
-		mCurlRequest->process();
 	}
 	
 	res = LLConvexDecomposition::quitThread();
@@ -646,7 +664,6 @@ std::string LLMeshRepoThread::constructUrl(LLUUID mesh_id)
 	if (gAgent.getRegion())
 	{
 		http_url = gMeshRepo.mGetMeshCapability; 
-		scrub_host_name(http_url, gAgent.getRegionHost());
 	}
 
 	if (!http_url.empty())
@@ -1385,13 +1402,14 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,
 	mFinished = false;
 	mOrigin = gAgent.getPositionAgent();
 	mHost = gAgent.getRegionHost();
+	
 	mUploadObjectAssetCapability = gAgent.getRegion()->getCapability("UploadObjectAsset");
 	mNewInventoryCapability = gAgent.getRegion()->getCapability("NewFileAgentInventoryVariablePrice");
 
+	mUploadObjectAssetCapability = scrub_host_name(mUploadObjectAssetCapability);
+	mNewInventoryCapability = scrub_host_name(mNewInventoryCapability);
+
 	mOrigin += gAgent.getAtAxis() * scale.magVec();
-	
-	scrub_host_name(mUploadObjectAssetCapability, mHost);
-	scrub_host_name(mNewInventoryCapability, mHost);
 }
 
 LLMeshUploadThread::~LLMeshUploadThread()
@@ -1986,9 +2004,9 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
 	LLMeshRepoThread::sActiveHeaderRequests--;
 	if (status < 200 || status > 400)
 	{
-		llwarns
-			<< "Header responder failed with status: "
-			<< status << ": " << reason << llendl;
+		//llwarns
+		//	<< "Header responder failed with status: "
+		//	<< status << ": " << reason << llendl;
 
 		// 503 (service unavailable) or 499 (timeout)
 		// can be due to server load and can be retried
@@ -2275,10 +2293,17 @@ void LLMeshRepository::notifyLoadedMeshes()
 		return;
 	}
 
+	static std::string region_name("never name a region this");
+
 	if (gAgent.getRegion())
 	{ //update capability url 
-		//TODO: only do this when region changes
-		mGetMeshCapability = gAgent.getRegion()->getCapability("GetMesh");
+		if (gAgent.getRegion()->getName() != region_name)
+		{
+			region_name = gAgent.getRegion()->getName();
+		
+			mGetMeshCapability = gAgent.getRegion()->getCapability("GetMesh");
+			mGetMeshCapability = scrub_host_name(mGetMeshCapability);
+		}
 	}
 
 	LLFastTimer t(FTM_MESH_UPDATE);
@@ -2977,7 +3002,7 @@ void LLMeshUploadThread::priceResult(LLMeshUploadData& data, const LLSD& content
 {
 	mPendingCost += content["upload_price"].asInteger();
 	data.mRSVP = content["rsvp"].asString();
-	data.mRSVP = scrub_host_name(data.mRSVP, mHost);
+	data.mRSVP = scrub_host_name(data.mRSVP);
 
 	mConfirmedQ.push(data);
 }
@@ -2986,7 +3011,7 @@ void LLMeshUploadThread::priceResult(LLTextureUploadData& data, const LLSD& cont
 {
 	mPendingCost += content["upload_price"].asInteger();
 	data.mRSVP = content["rsvp"].asString();
-	data.mRSVP = scrub_host_name(data.mRSVP, mHost);
+	data.mRSVP = scrub_host_name(data.mRSVP);
 
 	mConfirmedTextureQ.push(data);
 }
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index d6d38de2257a84ba649436164306b82ef22a284d..ca7b51a3cc7e54d482c894c300a1d61f8c0a5b74 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -51,6 +51,8 @@
 #include "llviewerstats.h"
 #include "llworld.h"
 
+std::string scrub_host_name(std::string http_url);
+
 //////////////////////////////////////////////////////////////////////////////
 class LLTextureFetchWorker : public LLWorkerClass
 {
@@ -912,7 +914,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
 				// Will call callbackHttpGet when curl request completes
 				std::vector<std::string> headers;
 				headers.push_back("Accept: image/x-j2c");
-				res = mFetcher->mCurlGetRequest->getByteRange(mUrl, headers, offset, mRequestedSize,
+				res = mFetcher->mCurlGetRequest->getByteRange(scrub_host_name(mUrl), headers, offset, mRequestedSize,
 															  new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, offset, true));
 			}
 			if (!res)
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 573fb1a8b56450b946634d3e5aff452ac91328d6..972c9c255e26d5a31cdceef686165682fc2ca09e 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -655,12 +655,15 @@ class LLDebugText
 			}
 		}
 
-		S32 pending = (S32) gMeshRepo.mPendingRequests.size();
-		S32 header = (S32) gMeshRepo.mThread->mHeaderReqQ.size();
-		S32 lod = (S32) gMeshRepo.mThread->mLODReqQ.size();
-
-		if (pending + header + lod + LLMeshRepoThread::sActiveHeaderRequests + LLMeshRepoThread::sActiveLODRequests != 0)
+		if (!gMeshRepo.mPendingRequests.empty() ||
+			!gMeshRepo.mThread->mHeaderReqQ.empty() ||
+			!gMeshRepo.mThread->mLODReqQ.empty())
 		{
+			LLMutexLock lock(gMeshRepo.mThread->mMutex);
+			S32 pending = (S32) gMeshRepo.mPendingRequests.size();
+			S32 header = (S32) gMeshRepo.mThread->mHeaderReqQ.size();
+			S32 lod = (S32) gMeshRepo.mThread->mLODReqQ.size();
+
 			addText(xpos, ypos, llformat ("Mesh Queue - %d pending (%d:%d header | %d:%d LOD)", 
 												pending,
 												LLMeshRepoThread::sActiveHeaderRequests, header,