diff --git a/.hgtags b/.hgtags
index 48c28ab91858dcaeb37493b626d63a4c0f8ad275..a20756b9e7777cbb31c4f6f26951bece0d8c56d9 100755
--- a/.hgtags
+++ b/.hgtags
@@ -364,3 +364,4 @@ f1d3b3fcab28ed9ea532bf50db0ba96f5c8cc8e9 DRTVWR-232
 4918b150e75df6b516fb6c2616d32043fa6b4cac DRTVWR-245
 94ab2b49458ab372a95d2d6949fdf574f413068d 3.4.3-beta1
 4c3460cb1fb7c6da9965e09c734d282a8e9c81f0 DRTVWR-229
+f4481df42f9a4a92bf475a80f0c51d1a4bbdfd59 DRTVWR-246
diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake
index 09501e0406e637ceea1e1c92d10291504e9fe2da..73b3642ae646c3e5ff493157e92d32b9fcb7c9fb 100644
--- a/indra/cmake/GooglePerfTools.cmake
+++ b/indra/cmake/GooglePerfTools.cmake
@@ -3,7 +3,7 @@ include(Prebuilt)
 
 # If you want to enable or disable TCMALLOC in viewer builds, this is the place.
 # set ON or OFF as desired.
-set (USE_TCMALLOC ON)
+set (USE_TCMALLOC OFF)
 
 if (STANDALONE)
   include(FindGooglePerfTools)
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 6073bcd0a6cc8713b0d2bdbe6be3635c1be57b6c..c96f2191f31558c3a93ca30f8723c414d13c6cde 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -944,13 +944,15 @@ LLSD LLMemoryInfo::loadStatsMap()
 	state.dwLength = sizeof(state);
 	GlobalMemoryStatusEx(&state);
 
-	stats.add("Percent Memory use", state.dwMemoryLoad);
-	stats.add("Total Physical KB",  state.ullTotalPhys/1024);
-	stats.add("Avail Physical KB",  state.ullAvailPhys/1024);
-	stats.add("Total page KB",      state.ullTotalPageFile/1024);
-	stats.add("Avail page KB",      state.ullAvailPageFile/1024);
-	stats.add("Total Virtual KB",   state.ullTotalVirtual/1024);
-	stats.add("Avail Virtual KB",   state.ullAvailVirtual/1024);
+	DWORDLONG div = 1024;
+
+	stats.add("Percent Memory use", state.dwMemoryLoad/div);
+	stats.add("Total Physical KB",  state.ullTotalPhys/div);
+	stats.add("Avail Physical KB",  state.ullAvailPhys/div);
+	stats.add("Total page KB",      state.ullTotalPageFile/div);
+	stats.add("Avail page KB",      state.ullAvailPageFile/div);
+	stats.add("Total Virtual KB",   state.ullTotalVirtual/div);
+	stats.add("Avail Virtual KB",   state.ullAvailVirtual/div);
 
 	PERFORMANCE_INFORMATION perf;
 	perf.cb = sizeof(perf);
@@ -982,15 +984,15 @@ LLSD LLMemoryInfo::loadStatsMap()
 	GetProcessMemoryInfo(GetCurrentProcess(), PPROCESS_MEMORY_COUNTERS(&pmem), sizeof(pmem));
 
 	stats.add("Page Fault Count",              pmem.PageFaultCount);
-	stats.add("PeakWorkingSetSize KB",         pmem.PeakWorkingSetSize/1024);
-	stats.add("WorkingSetSize KB",             pmem.WorkingSetSize/1024);
-	stats.add("QutaPeakPagedPoolUsage KB",     pmem.QuotaPeakPagedPoolUsage/1024);
-	stats.add("QuotaPagedPoolUsage KB",        pmem.QuotaPagedPoolUsage/1024);
-	stats.add("QuotaPeakNonPagedPoolUsage KB", pmem.QuotaPeakNonPagedPoolUsage/1024);
-	stats.add("QuotaNonPagedPoolUsage KB",     pmem.QuotaNonPagedPoolUsage/1024);
-	stats.add("PagefileUsage KB",              pmem.PagefileUsage/1024);
-	stats.add("PeakPagefileUsage KB",          pmem.PeakPagefileUsage/1024);
-	stats.add("PrivateUsage KB",               pmem.PrivateUsage/1024);
+	stats.add("PeakWorkingSetSize KB",         pmem.PeakWorkingSetSize/div);
+	stats.add("WorkingSetSize KB",             pmem.WorkingSetSize/div);
+	stats.add("QutaPeakPagedPoolUsage KB",     pmem.QuotaPeakPagedPoolUsage/div);
+	stats.add("QuotaPagedPoolUsage KB",        pmem.QuotaPagedPoolUsage/div);
+	stats.add("QuotaPeakNonPagedPoolUsage KB", pmem.QuotaPeakNonPagedPoolUsage/div);
+	stats.add("QuotaNonPagedPoolUsage KB",     pmem.QuotaNonPagedPoolUsage/div);
+	stats.add("PagefileUsage KB",              pmem.PagefileUsage/div);
+	stats.add("PeakPagefileUsage KB",          pmem.PeakPagefileUsage/div);
+	stats.add("PrivateUsage KB",               pmem.PrivateUsage/div);
 
 #elif LL_DARWIN
 
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 7eea9ece5a7627a0f5b8d6bb9871daee05126fc8..99c7ffcb6af7979a0ee67cbee283fdb2cb780afa 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1569,9 +1569,9 @@ if (WINDOWS)
     set_target_properties(${VIEWER_BINARY_NAME}
         PROPERTIES
         # *TODO -reenable this once we get server usage sorted out
-        LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS ${TCMALLOC_LINK_FLAGS}"
-        LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO"
-        LINK_FLAGS_RELEASE "/FORCE:MULTIPLE /MAP\"secondlife-bin.MAP\" /OPT:REF"
+        LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS ${TCMALLOC_LINK_FLAGS} /LARGEADDRESSAWARE"
+        LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO /LARGEADDRESSAWARE"
+        LINK_FLAGS_RELEASE "/FORCE:MULTIPLE /MAP\"secondlife-bin.MAP\" /OPT:REF /LARGEADDRESSAWARE"
         )
     if(USE_PRECOMPILED_HEADERS)
         set_target_properties(
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 4fa1663907e852317947fdfb642f8af417dfa856..199e4f459d2e0bb2acbacab9873039c81cedbe4a 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -5755,7 +5755,7 @@
       <key>Type</key>
       <string>Boolean</string>
       <key>Value</key>
-      <integer>1</integer>
+      <integer>0</integer>
     </map>
     <key>MemoryPrivatePoolSize</key>
     <map>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 438194c715f975b7ada0a599f67576eab354a42a..30f82926f1f2757faaf7d7594e05518fe3c2b81a 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -710,7 +710,7 @@ bool LLAppViewer::init()
 	//set the max heap size.
 	initMaxHeapSize() ;
 
-	LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled"), (U32)gSavedSettings.getU32("MemoryPrivatePoolSize")) ;
+	LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled"), (U32)gSavedSettings.getU32("MemoryPrivatePoolSize")*1024*1024) ;
 
 	// write Google Breakpad minidump files to our log directory
 	std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index e0ca1232b0da7b55c3abb7e49393d26e165b41e5..11790d562f8739e5e5783d9300ea3efacdcc6f6e 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -125,7 +125,7 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
 	
 #if WINDOWS_CRT_MEM_CHECKS && !INCLUDE_VLD
 	_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); // dump memory leaks on exit
-#elif 1
+#elif 0
 	// Experimental - enable the low fragmentation heap
 	// This results in a 2-3x improvement in opening a new Inventory window (which uses a large numebr of allocations)
 	// Note: This won't work when running from the debugger unless the _NO_DEBUG_HEAP environment variable is set to 1
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 32cf8cc1b30fd178ec7a015f538ab30ba4087da5..96d7890a9e622beab6f52228094d4fa81e205a0a 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -624,6 +624,7 @@ LLViewerTexture::~LLViewerTexture()
 void LLViewerTexture::init(bool firstinit)
 {
 	mBoostLevel = LLViewerTexture::BOOST_NONE;
+	mSelectedTime = 0.f;
 
 	mFullWidth = 0;
 	mFullHeight = 0;
@@ -679,11 +680,18 @@ void LLViewerTexture::setBoostLevel(S32 level)
 	if(mBoostLevel != level)
 	{
 		mBoostLevel = level ;
-		if(mBoostLevel != LLViewerTexture::BOOST_NONE)
+		if(mBoostLevel != LLViewerTexture::BOOST_NONE && 
+			mBoostLevel != LLViewerTexture::BOOST_SELECTED)
 		{
 			setNoDelete() ;		
 		}
 	}
+
+	if (mBoostLevel == LLViewerTexture::BOOST_SELECTED)
+	{
+		mSelectedTime = gFrameTimeSeconds;
+	}
+
 }
 
 
@@ -1904,13 +1912,34 @@ void LLViewerFetchedTexture::updateVirtualSize()
 	for(U32 i = 0 ; i < mNumFaces ; i++)
 	{				
 		LLFace* facep = mFaceList[i] ;
-		if( facep && facep->getDrawable() && facep->getDrawable()->isRecentlyVisible())
+		if( facep )
 		{
-			addTextureStats(facep->getVirtualSize()) ;
-			setAdditionalDecodePriority(facep->getImportanceToCamera()) ;
+			LLDrawable* drawable = facep->getDrawable();
+			if (drawable)
+			{
+				if(drawable->isRecentlyVisible())
+				{
+					if (getBoostLevel() == LLViewerTexture::BOOST_NONE && 
+						drawable->getVObj() && drawable->getVObj()->isSelected())
+					{
+						setBoostLevel(LLViewerTexture::BOOST_SELECTED);
+					}
+					addTextureStats(facep->getVirtualSize()) ;
+					setAdditionalDecodePriority(facep->getImportanceToCamera()) ;
+				}
+			}
 		}
 	}
 
+	//reset whether or not a face was selected after 10 seconds
+	const F32 SELECTION_RESET_TIME = 10.f;
+
+	if (getBoostLevel() ==  LLViewerTexture::BOOST_SELECTED && 
+		gFrameTimeSeconds - mSelectedTime > SELECTION_RESET_TIME)
+	{
+		setBoostLevel(LLViewerTexture::BOOST_NONE);
+	}
+
 	if(mMaxVirtualSizeResetCounter > 0)
 	{
 		mMaxVirtualSizeResetCounter--;
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 2ea9a07e9a1acff51c8d7406d6294859ad5bf021..2e7949e9a38f84d42ef8b42feba503d09baba45e 100755
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -275,6 +275,7 @@ private:
 protected:
 	LLUUID mID;
 	S32 mBoostLevel;				// enum describing priority level
+	F32 mSelectedTime;				// time texture was last selected
 	S32 mFullWidth;
 	S32 mFullHeight;
 	BOOL  mUseMipMaps ;