diff --git a/.hgtags b/.hgtags
index 9cbb192d43100434efe1f18f0b686c116260e26c..9c3a2579fd24b15b16c580d5ea5cf7f6392315b3 100755
--- a/.hgtags
+++ b/.hgtags
@@ -529,3 +529,4 @@ cea1632c002c065985ebea15eeeb4aac90f50545 5.0.2-release
 b4d76b5590fdf8bab72c64442353753a527cbc44 5.0.5-release
 3e5035dfd8af49bd4c0009f0a76ef46a15991a45 5.0.6-release
 abcab37e1b29414ab8c03af9ca2ab489d809788a 5.0.7-release
+505a492f30bd925bb48e2e093ae77c3c2b4c740f 5.0.8-release
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 064639fe72ea90123f98b5accadcb8e13c7b72b2..6f4e88e836e27dd189a2be7ad0fe03523200f59d 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -1039,9 +1039,9 @@ Nicholaz Beresford
 	VWR-2682
 	VWR-2684
 Nick Rhodes
-NickyD
-	MAINT-873
 Nicky Dasmijn
+	MAINT-873
+	MAINT-7541
 	VWR-29228
 	MAINT-1392
 	MAINT-873
diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp
index d8185aa693e65ce3a0b993d55dda45ae32407f3f..35e76f1d9d0c0c7d32cfba1d09965e404151f74b 100644
--- a/indra/llcharacter/llmotioncontroller.cpp
+++ b/indra/llcharacter/llmotioncontroller.cpp
@@ -139,7 +139,8 @@ LLMotionController::LLMotionController()
 	  mTimeStep(0.f),
 	  mTimeStepCount(0),
 	  mLastInterp(0.f),
-	  mIsSelf(FALSE)
+	  mIsSelf(FALSE),
+	  mLastCountAfterPurge(0)
 {
 }
 
@@ -238,10 +239,12 @@ void LLMotionController::purgeExcessMotions()
 		}
 	}
 
-	if (mLoadedMotions.size() > 2*MAX_MOTION_INSTANCES)
+	U32 loaded_count = mLoadedMotions.size();
+	if (loaded_count > (2 * MAX_MOTION_INSTANCES) && loaded_count > mLastCountAfterPurge)
 	{
-		LL_WARNS_ONCE("Animation") << "> " << 2*MAX_MOTION_INSTANCES << " Loaded Motions" << LL_ENDL;
+		LL_WARNS_ONCE("Animation") << loaded_count << " Loaded Motions. Amount of motions is over limit." << LL_ENDL;
 	}
+	mLastCountAfterPurge = loaded_count;
 }
 
 //-----------------------------------------------------------------------------
diff --git a/indra/llcharacter/llmotioncontroller.h b/indra/llcharacter/llmotioncontroller.h
index 72de3316947f1ce13fcca68848e087bf30e95e2d..9d9c64f4f0004bff6ae1169ac301b75159e0243b 100644
--- a/indra/llcharacter/llmotioncontroller.h
+++ b/indra/llcharacter/llmotioncontroller.h
@@ -224,6 +224,8 @@ class LLMotionController
 	F32					mLastInterp;
 
 	U8					mJointSignature[2][LL_CHARACTER_MAX_ANIMATED_JOINTS];
+private:
+	U32					mLastCountAfterPurge; //for logging and debugging purposes
 };
 
 //-----------------------------------------------------------------------------
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 2c76f2902000e752e203280ed93a96b41d2c6360..6cc9e804d4ac4558551247128e31980ea0decb62 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -256,6 +256,70 @@ bool LLApp::parseCommandOptions(int argc, char** argv)
 	return true;
 }
 
+bool LLApp::parseCommandOptions(int argc, wchar_t** wargv)
+{
+	LLSD commands;
+	std::string name;
+	std::string value;
+	for(int ii = 1; ii < argc; ++ii)
+	{
+		if(wargv[ii][0] != '-')
+		{
+			LL_INFOS() << "Did not find option identifier while parsing token: "
+				<< wargv[ii] << LL_ENDL;
+			return false;
+		}
+		int offset = 1;
+		if(wargv[ii][1] == '-') ++offset;
+
+#if LL_WINDOWS
+	name.assign(utf16str_to_utf8str(&wargv[ii][offset]));
+#else
+	name.assign(wstring_to_utf8str(&wargv[ii][offset]));
+#endif
+		if(((ii+1) >= argc) || (wargv[ii+1][0] == '-'))
+		{
+			// we found another option after this one or we have
+			// reached the end. simply record that this option was
+			// found and continue.
+			int flag = name.compare("logfile");
+			if (0 == flag)
+			{
+				commands[name] = "log";
+			}
+			else
+			{
+				commands[name] = true;
+			}
+			
+			continue;
+		}
+		++ii;
+
+#if LL_WINDOWS
+	value.assign(utf16str_to_utf8str((wargv[ii])));
+#else
+	value.assign(wstring_to_utf8str((wargv[ii])));
+#endif
+
+#if LL_WINDOWS
+		//Windows changed command line parsing.  Deal with it.
+		S32 slen = value.length() - 1;
+		S32 start = 0;
+		S32 end = slen;
+		if (wargv[ii][start]=='"')start++;
+		if (wargv[ii][end]=='"')end--;
+		if (start!=0 || end!=slen) 
+		{
+			value = value.substr (start,end);
+		}
+#endif
+
+		commands[name] = value;
+	}
+	setOptionData(PRIORITY_COMMAND_LINE, commands);
+	return true;
+}
 
 void LLApp::manageLiveFile(LLLiveFile* livefile)
 {
@@ -354,7 +418,7 @@ void LLApp::setupErrorHandling(bool second_instance)
 			std::wstring wpipe_name;
 			wpipe_name =  mCrashReportPipeStr + wstringize(getPid());
 
-			const std::wstring wdump_path(wstringize(mDumpPath));
+			const std::wstring wdump_path(utf8str_to_utf16str(mDumpPath));
 
 			int retries = 30;
 			for (; retries > 0; --retries)
@@ -515,9 +579,9 @@ void LLApp::setMiniDumpDir(const std::string &path)
 
 	if(mExceptionHandler == 0) return;
 #ifdef LL_WINDOWS
-	wchar_t buffer[MAX_MINDUMP_PATH_LENGTH];
-	mbstowcs(buffer, mDumpPath.c_str(), MAX_MINDUMP_PATH_LENGTH);
-	mExceptionHandler->set_dump_path(std::wstring(buffer));
+	std::wstring buffer(utf8str_to_utf16str(mDumpPath));
+	if (buffer.size() > MAX_MINDUMP_PATH_LENGTH) buffer.resize(MAX_MINDUMP_PATH_LENGTH);
+	mExceptionHandler->set_dump_path(buffer);
 #elif LL_LINUX
         //google_breakpad::MinidumpDescriptor desc("/tmp");	//path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched.
         google_breakpad::MinidumpDescriptor desc(mDumpPath);	//path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched.
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index ff9a92b45f703418c1d2c03018af7fee8486566b..acd829d8649ae6a0883be66338014267ef3d82ee 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -106,7 +106,7 @@ class LL_COMMON_API LLApp
 	LLSD getOption(const std::string& name) const;
 
 	/** 
-	 * @brief Parse command line options and insert them into
+	 * @brief Parse ASCII command line options and insert them into
 	 * application command line options.
 	 *
 	 * The name inserted into the option will have leading option
@@ -119,6 +119,20 @@ class LL_COMMON_API LLApp
 	 */
 	bool parseCommandOptions(int argc, char** argv);
 
+	/** 
+	 * @brief Parse Unicode command line options and insert them into
+	 * application command line options.
+	 *
+	 * The name inserted into the option will have leading option
+	 * identifiers (a minus or double minus) stripped. All options
+	 * with values will be stored as a string, while all options
+	 * without values will be stored as true.
+	 * @param argc The argc passed into main().
+	 * @param wargv The wargv passed into main().
+	 * @return Returns true if the parse succeeded.
+	 */
+	bool parseCommandOptions(int argc, wchar_t** wargv);
+
 	/**
 	 * @brief Keep track of live files automatically.
 	 *
diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp
index 97270e4931d7cfc7a0b7196173abffd94a62c728..93db6c0d178a83f97d60955baccec3d072e35a2f 100644
--- a/indra/llcommon/llevents.cpp
+++ b/indra/llcommon/llevents.cpp
@@ -316,6 +316,13 @@ LLBoundListener LLEventPump::listen_impl(const std::string& name, const LLEventL
                                          const NameList& after,
                                          const NameList& before)
 {
+    if (!mSignal)
+    {
+        LL_WARNS() << "Can't connect listener" << LL_ENDL;
+        // connect will fail, return dummy
+        return LLBoundListener();
+    }
+
     float nodePosition = 1.0;
 
     // if the supplied name is empty we are not interested in the ordering mechanism 
diff --git a/indra/llcommon/llinitparam.cpp b/indra/llcommon/llinitparam.cpp
index 1d104cf55df6666f468171ff1a505dfa6995b683..aa2f4eb289b5e3e47d09f1cb99bb05ebc3274287 100644
--- a/indra/llcommon/llinitparam.cpp
+++ b/indra/llcommon/llinitparam.cpp
@@ -193,12 +193,7 @@ namespace LLInitParam
 		{
 			if (!silent)
 			{
-				std::string file_name = p.getCurrentFileName();
-				if(!file_name.empty())
-				{
-					file_name = "in file: " + file_name;
-				}
-				p.parserWarning(llformat("Failed to parse parameter \"%s\" %s", p.getCurrentElementName().c_str(), file_name.c_str()));
+				p.parserWarning(llformat("Failed to parse parameter \"%s\"", p.getCurrentElementName().c_str()));
 			}
 			return false;
 		}
diff --git a/indra/llcommon/llmetricperformancetester.cpp b/indra/llcommon/llmetricperformancetester.cpp
index 16fc365da1be7ec9d773181bd43611ae6279d90b..f8a93baf452c0bd4cb2bb4dadb647808f5523aba 100644
--- a/indra/llcommon/llmetricperformancetester.cpp
+++ b/indra/llcommon/llmetricperformancetester.cpp
@@ -132,8 +132,8 @@ void LLMetricPerformanceTesterBasic::doAnalysisMetrics(std::string baseline, std
 	}
 	
 	// Open baseline and current target, exit if one is inexistent
-	std::ifstream base_is(baseline.c_str());
-	std::ifstream target_is(target.c_str());
+	llifstream base_is(baseline.c_str());
+	llifstream target_is(target.c_str());
 	if (!base_is.is_open() || !target_is.is_open())
 	{
 		LL_WARNS() << "'-analyzeperformance' error : baseline or current target file inexistent" << LL_ENDL;
@@ -151,7 +151,7 @@ void LLMetricPerformanceTesterBasic::doAnalysisMetrics(std::string baseline, std
 	target_is.close();
 	
 	//output comparision
-	std::ofstream os(output.c_str());
+	llofstream os(output.c_str());
 	
 	os << "Label, Metric, Base(B), Target(T), Diff(T-B), Percentage(100*T/B)\n"; 
 	for(LLMetricPerformanceTesterBasic::name_tester_map_t::iterator iter = LLMetricPerformanceTesterBasic::sTesterMap.begin() ; 
@@ -212,7 +212,7 @@ void LLMetricPerformanceTesterBasic::addMetric(std::string str)
 }
 
 /*virtual*/ 
-void LLMetricPerformanceTesterBasic::analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) 
+void LLMetricPerformanceTesterBasic::analyzePerformance(llofstream* os, LLSD* base, LLSD* current) 
 {
 	resetCurrentCount() ;
 
@@ -254,14 +254,14 @@ void LLMetricPerformanceTesterBasic::analyzePerformance(std::ofstream* os, LLSD*
 }
 
 /*virtual*/ 
-void LLMetricPerformanceTesterBasic::compareTestResults(std::ofstream* os, std::string metric_string, S32 v_base, S32 v_current) 
+void LLMetricPerformanceTesterBasic::compareTestResults(llofstream* os, std::string metric_string, S32 v_base, S32 v_current) 
 {
 	*os << llformat(" ,%s, %d, %d, %d, %.4f\n", metric_string.c_str(), v_base, v_current, 
 						v_current - v_base, (v_base != 0) ? 100.f * v_current / v_base : 0) ;
 }
 
 /*virtual*/ 
-void LLMetricPerformanceTesterBasic::compareTestResults(std::ofstream* os, std::string metric_string, F32 v_base, F32 v_current) 
+void LLMetricPerformanceTesterBasic::compareTestResults(llofstream* os, std::string metric_string, F32 v_base, F32 v_current) 
 {
 	*os << llformat(" ,%s, %.4f, %.4f, %.4f, %.4f\n", metric_string.c_str(), v_base, v_current,						
 						v_current - v_base, (fabs(v_base) > 0.0001f) ? 100.f * v_current / v_base : 0.f ) ;
@@ -293,7 +293,7 @@ LLMetricPerformanceTesterWithSession::~LLMetricPerformanceTesterWithSession()
 }
 
 /*virtual*/ 
-void LLMetricPerformanceTesterWithSession::analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) 
+void LLMetricPerformanceTesterWithSession::analyzePerformance(llofstream* os, LLSD* base, LLSD* current) 
 {
 	// Load the base session
 	resetCurrentCount() ;
diff --git a/indra/llcommon/llmetricperformancetester.h b/indra/llcommon/llmetricperformancetester.h
index e6b46be1cf905f193652bb2458ee8e6e573eb738..2e99ed979df939396b3d2bcbbaaf40737cd3b9a7 100644
--- a/indra/llcommon/llmetricperformancetester.h
+++ b/indra/llcommon/llmetricperformancetester.h
@@ -60,7 +60,7 @@ class LL_COMMON_API LLMetricPerformanceTesterBasic
 	 * By default, compares the test results against the baseline one by one, item by item, 
 	 * in the increasing order of the LLSD record counter, starting from the first one.
 	 */
-	virtual void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ;
+	virtual void analyzePerformance(llofstream* os, LLSD* base, LLSD* current) ;
 
 	static void doAnalysisMetrics(std::string baseline, std::string target, std::string output) ;
 
@@ -93,8 +93,8 @@ class LL_COMMON_API LLMetricPerformanceTesterBasic
 	 * @param[in] v_base - Base value of the metric.
 	 * @param[in] v_current - Current value of the metric.
 	 */
-	virtual void compareTestResults(std::ofstream* os, std::string metric_string, S32 v_base, S32 v_current) ;
-	virtual void compareTestResults(std::ofstream* os, std::string metric_string, F32 v_base, F32 v_current) ;
+	virtual void compareTestResults(llofstream* os, std::string metric_string, S32 v_base, S32 v_current) ;
+	virtual void compareTestResults(llofstream* os, std::string metric_string, F32 v_base, F32 v_current) ;
 
 	/**
 	 * @brief Reset internal record count. Count starts with 1.
@@ -181,7 +181,7 @@ class LL_COMMON_API LLMetricPerformanceTesterWithSession : public LLMetricPerfor
 	 * This will be loading the base and current sessions and compare them using the virtual 
 	 * abstract methods loadTestSession() and compareTestSessions()
 	 */
-	virtual void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ;
+	virtual void analyzePerformance(llofstream* os, LLSD* base, LLSD* current) ;
 
 protected:
 	/**
@@ -205,7 +205,7 @@ class LL_COMMON_API LLMetricPerformanceTesterWithSession : public LLMetricPerfor
 	 * @brief Compare the base session and the target session. Assumes base and current sessions have been loaded.
 	 * @param[out] os - The comparison result as a standard stream
 	 */
-	virtual void compareTestSessions(std::ofstream* os) = 0;
+	virtual void compareTestSessions(llofstream* os) = 0;
 
 	LLTestSession* mBaseSessionp;
 	LLTestSession* mCurrentSessionp;
diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h
index 962367f69fe37a5af9af741e73d8f7017611218e..294d0066ca53ed93bb9d940bf6c7daa82cd39fcf 100644
--- a/indra/llcommon/llsys.h
+++ b/indra/llcommon/llsys.h
@@ -37,13 +37,14 @@
 //
 
 #include "llsd.h"
+#include "llsingleton.h"
 #include <iosfwd>
 #include <string>
 
-class LL_COMMON_API LLOSInfo
+class LL_COMMON_API LLOSInfo : public LLSingleton<LLOSInfo>
 {
+	LLSINGLETON(LLOSInfo);
 public:
-	LLOSInfo();
 	void stream(std::ostream& s) const;
 
 	const std::string& getOSString() const;
diff --git a/indra/llcorehttp/_httpinternal.h b/indra/llcorehttp/_httpinternal.h
index 79c89d6c920f9950ca8171bf81c6cd6cfc58e37b..690ebbecd8d6321ae7c7a20e923697f96e45050f 100644
--- a/indra/llcorehttp/_httpinternal.h
+++ b/indra/llcorehttp/_httpinternal.h
@@ -127,9 +127,12 @@ const int HTTP_TRACE_MAX = HTTP_TRACE_CURL_BODIES;
 // We want to span a few windows to allow transport to slow
 // after onset of the throttles and then recover without a final
 // failure.  Other systems may need other constants.
-const int HTTP_RETRY_COUNT_DEFAULT = 8;
+const int HTTP_RETRY_COUNT_DEFAULT = 5;
 const int HTTP_RETRY_COUNT_MIN = 0;
 const int HTTP_RETRY_COUNT_MAX = 100;
+const HttpTime HTTP_RETRY_BACKOFF_MIN_DEFAULT = 1E6L; // 1 sec
+const HttpTime HTTP_RETRY_BACKOFF_MAX_DEFAULT = 5E6L; // 5 sec
+const HttpTime HTTP_RETRY_BACKOFF_MAX = 20E6L; // 20 sec
 
 const int HTTP_REDIRECTS_DEFAULT = 10;
 
diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp
index 07cc0e462556fd6b2a518eef19663e2eed5fd29b..fceed8524be415386a00ff26e361e4fd4e92526c 100644
--- a/indra/llcorehttp/_httpoprequest.cpp
+++ b/indra/llcorehttp/_httpoprequest.cpp
@@ -140,6 +140,8 @@ HttpOpRequest::HttpOpRequest()
 	  mPolicy503Retries(0),
 	  mPolicyRetryAt(HttpTime(0)),
 	  mPolicyRetryLimit(HTTP_RETRY_COUNT_DEFAULT),
+	  mPolicyMinRetryBackoff(HttpTime(HTTP_RETRY_BACKOFF_MIN_DEFAULT)),
+	  mPolicyMaxRetryBackoff(HttpTime(HTTP_RETRY_BACKOFF_MAX_DEFAULT)),
 	  mCallbackSSLVerify(NULL)
 {
 	// *NOTE:  As members are added, retry initialization/cleanup
@@ -434,6 +436,9 @@ void HttpOpRequest::setupCommon(HttpRequest::policy_t policy_id,
 		mPolicyRetryLimit = options->getRetries();
 		mPolicyRetryLimit = llclamp(mPolicyRetryLimit, HTTP_RETRY_COUNT_MIN, HTTP_RETRY_COUNT_MAX);
 		mTracing = (std::max)(mTracing, llclamp(options->getTrace(), HTTP_TRACE_MIN, HTTP_TRACE_MAX));
+
+		mPolicyMinRetryBackoff = llclamp(options->getMinBackoff(), HttpTime(0), HTTP_RETRY_BACKOFF_MAX);
+		mPolicyMaxRetryBackoff = llclamp(options->getMaxBackoff(), mPolicyMinRetryBackoff, HTTP_RETRY_BACKOFF_MAX);
 	}
 }
 
diff --git a/indra/llcorehttp/_httpoprequest.h b/indra/llcorehttp/_httpoprequest.h
index dbcc57d0fdf1325efd802f272a7dff772b4604e7..43d49324af8280898ed2916058eeae739148b0b1 100644
--- a/indra/llcorehttp/_httpoprequest.h
+++ b/indra/llcorehttp/_httpoprequest.h
@@ -232,6 +232,8 @@ class HttpOpRequest : public HttpOperation
 	int					mPolicy503Retries;
 	HttpTime			mPolicyRetryAt;
 	int					mPolicyRetryLimit;
+	HttpTime			mPolicyMinRetryBackoff; // initial delay between retries (mcs)
+	HttpTime			mPolicyMaxRetryBackoff;
 };  // end class HttpOpRequest
 
 
diff --git a/indra/llcorehttp/_httppolicy.cpp b/indra/llcorehttp/_httppolicy.cpp
index b2709b53ecf76e3405920100a2b15f253b31e46c..4889cac9bf1a3d6b6ac7417f8eb04cb5f37eaa64 100644
--- a/indra/llcorehttp/_httppolicy.cpp
+++ b/indra/llcorehttp/_httppolicy.cpp
@@ -151,20 +151,16 @@ void HttpPolicy::addOp(const HttpOpRequest::ptr_t &op)
 
 void HttpPolicy::retryOp(const HttpOpRequest::ptr_t &op)
 {
-	static const HttpTime retry_deltas[] =
-		{
-			 250000,			// 1st retry in 0.25 S, etc...
-			 500000,
-			1000000,
-			2000000,
-			5000000				// ... to every 5.0 S.
-		};
-	static const int delta_max(int(LL_ARRAY_SIZE(retry_deltas)) - 1);
 	static const HttpStatus error_503(503);
 
 	const HttpTime now(totalTime());
 	const int policy_class(op->mReqPolicy);
-	HttpTime delta(retry_deltas[llclamp(op->mPolicyRetries, 0, delta_max)]);
+
+	HttpTime delta_min = op->mPolicyMinRetryBackoff;
+	HttpTime delta_max = op->mPolicyMaxRetryBackoff;
+	// mPolicyRetries limited to 100
+	U32 delta_factor = op->mPolicyRetries <= 10 ? 1 << op->mPolicyRetries : 1024;
+	HttpTime delta = llmin(delta_min * delta_factor, delta_max);
 	bool external_delta(false);
 
 	if (op->mReplyRetryAfter > 0 && op->mReplyRetryAfter < 30)
diff --git a/indra/llcorehttp/httpoptions.cpp b/indra/llcorehttp/httpoptions.cpp
index aab447f2dd11f5bc3fb1e35c33d19b4db0d36da5..df5aa52fa9d0dd2d58c414129afa0d2a2728cf63 100644
--- a/indra/llcorehttp/httpoptions.cpp
+++ b/indra/llcorehttp/httpoptions.cpp
@@ -39,6 +39,8 @@ HttpOptions::HttpOptions() :
     mTimeout(HTTP_REQUEST_TIMEOUT_DEFAULT),
     mTransferTimeout(HTTP_REQUEST_XFER_TIMEOUT_DEFAULT),
     mRetries(HTTP_RETRY_COUNT_DEFAULT),
+    mMinRetryBackoff(HTTP_RETRY_BACKOFF_MIN_DEFAULT),
+    mMaxRetryBackoff(HTTP_RETRY_BACKOFF_MAX_DEFAULT),
     mUseRetryAfter(HTTP_USE_RETRY_AFTER_DEFAULT),
     mFollowRedirects(true),
     mVerifyPeer(false),
@@ -81,6 +83,16 @@ void HttpOptions::setRetries(unsigned int retries)
 	mRetries = retries;
 }
 
+void HttpOptions::setMinBackoff(HttpTime delay)
+{
+	mMinRetryBackoff = delay;
+}
+
+void HttpOptions::setMaxBackoff(HttpTime delay)
+{
+	mMaxRetryBackoff = delay;
+}
+
 void HttpOptions::setUseRetryAfter(bool use_retry)
 {
 	mUseRetryAfter = use_retry;
diff --git a/indra/llcorehttp/httpoptions.h b/indra/llcorehttp/httpoptions.h
index 510eaa45bba158e08a0b9f4bdf3cc04d42eadc77..8a6de61b04bab9b7823e55bbbdf80cd1b6f23183 100644
--- a/indra/llcorehttp/httpoptions.h
+++ b/indra/llcorehttp/httpoptions.h
@@ -101,13 +101,31 @@ class HttpOptions : private boost::noncopyable
 
     /// Sets the number of retries on an LLCore::HTTPRequest before the 
     /// request fails.
-	// Default:  8
+	// Default:  5
 	void				setRetries(unsigned int retries);
 	unsigned int		getRetries() const
 	{
 		return mRetries;
 	}
 
+	/// Sets minimal delay before request retries. In microseconds.
+	/// HttpPolicy will increase delay from min to max with each retry
+	// Default: 1 000 000 mcs
+	void				setMinBackoff(HttpTime delay);
+	HttpTime			getMinBackoff() const
+	{
+		return mMinRetryBackoff;
+	}
+
+	/// Sets maximum delay before request retries. In microseconds.
+	/// HttpPolicy will increase delay from min to max with each retry
+	// Default:  5 000 000 mcs
+	void				setMaxBackoff(HttpTime delay);
+	HttpTime			getMaxBackoff() const
+	{
+		return mMaxRetryBackoff;
+	}
+
 	// Default:  true
 	void				setUseRetryAfter(bool use_retry);
 	bool				getUseRetryAfter() const
@@ -166,6 +184,8 @@ class HttpOptions : private boost::noncopyable
 	unsigned int		mTimeout;
 	unsigned int		mTransferTimeout;
 	unsigned int		mRetries;
+	HttpTime			mMinRetryBackoff;
+	HttpTime			mMaxRetryBackoff;
 	bool				mUseRetryAfter;
 	bool				mFollowRedirects;
 	bool				mVerifyPeer;
diff --git a/indra/llcrashlogger/llcrashlock.cpp b/indra/llcrashlogger/llcrashlock.cpp
index 7dde1fcd69fbd1a0b2617ad38e73077aaf416142..77abfbcf0f7b1b40f34739e08e72685d23e59dfd 100644
--- a/indra/llcrashlogger/llcrashlock.cpp
+++ b/indra/llcrashlogger/llcrashlock.cpp
@@ -188,12 +188,22 @@ LLSD LLCrashLock::getProcessList()
 //static
 bool LLCrashLock::fileExists(std::string filename)
 {
-	return boost::filesystem::exists(filename.c_str());
+#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
+	boost::filesystem::path file_path(utf8str_to_utf16str(filename));
+#else
+	boost::filesystem::path file_path(filename);
+#endif
+	return boost::filesystem::exists(file_path);
 }
 
 void LLCrashLock::cleanupProcess(std::string proc_dir)
 {
-    boost::filesystem::remove_all(proc_dir);
+#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
+	boost::filesystem::path dir_path(utf8str_to_utf16str(proc_dir));
+#else
+	boost::filesystem::path dir_path(proc_dir);
+#endif
+	boost::filesystem::remove_all(dir_path);
 }
 
 bool LLCrashLock::putProcessList(const LLSD& proc_sd)
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index 9bd142aacc5180875fc40868dbd8044317c5fbd0..5e7471550063aa2a981e6b19f5e2cab2d403e12c 100644
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -155,9 +155,9 @@ std::string getStartupStateFromLog(std::string& sllog)
 
 bool LLCrashLogger::readFromXML(LLSD& dest, const std::string& filename )
 {
-    std::string db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,filename);
-    std::ifstream log_file(db_file_name.c_str());
-    
+	std::string db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,filename);
+	llifstream log_file(db_file_name.c_str());
+
 	// Look for it in the given file
 	if (log_file.is_open())
 	{
@@ -186,7 +186,7 @@ bool LLCrashLogger::readMinidump(std::string minidump_path)
 {
 	size_t length=0;
 
-	std::ifstream minidump_stream(minidump_path.c_str(), std::ios_base::in | std::ios_base::binary);
+	llifstream minidump_stream(minidump_path.c_str(), std::ios_base::in | std::ios_base::binary);
 	if(minidump_stream.is_open())
 	{
 		minidump_stream.seekg(0, std::ios::end);
@@ -287,7 +287,7 @@ void LLCrashLogger::gatherFiles()
         if (!file.empty())
         {
             LL_DEBUGS("CRASHREPORT") << "trying to read " << itr->first << ": " << file << LL_ENDL;
-            std::ifstream f(file.c_str());
+            llifstream f(file.c_str());
             if(f.is_open())
             {
                 std::stringstream s;
@@ -342,7 +342,7 @@ void LLCrashLogger::gatherFiles()
             if ( ( iter->length() > 30 ) && (iter->rfind(".dmp") == (iter->length()-4) ) )
             {
                 std::string fullname = pathname + *iter;
-                std::ifstream fdat( fullname.c_str(), std::ifstream::binary);
+                llifstream fdat(fullname.c_str(), std::ifstream::binary);
                 if (fdat)
                 {
                     char buf[5];
@@ -462,7 +462,7 @@ bool LLCrashLogger::sendCrashLog(std::string dump_dir)
     
 	updateApplication("Sending reports...");
 
-	std::ofstream out_file(report_file.c_str());
+	llofstream out_file(report_file.c_str());
 	LLSDSerialize::toPrettyXML(post_data, out_file);
     out_file.flush();
 	out_file.close();
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index a07ea146212c5e208651ef42ff9519ab11661927..ad765b641531c6122c5ed1f523f5c9641534442d 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -1436,7 +1436,7 @@ void LLImageRaw::copyScaled( LLImageRaw* src )
 bool LLImageRaw::scale( S32 new_width, S32 new_height, bool scale_image_data )
 {
     S32 components = getComponents();
-	if (! ((1 == components) || (3 == components) || (4 == components) ))
+    if (components != 1 && components != 3 && components != 4)
     {
         LL_WARNS() << "Invalid getComponents value (" << components << ")" << LL_ENDL;
         return false;
@@ -1512,6 +1512,55 @@ bool LLImageRaw::scale( S32 new_width, S32 new_height, bool scale_image_data )
 	return true ;
 }
 
+LLPointer<LLImageRaw> LLImageRaw::scaled(S32 new_width, S32 new_height)
+{
+    LLPointer<LLImageRaw> result;
+
+    S32 components = getComponents();
+    if (components != 1 && components != 3 && components != 4)
+    {
+        LL_WARNS() << "Invalid getComponents value (" << components << ")" << LL_ENDL;
+        return result;
+    }
+
+    if (isBufferInvalid())
+    {
+        LL_WARNS() << "Invalid image buffer" << LL_ENDL;
+        return result;
+    }
+
+    S32 old_width = getWidth();
+    S32 old_height = getHeight();
+
+    if ((old_width == new_width) && (old_height == new_height))
+    {
+        result = new LLImageRaw(old_width, old_height, components);
+        if (!result)
+        {
+            LL_WARNS() << "Failed to allocate new image" << LL_ENDL;
+            return result;
+        }
+        memcpy(result->getData(), getData(), getDataSize());
+    }
+    else
+    {
+        S32 new_data_size = new_width * new_height * components;
+
+        if (new_data_size > 0)
+        {
+            result = new LLImageRaw(new_width, new_height, components);
+            if (!result)
+            {
+                LL_WARNS() << "Failed to allocate new image" << LL_ENDL;
+                return result;
+            }
+            bilinear_scale(getData(), old_width, old_height, components, old_width*components, result->getData(), new_width, new_height, components, new_width*components);
+        }
+    }
+
+    return result;
+}
+
 void LLImageRaw::copyLineScaled( U8* in, U8* out, S32 in_pixel_len, S32 out_pixel_len, S32 in_pixel_step, S32 out_pixel_step )
 {
 	const S32 components = getComponents();
@@ -1785,10 +1834,13 @@ static std::string find_file(std::string &name, S8 *codec)
 #endif
 EImageCodec LLImageBase::getCodecFromExtension(const std::string& exten)
 {
-	for (int i=0; i<(int)(NUM_FILE_EXTENSIONS); i++)
+	if (!exten.empty())
 	{
-		if (exten == file_extensions[i].exten)
-			return file_extensions[i].codec;
+		for (int i = 0; i < (int)(NUM_FILE_EXTENSIONS); i++)
+		{
+			if (exten == file_extensions[i].exten)
+				return file_extensions[i].codec;
+		}
 	}
 	return IMG_CODEC_INVALID;
 }
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index d0bd4a2aefe554964057bd53051c28be4241f0a5..958c9fad3d1eef2ea7f37285950e3de0f0367ee3 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -215,7 +215,8 @@ class LLImageRaw : public LLImageBase
 	void expandToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, bool scale_image = true);
 	void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, bool scale_image = true);
 	void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE);
-	bool scale( S32 new_width, S32 new_height, bool scale_image = true );
+	bool scale(S32 new_width, S32 new_height, bool scale_image = true);
+    LLPointer<LLImageRaw> scaled(S32 new_width, S32 new_height);
 	
 	// Fill the buffer with a constant color
 	void fill( const LLColor4U& color );
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 7a54d83b3fdd9e57d0e0d67d7b7f6e033075a7d1..b0ac3c9436d032c0c82b77e622bfd2918afa06df 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -5311,19 +5311,31 @@ void LLVolumeFace::cacheOptimize()
 	S32 num_verts = mNumVertices;
 	S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF;
 	LLVector4a* pos = (LLVector4a*) ll_aligned_malloc<64>(sizeof(LLVector4a)*2*num_verts+size);
+	if (pos == NULL)
+	{
+		LL_ERRS("LLVOLUME") << "Allocation of positions vector[" << sizeof(LLVector4a) * 2 * num_verts + size  << "] failed. " << LL_ENDL;
+	}
 	LLVector4a* norm = pos + num_verts;
 	LLVector2* tc = (LLVector2*) (norm + num_verts);
 
 	LLVector4a* wght = NULL;
 	if (mWeights)
 	{
-		wght = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+		wght = (LLVector4a*)ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+		if (wght == NULL)
+		{
+			LL_ERRS("LLVOLUME") << "Allocation of weights[" << sizeof(LLVector4a) * num_verts << "] failed" << LL_ENDL;
+		}
 	}
 
 	LLVector4a* binorm = NULL;
 	if (mTangents)
 	{
 		binorm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+		if (binorm == NULL)
+		{
+			LL_ERRS("LLVOLUME") << "Allocation of binormals[" << sizeof(LLVector4a)*num_verts << "] failed" << LL_ENDL;
+		}
 	}
 
 	//allocate mapping of old indices to new indices
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 7757198af525935904294419c8e4752decee956e..1847c661d738766f3763a3246a105b4421eda9e1 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -65,7 +65,7 @@ static const std::string HEADLESS_VENDOR_STRING("Linden Lab");
 static const std::string HEADLESS_RENDERER_STRING("Headless");
 static const std::string HEADLESS_VERSION_STRING("1.0");
 
-std::ofstream gFailLog;
+llofstream gFailLog;
 
 #if GL_ARB_debug_output
 
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index 75e5fe86ec0ce1447b6df43b9fc62c3afe7fa0da..aa98b3f6bc635992f59132175486c58b59506bec 100644
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -47,7 +47,7 @@
 
 extern BOOL gDebugGL;
 extern BOOL gDebugSession;
-extern std::ofstream gFailLog;
+extern llofstream gFailLog;
 
 #define LL_GL_ERRS LL_ERRS("RenderState")
 
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index 641241a88c48822e4cc349ed22716901935de751..f71a88c56e84d1e42e3131258e9a48dcb2db67f5 100644
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -147,6 +147,10 @@ class LLFolderViewModelItem : public LLRefCount, public LLTrace::MemTrackable<LL
 	virtual const std::string& getDisplayName() const = 0;
 	virtual const std::string& getSearchableName() const = 0;
 
+	virtual std::string getSearchableDescription() const = 0;
+	virtual std::string getSearchableCreatorName()const = 0;
+	virtual std::string getSearchableUUIDString() const = 0;
+
 	virtual LLPointer<LLUIImage> getIcon() const = 0;
 	virtual LLPointer<LLUIImage> getIconOpen() const { return getIcon(); }
 	virtual LLPointer<LLUIImage> getIconOverlay() const { return NULL; }
diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp
index f70eebc594e1774a25c2f54c0fa5b6e1df20a543..6135cc56ad76197ed382d254134293613f25ac60 100644
--- a/indra/llui/llscrollcontainer.cpp
+++ b/indra/llui/llscrollcontainer.cpp
@@ -72,6 +72,7 @@ LLScrollContainer::Params::Params()
 	hide_scrollbar("hide_scrollbar"),
 	min_auto_scroll_rate("min_auto_scroll_rate", 100),
 	max_auto_scroll_rate("max_auto_scroll_rate", 1000),
+	max_auto_scroll_zone("max_auto_scroll_zone", 16),
 	reserve_scroll_corner("reserve_scroll_corner", false),
 	size("size", -1)
 {}
@@ -88,6 +89,7 @@ LLScrollContainer::LLScrollContainer(const LLScrollContainer::Params& p)
 	mReserveScrollCorner(p.reserve_scroll_corner),
 	mMinAutoScrollRate(p.min_auto_scroll_rate),
 	mMaxAutoScrollRate(p.max_auto_scroll_rate),
+	mMaxAutoScrollZone(p.max_auto_scroll_zone),
 	mScrolledView(NULL),
 	mSize(p.size)
 {
@@ -290,7 +292,21 @@ BOOL LLScrollContainer::handleDragAndDrop(S32 x, S32 y, MASK mask,
 	return TRUE;
 }
 
+bool LLScrollContainer::canAutoScroll(S32 x, S32 y)
+{
+	if (mAutoScrolling)
+	{
+		return true; // already scrolling
+	}
+	return autoScroll(x, y, false);
+}
+
 bool LLScrollContainer::autoScroll(S32 x, S32 y)
+{
+	return autoScroll(x, y, true);
+}
+
+bool LLScrollContainer::autoScroll(S32 x, S32 y, bool do_scroll)
 {
 	static LLUICachedControl<S32> scrollbar_size_control ("UIScrollbarSize", 0);
 	S32 scrollbar_size = (mSize == -1 ? scrollbar_size_control : mSize);
@@ -302,6 +318,8 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
 		screenRectToLocal(getRootView()->getLocalRect(), &screen_local_extents);
 
 		LLRect inner_rect_local( 0, mInnerRect.getHeight(), mInnerRect.getWidth(), 0 );
+		// Note: Will also include scrollers as scroll zones, so opposite
+		// scroll zones might have different size due to visible scrollers
 		if(	mScrollbar[HORIZONTAL]->getVisible() )
 		{
 			inner_rect_local.mBottom += scrollbar_size;
@@ -316,8 +334,8 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
 
 		S32 auto_scroll_speed = ll_round(mAutoScrollRate * LLFrameTimer::getFrameDeltaTimeF32());
 		// autoscroll region should take up no more than one third of visible scroller area
-		S32 auto_scroll_region_width = llmin(inner_rect_local.getWidth() / 3, 10); 
-		S32 auto_scroll_region_height = llmin(inner_rect_local.getHeight() / 3, 10); 
+		S32 auto_scroll_region_width = llmin(inner_rect_local.getWidth() / 3, (S32)mMaxAutoScrollZone); 
+		S32 auto_scroll_region_height = llmin(inner_rect_local.getHeight() / 3, (S32)mMaxAutoScrollZone); 
 
 		if(	mScrollbar[HORIZONTAL]->getVisible() )
 		{
@@ -325,8 +343,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
 			left_scroll_rect.mRight = inner_rect_local.mLeft + auto_scroll_region_width;
 			if( left_scroll_rect.pointInRect( x, y ) && (mScrollbar[HORIZONTAL]->getDocPos() > 0) )
 			{
-				mScrollbar[HORIZONTAL]->setDocPos( mScrollbar[HORIZONTAL]->getDocPos() - auto_scroll_speed );
-				mAutoScrolling = TRUE;
+				if (do_scroll)
+				{
+					mScrollbar[HORIZONTAL]->setDocPos(mScrollbar[HORIZONTAL]->getDocPos() - auto_scroll_speed);
+					mAutoScrolling = TRUE;
+				}
 				scrolling = true;
 			}
 
@@ -334,8 +355,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
 			right_scroll_rect.mLeft = inner_rect_local.mRight - auto_scroll_region_width;
 			if( right_scroll_rect.pointInRect( x, y ) && (mScrollbar[HORIZONTAL]->getDocPos() < mScrollbar[HORIZONTAL]->getDocPosMax()) )
 			{
-				mScrollbar[HORIZONTAL]->setDocPos( mScrollbar[HORIZONTAL]->getDocPos() + auto_scroll_speed );
-				mAutoScrolling = TRUE;
+				if (do_scroll)
+				{
+					mScrollbar[HORIZONTAL]->setDocPos(mScrollbar[HORIZONTAL]->getDocPos() + auto_scroll_speed);
+					mAutoScrolling = TRUE;
+				}
 				scrolling = true;
 			}
 		}
@@ -345,8 +369,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
 			bottom_scroll_rect.mTop = inner_rect_local.mBottom + auto_scroll_region_height;
 			if( bottom_scroll_rect.pointInRect( x, y ) && (mScrollbar[VERTICAL]->getDocPos() < mScrollbar[VERTICAL]->getDocPosMax()) )
 			{
-				mScrollbar[VERTICAL]->setDocPos( mScrollbar[VERTICAL]->getDocPos() + auto_scroll_speed );
-				mAutoScrolling = TRUE;
+				if (do_scroll)
+				{
+					mScrollbar[VERTICAL]->setDocPos(mScrollbar[VERTICAL]->getDocPos() + auto_scroll_speed);
+					mAutoScrolling = TRUE;
+				}
 				scrolling = true;
 			}
 
@@ -354,8 +381,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
 			top_scroll_rect.mBottom = inner_rect_local.mTop - auto_scroll_region_height;
 			if( top_scroll_rect.pointInRect( x, y ) && (mScrollbar[VERTICAL]->getDocPos() > 0) )
 			{
-				mScrollbar[VERTICAL]->setDocPos( mScrollbar[VERTICAL]->getDocPos() - auto_scroll_speed );
-				mAutoScrolling = TRUE;
+				if (do_scroll)
+				{
+					mScrollbar[VERTICAL]->setDocPos(mScrollbar[VERTICAL]->getDocPos() - auto_scroll_speed);
+					mAutoScrolling = TRUE;
+				}
 				scrolling = true;
 			}
 		}
diff --git a/indra/llui/llscrollcontainer.h b/indra/llui/llscrollcontainer.h
index c4c4d0a136b7ba052bbccc951c7f49644a42a3ac..e6c78913975c706a80e40e4fe22dec603c1ef354 100644
--- a/indra/llui/llscrollcontainer.h
+++ b/indra/llui/llscrollcontainer.h
@@ -66,6 +66,7 @@ class LLScrollContainer : public LLUICtrl
 							hide_scrollbar;
 		Optional<F32>		min_auto_scroll_rate,
 							max_auto_scroll_rate;
+		Optional<U32>		max_auto_scroll_zone;
 		Optional<LLUIColor>	bg_color;
 		Optional<LLScrollbar::callback_t> scroll_callback;
 		Optional<S32>		size;
@@ -114,7 +115,8 @@ class LLScrollContainer : public LLUICtrl
 
 	virtual void	draw();
 	virtual bool	addChild(LLView* view, S32 tab_group = 0);
-	
+
+	bool canAutoScroll(S32 x, S32 y);
 	bool autoScroll(S32 x, S32 y);
 
 	S32 getSize() const { return mSize; }
@@ -128,6 +130,7 @@ class LLScrollContainer : public LLUICtrl
 	virtual void scrollHorizontal( S32 new_pos );
 	virtual void scrollVertical( S32 new_pos );
 	void updateScroll();
+	bool autoScroll(S32 x, S32 y, bool do_scroll);
 	void calcVisibleSize( S32 *visible_width, S32 *visible_height, BOOL* show_h_scrollbar, BOOL* show_v_scrollbar ) const;
 
 	LLScrollbar* mScrollbar[ORIENTATION_COUNT];
@@ -141,6 +144,7 @@ class LLScrollContainer : public LLUICtrl
 	F32			mAutoScrollRate;
 	F32			mMinAutoScrollRate;
 	F32			mMaxAutoScrollRate;
+	U32			mMaxAutoScrollZone;
 	bool		mHideScrollbar;
 };
 
diff --git a/indra/llui/llxuiparser.cpp b/indra/llui/llxuiparser.cpp
index 99a0869ce31e11b4a0e9afe4833043b98115d817..138ba8bf023f1dd9f1a159c59ed22f16dba302a4 100644
--- a/indra/llui/llxuiparser.cpp
+++ b/indra/llui/llxuiparser.cpp
@@ -58,10 +58,6 @@ static 	LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs;
 
 const char* NO_VALUE_MARKER = "no_value";
 
-#ifdef LL_WINDOWS
-const S32 LINE_NUMBER_HERE = 0;
-#endif
-
 struct MaxOccursValues : public LLInitParam::TypeValuesHelper<U32, MaxOccursValues>
 {
 	static void declareValues()
@@ -1313,22 +1309,14 @@ bool LLXUIParser::writeSDValue(Parser& parser, const void* val_ptr, name_stack_t
 
 void LLXUIParser::parserWarning(const std::string& message)
 {
-#ifdef LL_WINDOWS
-	// use Visual Studio friendly formatting of output message for easy access to originating xml
-	LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()) << LL_ENDL;
-#else
-	Parser::parserWarning(message);
-#endif
+	std::string warning_msg = llformat("%s:\t%s(%d)", message.c_str(), mCurFileName.c_str(), mCurReadNode->getLineNumber());
+	Parser::parserWarning(warning_msg);
 }
 
 void LLXUIParser::parserError(const std::string& message)
 {
-#ifdef LL_WINDOWS
-    // use Visual Studio friendly formatting of output message for easy access to originating xml
-	LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()) << LL_ENDL;
-#else
-	Parser::parserError(message);
-#endif
+	std::string error_msg = llformat("%s:\t%s(%d)", message.c_str(), mCurFileName.c_str(), mCurReadNode->getLineNumber());
+	Parser::parserError(error_msg);
 }
 
 
@@ -1641,22 +1629,14 @@ bool LLSimpleXUIParser::processText()
 
 void LLSimpleXUIParser::parserWarning(const std::string& message)
 {
-#ifdef LL_WINDOWS
-	// use Visual Studio friendly formatting of output message for easy access to originating xml
-	LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()) << LL_ENDL;
-#else
-	Parser::parserWarning(message);
-#endif
+	std::string warning_msg = llformat("%s:\t%s",  message.c_str(), mCurFileName.c_str());
+	Parser::parserWarning(warning_msg);
 }
 
 void LLSimpleXUIParser::parserError(const std::string& message)
 {
-#ifdef LL_WINDOWS
-        // use Visual Studio friendly formatting of output message for easy access to originating xml
-	LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()) << LL_ENDL;
-#else
-	Parser::parserError(message);
-#endif
+	std::string error_msg = llformat("%s:\t%s",  message.c_str(), mCurFileName.c_str());
+	Parser::parserError(error_msg);
 }
 
 bool LLSimpleXUIParser::readFlag(Parser& parser, void* val_ptr)
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index 924e1166ee44608706b760d68070a53604587b14..b845de71fa3b1aaa31deeae356d936f252478fd5 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -104,8 +104,13 @@ LLDir::~LLDir()
 std::vector<std::string> LLDir::getFilesInDir(const std::string &dirname)
 {
     //Returns a vector of fullpath filenames.
-    
-    boost::filesystem::path p (dirname);
+
+#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
+    boost::filesystem::path p(utf8str_to_utf16str(dirname));
+#else
+    boost::filesystem::path p(dirname);
+#endif
+
     std::vector<std::string> v;
     
     if (exists(p))
@@ -193,7 +198,12 @@ U32 LLDir::deleteDirAndContents(const std::string& dir_name)
 
 	try
 	{
-	   boost::filesystem::path dir_path(dir_name);
+#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
+		boost::filesystem::path dir_path(utf8str_to_utf16str(dir_name));
+#else
+		boost::filesystem::path dir_path(dir_name);
+#endif
+
 	   if (boost::filesystem::exists (dir_path))
 	   {
 	      if (!boost::filesystem::is_empty (dir_path))
diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index 4eb29c98f9aa6ea4cd96ecd991c22c6967b91d9f..ec1454308c2c6214b40929be4228f21355f5b49e 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -440,6 +440,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 			}
 			else if (message_name == "cleanup")
 			{
+				mVolumeCatcher.setVolume(0);
 				mLLCEFLib->requestExit();
 			}
 			else if (message_name == "shm_added")
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 51e67ba4d030c9b7c6e94b506d3c2b12306de4d0..bb09d45b57461b72067a7d0ca20681c55171605a 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-5.0.8
+5.0.9
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index dd038d33e40cbe3f4f7669894e7eb13472c4d706..def97f33205c602809153ea9835aebe1a8902512 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -812,6 +812,17 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>FramePerSecondLimit</key>
+    <map>
+      <key>Comment</key>
+      <string>Controls upper limit of frames per second</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>U32</string>
+      <key>Value</key>
+      <integer>120</integer>
+    </map>
     <key>BackgroundYieldTime</key>
     <map>
       <key>Comment</key>
@@ -1382,7 +1393,7 @@
       <key>Type</key>
       <string>U32</string>
       <key>Value</key>
-      <integer>512</integer>
+      <integer>1024</integer>
     </map>
     <key>CacheValidateCounter</key>
     <map>
@@ -4534,7 +4545,7 @@
       <key>Type</key>
       <string>String</string>
       <key>Value</key>
-      <string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
+      <string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
     </map>
     <key>HighResSnapshot</key>
     <map>
@@ -5581,12 +5592,12 @@
     <key>Type</key>
     <string>F32</string>
     <key>Value</key>
-    <real>10.0</real>
+    <real>40.0</real>
   </map>
   <key>LoginSRVPump</key>
   <map>
     <key>Comment</key>
-    <string>Name of the message pump that handles SRV request</string>
+    <string>Name of the message pump that handles SRV request (deprecated)</string>
     <key>Persist</key>
     <integer>0</integer>
     <key>Type</key>
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 89317f2793f7069123c54515cf6d9eaf4c8778ca..6ee330619f3e2d1bfd2f96036c057ab38f03844a 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -300,11 +300,6 @@ CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" \
 CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \
 				'"$INSTDIR\uninst.exe"' ''
 
-# Create *.bat file to specify lang params on first run from installer - see MAINT-5259
-FileOpen $9 "$INSTDIR\autorun.bat" w
-FileWrite $9 'start "$INSTDIR\$INSTEXE" "$INSTDIR\$INSTEXE" $SHORTCUT_LANG_PARAM$\r$\n'
-FileClose $9
-
 # Write registry
 WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" "$INSTDIR"
 WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" "${VERSION_LONG}"
@@ -700,7 +695,7 @@ Call CheckWindowsServPack		# Warn if not on the latest SP before asking to launc
 	Push $R0					# Option value, unused
 	StrCmp $SKIP_AUTORUN "true" +2;
 # Assumes SetOutPath $INSTDIR
-	Exec '"$WINDIR\explorer.exe" "$INSTDIR\autorun.bat"'
+	Exec '"$WINDIR\explorer.exe" "$INSTDIR\$INSTSHORTCUT.lnk"'
 	Pop $R0
 
 FunctionEnd
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index c928cf0601bfa60e82285bfb9766269878ffe2bf..0fb811a3867b0bec0ca00481d24c959ed84d34c2 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -1321,6 +1321,8 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
 
 //=========================================================================
 
+const std::string LLAppearanceMgr::sExpectedTextureName = "OutfitPreview";
+
 const LLUUID LLAppearanceMgr::getCOF() const
 {
 	return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
@@ -1571,7 +1573,14 @@ void LLAppearanceMgr::removeOutfitPhoto(const LLUUID& outfit_id)
     BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)
     {
         LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem();
-        if (linked_item != NULL && linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+        if (linked_item != NULL)
+        {
+            if (linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+            {
+                gInventory.removeItem(outfit_item->getUUID());
+            }
+        }
+        else if (outfit_item->getActualType() == LLAssetType::AT_TEXTURE)
         {
             gInventory.removeItem(outfit_item->getUUID());
         }
@@ -3209,6 +3218,7 @@ void appearance_mgr_update_dirty_state()
 void update_base_outfit_after_ordering()
 {
 	LLAppearanceMgr& app_mgr = LLAppearanceMgr::instance();
+	app_mgr.setOutfitImage(LLUUID());
 	LLInventoryModel::cat_array_t sub_cat_array;
 	LLInventoryModel::item_array_t outfit_item_array;
 	gInventory.collectDescendents(app_mgr.getBaseOutfitUUID(),
@@ -3218,9 +3228,26 @@ void update_base_outfit_after_ordering()
 	BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)
 	{
 		LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem();
-		if (linked_item != NULL && linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+		if (linked_item != NULL)
+		{
+			if (linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+			{
+				app_mgr.setOutfitImage(linked_item->getLinkedUUID());
+				if (linked_item->getName() == LLAppearanceMgr::sExpectedTextureName)
+				{
+					// Images with "appropriate" name take priority
+					break;
+				}
+			}
+		}
+		else if (outfit_item->getActualType() == LLAssetType::AT_TEXTURE)
 		{
-			app_mgr.setOutfitImage(linked_item->getLinkedUUID());
+			app_mgr.setOutfitImage(outfit_item->getUUID());
+			if (outfit_item->getName() == LLAppearanceMgr::sExpectedTextureName)
+			{
+				// Images with "appropriate" name take priority
+				break;
+			}
 		}
 	}
 
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 166c663feb3f0eec7d1490d888f9a3f2b2a49377..c274a8b04903e11cfdd7ec2a1801c5a66e4a43ce 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -291,6 +291,9 @@ class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
 	BOOL getIsInCOF(const LLUUID& obj_id) const;
 	// Is this in the COF and can the user delete it from the COF?
 	BOOL getIsProtectedCOFItem(const LLUUID& obj_id) const;
+
+	// Outfits will prioritize textures with such name to use for preview in gallery
+	static const std::string sExpectedTextureName;
 };
 
 class LLUpdateAppearanceOnDestroy: public LLInventoryCallback
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 33798032cc8eff67eae797630aad2112f3518864..7e6caeba50600dac4ff5f2dbd5179c8651cc9c20 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -315,8 +315,6 @@ F32SecondsImplicit gFrameIntervalSeconds = 0.f;
 F32 gFPSClamped = 10.f;						// Pretend we start at target rate.
 F32 gFrameDTClamped = 0.f;					// Time between adjacent checks to network for packets
 U64MicrosecondsImplicit	gStartTime = 0; // gStartTime is "private", used only to calculate gFrameTimeSeconds
-U32 gFrameStalls = 0;
-const F64 FRAME_STALL_THRESHOLD = 1.0;
 
 LLTimer gRenderStartTime;
 LLFrameTimer gForegroundTime;
@@ -641,7 +639,7 @@ class LLFastTimerLogThread : public LLThread
 
 	void run()
 	{
-		std::ofstream os(mFile.c_str());
+		llofstream os(mFile.c_str());
 		
 		while (!LLAppViewer::instance()->isQuitting())
 		{
@@ -705,7 +703,8 @@ LLAppViewer::LLAppViewer()
 	mFastTimerLogThread(NULL),
 	mUpdater(new LLUpdaterService()),
 	mSettingsLocationList(NULL),
-	mIsFirstRun(false)
+	mIsFirstRun(false),
+	mMinMicroSecPerFrame(0.f)
 {
 	if(NULL != sInstance)
 	{
@@ -734,7 +733,7 @@ LLAppViewer::LLAppViewer()
 	//
 	
 	LLLoginInstance::instance().setUpdaterService(mUpdater.get());
-	LLLoginInstance::instance().setPlatformInfo(gPlatform, getOSInfo().getOSVersionString(), getOSInfo().getOSStringSimple());
+	LLLoginInstance::instance().setPlatformInfo(gPlatform, LLOSInfo::instance().getOSVersionString(), LLOSInfo::instance().getOSStringSimple());
 }
 
 LLAppViewer::~LLAppViewer()
@@ -1249,6 +1248,9 @@ bool LLAppViewer::init()
 	joystick->setNeedsReset(true);
 	/*----------------------------------------------------------------------*/
 
+	gSavedSettings.getControl("FramePerSecondLimit")->getSignal()->connect(boost::bind(&LLAppViewer::onChangeFrameLimit, this, _2));
+	onChangeFrameLimit(gSavedSettings.getLLSD("FramePerSecondLimit"));
+
 	return true;
 }
 
@@ -1328,9 +1330,6 @@ bool LLAppViewer::frame()
 	LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));
 	LLSD newFrame;
 
-	LLTimer frameTimer,idleTimer;
-	LLTimer debugTime;
-
 	//LLPrivateMemoryPoolTester::getInstance()->run(false) ;
 	//LLPrivateMemoryPoolTester::getInstance()->run(true) ;
 	//LLPrivateMemoryPoolTester::destroy() ;
@@ -1371,14 +1370,6 @@ bool LLAppViewer::frame()
 			gViewerWindow->getWindow()->gatherInput();
 		}
 
-#if 1 && !LL_RELEASE_FOR_DOWNLOAD
-		// once per second debug info
-		if (debugTime.getElapsedTimeF32() > 1.f)
-		{
-			debugTime.reset();
-		}
-		
-#endif
 		//memory leaking simulation
 		LLFloaterMemLeak* mem_leak_instance =
 			LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
@@ -1432,7 +1423,24 @@ bool LLAppViewer::frame()
 			{
 				pingMainloopTimeout("Main:Display");
 				gGLActive = TRUE;
+
+				static U64 last_call = 0;
+				if (!gTeleportDisplay)
+				{
+					// Frame/draw throttling
+					U64 elapsed_time = LLTimer::getTotalTime() - last_call;
+					if (elapsed_time < mMinMicroSecPerFrame)
+					{
+						LL_RECORD_BLOCK_TIME(FTM_SLEEP);
+						// llclamp for when time function gets funky
+						U64 sleep_time = llclamp(mMinMicroSecPerFrame - elapsed_time, (U64)1, (U64)1e6);
+						micro_sleep(sleep_time, 0);
+					}
+				}
+				last_call = LLTimer::getTotalTime();
+
 				display();
+
 				pingMainloopTimeout("Main:Snapshot");
 				LLFloaterSnapshot::update(); // take snapshots
 					LLFloaterOutfitSnapshot::update();
@@ -1460,7 +1468,8 @@ bool LLAppViewer::frame()
 					|| !gFocusMgr.getAppHasFocus())
 			{
 				// Sleep if we're not rendering, or the window is minimized.
-				S32 milliseconds_to_sleep = llclamp(gSavedSettings.getS32("BackgroundYieldTime"), 0, 1000);
+				static LLCachedControl<S32> s_bacground_yeild_time(gSavedSettings, "BackgroundYieldTime", 40);
+				S32 milliseconds_to_sleep = llclamp((S32)s_bacground_yeild_time, 0, 1000);
 				// don't sleep when BackgroundYieldTime set to 0, since this will still yield to other threads
 				// of equal priority on Windows
 				if (milliseconds_to_sleep > 0)
@@ -1484,7 +1493,6 @@ bool LLAppViewer::frame()
 				ms_sleep(500);
 			}
 
-			idleTimer.reset();
 			S32 total_work_pending = 0;
 			S32 total_io_pending = 0;	
 			{
@@ -1537,13 +1545,6 @@ bool LLAppViewer::frame()
 				}
 			}
 
-			if ((LLStartUp::getStartupState() >= STATE_CLEANUP) &&
-				(frameTimer.getElapsedTimeF64() > FRAME_STALL_THRESHOLD))
-			{
-				gFrameStalls++;
-			}
-			frameTimer.reset();
-
 			resumeMainloopTimeout();
 
 			pingMainloopTimeout("Main:End");
@@ -3110,7 +3111,7 @@ void LLAppViewer::initUpdater()
 	mUpdater->initialize(channel, 
 						 version,
 						 gPlatform,
-						 getOSInfo().getOSVersionString(),
+						 LLOSInfo::instance().getOSVersionString(),
 						 unique_id,
 						 willing_to_test
 						 );
@@ -3192,10 +3193,13 @@ bool LLAppViewer::initWindow()
 		
     
 #ifdef LL_DARWIN
-    //Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later)
-   if (getOSInfo().mMajorVer == 10 && getOSInfo().mMinorVer < 7)
-		if ( getOSInfo().mMinorVer == 6 && getOSInfo().mBuild < 8 )
-       		gViewerWindow->getWindow()->setOldResize(true);
+	//Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later)
+	LLOSInfo& os_info = LLOSInfo::instance();
+	if (os_info.mMajorVer == 10 && os_info.mMinorVer < 7)
+	{
+		if ( os_info.mMinorVer == 6 && os_info.mBuild < 8 )
+			gViewerWindow->getWindow()->setOldResize(true);
+	}
 #endif
     
 	if (gSavedSettings.getBOOL("WindowMaximized"))
@@ -3337,7 +3341,7 @@ LLSD LLAppViewer::getViewerInfo() const
 	info["CPU"] = gSysCPU.getCPUString();
 	info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB().valueInUnits<LLUnits::Megabytes>());
 	// Moved hack adjustment to Windows memory size into llsys.cpp
-	info["OS_VERSION"] = LLAppViewer::instance()->getOSInfo().getOSString();
+	info["OS_VERSION"] = LLOSInfo::instance().getOSString();
 	info["GRAPHICS_CARD_VENDOR"] = (const char*)(glGetString(GL_VENDOR));
 	info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER));
 
@@ -3382,7 +3386,7 @@ LLSD LLAppViewer::getViewerInfo() const
 
 	info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
 	bool want_fullname = true;
-	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
+	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : "Undefined";
 	if(LLVoiceClient::getInstance()->voiceEnabled())
 	{
 		LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion();
@@ -3519,6 +3523,70 @@ std::string LLAppViewer::getViewerInfoString() const
 	return support.str();
 }
 
+std::string LLAppViewer::getShortViewerInfoString() const
+{
+	std::ostringstream support;
+	LLSD info(getViewerInfo());
+
+	support << LLTrans::getString("APP_NAME") << " " << info["VIEWER_VERSION_STR"].asString();
+	support << " (" << info["CHANNEL"].asString() << ")";
+	if (info.has("BUILD_CONFIG"))
+	{
+		support << "\n" << "Build Configuration " << info["BUILD_CONFIG"].asString();
+	}
+	if (info.has("REGION"))
+	{
+		support << "\n\n" << "You are at " << ll_vector3_from_sd(info["POSITION_LOCAL"]) << " in " << info["REGION"].asString();
+		support << " located at " << info["HOSTNAME"].asString() << " (" << info["HOSTIP"].asString() << ")";
+		support << "\n" << "SLURL: " << info["SLURL"].asString();
+		support << "\n" << "(Global coordinates " << ll_vector3_from_sd(info["POSITION"]) << ")";
+		support << "\n" << info["SERVER_VERSION"].asString();
+	}
+
+	support << "\n\n" << "CPU: " << info["CPU"].asString();
+	support << "\n" << "Memory: " << info["MEMORY_MB"].asString() << " MB";
+	support << "\n" << "OS: " << info["OS_VERSION"].asString();
+	support << "\n" << "Graphics Card: " << info["GRAPHICS_CARD"].asString() << " (" <<  info["GRAPHICS_CARD_VENDOR"].asString() << ")";
+
+	if (info.has("GRAPHICS_DRIVER_VERSION"))
+	{
+		support << "\n" << "Windows Graphics Driver Version: " << info["GRAPHICS_DRIVER_VERSION"].asString();
+	}
+
+	support << "\n" << "OpenGL Version: " << info["OPENGL_VERSION"].asString();
+
+	support << "\n\n" << "Window size:" << info["WINDOW_WIDTH"].asString() << "x" << info["WINDOW_HEIGHT"].asString();
+	support << "\n" << "Language: " << LLUI::getLanguage();
+	support << "\n" << "Font Size Adjustment: " << info["FONT_SIZE_ADJUSTMENT"].asString() << "pt";
+	support << "\n" << "UI Scaling: " << info["UI_SCALE"].asString();
+	support << "\n" << "Draw distance: " << info["DRAW_DISTANCE"].asString();
+	support << "\n" << "Bandwidth: " << info["NET_BANDWITH"].asString() << "kbit/s";
+	support << "\n" << "LOD factor: " << info["LOD_FACTOR"].asString();
+	support << "\n" << "Render quality: " << info["RENDER_QUALITY"].asString() << " / 7";
+	support << "\n" << "ALM: " << info["GPU_SHADERS"].asString();
+	support << "\n" << "Texture memory: " << info["TEXTURE_MEMORY"].asString() << "MB";
+	support << "\n" << "VFS (cache) creation time: " << info["VFS_TIME"].asString();
+
+	support << "\n\n" << "J2C Decoder: " << info["J2C_VERSION"].asString();
+	support << "\n" << "Audio Driver: " << info["AUDIO_DRIVER_VERSION"].asString();
+	support << "\n" << "LLCEFLib/CEF: " << info["LLCEFLIB_VERSION"].asString();
+	support << "\n" << "LibVLC: " << info["LIBVLC_VERSION"].asString();
+	support << "\n" << "Voice Server: " << info["VOICE_VERSION"].asString();
+
+	if (info.has("PACKETS_IN"))
+	{
+		support << "\n" << "Packets Lost: " << info["PACKETS_LOST"].asInteger() << "/" << info["PACKETS_IN"].asInteger();
+		F32 packets_pct = info["PACKETS_PCT"].asReal();
+		support << " (" << ll_round(packets_pct, 0.001f) << "%)";
+	}
+
+	LLSD substitution;
+	substitution["datetime"] = (S32)time(NULL);
+	support << "\n" << LLTrans::getString("AboutTime", substitution);
+
+	return support.str();
+}
+
 void LLAppViewer::cleanupSavedSettings()
 {
 	gSavedSettings.setBOOL("MouseSun", FALSE);
@@ -3595,7 +3663,7 @@ void LLAppViewer::writeSystemInfo()
 	
 	gDebugInfo["RAMInfo"]["Physical"] = (LLSD::Integer)(gSysMemory.getPhysicalMemoryKB().value());
 	gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer)(gMemoryAllocated.valueInUnits<LLUnits::Kilobytes>());
-	gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple();
+	gDebugInfo["OSInfo"] = LLOSInfo::instance().getOSStringSimple();
 
 	// The user is not logged on yet, but record the current grid choice login url
 	// which may have been the intended grid. 
@@ -3637,8 +3705,8 @@ void LLAppViewer::writeSystemInfo()
 	// query some system information
 	LL_INFOS("SystemInfo") << "CPU info:\n" << gSysCPU << LL_ENDL;
 	LL_INFOS("SystemInfo") << "Memory info:\n" << gSysMemory << LL_ENDL;
-	LL_INFOS("SystemInfo") << "OS: " << getOSInfo().getOSStringSimple() << LL_ENDL;
-	LL_INFOS("SystemInfo") << "OS info: " << getOSInfo() << LL_ENDL;
+	LL_INFOS("SystemInfo") << "OS: " << LLOSInfo::instance().getOSStringSimple() << LL_ENDL;
+	LL_INFOS("SystemInfo") << "OS info: " << LLOSInfo::instance() << LL_ENDL;
 
     gDebugInfo["SettingsFilename"] = gSavedSettings.getString("ClientSettingsFile");
 	gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName();
@@ -3670,7 +3738,7 @@ void getFileList()
 		if ( ( iter->length() > 30 ) && (iter->rfind(".dmp") == (iter->length()-4) ) )
 		{
 			std::string fullname = pathname + *iter;
-			std::ifstream fdat( fullname.c_str(), std::ifstream::binary);
+			llifstream fdat( fullname.c_str(), std::ifstream::binary);
 			if (fdat)
 			{
 				char buf[5];
@@ -4358,6 +4426,7 @@ bool LLAppViewer::initCache()
 		if (gSavedSettings.getBOOL("PurgeCacheOnStartup") ||
 			gSavedSettings.getBOOL("PurgeCacheOnNextStartup"))
 		{
+			LL_INFOS("AppCache") << "Startup cache purge requested: " << (gSavedSettings.getBOOL("PurgeCacheOnStartup") ? "ALWAYS" : "ONCE") << LL_ENDL;
 			gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false);
 			mPurgeCache = true;
 			// STORM-1141 force purgeAllTextures to get called to prevent a crash here. -brad
@@ -4372,6 +4441,7 @@ bool LLAppViewer::initCache()
 		std::string new_cache_location = gSavedSettings.getString("NewCacheLocation");
 		if (new_cache_location != cache_location)
 		{
+			LL_INFOS("AppCache") << "Cache location changed, cache needs purging" << LL_ENDL;
 			gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation"));
 			purgeCache(); // purge old cache
 			gSavedSettings.setString("CacheLocation", new_cache_location);
@@ -4397,23 +4467,15 @@ bool LLAppViewer::initCache()
 	// Init the texture cache
 	// Allocate 80% of the cache size for textures	
 	const S32 MB = 1024 * 1024;
-	const S64 MIN_CACHE_SIZE = 64 * MB;
+	const S64 MIN_CACHE_SIZE = 256 * MB;
 	const S64 MAX_CACHE_SIZE = 9984ll * MB;
 	const S64 MAX_VFS_SIZE = 1024 * MB; // 1 GB
 
 	S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB;
 	cache_size = llclamp(cache_size, MIN_CACHE_SIZE, MAX_CACHE_SIZE);
 
-	S64 texture_cache_size = ((cache_size * 8) / 10);
-	S64 vfs_size = cache_size - texture_cache_size;
-
-	if (vfs_size > MAX_VFS_SIZE)
-	{
-		// Give the texture cache more space, since the VFS can't be bigger than 1GB.
-		// This happens when the user's CacheSize setting is greater than 5GB.
-		vfs_size = MAX_VFS_SIZE;
-		texture_cache_size = cache_size - MAX_VFS_SIZE;
-	}
+	S64 vfs_size = llmin((S64)((cache_size * 2) / 10), MAX_VFS_SIZE);
+	S64 texture_cache_size = cache_size - vfs_size;
 
 	S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, texture_cache_mismatch);
 	texture_cache_size -= extra;
@@ -5586,6 +5648,19 @@ void LLAppViewer::disconnectViewer()
 	LLUrlEntryParcel::setDisconnected(gDisconnected);
 }
 
+bool LLAppViewer::onChangeFrameLimit(LLSD const & evt)
+{
+	if (evt.asInteger() > 0)
+	{
+		mMinMicroSecPerFrame = 1000000 / evt.asInteger();
+	}
+	else
+	{
+		mMinMicroSecPerFrame = 0;
+	}
+	return false;
+}
+
 void LLAppViewer::forceErrorLLError()
 {
    	LL_ERRS() << "This is a deliberate llerror" << LL_ENDL;
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 7bb3c32c515466e5ac45885c0035721e2c9ca86b..520ff68a02727d268274d4cdd4bb9d612086ad19 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -98,11 +98,10 @@ class LLAppViewer : public LLApp
 
 	void writeDebugInfo(bool isStatic=true);
 
-	const LLOSInfo& getOSInfo() const { return mSysOSInfo; }
-
 	void setServerReleaseNotesURL(const std::string& url) { mServerReleaseNotesURL = url; }
 	LLSD getViewerInfo() const;
 	std::string getViewerInfoString() const;
+	std::string getShortViewerInfoString() const;
 
 	// Report true if under the control of a debugger. A null-op default.
 	virtual bool beingDebugged() { return false; } 
@@ -255,6 +254,8 @@ class LLAppViewer : public LLApp
     void sendLogoutRequest();
     void disconnectViewer();
 
+	bool onChangeFrameLimit(LLSD const & evt);
+
 	// *FIX: the app viewer class should be some sort of singleton, no?
 	// Perhaps its child class is the singleton and this should be an abstract base.
 	static LLAppViewer* sInstance; 
@@ -267,8 +268,6 @@ class LLAppViewer : public LLApp
 	std::string mLogoutMarkerFileName;
 	LLAPRFile mLogoutMarkerFile; // A file created to indicate the app is running.
 
-	
-	LLOSInfo mSysOSInfo; 
 	bool mReportedCrash;
 
 	std::string mServerReleaseNotesURL;
@@ -316,6 +315,8 @@ class LLAppViewer : public LLApp
 	LLAppCoreHttp mAppCoreHttp;
 
 	bool mIsFirstRun;
+	U64 mMinMicroSecPerFrame; // frame throttling
+
 	//---------------------------------------------
 	//*NOTE: Mani - legacy updater stuff
 	// Still useable?
@@ -371,7 +372,6 @@ extern F32SecondsImplicit		gFrameTimeSeconds;			// Loses msec precision after ~4
 extern F32SecondsImplicit		gFrameIntervalSeconds;		// Elapsed time between current and previous gFrameTimeSeconds
 extern F32		gFPSClamped;				// Frames per second, smoothed, weighted toward last frame
 extern F32		gFrameDTClamped;
-extern U32 		gFrameStalls;
 
 extern LLTimer gRenderStartTime;
 extern LLFrameTimer gForegroundTime;
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 5107030476eaf49e94a19eb0c84d783b3465a4a8..284a39301bbdccee53a74669a5d550686c87469b 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -694,10 +694,10 @@ void LLAppViewerWin32::initCrashReporting(bool reportFreeze)
 	PROCESS_INFORMATION processInfo;
 
 	std::wstring exe_wstr;
-	exe_wstr=wstringize(exe_path);
+	exe_wstr = utf8str_to_utf16str(exe_path);
 
 	std::wstring arg_wstr;
-	arg_wstr=wstringize(arg_str);
+	arg_wstr = utf8str_to_utf16str(arg_str);
 
 	LL_INFOS("CrashReport") << "Creating crash reporter process " << exe_path << " with params: " << arg_str << LL_ENDL;
     if(CreateProcess(exe_wstr.c_str(),     
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index af7b50802cd34df0b463dd93a797e8eb8488f4e9..3868bafae4db0daecae40aeaa5f231860572ad70 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -70,6 +70,9 @@ class LLConversationItem : public LLFolderViewModelItemCommon
 	virtual const std::string& getName() const { return mName; }
 	virtual const std::string& getDisplayName() const { return mName; }
 	virtual const std::string& getSearchableName() const { return mName; }
+	virtual std::string getSearchableDescription() const { return LLStringUtil::null; }
+	virtual std::string getSearchableCreatorName() const { return LLStringUtil::null; }
+	virtual std::string getSearchableUUIDString() const {return LLStringUtil::null;}
 	virtual const LLUUID& getUUID() const { return mUUID; }
 	virtual time_t getCreationDate() const { return 0; }
 	virtual LLPointer<LLUIImage> getIcon() const { return NULL; }
diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp
index e422581129b6de84a5ef308000623bac1093e424..e56a67f8d16e6e2bca11912943fc39253efda693 100644
--- a/indra/newview/llestateinfomodel.cpp
+++ b/indra/newview/llestateinfomodel.cpp
@@ -116,7 +116,7 @@ void LLEstateInfoModel::notifyCommit()
 // tries to send estate info using a cap; returns true if it succeeded
 bool LLEstateInfoModel::commitEstateInfoCaps()
 {
-	std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo");
+	std::string url = gAgent.getRegionCapability("EstateChangeInfo");
 
 	if (url.empty())
 	{
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index a69b3b7dc70fa8bc25d60eaa946ddd1112940b25..4110971fa54e1cb264fe53fa096d3857da3af441 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -463,7 +463,7 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t
 
 	{ //read base log into memory
 		S32 i = 0;
-		std::ifstream is(base.c_str());
+		llifstream is(base.c_str());
 		while (!is.eof() && LLSDParser::PARSE_FAILURE != LLSDSerialize::fromXML(cur, is))
 		{
 			base_data[i++] = cur;
@@ -476,7 +476,7 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t
 
 	{ //read current log into memory
 		S32 i = 0;
-		std::ifstream is(target.c_str());
+		llifstream is(target.c_str());
 		while (!is.eof() && LLSDParser::PARSE_FAILURE != LLSDSerialize::fromXML(cur, is))
 		{
 			cur_data[i++] = cur;
@@ -821,8 +821,8 @@ LLSD LLFastTimerView::analyzePerformanceLogDefault(std::istream& is)
 void LLFastTimerView::doAnalysisDefault(std::string baseline, std::string target, std::string output)
 {
 	// Open baseline and current target, exit if one is inexistent
-	std::ifstream base_is(baseline.c_str());
-	std::ifstream target_is(target.c_str());
+	llifstream base_is(baseline.c_str());
+	llifstream target_is(target.c_str());
 	if (!base_is.is_open() || !target_is.is_open())
 	{
 		LL_WARNS() << "'-analyzeperformance' error : baseline or current target file inexistent" << LL_ENDL;
@@ -840,7 +840,7 @@ void LLFastTimerView::doAnalysisDefault(std::string baseline, std::string target
 	target_is.close();
 
 	//output comparison
-	std::ofstream os(output.c_str());
+	llofstream os(output.c_str());
 
 	LLSD::Real session_time = current["SessionTime"].asReal();
 	os <<
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index b8fd96840b080bf1ed576b1173ea89b69541b559..b1e911e44acb316bcec54d02d0c30932d8abfdde 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -487,7 +487,7 @@ void LLFeatureManager::fetchFeatureTableCoro(std::string tableName)
 
 
 #if LL_WINDOWS
-    std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+    std::string os_string = LLOSInfo::instance().getOSStringSimple();
     std::string filename;
 
     if (os_string.find("Microsoft Windows XP") == 0)
@@ -768,7 +768,7 @@ void LLFeatureManager::applyBaseMasks()
 	}
 
 #if LL_DARWIN
-	const LLOSInfo& osInfo = LLAppViewer::instance()->getOSInfo();
+	const LLOSInfo& osInfo = LLOSInfo::instance();
 	if (osInfo.mMajorVer == 10 && osInfo.mMinorVer < 7)
 	{
 		maskFeatures("OSX_10_6_8");
diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp
index b6e61f83b1f547405bb2081fd0344aad107a01f1..e075a311c2252b923c9638eaa33d10867a86d963 100644
--- a/indra/newview/llflexibleobject.cpp
+++ b/indra/newview/llflexibleobject.cpp
@@ -43,9 +43,9 @@
 #include "llworld.h"
 #include "llvoavatar.h"
 
+static const F32 SEC_PER_FLEXI_FRAME = 1.f / 60.f; // 60 flexi updates per second
 /*static*/ F32 LLVolumeImplFlexible::sUpdateFactor = 1.0f;
 std::vector<LLVolumeImplFlexible*> LLVolumeImplFlexible::sInstanceList;
-std::vector<S32> LLVolumeImplFlexible::sUpdateDelay;
 
 static LLTrace::BlockTimerStatHandle FTM_FLEXIBLE_REBUILD("Rebuild");
 static LLTrace::BlockTimerStatHandle FTM_DO_FLEXIBLE_UPDATE("Flexible Update");
@@ -56,7 +56,10 @@ static LLTrace::BlockTimerStatHandle FTM_DO_FLEXIBLE_UPDATE("Flexible Update");
 // constructor
 //-----------------------------------------------
 LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectData* attributes) :
-		mVO(vo), mAttributes(attributes)
+		mVO(vo),
+		mAttributes(attributes),
+		mLastFrameNum(0),
+		mLastUpdatePeriod(0)
 {
 	static U32 seed = 0;
 	mID = seed++;
@@ -64,7 +67,6 @@ LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectD
 	mUpdated = FALSE;
 	mInitializedRes = -1;
 	mSimulateRes = 0;
-	mFrameNum = 0;
 	mCollisionSphereRadius = 0.f;
 	mRenderRes = -1;
 	
@@ -75,7 +77,6 @@ LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectD
 
 	mInstanceIndex = sInstanceList.size();
 	sInstanceList.push_back(this);
-	sUpdateDelay.push_back(0);
 }//-----------------------------------------------
 
 LLVolumeImplFlexible::~LLVolumeImplFlexible()
@@ -86,28 +87,28 @@ LLVolumeImplFlexible::~LLVolumeImplFlexible()
 	{
 		sInstanceList[mInstanceIndex] = sInstanceList[end_idx];
 		sInstanceList[mInstanceIndex]->mInstanceIndex = mInstanceIndex;
-		sUpdateDelay[mInstanceIndex] = sUpdateDelay[end_idx];
 	}
 
 	sInstanceList.pop_back();
-	sUpdateDelay.pop_back();
 }
 
 //static
 void LLVolumeImplFlexible::updateClass()
 {
-	std::vector<S32>::iterator delay_iter = sUpdateDelay.begin();
+	LL_RECORD_BLOCK_TIME(FTM_DO_FLEXIBLE_UPDATE);
 
+	U64 virtual_frame_num = LLTimer::getElapsedSeconds() / SEC_PER_FLEXI_FRAME;
 	for (std::vector<LLVolumeImplFlexible*>::iterator iter = sInstanceList.begin();
 			iter != sInstanceList.end();
 			++iter)
 	{
-		--(*delay_iter);
-		if (*delay_iter <= 0)
+		// Note: by now update period might have changed
+		if ((*iter)->mRenderRes == -1
+			|| (*iter)->mLastFrameNum + (*iter)->mLastUpdatePeriod <= virtual_frame_num
+			|| (*iter)->mLastFrameNum > virtual_frame_num) //time issues, overflow
 		{
 			(*iter)->doIdleUpdate();
 		}
-		++delay_iter;
 	}
 }
 
@@ -334,15 +335,12 @@ void LLVolumeImplFlexible::updateRenderRes()
 // updated every time step. In the future, perhaps there could be an 
 // optimization similar to what Havok does for objects that are stationary. 
 //---------------------------------------------------------------------------------
-static LLTrace::BlockTimerStatHandle FTM_FLEXIBLE_UPDATE("Update Flexies");
 void LLVolumeImplFlexible::doIdleUpdate()
 {
 	LLDrawable* drawablep = mVO->mDrawable;
 
 	if (drawablep)
 	{
-		//LL_RECORD_BLOCK_TIME(FTM_FLEXIBLE_UPDATE);
-
 		//ensure drawable is active
 		drawablep->makeActive();
 
@@ -354,15 +352,20 @@ void LLVolumeImplFlexible::doIdleUpdate()
 			{
 				updateRenderRes();
 				gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);
-				sUpdateDelay[mInstanceIndex] = 0;
 			}
 			else
 			{
 				F32 pixel_area = mVO->getPixelArea();
 
+				// Note: Flexies afar will be rarely updated, closer ones will be updated more frequently.
+				// But frequency differences are extremely noticeable, so consider modifying update factor,
+				// or at least clamping value a bit more from both sides.
 				U32 update_period = (U32) (llmax((S32) (LLViewerCamera::getInstance()->getScreenPixelArea()*0.01f/(pixel_area*(sUpdateFactor+1.f))),0)+1);
 				// MAINT-1890 Clamp the update period to ensure that the update_period is no greater than 32 frames
-				update_period = llclamp(update_period, 0U, 32U);
+				update_period = llclamp(update_period, 1U, 32U);
+
+				// We control how fast flexies update, buy splitting updates among frames
+				U64 virtual_frame_num = LLTimer::getElapsedSeconds() / SEC_PER_FLEXI_FRAME;
 
 				if	(visible)
 				{
@@ -370,42 +373,44 @@ void LLVolumeImplFlexible::doIdleUpdate()
 						pixel_area > 256.f)
 					{
 						U32 id;
-				
 						if (mVO->isRootEdit())
 						{
 							id = mID;
 						}
 						else
 						{
-							LLVOVolume* parent = (LLVOVolume*) mVO->getParent();
+							LLVOVolume* parent = (LLVOVolume*)mVO->getParent();
 							id = parent->getVolumeInterfaceID();
 						}
 
-				if (mVO->isRootEdit())
-				{
-					id = mID;
-				}
-				else
-				{
-					LLVOVolume* parent = (LLVOVolume*) mVO->getParent();
-					id = parent->getVolumeInterfaceID();
-				}
 
-				if ((LLDrawable::getCurrentFrame()+id)%update_period == 0)
-				{
-							sUpdateDelay[mInstanceIndex] = (S32) update_period-1;
+						// Throttle flexies and spread load by preventing flexies from updating in same frame
+						// Shows how many frames we need to wait before next update
+						U64 throttling_delay = (virtual_frame_num + id) % update_period;
 
-					updateRenderRes();
+						if ((throttling_delay == 0 && mLastFrameNum < virtual_frame_num) //one or more virtual frames per frame
+							|| (mLastFrameNum + update_period < virtual_frame_num)) // missed virtual frame
+						{
+							// We need mLastFrameNum to compensate for 'unreliable time' and to filter 'duplicate' frames
+							// If happened too late, subtract throttling_delay (it is zero otherwise)
+							mLastFrameNum = virtual_frame_num - throttling_delay;
+
+							// Store update period for updateClass()
+							// Note: Consider substituting update_period with mLastUpdatePeriod everywhere.
+							mLastUpdatePeriod = update_period;
+
+							updateRenderRes();
 
-					gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);
+							gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);
+						}
+					}
 				}
-			}
-		}
 				else
 				{
-					sUpdateDelay[mInstanceIndex] = (S32) update_period;
-	}
-}
+					mLastFrameNum = virtual_frame_num;
+					mLastUpdatePeriod = update_period;
+				}
+			}
 
 		}
 	}
diff --git a/indra/newview/llflexibleobject.h b/indra/newview/llflexibleobject.h
index a00551df8e10b5357f79a89f19ac7de52a026af0..9383ab03ae78d215f724188fec7181d4cec74800 100644
--- a/indra/newview/llflexibleobject.h
+++ b/indra/newview/llflexibleobject.h
@@ -72,7 +72,6 @@ class LLVolumeImplFlexible : public LLVolumeInterface
 {
 private:
 	static std::vector<LLVolumeImplFlexible*> sInstanceList;
-	static std::vector<S32> sUpdateDelay;
 	S32 mInstanceIndex;
 
 	public:
@@ -133,7 +132,8 @@ class LLVolumeImplFlexible : public LLVolumeInterface
 		S32							mInitializedRes;
 		S32							mSimulateRes;
 		S32							mRenderRes;
-		U32							mFrameNum;
+		U64							mLastFrameNum;
+		U32							mLastUpdatePeriod;
 		LLVector3					mCollisionSpherePosition;
 		F32							mCollisionSphereRadius;
 		U32							mID;
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index c394eb815b91c3790342c82bd45c9a5d85ffee00..c5561fe011f24a3da64fc329558084c45e234699 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -496,6 +496,18 @@ void LLFloaterAvatarPicker::find()
 
 	std::string text = getChild<LLUICtrl>("Edit")->getValue().asString();
 
+	size_t separator_index = text.find_first_of(" ._");
+	if (separator_index != text.npos)
+	{
+		std::string first = text.substr(0, separator_index);
+		std::string last = text.substr(separator_index+1, text.npos);
+		LLStringUtil::trim(last);
+		if("Resident" == last)
+		{
+			text = first;
+		}
+	}
+
 	mQueryID.generate();
 
 	std::string url;
@@ -739,12 +751,13 @@ void LLFloaterAvatarPicker::processResponse(const LLUUID& query_id, const LLSD&
 
 		if (search_results->isEmpty())
 		{
-			LLStringUtil::format_map_t map;
-			map["[TEXT]"] = getChild<LLUICtrl>("Edit")->getValue().asString();
+			std::string name = "'" + getChild<LLUICtrl>("Edit")->getValue().asString() + "'";
 			LLSD item;
 			item["id"] = LLUUID::null;
 			item["columns"][0]["column"] = "name";
-			item["columns"][0]["value"] = getString("not_found", map);
+			item["columns"][0]["value"] = name;
+			item["columns"][1]["column"] = "username";
+			item["columns"][1]["value"] = getString("not_found_text");
 			search_results->addElement(item);
 			search_results->setEnabled(false);
 			getChildView("ok_btn")->setEnabled(false);
diff --git a/indra/newview/llfloateravatarrendersettings.cpp b/indra/newview/llfloateravatarrendersettings.cpp
index 2bae7d63aaac2d894ef51e444794da344311f1af..8bdb70a20d2b23b73fb2d3a91a780f835b78040a 100644
--- a/indra/newview/llfloateravatarrendersettings.cpp
+++ b/indra/newview/llfloateravatarrendersettings.cpp
@@ -27,11 +27,13 @@
 
 #include "llfloateravatarrendersettings.h"
 
+#include "llagent.h"
 #include "llavatarnamecache.h"
 #include "llfloateravatarpicker.h"
 #include "llfiltereditor.h"
 #include "llfloaterreg.h"
 #include "llnamelistctrl.h"
+#include "llnotificationsutil.h"
 #include "llmenugl.h"
 #include "lltrans.h"
 #include "llviewerobjectlist.h"
@@ -268,6 +270,11 @@ void LLFloaterAvatarRenderSettings::onClickAdd(const LLSD& userdata)
 void LLFloaterAvatarRenderSettings::callbackAvatarPicked(const uuid_vec_t& ids, S32 visual_setting)
 {
     if (ids.empty()) return;
+    if(ids[0] == gAgentID)
+    {
+        LLNotificationsUtil::add("AddSelfRenderExceptions");
+        return;
+    }
     setAvatarRenderSetting(ids[0], visual_setting);
 }
 
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 43529097064f83d054096a95b5a4ce8d98d7a9a6..88b3fb7b9681f7af464beabb007f05086decf15e 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -503,7 +503,7 @@ BOOL LLPanelLandGeneral::postBuild()
 	// note: on region change this will not be re checked, should not matter on Agni as
 	// 99% of the time all regions will return the same caps. In case of an erroneous setting
 	// to enabled the floater will just throw an error when trying to get it's cap
-	std::string url = gAgent.getRegion()->getCapability("LandResources");
+	std::string url = gAgent.getRegionCapability("LandResources");
 	if (!url.empty())
 	{
 		if(mBtnScriptLimits)
@@ -2181,17 +2181,8 @@ void LLPanelLandOptions::refreshSearch()
 			&& region
 			&& !(region->getRegionFlag(REGION_FLAGS_BLOCK_PARCEL_SEARCH));
 
-	// There is a bug with this panel whereby the Show Directory bit can be 
-	// slammed off by the Region based on an override.  Since this data is cached
-	// locally the change will not reflect in the panel, which could cause confusion
-	// A workaround for this is to flip the bit off in the locally cached version
-	// when we detect a mismatch case.
-	if(!can_change && parcel->getParcelFlag(PF_SHOW_DIRECTORY))
-	{
-		parcel->setParcelFlag(PF_SHOW_DIRECTORY, FALSE);
-	}
 	BOOL show_directory = parcel->getParcelFlag(PF_SHOW_DIRECTORY);
-	mCheckShowDirectory	->set(show_directory);
+	mCheckShowDirectory->set(show_directory);
 
 	// Set by string in case the order in UI doesn't match the order by index.
 	LLParcel::ECategory cat = parcel->getCategory();
diff --git a/indra/newview/llfloatermodeluploadbase.cpp b/indra/newview/llfloatermodeluploadbase.cpp
index 7cdfd56d9ab86e165458aaf22ea14fe1fb8a1c2c..4427e913e3f7d43900b2b4c57cb62cd65b82110c 100644
--- a/indra/newview/llfloatermodeluploadbase.cpp
+++ b/indra/newview/llfloatermodeluploadbase.cpp
@@ -41,7 +41,7 @@ LLFloaterModelUploadBase::LLFloaterModelUploadBase(const LLSD& key)
 void LLFloaterModelUploadBase::requestAgentUploadPermissions()
 {
 	std::string capability = "MeshUploadFlag";
-	std::string url = gAgent.getRegion()->getCapability(capability);
+	std::string url = gAgent.getRegionCapability(capability);
 
 	if (!url.empty())
 	{
diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp
index 271fb2f9a356559587b09c472c68f820b2289785..e8175896226b71fd79b6b422dfe69a1184b3a8ff 100644
--- a/indra/newview/llfloaterregiondebugconsole.cpp
+++ b/indra/newview/llfloaterregiondebugconsole.cpp
@@ -116,11 +116,11 @@ BOOL LLFloaterRegionDebugConsole::postBuild()
 
 	mOutput = getChild<LLTextEditor>("region_debug_console_output");
 
-	std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync");
+	std::string url = gAgent.getRegionCapability("SimConsoleAsync");
 	if (url.empty())
 	{
 		// Fall back to see if the old API is supported.
-		url = gAgent.getRegion()->getCapability("SimConsole");
+		url = gAgent.getRegionCapability("SimConsole");
 		if (url.empty())
 		{
 			mOutput->appendText(
@@ -139,11 +139,11 @@ void LLFloaterRegionDebugConsole::onInput(LLUICtrl* ctrl, const LLSD& param)
 	LLLineEditor* input = static_cast<LLLineEditor*>(ctrl);
 	std::string text = input->getText() + "\n";
 
-	std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync");
+	std::string url = gAgent.getRegionCapability("SimConsoleAsync");
 	if (url.empty())
 	{
 		// Fall back to the old API
-		url = gAgent.getRegion()->getCapability("SimConsole");
+		url = gAgent.getRegionCapability("SimConsole");
 		if (url.empty())
 		{
 			text += CONSOLE_UNAVAILABLE + PROMPT;
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index c330c2ae4783ce53788bbfa06412c1ef5e74b5ea..af68a2aae10a014ff5ba57689f50b3bf86729e37 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -238,7 +238,7 @@ BOOL LLFloaterRegionInfo::postBuild()
 		return TRUE;
 	}
 
-	if(!gAgent.getRegion()->getCapability("RegionExperiences").empty())
+	if(!gAgent.getRegionCapability("RegionExperiences").empty())
 	{
 		panel = new LLPanelRegionExperiences;
 		mInfoPanels.push_back(panel);
@@ -879,7 +879,7 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L
 
 void LLFloaterRegionInfo::requestMeshRezInfo()
 {
-	std::string sim_console_url = gAgent.getRegion()->getCapability("SimConsoleAsync");
+	std::string sim_console_url = gAgent.getRegionCapability("SimConsoleAsync");
 
 	if (!sim_console_url.empty())
 	{
@@ -907,7 +907,7 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
 
 	// First try using a Cap.  If that fails use the old method.
 	LLSD body;
-	std::string url = gAgent.getRegion()->getCapability("DispatchRegionInfo");
+	std::string url = gAgent.getRegionCapability("DispatchRegionInfo");
 	if (!url.empty())
 	{
 		body["block_terraform"] = getChild<LLUICtrl>("block_terraform_check")->getValue();
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index 515c2b0c4bddc2dafb5d8b9af8b9ba90bc9a8e44..c0f5e63623877f89795db712058b74acaf7187fd 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -438,8 +438,8 @@ void LLFloaterReporter::onClickSend(void *userdata)
 
 		LLUploadDialog::modalUploadDialog(LLTrans::getString("uploading_abuse_report"));
 		// *TODO don't upload image if checkbox isn't checked
-		std::string url = gAgent.getRegion()->getCapability("SendUserReport");
-		std::string sshot_url = gAgent.getRegion()->getCapability("SendUserReportWithScreenshot");
+		std::string url = gAgent.getRegionCapability("SendUserReport");
+		std::string sshot_url = gAgent.getRegionCapability("SendUserReportWithScreenshot");
 		if(!url.empty() || !sshot_url.empty())
 		{
 			self->sendReportViaCaps(url, sshot_url, self->gatherReport());
diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp
index 5f0587a286d00569f1d8db5728c8b4a3d88fdaac..21df769d0ce0ed50785e3c07ac6675b06b0a9fa5 100644
--- a/indra/newview/llfloaterscriptlimits.cpp
+++ b/indra/newview/llfloaterscriptlimits.cpp
@@ -112,24 +112,16 @@ BOOL LLFloaterScriptLimits::postBuild()
 	}
 
 	// contruct the panels
-	std::string land_url = gAgent.getRegion()->getCapability("LandResources");
-	if (!land_url.empty())
-	{
-		LLPanelScriptLimitsRegionMemory* panel_memory;
-		panel_memory = new LLPanelScriptLimitsRegionMemory;
-		mInfoPanels.push_back(panel_memory);
-		panel_memory->buildFromFile( "panel_script_limits_region_memory.xml");
-		mTab->addTabPanel(panel_memory);
-	}
-	
-	std::string attachment_url = gAgent.getRegion()->getCapability("AttachmentResources");
-	if (!attachment_url.empty())
-	{
-		LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment;
-		mInfoPanels.push_back(panel_attachments);
-		panel_attachments->buildFromFile("panel_script_limits_my_avatar.xml");
-		mTab->addTabPanel(panel_attachments);
-	}
+	LLPanelScriptLimitsRegionMemory* panel_memory = new LLPanelScriptLimitsRegionMemory;
+	mInfoPanels.push_back(panel_memory);
+	panel_memory->buildFromFile( "panel_script_limits_region_memory.xml");
+	mTab->addTabPanel(panel_memory);
+
+	LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment;
+	mInfoPanels.push_back(panel_attachments);
+	panel_attachments->buildFromFile("panel_script_limits_my_avatar.xml");
+	mTab->addTabPanel(panel_attachments);
+
 	
 	if(mInfoPanels.size() > 0)
 	{
@@ -195,6 +187,8 @@ LLPanelScriptLimitsRegionMemory::~LLPanelScriptLimitsRegionMemory()
 
 BOOL LLPanelScriptLimitsRegionMemory::getLandScriptResources()
 {
+	if (!gAgent.getRegion()) return FALSE;
+
 	LLSD body;
 	std::string url = gAgent.getRegion()->getCapability("LandResources");
 	if (!url.empty())
@@ -718,10 +712,9 @@ BOOL LLPanelScriptLimitsRegionMemory::StartRequestChain()
 	LLParcel* parcel = instance->getCurrentSelectedParcel();
 	LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
 	
-	LLUUID current_region_id = gAgent.getRegion()->getRegionID();
-
 	if ((region) && (parcel))
 	{
+		LLUUID current_region_id = gAgent.getRegion()->getRegionID();
 		LLVector3 parcel_center = parcel->getCenterpoint();
 		
 		region_id = region->getRegionID();
@@ -982,6 +975,8 @@ void LLPanelScriptLimitsRegionMemory::onClickReturn(void* userdata)
 
 BOOL LLPanelScriptLimitsAttachment::requestAttachmentDetails()
 {
+	if (!gAgent.getRegion()) return FALSE;
+
 	LLSD body;
 	std::string url = gAgent.getRegion()->getCapability("AttachmentResources");
 	if (!url.empty())
diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp
index 8b3cfa7fd510433ee6ac2cab295c6dd99625fa64..64ddeff1b0897251077ed15bbb1ef9c96a537f37 100644
--- a/indra/newview/llfloatersidepanelcontainer.cpp
+++ b/indra/newview/llfloatersidepanelcontainer.cpp
@@ -74,7 +74,10 @@ void LLFloaterSidePanelContainer::closeFloater(bool app_quitting)
 				{
 					edit_wearable_ptr->onClose();
 				}
-				panel_appearance->showOutfitsInventoryPanel();
+				if(!app_quitting)
+				{
+					panel_appearance->showOutfitsInventoryPanel();
+				}
 			}
 		}
 	}
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index ba3106913c7b76800a83e6392036f59467da3879..2d0002dcd88d0feef304d6327361f5af0865c659 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -314,8 +314,8 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshotBase* floater)
 		}
 		else
 		{
-			width_ctrl->setMaxValue(6016);
-			height_ctrl->setMaxValue(6016);
+			width_ctrl->setMaxValue(MAX_SNAPSHOT_IMAGE_SIZE);
+			height_ctrl->setMaxValue(MAX_SNAPSHOT_IMAGE_SIZE);
 		}
 	}
 		
diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp
index e9f80b795ab6cfb39e5ba06c3b1230beb722f92f..d53cf2a9a3bd08ca6b1fa914d2c215b663e744c1 100644
--- a/indra/newview/llfolderviewmodelinventory.cpp
+++ b/indra/newview/llfolderviewmodelinventory.cpp
@@ -258,6 +258,15 @@ bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
 	{
         // This is where filter check on the item done (CHUI-849)
 		const bool passed_filter = filter.check(this);
+		if (passed_filter && mChildren.empty()) // Update the latest filter generation for empty folders
+		{
+			LLFolderViewModelItemInventory* view_model = this;
+			while (view_model && view_model->mMostFilteredDescendantGeneration < filter_generation)
+			{
+				view_model->mMostFilteredDescendantGeneration = filter_generation;
+				view_model = static_cast<LLFolderViewModelItemInventory*>(view_model->mParent);
+			}
+		}
 		setPassedFilter(passed_filter, filter_generation, filter.getStringMatchOffset(this), filter.getFilterStringSize());
         continue_filtering = !filter.isTimedOut();
 	}
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index feef726630ecd09949e4782e235dc9588d246be8..d62b6300cb74d7a35576f9c0d36112a74cea6b58 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -3671,8 +3671,7 @@ class LLViewerChatterBoxInvitation : public LLHTTPNode
 			}
 
 			//K now we want to accept the invitation
-			std::string url = gAgent.getRegion()->getCapability(
-				"ChatSessionRequest");
+			std::string url = gAgent.getRegionCapability("ChatSessionRequest");
 
 			if ( url != "" )
 			{
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 2751631a59b3919601d9a7816f5be9dddbca3674..3f18039376122454c23b8face840d3d50e16eebf 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -204,6 +204,58 @@ const std::string& LLInvFVBridge::getDisplayName() const
 	return mDisplayName;
 }
 
+std::string LLInvFVBridge::getSearchableDescription() const
+{
+	const LLInventoryModel* model = getInventoryModel();
+	if (model)
+	{
+		const LLInventoryItem *item = model->getItem(mUUID);
+		if(item)
+		{
+			std::string desc = item->getDescription();
+			LLStringUtil::toUpper(desc);
+			return desc;
+		}
+	}
+	return LLStringUtil::null;
+}
+
+std::string LLInvFVBridge::getSearchableCreatorName() const
+{
+	const LLInventoryModel* model = getInventoryModel();
+	if (model)
+	{
+		const LLInventoryItem *item = model->getItem(mUUID);
+		if(item)
+		{
+			LLAvatarName av_name;
+			if (LLAvatarNameCache::get(item->getCreatorUUID(), &av_name))
+			{
+				std::string username = av_name.getUserName();
+				LLStringUtil::toUpper(username);
+				return username;
+			}
+		}
+	}
+	return LLStringUtil::null;
+}
+
+std::string LLInvFVBridge::getSearchableUUIDString() const
+{
+	const LLInventoryModel* model = getInventoryModel();
+	if (model)
+	{
+		const LLViewerInventoryItem *item = model->getItem(mUUID);
+		if(item && (item->getIsFullPerm() || gAgent.isGodlikeWithoutAdminMenuFakery()))
+		{
+			std::string uuid = item->getAssetUUID().asString();
+			LLStringUtil::toUpper(uuid);
+			return uuid;
+		}
+	}
+	return LLStringUtil::null;
+}
+
 // Folders have full perms
 PermissionMask LLInvFVBridge::getPermissionMask() const
 {
@@ -828,6 +880,12 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
 	{
 		disabled_items.push_back(std::string("Properties"));
 	}
+
+	LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+	if (active_panel && (active_panel->getName() != "All Items"))
+	{
+		items.push_back(std::string("Show in Main Panel"));
+	}
 }
 
 void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
@@ -1593,6 +1651,11 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
 		gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(buffer));
 		return;
 	}
+	else if ("show_in_main_panel" == action)
+	{
+		LLInventoryPanel::openInventoryPanelAndSetSelection(TRUE, mUUID, TRUE);
+		return;
+	}
 	else if ("cut" == action)
 	{
 		cutToClipboard();
@@ -1813,13 +1876,19 @@ void LLItemBridge::buildDisplayName() const
 	{
 		mDisplayName.assign(LLStringUtil::null);
 	}
-	
+	S32 old_length = mSearchableName.length();
+	S32 new_length = mDisplayName.length() + getLabelSuffix().length();
+
 	mSearchableName.assign(mDisplayName);
 	mSearchableName.append(getLabelSuffix());
 	LLStringUtil::toUpper(mSearchableName);
 	
-    //Name set, so trigger a sort
-    if(mParent)
+	if ((old_length > new_length) && getInventoryFilter())
+	{
+		getInventoryFilter()->setModified(LLFolderViewFilter::FILTER_MORE_RESTRICTIVE);
+	}
+	//Name set, so trigger a sort
+	if(mParent)
 	{
 		mParent->requestSort();
 	}
@@ -3087,6 +3156,11 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
 		modifyOutfit(TRUE);
 		return;
 	}
+	else if ("show_in_main_panel" == action)
+	{
+		LLInventoryPanel::openInventoryPanelAndSetSelection(TRUE, mUUID, TRUE);
+		return;
+	}
 	else if ("cut" == action)
 	{
 		cutToClipboard();
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index e6fcb6be96871a13d1ea377be71def0fe1760700..fd532c609c6f55a21eacf2498352450accc513f3 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -94,6 +94,10 @@ class LLInvFVBridge : public LLFolderViewModelItemInventory
 	virtual const std::string& getDisplayName() const;
 	const std::string& getSearchableName() const { return mSearchableName; }
 
+	std::string getSearchableDescription() const;
+	std::string getSearchableCreatorName() const;
+	std::string getSearchableUUIDString() const;
+
 	virtual PermissionMask getPermissionMask() const;
 	virtual LLFolderType::EType getPreferredType() const;
 	virtual time_t getCreationDate() const;
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 1433ea36bf0e743e8de29ea071b421ffcf3c1293..9193613e9f2cd5cb5fbff8f6b4a33f96dbf84112 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -29,6 +29,7 @@
 #include "llinventoryfilter.h"
 
 // viewer includes
+#include "llagent.h"
 #include "llfolderviewmodel.h"
 #include "llfolderviewitem.h"
 #include "llinventorymodel.h"
@@ -76,10 +77,14 @@ LLInventoryFilter::LLInventoryFilter(const Params& p)
 	mFilterSubString(p.substring),
 	mCurrentGeneration(0),
 	mFirstRequiredGeneration(0),
-	mFirstSuccessGeneration(0)
+	mFirstSuccessGeneration(0),
+	mSearchType(SEARCHTYPE_NAME),
+	mFilterCreatorType(FILTERCREATOR_ALL)
 {
 	// copy mFilterOps into mDefaultFilterOps
 	markDefault();
+	mUsername = gAgentUsername;
+	LLStringUtil::toUpper(mUsername);
 }
 
 bool LLInventoryFilter::check(const LLFolderViewModelItem* item) 
@@ -93,10 +98,29 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
 		return true;
 	}
 
-	bool passed = (mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) != std::string::npos : true);
+	std::string desc = listener->getSearchableCreatorName();
+	switch(mSearchType)
+	{
+		case SEARCHTYPE_CREATOR:
+			desc = listener->getSearchableCreatorName();
+			break;
+		case SEARCHTYPE_DESCRIPTION:
+			desc = listener->getSearchableDescription();
+			break;
+		case SEARCHTYPE_UUID:
+			desc = listener->getSearchableUUIDString();
+			break;
+		case SEARCHTYPE_NAME:
+		default:
+			desc = listener->getSearchableName();
+			break;
+	}
+
+	bool passed = (mFilterSubString.size() ? desc.find(mFilterSubString) != std::string::npos : true);
 	passed = passed && checkAgainstFilterType(listener);
 	passed = passed && checkAgainstPermissions(listener);
 	passed = passed && checkAgainstFilterLinks(listener);
+	passed = passed && checkAgainstCreator(listener);
 
 	return passed;
 }
@@ -245,6 +269,14 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent
 		}
 	}
 	
+	if(filterTypes & FILTERTYPE_WORN)
+	{
+		if (!get_is_item_worn(object_id))
+		{
+			return FALSE;
+		}
+	}
+
 	////////////////////////////////////////////////////////////////////////////////
 	// FILTERTYPE_UUID
 	// Pass if this item is the target UUID or if it links to the target UUID
@@ -453,6 +485,24 @@ bool LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewModelItemInven
 	return TRUE;
 }
 
+bool LLInventoryFilter::checkAgainstCreator(const LLFolderViewModelItemInventory* listener) const
+{
+	if (!listener) return TRUE;
+	const BOOL is_folder = listener->getInventoryType() == LLInventoryType::IT_CATEGORY;
+	switch(mFilterCreatorType)
+	{
+		case FILTERCREATOR_SELF:
+			if(is_folder) return FALSE;
+			return (listener->getSearchableCreatorName() == mUsername);
+		case FILTERCREATOR_OTHERS:
+			if(is_folder) return FALSE;
+			return (listener->getSearchableCreatorName() != mUsername);
+		case FILTERCREATOR_ALL:
+		default:
+			return TRUE;
+	}
+}
+
 const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const
 {
 	return mFilterSubString;
@@ -460,7 +510,14 @@ const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const
 
 std::string::size_type LLInventoryFilter::getStringMatchOffset(LLFolderViewModelItem* item) const
 {
-	return mFilterSubString.size() ? item->getSearchableName().find(mFilterSubString) : std::string::npos;
+	if (mSearchType == SEARCHTYPE_NAME)
+	{
+		return mFilterSubString.size() ? item->getSearchableName().find(mFilterSubString) : std::string::npos;
+	}
+	else
+	{
+		return std::string::npos;
+	}
 }
 
 bool LLInventoryFilter::isDefault() const
@@ -533,6 +590,24 @@ void LLInventoryFilter::updateFilterTypes(U64 types, U64& current_types)
 	}
 }
 
+void LLInventoryFilter::setSearchType(ESearchType type)
+{
+	if(mSearchType != type)
+	{
+		mSearchType = type;
+		setModified();
+	}
+}
+
+void LLInventoryFilter::setFilterCreator(EFilterCreatorType type)
+{
+	if(mFilterCreatorType != type)
+	{
+		mFilterCreatorType = type;
+		setModified();
+	}
+}
+
 void LLInventoryFilter::setFilterObjectTypes(U64 types)
 {
 	updateFilterTypes(types, mFilterOps.mFilterObjectTypes);
@@ -556,6 +631,11 @@ void LLInventoryFilter::setFilterEmptySystemFolders()
 	mFilterOps.mFilterTypes |= FILTERTYPE_EMPTYFOLDERS;
 }
 
+void LLInventoryFilter::setFilterWorn()
+{
+    mFilterOps.mFilterTypes |= FILTERTYPE_WORN;
+}
+
 void LLInventoryFilter::setFilterMarketplaceActiveFolders()
 {
 	mFilterOps.mFilterTypes |= FILTERTYPE_MARKETPLACE_ACTIVE;
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index eee36b7e407579f4287c4ab440c31036c702e212..01754ed0232435f894144c06595703f60840f8cc 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -57,7 +57,8 @@ class LLInventoryFilter : public LLFolderViewFilter
         FILTERTYPE_MARKETPLACE_INACTIVE = 0x1 << 7,		// pass if folder is a marketplace inactive folder
         FILTERTYPE_MARKETPLACE_UNASSOCIATED = 0x1 << 8,	// pass if folder is a marketplace non associated (no market ID) folder
         FILTERTYPE_MARKETPLACE_LISTING_FOLDER = 0x1 << 9,	// pass iff folder is a listing folder
-        FILTERTYPE_NO_MARKETPLACE_ITEMS = 0x1 << 10         // pass iff folder is not under the marketplace
+        FILTERTYPE_NO_MARKETPLACE_ITEMS = 0x1 << 10,         // pass iff folder is not under the marketplace
+        FILTERTYPE_WORN = 0x1 << 11,     // pass if item is worn
 	};
 
 	enum EFilterDateDirection
@@ -82,6 +83,21 @@ class LLInventoryFilter : public LLFolderViewFilter
 		SO_FOLDERS_BY_WEIGHT = 0x1 << 3,    // Force folder sort by weight, usually, amount of some elements in their descendents
 	};
 
+	enum ESearchType
+	{
+		SEARCHTYPE_NAME,
+		SEARCHTYPE_DESCRIPTION,
+		SEARCHTYPE_CREATOR,
+		SEARCHTYPE_UUID
+	};
+
+	enum EFilterCreatorType
+	{
+		FILTERCREATOR_ALL,
+		FILTERCREATOR_SELF,
+		FILTERCREATOR_OTHERS
+	};
+
 	struct FilterOps
 	{
 		struct DateRange : public LLInitParam::Block<DateRange>
@@ -176,12 +192,17 @@ class LLInventoryFilter : public LLFolderViewFilter
 	void 				setFilterUUID(const LLUUID &object_id);
 	void				setFilterWearableTypes(U64 types);
 	void				setFilterEmptySystemFolders();
+	void				setFilterWorn();
 	void				setFilterMarketplaceActiveFolders();
 	void				setFilterMarketplaceInactiveFolders();
 	void				setFilterMarketplaceUnassociatedFolders();
     void                setFilterMarketplaceListingFolders(bool select_only_listing_folders);
     void                setFilterNoMarketplaceFolder();
 	void				updateFilterTypes(U64 types, U64& current_types);
+	void 				setSearchType(ESearchType type);
+	ESearchType			getSearchType() { return mSearchType; }
+	void 				setFilterCreator(EFilterCreatorType type);
+	EFilterCreatorType		getFilterCreator() { return mFilterCreatorType; }
 
 	void 				setFilterSubString(const std::string& string);
 	const std::string& 	getFilterSubString(BOOL trim = FALSE) const;
@@ -277,6 +298,7 @@ class LLInventoryFilter : public LLFolderViewFilter
 	bool 				checkAgainstPermissions(const class LLFolderViewModelItemInventory* listener) const;
 	bool 				checkAgainstPermissions(const LLInventoryItem* item) const;
 	bool 				checkAgainstFilterLinks(const class LLFolderViewModelItemInventory* listener) const;
+	bool 				checkAgainstCreator(const class LLFolderViewModelItemInventory* listener) const;
 	bool				checkAgainstClipboard(const LLUUID& object_id) const;
 
 	FilterOps				mFilterOps;
@@ -285,6 +307,7 @@ class LLInventoryFilter : public LLFolderViewFilter
 
 	std::string				mFilterSubString;
 	std::string				mFilterSubStringOrig;
+	std::string				mUsername;
 	const std::string		mName;
 
 	S32						mCurrentGeneration;
@@ -299,6 +322,9 @@ class LLInventoryFilter : public LLFolderViewFilter
     
 	std::string 			mFilterText;
 	std::string 			mEmptyLookupMessage;
+
+	ESearchType 			mSearchType;
+	EFilterCreatorType		mFilterCreatorType;
 };
 
 #endif
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index d282240bfbbb5356a5865e5daa566cf7064adcf7..67ddd79230ce31045de4049ae587739cc08221b1 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -2296,7 +2296,8 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
 	if ("delete" == action)
 	{
 		static bool sDisplayedAtSession = false;
-		
+		const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+		bool marketplacelistings_item = false;
 		LLAllDescendentsPassedFilter f;
 		for (std::set<LLFolderViewItem*>::iterator it = selected_items.begin(); (it != selected_items.end()) && (f.allDescendentsPassedFilter()); ++it)
 		{
@@ -2304,9 +2305,15 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
 			{
 				folder->applyFunctorRecursively(f);
 			}
+			LLFolderViewModelItemInventory * viewModel = dynamic_cast<LLFolderViewModelItemInventory *>((*it)->getViewModelItem());
+			if (viewModel && gInventory.isObjectDescendentOf(viewModel->getUUID(), marketplacelistings_id))
+			{
+				marketplacelistings_item = true;
+				break;
+			}
 		}
 		// Fall through to the generic confirmation if the user choose to ignore the specialized one
-		if ( (!f.allDescendentsPassedFilter()) && (!LLNotifications::instance().getIgnored("DeleteFilteredItems")) )
+		if ( (!f.allDescendentsPassedFilter()) && !marketplacelistings_item && (!LLNotifications::instance().getIgnored("DeleteFilteredItems")) )
 		{
 			LLNotificationsUtil::add("DeleteFilteredItems", LLSD(), LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root->getHandle()));
 		}
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index f9c91312ee55cf92acbbae46d83aec0583ce70f9..8f93796ec733c806b4c24a0d3f55da0cbbf3cc7d 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -351,6 +351,11 @@ void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType
 		getFilter().setFilterCategoryTypes(types);
 }
 
+void LLInventoryPanel::setFilterWorn()
+{
+    getFilter().setFilterWorn();
+}
+
 U32 LLInventoryPanel::getFilterObjectTypes() const 
 { 
 	return getFilter().getFilterObjectTypes();
@@ -420,6 +425,16 @@ void LLInventoryPanel::setFilterLinks(U64 filter_links)
 	getFilter().setFilterLinks(filter_links);
 }
 
+void LLInventoryPanel::setSearchType(LLInventoryFilter::ESearchType type)
+{
+	getFilter().setSearchType(type);
+}
+
+LLInventoryFilter::ESearchType LLInventoryPanel::getSearchType()
+{
+	return getFilter().getSearchType();
+}
+
 void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show)
 {
 	getFilter().setShowFolderState(show);
@@ -1344,9 +1359,14 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
 }
 
 //static
-void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id)
+void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id, BOOL main_panel)
 {
-	LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
+	LLInventoryPanel *active_panel;
+	if (main_panel)
+	{
+		LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory")->selectAllItemsPanel();
+	}
+	active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
 
 	if (active_panel)
 	{
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 5ee58707b05213a15da44338ecfebc1fd89a6008..d849647bb6ccc0a010d11b85a7ebae56f6bd8f1d 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -172,6 +172,7 @@ class LLInventoryPanel : public LLPanel
 	LLInventoryFilter& getFilter();
 	const LLInventoryFilter& getFilter() const;
 	void setFilterTypes(U64 filter, LLInventoryFilter::EFilterType = LLInventoryFilter::FILTERTYPE_OBJECT);
+	void setFilterWorn();
 	U32 getFilterObjectTypes() const;
 	void setFilterPermMask(PermissionMask filter_perm_mask);
 	U32 getFilterPermMask() const;
@@ -183,6 +184,8 @@ class LLInventoryPanel : public LLPanel
 	void setDateSearchDirection(U32 direction);
 	BOOL getSinceLogoff();
 	void setFilterLinks(U64 filter_links);
+	void setSearchType(LLInventoryFilter::ESearchType type);
+	LLInventoryFilter::ESearchType getSearchType();
 
 	void setShowFolderState(LLInventoryFilter::EFolderShow show);
 	LLInventoryFilter::EFolderShow getShowFolderState();
@@ -218,7 +221,7 @@ class LLInventoryPanel : public LLPanel
 	// "Auto_open" determines if we open an inventory panel if none are open.
 	static LLInventoryPanel *getActiveInventoryPanel(BOOL auto_open = TRUE);
 	
-	static void openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id);
+	static void openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id, BOOL main_panel = FALSE);
 
 	void addItemID(const LLUUID& id, LLFolderViewItem* itemp);
 	void removeItemID(const LLUUID& id);
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index bacd88e0e0b5e1ad15014ade8710d9f4c9428fbc..fe7751473a7c24017887f517db7d827afc2b299c 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -64,6 +64,8 @@
 #include <boost/scoped_ptr.hpp>
 #include <sstream>
 
+const S32 LOGIN_MAX_RETRIES = 3;
+
 // this can be removed once it is defined by the build for all forks
 #ifndef ADDRESS_SIZE
 #  define ADDRESS_SIZE 32
@@ -631,13 +633,29 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
         request_params[it->first] = it->second;
     }
 
+    // log request_params _before_ adding the credentials   
+    LL_DEBUGS("LLLogin") << "Login parameters: " << LLSDOStreamer<LLSDNotationFormatter>(request_params) << LL_ENDL;
+
+    // Copy the credentials into the request after logging the rest
+    LLSD credentials(user_credential->getLoginParams());
+    for (LLSD::map_const_iterator it = credentials.beginMap();
+         it != credentials.endMap();
+         it++
+         )
+    {
+        request_params[it->first] = it->second;
+    }
+
+	// Specify desired timeout/retry options
+	LLSD http_params;
+	http_params["timeout"] = gSavedSettings.getF32("LoginSRVTimeout");
+	http_params["retries"] = LOGIN_MAX_RETRIES;
+
 	mRequestData.clear();
 	mRequestData["method"] = "login_to_simulator";
 	mRequestData["params"] = request_params;
 	mRequestData["options"] = requested_options;
-
-	mRequestData["cfg_srv_timeout"] = gSavedSettings.getF32("LoginSRVTimeout");
-	mRequestData["cfg_srv_pump"] = gSavedSettings.getString("LoginSRVPump");
+	mRequestData["http_params"] = http_params;
 }
 
 bool LLLoginInstance::handleLoginEvent(const LLSD& event)
diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp
index b5fd3df0f35ce45ca3dfd579f4830b0b5b00ccc5..b0ee8e7fcb628e26cac3eef2e550f19ec52fb81c 100644
--- a/indra/newview/llmachineid.cpp
+++ b/indra/newview/llmachineid.cpp
@@ -37,6 +37,28 @@ using namespace std;
 unsigned char static_unique_id[] =  {0,0,0,0,0,0};
 bool static has_static_unique_id = false;
 
+#if	LL_WINDOWS
+
+class LLComInitialize
+{
+    HRESULT mHR;
+public:
+    LLComInitialize()
+    {
+        mHR = CoInitializeEx(0, COINIT_MULTITHREADED);
+        if (FAILED(mHR))
+            LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << hex << mHR << LL_ENDL;
+    }
+
+    ~LLComInitialize()
+    {
+        if (SUCCEEDED(mHR))
+            CoUninitialize();
+    }
+};
+
+#endif //LL_WINDOWS
+
 // get an unique machine id.
 // NOT THREAD SAFE - do before setting up threads.
 // MAC Address doesn't work for Windows 7 since the first returned hardware MAC address changes with each reboot,  Go figure??
@@ -59,12 +81,7 @@ S32 LLMachineID::init()
         // Step 1: --------------------------------------------------
         // Initialize COM. ------------------------------------------
 
-        hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 
-        if (FAILED(hres))
-        {
-            LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x"   << hex << hres << LL_ENDL;
-            return 1;                  // Program has failed.
-        }
+        LLComInitialize comInit;
 
         // Step 2: --------------------------------------------------
         // Set general COM security levels --------------------------
@@ -89,7 +106,6 @@ S32 LLMachineID::init()
         if (FAILED(hres))
         {
             LL_WARNS("AppInit") << "Failed to initialize security. Error code = 0x"  << hex << hres << LL_ENDL;
-            CoUninitialize();
             return 1;                    // Program has failed.
         }
         
@@ -107,7 +123,6 @@ S32 LLMachineID::init()
         if (FAILED(hres))
         {
             LL_WARNS("AppInit") << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << LL_ENDL;
-            CoUninitialize();
             return 1;                 // Program has failed.
         }
 
@@ -134,7 +149,6 @@ S32 LLMachineID::init()
         {
             LL_WARNS("AppInit") << "Could not connect. Error code = 0x"  << hex << hres << LL_ENDL;
             pLoc->Release();     
-            CoUninitialize();
             return 1;                // Program has failed.
         }
 
@@ -160,7 +174,6 @@ S32 LLMachineID::init()
             LL_WARNS("AppInit") << "Could not set proxy blanket. Error code = 0x"   << hex << hres << LL_ENDL;
             pSvc->Release();
             pLoc->Release();     
-            CoUninitialize();
             return 1;               // Program has failed.
         }
 
@@ -181,7 +194,6 @@ S32 LLMachineID::init()
             LL_WARNS("AppInit") << "Query for operating system name failed." << " Error code = 0x"  << hex << hres << LL_ENDL;
             pSvc->Release();
             pLoc->Release();
-            CoUninitialize();
             return 1;               // Program has failed.
         }
 
@@ -236,7 +248,6 @@ S32 LLMachineID::init()
             pLoc->Release();
         if (pEnumerator)
             pEnumerator->Release();
-        CoUninitialize();
         ret_code=0;
 #else
         unsigned char * staticPtr = (unsigned char *)(&static_unique_id[0]);
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 291d87073e65004b04d79f07c2857c3cb1a66b9c..125a67e23e86f64f9f891bcc2872b429f4e3bdc1 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -176,6 +176,8 @@ class LLMediaCtrl :
         virtual bool    wantsKeyUpKeyDown() const;
         virtual bool    wantsReturnKey() const;
 
+        virtual BOOL	acceptsTextInput() const {return TRUE;}
+
 	protected:
 		void convertInputCoords(S32& x, S32& y);
 
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index c2a0393170e02c9705bf17bf3bef45431c6ac3c5..df708013fc8aae3d5264afa293497497310df2e3 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -1892,7 +1892,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,
 	mOrigin = gAgent.getPositionAgent();
 	mHost = gAgent.getRegionHost();
 	
-	mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");
+	mWholeModelFeeCapability = gAgent.getRegionCapability("NewFileAgentInventory");
 
 	mOrigin += gAgent.getAtAxis() * scale.magVec();
 
@@ -1980,14 +1980,14 @@ void dump_llsd_to_file(const LLSD& content, std::string filename)
 {
 	if (gSavedSettings.getBOOL("MeshUploadLogXML"))
 	{
-		std::ofstream of(filename.c_str());
+		llofstream of(filename.c_str());
 		LLSDSerialize::toPrettyXML(content,of);
 	}
 }
 
 LLSD llsd_from_file(std::string filename)
 {
-	std::ifstream ifs(filename.c_str());
+	llifstream ifs(filename.c_str());
 	LLSD result;
 	LLSDSerialize::fromXML(result,ifs);
 	return result;
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index 5518656f3f802379cbc6c0b8ded0c151decedd4a..cca65f2ce1f3445a21da55d94b61209b6fc7741c 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -699,13 +699,24 @@ void LLOutfitGalleryItem::draw()
     const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
     if (mTexturep)
     {
-        LLRect interior = border;
-        interior.stretch(-1);
+        if (mImageUpdatePending && mTexturep->getDiscardLevel() >= 0)
+        {
+            mImageUpdatePending = false;
+            if (mTexturep->getOriginalWidth() > MAX_OUTFIT_PHOTO_WIDTH || mTexturep->getOriginalHeight() > MAX_OUTFIT_PHOTO_HEIGHT)
+            {
+                setDefaultImage();
+            }
+        }
+        else
+        {
+            LLRect interior = border;
+            interior.stretch(-1);
 
-        gl_draw_scaled_image(interior.mLeft - 1, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha);
+            gl_draw_scaled_image(interior.mLeft - 1, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha);
 
-        // Pump the priority
-        mTexturep->addTextureStats((F32)(interior.getWidth() * interior.getHeight()));
+            // Pump the priority
+            mTexturep->addTextureStats((F32)(interior.getWidth() * interior.getHeight()));
+        }
     }
     
 }
@@ -771,12 +782,19 @@ BOOL LLOutfitGalleryItem::handleDoubleClick(S32 x, S32 y, MASK mask)
     return LLPanel::handleDoubleClick(x, y, mask);
 }
 
-void LLOutfitGalleryItem::setImageAssetId(LLUUID image_asset_id)
+bool LLOutfitGalleryItem::setImageAssetId(LLUUID image_asset_id)
 {
-    mImageAssetId = image_asset_id;
-    mTexturep = LLViewerTextureManager::getFetchedTexture(image_asset_id, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
-    getChildView("preview_outfit")->setVisible(FALSE);
-    mDefaultImage = false;
+    LLPointer<LLViewerFetchedTexture> texture = LLViewerTextureManager::getFetchedTexture(image_asset_id, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+    if (texture && texture->getOriginalWidth() <= MAX_OUTFIT_PHOTO_WIDTH && texture->getOriginalHeight() <= MAX_OUTFIT_PHOTO_HEIGHT)
+    {
+        mImageAssetId = image_asset_id;
+        mTexturep = texture;
+        getChildView("preview_outfit")->setVisible(FALSE);
+        mDefaultImage = false;
+        mImageUpdatePending = (texture->getDiscardLevel() == -1);
+        return true;
+    }
+    return false;
 }
 
 LLUUID LLOutfitGalleryItem::getImageAssetId()
@@ -790,6 +808,7 @@ void LLOutfitGalleryItem::setDefaultImage()
     mImageAssetId.setNull();
     getChildView("preview_outfit")->setVisible(TRUE);
     mDefaultImage = true;
+    mImageUpdatePending = false;
 }
 
 LLContextMenu* LLOutfitGalleryContextMenu::createMenu()
@@ -1025,13 +1044,28 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
         BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)
         {
             LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem();
-            if (linked_item != NULL && linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+            LLUUID asset_id, inv_id;
+            std::string item_name;
+            if (linked_item != NULL)
             {
-                LLUUID asset_id = linked_item->getAssetUUID();
-                mOutfitMap[category_id]->setImageAssetId(asset_id);
-                photo_loaded = true;
-                std::string linked_item_name = linked_item->getName();
-                if (!mOutfitRenamePending.isNull() && mOutfitRenamePending.asString() == linked_item_name)
+                if (linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+                {
+                    asset_id = linked_item->getAssetUUID();
+                    inv_id = linked_item->getUUID();
+                    item_name = linked_item->getName();
+                }
+            }
+            else if (outfit_item->getActualType() == LLAssetType::AT_TEXTURE)
+            {
+                asset_id = outfit_item->getAssetUUID();
+                inv_id = outfit_item->getUUID();
+                item_name = outfit_item->getName();
+            }
+            if (asset_id.notNull())
+            {
+                photo_loaded |= mOutfitMap[category_id]->setImageAssetId(asset_id);
+                // Rename links
+                if (!mOutfitRenamePending.isNull() && mOutfitRenamePending.asString() == item_name)
                 {
                     LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(mOutfitRenamePending);
                     LLStringUtil::format_map_t photo_string_args;
@@ -1039,7 +1073,7 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
                     std::string new_name = getString("outfit_photo_string", photo_string_args);
                     LLSD updates;
                     updates["name"] = new_name;
-                    update_inventory_item(linked_item->getUUID(), updates, NULL);
+                    update_inventory_item(inv_id, updates, NULL);
                     mOutfitRenamePending.setNull();
                     LLFloater* inv_floater = LLFloaterReg::getInstance("inventory");
                     if (inv_floater)
@@ -1052,7 +1086,11 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
                         appearance_floater->setFocus(TRUE);
                     }
                 }
-                break;
+                if (item_name == LLAppearanceMgr::sExpectedTextureName)
+                {
+                    // Images with "appropriate" name take priority
+                    break;
+                }
             }
             if (!photo_loaded)
             {
@@ -1067,6 +1105,7 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
     }
 }
 
+// Refresh linked textures from "textures" uploads folder
 void LLOutfitGallery::refreshTextures(const LLUUID& category_id)
 {
     LLInventoryModel::cat_array_t cat_array;
@@ -1176,6 +1215,7 @@ void LLOutfitGallery::uploadPhoto(LLUUID outfit_id)
                 upload_pending_name, callback, expected_upload_cost, nruserdata);
             mOutfitLinkPending = outfit_id;
         }
+        delete unit;
     }
 }
 
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index 25662470729ba766af150ce95d0d6560cea4373e..b1ca8505087abc8bb5c07038d92df936e5ebe37d 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -259,7 +259,7 @@ class LLOutfitGalleryItem : public LLPanel
     /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
 
     void setDefaultImage();
-    void setImageAssetId(LLUUID asset_id);
+    bool setImageAssetId(LLUUID asset_id);
     LLUUID getImageAssetId();
     void setOutfitName(std::string name);
     void setOutfitWorn(bool value);
@@ -282,6 +282,7 @@ class LLOutfitGalleryItem : public LLPanel
     bool     mSelected;
     bool     mWorn;
     bool     mDefaultImage;
+    bool     mImageUpdatePending;
     bool	 mHidden;
     std::string mOutfitName;
 };
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index f8a5bbb036f363154d9feb1d124307af8c68acaa..a88c10521c4f2f3ee05b2d71f80bbde4afbb9b44 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -791,7 +791,7 @@ void LLPanelLogin::loadLoginPage()
 	params["grid"] = LLGridManager::getInstance()->getGridId();
 
 	// add OS info
-	params["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+	params["os"] = LLOSInfo::instance().getOSStringSimple();
 
 	// sourceid
 	params["sourceid"] = gSavedSettings.getString("sourceid");
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index dd75ae9c06873f93913e05a89902d39aa86f9ccd..f771a027e0f81e5443f526fb2ef47b597ad2fbda 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -30,6 +30,8 @@
 #include "llagent.h"
 #include "llagentcamera.h"
 #include "llavataractions.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
 #include "lldndbutton.h"
 #include "lleconomy.h"
 #include "llfilepicker.h"
@@ -84,6 +86,9 @@ class LLFloaterInventoryFinder : public LLFloater
 	BOOL getCheckSinceLogoff();
 	U32 getDateSearchDirection();
 
+	void onCreatorSelfFilterCommit();
+	void onCreatorOtherFilterCommit();
+
 	static void onTimeAgo(LLUICtrl*, void *);
 	static void onCloseBtn(void* user_data);
 	static void selectAllTypes(void* user_data);
@@ -92,6 +97,8 @@ class LLFloaterInventoryFinder : public LLFloater
 	LLPanelMainInventory*	mPanelMainInventory;
 	LLSpinCtrl*			mSpinSinceDays;
 	LLSpinCtrl*			mSpinSinceHours;
+	LLCheckBoxCtrl*		mCreatorSelf;
+	LLCheckBoxCtrl*		mCreatorOthers;
 	LLInventoryFilter*	mFilter;
 };
 
@@ -102,6 +109,7 @@ class LLFloaterInventoryFinder : public LLFloater
 LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
 	: LLPanel(p),
 	  mActivePanel(NULL),
+	  mWornItemsPanel(NULL),
 	  mSavedFolderState(NULL),
 	  mFilterText(""),
 	  mMenuGearDefault(NULL),
@@ -158,6 +166,25 @@ BOOL LLPanelMainInventory::postBuild()
 		recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2));
 	}
 
+	mWornItemsPanel = getChild<LLInventoryPanel>("Worn Items");
+	if (mWornItemsPanel)
+	{
+		U32 filter_types = 0x0;
+		filter_types |= 0x1 << LLInventoryType::IT_WEARABLE;
+		filter_types |= 0x1 << LLInventoryType::IT_ATTACHMENT;
+		filter_types |= 0x1 << LLInventoryType::IT_OBJECT;
+		mWornItemsPanel->setFilterTypes(filter_types);
+		mWornItemsPanel->setFilterWorn();
+		mWornItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+		mWornItemsPanel->setFilterLinks(LLInventoryFilter::FILTERLINK_EXCLUDE_LINKS);
+		mWornItemsPanel->getFilter().markDefault();
+		mWornItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mWornItemsPanel, _1, _2));
+	}
+	mSearchTypeCombo  = getChild<LLComboBox>("search_type");
+	if(mSearchTypeCombo)
+	{
+		mSearchTypeCombo->setCommitCallback(boost::bind(&LLPanelMainInventory::onSelectSearchType, this));
+	}
 	// Now load the stored settings from disk, if available.
 	std::string filterSaveName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME));
 	LL_INFOS() << "LLPanelMainInventory::init: reading from " << filterSaveName << LL_ENDL;
@@ -262,6 +289,16 @@ LLPanelMainInventory::~LLPanelMainInventory( void )
 	delete mSavedFolderState;
 }
 
+LLInventoryPanel* LLPanelMainInventory::getAllItemsPanel()
+{
+	return  getChild<LLInventoryPanel>("All Items");
+}
+
+void LLPanelMainInventory::selectAllItemsPanel()
+{
+	mFilterTabs->selectFirstTab();
+}
+
 void LLPanelMainInventory::startSearch()
 {
 	// this forces focus to line editor portion of search editor
@@ -387,6 +424,48 @@ void LLPanelMainInventory::setSortBy(const LLSD& userdata)
     }
 }
 
+void LLPanelMainInventory::onSelectSearchType()
+{
+	std::string new_type = mSearchTypeCombo->getValue();
+	if (new_type == "search_by_name")
+	{
+		getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_NAME);
+	}
+	if (new_type == "search_by_creator")
+	{
+		getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_CREATOR);
+	}
+	if (new_type == "search_by_description")
+	{
+		getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_DESCRIPTION);
+	}
+	if (new_type == "search_by_UUID")
+	{
+		getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_UUID);
+	}
+}
+
+void LLPanelMainInventory::updateSearchTypeCombo()
+{
+	LLInventoryFilter::ESearchType search_type = getActivePanel()->getSearchType();
+	switch(search_type)
+	{
+		case LLInventoryFilter::SEARCHTYPE_CREATOR:
+			mSearchTypeCombo->setValue("search_by_creator");
+			break;
+		case LLInventoryFilter::SEARCHTYPE_DESCRIPTION:
+			mSearchTypeCombo->setValue("search_by_description");
+			break;
+		case LLInventoryFilter::SEARCHTYPE_UUID:
+			mSearchTypeCombo->setValue("search_by_UUID");
+			break;
+		case LLInventoryFilter::SEARCHTYPE_NAME:
+		default:
+			mSearchTypeCombo->setValue("search_by_name");
+			break;
+	}
+}
+
 // static
 BOOL LLPanelMainInventory::filtersVisible(void* user_data)
 {
@@ -400,7 +479,7 @@ void LLPanelMainInventory::onClearSearch()
 {
 	BOOL initially_active = FALSE;
 	LLFloater *finder = getFinder();
-	if (mActivePanel)
+	if (mActivePanel && (getActivePanel() != mWornItemsPanel))
 	{
 		initially_active = mActivePanel->getFilter().isNotDefault();
 		mActivePanel->setFilterSubString(LLStringUtil::null);
@@ -507,6 +586,11 @@ void LLPanelMainInventory::onFilterSelected()
 		return;
 	}
 
+	if (getActivePanel() == mWornItemsPanel)
+	{
+		mActivePanel->openAllFolders();
+	}
+	updateSearchTypeCombo();
 	setFilterSubString(mFilterSubString);
 	LLInventoryFilter& filter = mActivePanel->getFilter();
 	LLFloaterInventoryFinder *finder = getFinder();
@@ -540,7 +624,7 @@ BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 {
 	// Check to see if we are auto scrolling from the last frame
 	LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel();
-	BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y);
+	BOOL needsToScroll = panel->getScrollableContainer()->canAutoScroll(x, y);
 	if(mFilterTabs)
 	{
 		if(needsToScroll)
@@ -705,6 +789,11 @@ BOOL LLFloaterInventoryFinder::postBuild()
 	mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");
 	childSetCommitCallback("spin_days_ago", onTimeAgo, this);
 
+	mCreatorSelf = getChild<LLCheckBoxCtrl>("check_created_by_me");
+	mCreatorOthers = getChild<LLCheckBoxCtrl>("check_created_by_others");
+	mCreatorSelf->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorSelfFilterCommit, this));
+	mCreatorOthers->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorOtherFilterCommit, this));
+
 	childSetAction("Close", onCloseBtn, this);
 
 	updateElementsFromFilter();
@@ -763,6 +852,10 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
 	U32 hours = mFilter->getHoursAgo();
 	U32 date_search_direction = mFilter->getDateSearchDirection();
 
+	LLInventoryFilter::EFilterCreatorType filter_creator = mFilter->getFilterCreator();
+	bool show_created_by_me = ((filter_creator == LLInventoryFilter::FILTERCREATOR_ALL) || (filter_creator == LLInventoryFilter::FILTERCREATOR_SELF));
+	bool show_created_by_others = ((filter_creator == LLInventoryFilter::FILTERCREATOR_ALL) || (filter_creator == LLInventoryFilter::FILTERCREATOR_OTHERS));
+
 	// update the ui elements
 	setTitle(mFilter->getName());
 
@@ -780,6 +873,10 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
 	getChild<LLUICtrl>("check_texture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE));
 	getChild<LLUICtrl>("check_snapshot")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT));
 	getChild<LLUICtrl>("check_show_empty")->setValue(show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS);
+
+	getChild<LLUICtrl>("check_created_by_me")->setValue(show_created_by_me);
+	getChild<LLUICtrl>("check_created_by_others")->setValue(show_created_by_others);
+
 	getChild<LLUICtrl>("check_since_logoff")->setValue(mFilter->isSinceLogoff());
 	mSpinSinceHours->set((F32)(hours % 24));
 	mSpinSinceDays->set((F32)(hours / 24));
@@ -877,6 +974,7 @@ void LLFloaterInventoryFinder::draw()
 	mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ?
 		LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
 	mPanelMainInventory->getPanel()->setFilterTypes(filter);
+
 	if (getCheckSinceLogoff())
 	{
 		mSpinSinceDays->set(0);
@@ -905,6 +1003,46 @@ void LLFloaterInventoryFinder::draw()
 	LLPanel::draw();
 }
 
+void LLFloaterInventoryFinder::onCreatorSelfFilterCommit()
+{
+	bool show_creator_self = mCreatorSelf->getValue();
+	bool show_creator_other = mCreatorOthers->getValue();
+
+	if(show_creator_self && show_creator_other)
+	{
+		mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
+	}
+	else if(show_creator_self)
+	{
+		mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
+	}
+	else if(!show_creator_self || !show_creator_other)
+	{
+		mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
+		mCreatorOthers->set(TRUE);
+	}
+}
+
+void LLFloaterInventoryFinder::onCreatorOtherFilterCommit()
+{
+	bool show_creator_self = mCreatorSelf->getValue();
+	bool show_creator_other = mCreatorOthers->getValue();
+
+	if(show_creator_self && show_creator_other)
+	{
+		mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
+	}
+	else if(show_creator_other)
+	{
+		mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
+	}
+	else if(!show_creator_other || !show_creator_self)
+	{
+		mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
+		mCreatorSelf->set(TRUE);
+	}
+}
+
 BOOL LLFloaterInventoryFinder::getCheckShowEmpty()
 {
 	return getChild<LLUICtrl>("check_show_empty")->getValue();
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 38936804acf0f0e1cb9a8cf288afb21704cd7ed6..530f4e618c634932e5e7cb9eedc7229b181bf23e 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -34,6 +34,7 @@
 
 #include "llfolderview.h"
 
+class LLComboBox;
 class LLFolderViewItem;
 class LLInventoryPanel;
 class LLSaveFolderState;
@@ -76,6 +77,8 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
 
 	LLInventoryPanel* getPanel() { return mActivePanel; }
 	LLInventoryPanel* getActivePanel() { return mActivePanel; }
+	LLInventoryPanel* getAllItemsPanel();
+	void selectAllItemsPanel();
 	const LLInventoryPanel* getActivePanel() const { return mActivePanel; }
 
 	const std::string& getFilterText() const { return mFilterText; }
@@ -120,6 +123,8 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
 	void updateItemcountText();
 
 	void onFocusReceived();
+	void onSelectSearchType();
+	void updateSearchTypeCombo();
 
 private:
 	LLFloaterInventoryFinder* getFinder();
@@ -129,12 +134,14 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
     LLUICtrl*                   mCounterCtrl;
 	LLHandle<LLFloater>			mFinderHandle;
 	LLInventoryPanel*			mActivePanel;
+	LLInventoryPanel*			mWornItemsPanel;
 	bool						mResortActivePanel;
 	LLSaveFolderState*			mSavedFolderState;
 	std::string					mFilterText;
 	std::string					mFilterSubString;
 	S32							mItemCount;
 	std::string 				mItemCountString;
+	LLComboBox*					mSearchTypeCombo;
 
 
 	//////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 5dd44b4444f5cda6a84b02b83b93cb53ed76b044..0bf4d48421c34be97a6d8d53d6ac5f629b13ef15 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -1712,7 +1712,7 @@ void LLPanelObject::sendPosition(BOOL btn_down)
 			if (mObject->isRootEdit())
 			{								
 				// only offset by parent's translation
-				mObject->resetChildrenPosition(LLVector3(-delta), TRUE) ;				
+				mObject->resetChildrenPosition(LLVector3(-delta), TRUE, TRUE) ;
 			}
 
 			if(!btn_down)
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index dbfebf901a09abc8663b48cf2b752f758da36e78..b5ee68ba25ec3af177d1e41886f7b7b7992dfc38 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -110,6 +110,11 @@ class LLTaskInvFVBridge : public LLFolderViewModelItemInventory
 	virtual const std::string& getDisplayName() const;
 	virtual const std::string& getSearchableName() const;
 
+	virtual std::string getSearchableDescription() const {return LLStringUtil::null;}
+	virtual std::string getSearchableCreatorName() const {return LLStringUtil::null;}
+	virtual std::string getSearchableUUIDString() const {return LLStringUtil::null;}
+
+
 	virtual PermissionMask getPermissionMask() const { return PERM_NONE; }
 	/*virtual*/ LLFolderType::EType getPreferredType() const { return LLFolderType::FT_NONE; }
 	virtual const LLUUID& getUUID() const { return mUUID; }
diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp
index 3d18e837afc39c85e90882d7d4bdc43cd8e59968..f3a4cf36eed9f00d4e6e04fbf27e75606d66cd82 100644
--- a/indra/newview/llpanelsnapshotpostcard.cpp
+++ b/indra/newview/llpanelsnapshotpostcard.cpp
@@ -164,6 +164,8 @@ void LLPanelSnapshotPostcard::sendPostcardFinished(LLSD result)
 
 void LLPanelSnapshotPostcard::sendPostcard()
 {
+    if (!gAgent.getRegion()) return;
+
     // upload the image
     std::string url = gAgent.getRegion()->getCapability("SendPostcard");
     if (!url.empty())
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index a150007177e3ede7451edcbbde6fb281478b8049..3099a6e0391b53c7cb2f423f606c01188523e368 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -416,7 +416,7 @@ bool LLPanelWearing::populateAttachmentsList(bool update)
 void LLPanelWearing::requestAttachmentDetails()
 {
 	LLSD body;
-	std::string url = gAgent.getRegion()->getCapability("AttachmentResources");
+	std::string url = gAgent.getRegionCapability("AttachmentResources");
 	if (!url.empty())
 	{
 		LLCoros::instance().launch("LLPanelWearing::getAttachmentLimitsCoro",
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index fb21b980dcd6d75351cff16f8cee55f5254bcc25..fc2de4844e617ee082bf35f9bc145d8edb119327 100644
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -62,7 +62,8 @@ LLPreview::LLPreview(const LLSD& key)
 	mUserResized(FALSE),
 	mCloseAfterSave(FALSE),
 	mAssetStatus(PREVIEW_ASSET_UNLOADED),
-	mDirty(TRUE)
+	mDirty(TRUE),
+	mSaveDialogShown(FALSE)
 {
 	mAuxItem = new LLInventoryItem;
 	// don't necessarily steal focus on creation -- sometimes these guys pop up without user action
diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h
index 49c114720b4ab1c4a68c44f8cbc5b41904951674..b41aa2be1a67652ca83362fdaca8c89a52098180 100644
--- a/indra/newview/llpreview.h
+++ b/indra/newview/llpreview.h
@@ -121,7 +121,8 @@ class LLPreview : public LLFloater, LLInventoryObserver
 	// for LLInventoryObserver 
 	virtual void changed(U32 mask);	
 	BOOL mDirty;
-	
+	BOOL mSaveDialogShown;
+
 protected:
 	LLUUID mItemUUID;
 
diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp
index fb40af1302dcc79419052d8da6e2724a1e6b131d..12ac9e6fc52400c1848ba3f92a95945477ba619a 100644
--- a/indra/newview/llpreviewanim.cpp
+++ b/indra/newview/llpreviewanim.cpp
@@ -148,6 +148,12 @@ void LLPreviewAnim::draw()
 			}
 			if(gAgentAvatarp->isMotionActive(this->mItemID) && !this->mDidStart)
 			{
+				const LLInventoryItem *item = getItem();
+				LLMotion* motion = gAgentAvatarp->findMotion(this->mItemID);
+				if (item && motion)
+				{
+					motion->setName(item->getName());
+				}
 				this->mDidStart = true;
 			}
 		}
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index ff9a70d05c9edd2efbe05d4c4614cbd757996400..787bd68e5894a98fff109d5575dcea998aa6d078 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -234,9 +234,13 @@ BOOL LLPreviewGesture::canClose()
 	}
 	else
 	{
-		// Bring up view-modal dialog: Save changes? Yes, No, Cancel
-		LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(),
-			boost::bind(&LLPreviewGesture::handleSaveChangesDialog, this, _1, _2) );
+		if(!mSaveDialogShown)
+		{
+			mSaveDialogShown = TRUE;
+			// Bring up view-modal dialog: Save changes? Yes, No, Cancel
+			LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(),
+					boost::bind(&LLPreviewGesture::handleSaveChangesDialog, this, _1, _2) );
+		}
 		return FALSE;
 	}
 }
@@ -264,6 +268,7 @@ void LLPreviewGesture::onVisibilityChanged ( const LLSD& new_visibility )
 
 bool LLPreviewGesture::handleSaveChangesDialog(const LLSD& notification, const LLSD& response)
 {
+	mSaveDialogShown = FALSE;
 	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch(option)
 	{
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index 510d91839d6b6cff88a8cb0b83ccf0ff4ac0c851..850c3b350dcb6b26f34c40571db96ddfd8e41b17 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -153,9 +153,12 @@ BOOL LLPreviewNotecard::canClose()
 	}
 	else
 	{
-		// Bring up view-modal dialog: Save changes? Yes, No, Cancel
-		LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLPreviewNotecard::handleSaveChangesDialog,this, _1, _2));
-								  
+		if(!mSaveDialogShown)
+		{
+			mSaveDialogShown = TRUE;
+			// Bring up view-modal dialog: Save changes? Yes, No, Cancel
+			LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLPreviewNotecard::handleSaveChangesDialog,this, _1, _2));
+		}
 		return FALSE;
 	}
 }
@@ -639,6 +642,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data
 
 bool LLPreviewNotecard::handleSaveChangesDialog(const LLSD& notification, const LLSD& response)
 {
+	mSaveDialogShown = FALSE;
 	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch(option)
 	{
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index b7fea4e9825460c90d0224aae42d5810a6940f88..6ecc4c7fb91ed40600bd3dbd5509dce6e662a733 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -376,7 +376,8 @@ LLScriptEdCore::LLScriptEdCore(
 	mLive(live),
 	mContainer(container),
 	mHasScriptData(FALSE),
-	mScriptRemoved(FALSE)
+	mScriptRemoved(FALSE),
+	mSaveDialogShown(FALSE)
 {
 	setFollowsAll();
 	setBorderVisible(FALSE);
@@ -584,6 +585,14 @@ void LLScriptEdCore::setScriptText(const std::string& text, BOOL is_valid)
 	}
 }
 
+void LLScriptEdCore::makeEditorPristine()
+{
+	if (mEditor)
+	{
+		mEditor->makePristine();
+	}
+}
+
 bool LLScriptEdCore::loadScriptText(const std::string& filename)
 {
 	if (filename.empty())
@@ -847,8 +856,12 @@ BOOL LLScriptEdCore::canClose()
 	}
 	else
 	{
-		// Bring up view-modal dialog: Save changes? Yes, No, Cancel
-		LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleSaveChangesDialog, this, _1, _2));
+		if(!mSaveDialogShown)
+		{
+			mSaveDialogShown = TRUE;
+			// Bring up view-modal dialog: Save changes? Yes, No, Cancel
+			LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleSaveChangesDialog, this, _1, _2));
+		}
 		return FALSE;
 	}
 }
@@ -861,6 +874,7 @@ void LLScriptEdCore::setEnableEditing(bool enable)
 
 bool LLScriptEdCore::handleSaveChangesDialog(const LLSD& notification, const LLSD& response )
 {
+	mSaveDialogShown = FALSE;
 	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch( option )
 	{
@@ -1200,7 +1214,7 @@ void LLScriptEdCore::onBtnLoadFromFile( void* data )
 
 	std::string filename = file_picker.getFirstFile();
 
-	std::ifstream fin(filename.c_str());
+	llifstream fin(filename.c_str());
 
 	std::string line;
 	std::string text;
@@ -1238,7 +1252,7 @@ void LLScriptEdCore::onBtnSaveToFile( void* userdata )
 		{
 			std::string filename = file_picker.getFirstFile();
 			std::string scriptText=self->mEditor->getText();
-			std::ofstream fout(filename.c_str());
+			llofstream fout(filename.c_str());
 			fout<<(scriptText);
 			fout.close();
 			self->mSaveCallback( self->mUserdata, FALSE );
@@ -2026,7 +2040,7 @@ void LLLiveLSLEditor::loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType
 	buffer[file_length] = '\0';
 
 	mScriptEd->setScriptText(LLStringExplicit(&buffer[0]), TRUE);
-	mScriptEd->mEditor->makePristine();
+	mScriptEd->makeEditorPristine();
 	mScriptEd->setScriptName(getItem()->getName());
 }
 
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index 6b311256417fac16f3415c0c0ef89439605ed111..a185d858898b79c3feded1d06724cf891b658d6f 100644
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -90,6 +90,7 @@ class LLScriptEdCore : public LLPanel
 	bool			canLoadOrSaveToFile( void* userdata );
 
 	void            setScriptText(const std::string& text, BOOL is_valid);
+	void			makeEditorPristine();
 	bool			loadScriptText(const std::string& filename);
 	bool			writeToFile(const std::string& filename);
 	void			sync();
@@ -166,6 +167,7 @@ class LLScriptEdCore : public LLPanel
 	LLLiveLSLFile*	mLiveFile;
 	LLUUID			mAssociatedExperience;
 	BOOL			mScriptRemoved;
+	BOOL			mSaveDialogShown;
 
 	LLScriptEdContainer* mContainer; // parent view
 
diff --git a/indra/newview/llproductinforequest.cpp b/indra/newview/llproductinforequest.cpp
index b663df4aae8f67a570e362cae2e762dd6eeb4b00..4abb67355521e37795cfb704f5a7748e86a9c2ab 100644
--- a/indra/newview/llproductinforequest.cpp
+++ b/indra/newview/llproductinforequest.cpp
@@ -41,7 +41,7 @@ LLProductInfoRequestManager::LLProductInfoRequestManager():
 
 void LLProductInfoRequestManager::initSingleton()
 {
-	std::string url = gAgent.getRegion()->getCapability("ProductInfoRequest");
+	std::string url = gAgent.getRegionCapability("ProductInfoRequest");
 	if (!url.empty())
 	{
         LLCoros::instance().launch("LLProductInfoRequestManager::getLandDescriptionsCoro",
diff --git a/indra/newview/llscenemonitor.cpp b/indra/newview/llscenemonitor.cpp
index 02912f12a99f47fea5d6448710ec511e45a7fb09..5ab00130557223c47a49007bc808e39951ed18c5 100644
--- a/indra/newview/llscenemonitor.cpp
+++ b/indra/newview/llscenemonitor.cpp
@@ -532,7 +532,7 @@ void LLSceneMonitor::dumpToFile(std::string file_name)
 
 	LL_INFOS("SceneMonitor") << "Saving scene load stats to " << file_name << LL_ENDL; 
 
-	std::ofstream os(file_name.c_str());
+	llofstream os(file_name.c_str());
 
 	os << std::setprecision(10);
 
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index c6a0198afd091977f008776c753ef660d0f56f40..e25cac8c1784ac9edd534f1e11ad167166a6bdde 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -696,6 +696,19 @@ LLInventoryPanel *LLSidepanelInventory::getActivePanel()
 	return NULL;
 }
 
+void LLSidepanelInventory::selectAllItemsPanel()
+{
+	if (!getVisible())
+	{
+		return;
+	}
+	if (mInventoryPanel->getVisible())
+	{
+		 mPanelMainInventory->selectAllItemsPanel();
+	}
+
+}
+
 BOOL LLSidepanelInventory::isMainInventoryPanelActive() const
 {
 	return mInventoryPanel->getVisible();
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
index 5060f7025f6ac8946ece4011262b78a32e4f8852..3b8cdb98ab1fb9bc4652efaf10427f01d7d1fb75 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -57,6 +57,7 @@ class LLSidepanelInventory : public LLPanel
 	/*virtual*/ void onOpen(const LLSD& key);
 
 	LLInventoryPanel* getActivePanel(); // Returns an active inventory panel, if any.
+	void selectAllItemsPanel();
 	LLInventoryPanel* getInboxPanel() const { return mInventoryPanelInbox.get(); }
 
 	LLPanelMainInventory* getMainInventoryPanel() const { return mPanelMainInventory; }
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 19d1af34f9761ed1779590cb1cc7e572a4451913..abb936c3e5bea91f7440d61964483a3cd4ed55ea 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -818,7 +818,7 @@ void LLIMSpeakerMgr::toggleAllowTextChat(const LLUUID& speaker_id)
 	LLPointer<LLSpeaker> speakerp = findSpeaker(speaker_id);
 	if (!speakerp) return;
 
-	std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+	std::string url = gAgent.getRegionCapability("ChatSessionRequest");
 	LLSD data;
 	data["method"] = "mute update";
 	data["session-id"] = getSessionID();
@@ -844,7 +844,7 @@ void LLIMSpeakerMgr::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmu
 	// do not send voice moderation changes for avatars not in voice channel
 	if (!is_in_voice) return;
 
-	std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+	std::string url = gAgent.getRegionCapability("ChatSessionRequest");
 	LLSD data;
 	data["method"] = "mute update";
 	data["session-id"] = getSessionID();
@@ -924,7 +924,7 @@ void LLIMSpeakerMgr::processSessionUpdate(const LLSD& session_update)
 
 void LLIMSpeakerMgr::moderateVoiceSession(const LLUUID& session_id, bool disallow_voice)
 {
-	std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+	std::string url = gAgent.getRegionCapability("ChatSessionRequest");
 	LLSD data;
 	data["method"] = "session update";
 	data["session-id"] = session_id;
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 1a480b18388afda494579330020d150d2bdc18ad..8295ce029bff987435603144d2433bf4cffce5d1 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -345,7 +345,7 @@ bool idle_startup()
 	const std::string delims (" ");
 	std::string system;
 	int begIdx, endIdx;
-	std::string osString = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+	std::string osString = LLOSInfo::instance().getOSStringSimple();
 
 	begIdx = osString.find_first_not_of (delims);
 	endIdx = osString.find_first_of (delims, begIdx);
@@ -830,7 +830,8 @@ bool idle_startup()
 
 		// Don't do anything.  Wait for the login view to call the login_callback,
 		// which will push us to the next state.
-		display_startup();
+
+		// display() function will be the one to run display_startup()
 		// Sleep so we don't spin the CPU
 		ms_sleep(1);
 		return FALSE;
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index a54127362114a837f96cc51ecfc565227cb09878..f0c28041d141bc5ef3d1b2c8f0e9aab03e2e51b4 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -31,6 +31,7 @@
 #include "llapr.h"
 #include "lldir.h"
 #include "llimage.h"
+#include "llimagej2c.h" // for version control
 #include "lllfsthread.h"
 #include "llviewercontrol.h"
 
@@ -938,6 +939,14 @@ BOOL LLTextureCache::isInLocal(const LLUUID& id)
 F32 LLTextureCache::sHeaderCacheVersion = 1.7f;
 U32 LLTextureCache::sCacheMaxEntries = 1024 * 1024; //~1 million textures.
 S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit
+std::string LLTextureCache::sHeaderCacheEncoderVersion = LLImageJ2C::getEngineInfo();
+
+#if defined(ADDRESS_SIZE)
+U32 LLTextureCache::sHeaderCacheAddressSize = ADDRESS_SIZE;
+#else
+U32 LLTextureCache::sHeaderCacheAddressSize = 32;
+#endif
+
 const char* entries_filename = "texture.entries";
 const char* cache_filename = "texture.cache";
 const char* old_textures_dirname = "textures";
@@ -1080,12 +1089,28 @@ void LLTextureCache::readEntriesHeader()
 	}
 	else //create an empty entries header.
 	{
-		mHeaderEntriesInfo.mVersion = sHeaderCacheVersion ;
-		mHeaderEntriesInfo.mEntries = 0 ;
+		setEntriesHeader();
 		writeEntriesHeader() ;
 	}
 }
 
+void LLTextureCache::setEntriesHeader()
+{
+	if (sHeaderEncoderStringSize < sHeaderCacheEncoderVersion.size() + 1)
+	{
+		// For simplicity we use predefined size of header, so if version string
+		// doesn't fit, either getEngineInfo() returned malformed string or 
+		// sHeaderEncoderStringSize need to be increased.
+		// Also take into accout that c_str() returns additional null character
+		LL_ERRS() << "Version string doesn't fit in header" << LL_ENDL;
+	}
+
+	mHeaderEntriesInfo.mVersion = sHeaderCacheVersion;
+	mHeaderEntriesInfo.mAdressSize = sHeaderCacheAddressSize;
+	strcpy(mHeaderEntriesInfo.mEncoderVersion, sHeaderCacheEncoderVersion.c_str());
+	mHeaderEntriesInfo.mEntries = 0;
+}
+
 void LLTextureCache::writeEntriesHeader()
 {
 	llassert_always(mHeaderAPRFile == NULL);
@@ -1439,10 +1464,13 @@ void LLTextureCache::readHeaderCache()
 
 	readEntriesHeader();
 	
-	if (mHeaderEntriesInfo.mVersion != sHeaderCacheVersion)
+	if (mHeaderEntriesInfo.mVersion != sHeaderCacheVersion
+		|| mHeaderEntriesInfo.mAdressSize != sHeaderCacheAddressSize
+		|| strcmp(mHeaderEntriesInfo.mEncoderVersion, sHeaderCacheEncoderVersion.c_str()) != 0)
 	{
 		if (!mReadOnly)
 		{
+			LL_INFOS() << "Texture Cache version mismatch, Purging." << LL_ENDL;
 			purgeAllTextures(false);
 		}
 	}
@@ -1587,9 +1615,9 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
 				gDirUtilp->deleteFilesInDir(dirname, mask);
 			}
 		}
+		gDirUtilp->deleteFilesInDir(mTexturesDirName, mask); // headers, fast cache
 		if (purge_directories)
 		{
-			gDirUtilp->deleteFilesInDir(mTexturesDirName, mask);
 			LLFile::rmdir(mTexturesDirName);
 		}
 	}
@@ -1601,8 +1629,7 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
 	mUpdatedEntryMap.clear();
 
 	// Info with 0 entries
-	mHeaderEntriesInfo.mVersion = sHeaderCacheVersion;
-	mHeaderEntriesInfo.mEntries = 0;
+	setEntriesHeader();
 	writeEntriesHeader();
 
 	LL_INFOS() << "The entire texture cache is cleared." << LL_ENDL ;
@@ -1960,15 +1987,13 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis
 		if(w * h *c > 0) //valid
 		{
 			//make a duplicate to keep the original raw image untouched.
-			raw = raw->duplicate();
+			raw = raw->scaled(w, h);
 			if (raw->isBufferInvalid())
 			{
 				LL_WARNS() << "Invalid image duplicate buffer" << LL_ENDL;
 				return false;
 			}
 
-			raw->scale(w, h) ;
-			
 			discardlevel += i ;
 		}
 	}
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index 6ff4c4456828e9bcfa44c2ac69aafc55c170e6bd..95f9afc2bc7fe3a5fd93e0564f68c1e00551f802 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -46,10 +46,13 @@ class LLTextureCache : public LLWorkerThread
 
 private:
 	// Entries
+	static const U32 sHeaderEncoderStringSize = 32;
 	struct EntriesInfo
 	{
-		EntriesInfo() : mVersion(0.f), mEntries(0) {}
+		EntriesInfo() : mVersion(0.f), mAdressSize(0), mEntries(0) { memset(mEncoderVersion, 0, sHeaderEncoderStringSize); }
 		F32 mVersion;
+		U32 mAdressSize;
+		char mEncoderVersion[sHeaderEncoderStringSize];
 		U32 mEntries;
 	};
 	struct Entry
@@ -156,6 +159,7 @@ class LLTextureCache : public LLWorkerThread
 	LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset);
 	void closeHeaderEntriesFile();
 	void readEntriesHeader();
+	void setEntriesHeader();
 	void writeEntriesHeader();
 	S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create);
 	bool updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 new_body_size);
@@ -224,6 +228,8 @@ class LLTextureCache : public LLWorkerThread
 
 	// Statics
 	static F32 sHeaderCacheVersion;
+	static U32 sHeaderCacheAddressSize;
+	static std::string sHeaderCacheEncoderVersion;
 	static U32 sCacheMaxEntries;
 	static S64 sCacheMaxTexturesSize;
 };
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index b78d0b51d53c4b9f623772d9cdae49be78612399..84a2f1b597a4997a989b858a53e70ab5b8c8f90d 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -2559,7 +2559,7 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
 	  mTextureInfoMainThread(false)
 {
 	mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
-	mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), U32Bytes(gSavedSettings.getU32("TextureLoggingThreshold")));
+	mTextureInfo.setLogging(true);
 
 	LLAppCoreHttp & app_core_http(LLAppViewer::instance()->getAppCoreHttp());
 	mHttpRequest = new LLCore::HttpRequest;
diff --git a/indra/newview/lltextureinfo.cpp b/indra/newview/lltextureinfo.cpp
index 473d8ce709d4298d5302707bbbd80f013bebb87a..e79bb62a52fe0ba029cb5b0ba05f0483eaef2297 100644
--- a/indra/newview/lltextureinfo.cpp
+++ b/indra/newview/lltextureinfo.cpp
@@ -26,10 +26,19 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llagent.h"
+#include "llmeshrepository.h"
+#include "llsdutil.h"
 #include "lltextureinfo.h"
+#include "lltexturecache.h"
+#include "lltexturefetch.h"
 #include "lltexturestats.h"
-#include "llviewercontrol.h"
 #include "lltrace.h"
+#include "llviewercontrol.h"
+#include "llviewerregion.h"
+#include "llviewerstats.h"
+#include "llvocache.h"
+#include "llworld.h"
 
 static LLTrace::CountStatHandle<S32> sTextureDownloadsStarted("texture_downloads_started", "number of texture downloads initiated");
 static LLTrace::CountStatHandle<S32> sTextureDownloadsCompleted("texture_downloads_completed", "number of texture downloads completed");
@@ -37,10 +46,8 @@ static LLTrace::CountStatHandle<S32Bytes > sTextureDataDownloaded("texture_data_
 static LLTrace::CountStatHandle<U32Milliseconds > sTexureDownloadTime("texture_download_time", "amount of time spent fetching textures");
 
 LLTextureInfo::LLTextureInfo(bool postponeStartRecoreder) :
-	mLogTextureDownloadsToViewerLog(false),
-	mLogTextureDownloadsToSimulator(false),
-	mTextureDownloadProtocol("NONE"),
-	mTextureLogThreshold(LLUnits::Kilobytes::fromValue(100))
+	mLoggingEnabled(false),
+	mTextureDownloadProtocol("NONE")
 {
 	if (!postponeStartRecoreder)
 	{
@@ -48,11 +55,9 @@ LLTextureInfo::LLTextureInfo(bool postponeStartRecoreder) :
 	}
 }
 
-void LLTextureInfo::setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold)
+void LLTextureInfo::setLogging(bool log_info)
 {
-	mLogTextureDownloadsToViewerLog = writeToViewerLog;
-	mLogTextureDownloadsToSimulator = sendToSim;
-	mTextureLogThreshold = U32Bytes(textureLogThreshold);
+	mLoggingEnabled = log_info;
 }
 
 LLTextureInfo::~LLTextureInfo()
@@ -147,36 +152,80 @@ void LLTextureInfo::setRequestCompleteTimeAndLog(const LLUUID& id, U64Microsecon
 		break;
 	}
 
-	if (mLogTextureDownloadsToViewerLog)
+	if (mLoggingEnabled)
 	{
-		LL_INFOS() << "texture="   << id 
-			    << " start="    << details.mStartTime 
-			    << " end="      << details.mCompleteTime
-			    << " size="     << details.mSize
-			    << " offset="   << details.mOffset
-			    << " length="   << U32Milliseconds(details.mCompleteTime - details.mStartTime)
-			    << " protocol=" << protocol
-			    << LL_ENDL;
-	}
+		static LLCachedControl<bool> log_to_viewer_log(gSavedSettings, "LogTextureDownloadsToViewerLog", false);
+		static LLCachedControl<bool> log_to_simulator(gSavedSettings, "LogTextureDownloadsToSimulator", false);
+		static LLCachedControl<U32> texture_log_threshold(gSavedSettings, "TextureLoggingThreshold", 1);
 
-	if(mLogTextureDownloadsToSimulator)
-	{
-		add(sTextureDataDownloaded, details.mSize);
-		add(sTexureDownloadTime, details.mCompleteTime - details.mStartTime);
-		add(sTextureDownloadsCompleted, 1);
-		mTextureDownloadProtocol = protocol;
-		if (mRecording.getSum(sTextureDataDownloaded) >= mTextureLogThreshold)
+		if (log_to_viewer_log)
+		{
+			LL_INFOS() << "texture="   << id 
+				    << " start="    << details.mStartTime 
+				    << " end="      << details.mCompleteTime
+				    << " size="     << details.mSize
+				    << " offset="   << details.mOffset
+				    << " length="   << U32Milliseconds(details.mCompleteTime - details.mStartTime)
+				    << " protocol=" << protocol
+				    << LL_ENDL;
+		}
+
+		if(log_to_simulator)
 		{
-			LLSD texture_data;
-			std::stringstream startTime;
-			startTime << mCurrentStatsBundleStartTime;
-			texture_data["start_time"] = startTime.str();
-			std::stringstream endTime;
-			endTime << completeTime;
-			texture_data["end_time"] = endTime.str();
-			texture_data["averages"] = getAverages();
-			send_texture_stats_to_sim(texture_data);
-			resetTextureStatistics();
+			add(sTextureDataDownloaded, details.mSize);
+			add(sTexureDownloadTime, details.mCompleteTime - details.mStartTime);
+			add(sTextureDownloadsCompleted, 1);
+			mTextureDownloadProtocol = protocol;
+			if (mRecording.getSum(sTextureDataDownloaded) >= U32Bytes(texture_log_threshold))
+			{
+				LLSD texture_data;
+				std::stringstream startTime;
+				startTime << mCurrentStatsBundleStartTime;
+				texture_data["start_time"] = startTime.str();
+				std::stringstream endTime;
+				endTime << completeTime;
+				texture_data["end_time"] = endTime.str();
+				texture_data["averages"] = getAverages();
+
+				// Texture cache
+				LLSD texture_cache;
+				U32 cache_read = 0, cache_write = 0, res_wait = 0;
+				F64 cache_hit_rate = 0;
+				LLAppViewer::getTextureFetch()->getStateStats(&cache_read, &cache_write, &res_wait);
+				if (cache_read > 0 || cache_write > 0)
+				{
+					cache_hit_rate = cache_read / (cache_read + cache_write);
+				}
+				texture_cache["cache_read"] = LLSD::Integer(cache_read);
+				texture_cache["cache_write"] = LLSD::Integer(cache_write);
+				texture_cache["hit_rate"] = LLSD::Real(cache_hit_rate);
+				texture_cache["entries"] = LLSD::Integer(LLAppViewer::getTextureCache()->getEntries());
+				texture_cache["space_max"] = ll_sd_from_U64((U64)LLAppViewer::getTextureCache()->getMaxUsage().value()); // bytes
+				texture_cache["space_used"] = ll_sd_from_U64((U64)LLAppViewer::getTextureCache()->getUsage().value()); // bytes
+				texture_data["texture_cache"] = texture_cache;
+
+				// VO and mesh cache
+				LLSD object_cache;
+				object_cache["vo_entries_max"] = LLSD::Integer(LLVOCache::getInstance()->getCacheEntriesMax());
+				object_cache["vo_entries_curent"] = LLSD::Integer(LLVOCache::getInstance()->getCacheEntries());
+				object_cache["vo_active_entries"] = LLSD::Integer(LLWorld::getInstance()->getNumOfActiveCachedObjects());
+				U64 region_hit_count = gAgent.getRegion() != NULL ? gAgent.getRegion()->getRegionCacheHitCount() : 0;
+				U64 region_miss_count = gAgent.getRegion() != NULL ? gAgent.getRegion()->getRegionCacheMissCount() : 0;
+				F64 region_vocache_hit_rate = 0;
+				if (region_hit_count > 0 || region_miss_count > 0)
+				{
+					region_vocache_hit_rate = region_hit_count / (region_hit_count + region_miss_count);
+				}
+				object_cache["vo_region_hitcount"] = ll_sd_from_U64(region_hit_count);
+				object_cache["vo_region_misscount"] = ll_sd_from_U64(region_miss_count);
+				object_cache["vo_region_hitrate"] = LLSD::Real(region_vocache_hit_rate);
+				object_cache["mesh_reads"] = LLSD::Integer(LLMeshRepository::sCacheReads);
+				object_cache["mesh_writes"] = LLSD::Integer(LLMeshRepository::sCacheWrites);
+				texture_data["object_cache"] = object_cache;
+
+				send_texture_stats_to_sim(texture_data);
+				resetTextureStatistics();
+			}
 		}
 	}
 
diff --git a/indra/newview/lltextureinfo.h b/indra/newview/lltextureinfo.h
index 03721bdd73cd124079e908bdc1d0240e3087c8e5..46378eb7f82ced369d8ac029c0d1f001e946c948 100644
--- a/indra/newview/lltextureinfo.h
+++ b/indra/newview/lltextureinfo.h
@@ -38,7 +38,7 @@ class LLTextureInfo
 	LLTextureInfo(bool postponeStartRecoreder = true);
 	~LLTextureInfo();
 
-	void setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold);
+	void setLogging(bool log_info);
 	bool has(const LLUUID& id);
 	void setRequestStartTime(const LLUUID& id, U64 startTime);
 	void setRequestSize(const LLUUID& id, U32 size);
@@ -61,12 +61,11 @@ class LLTextureInfo
 
 	std::map<LLUUID, LLTextureInfoDetails *>	mTextures;
 	LLSD										mAverages;
-	bool										mLogTextureDownloadsToViewerLog,
-												mLogTextureDownloadsToSimulator;
+	bool										mLoggingEnabled;
 	std::string									mTextureDownloadProtocol;
-	U32Bytes					mTextureLogThreshold; 
 	U64Microseconds			mCurrentStatsBundleStartTime;
 	LLTrace::Recording							mRecording;
+
 };
 
 #endif // LL_LLTEXTUREINFO_H
diff --git a/indra/newview/lltexturestats.cpp b/indra/newview/lltexturestats.cpp
index 8ded148e178dfb7271c6d1d9a648fbb0895133fb..b55b4d9ca457e034c83d552175605ab32aebad02 100644
--- a/indra/newview/lltexturestats.cpp
+++ b/indra/newview/lltexturestats.cpp
@@ -30,6 +30,7 @@
 #include "llagent.h"
 #include "lltexturefetch.h" 
 #include "lltexturestats.h"
+#include "llversioninfo.h"
 #include "llviewerregion.h"
 #include "llcorehttputil.h"
 
@@ -45,6 +46,8 @@ void send_texture_stats_to_sim(const LLSD &texture_stats)
 	LLUUID agent_id = gAgent.getID();
 	texture_stats_report["agent_id"] = agent_id;
 	texture_stats_report["region_id"] = gAgent.getRegion()->getRegionID();
+	texture_stats_report["viewer_channel"] = LLVersionInfo::getChannel();
+	texture_stats_report["viewer_version"] = LLVersionInfo::getVersion();
 	texture_stats_report["stats_data"] = texture_stats;
 
 	std::string texture_cap_url = gAgent.getRegion()->getCapability("TextureStats");
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index fc052ae3aaa445bd7ced8e998dfa67fbe2e8beb0..f473000657f78b45d8aa5b3db90d51852164da59 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -485,7 +485,8 @@ void LLToolPie::walkToClickedLocation()
 	mAutoPilotDestination->setColor(LLColor4U(170, 210, 190));
 	mAutoPilotDestination->setDuration(3.f);
 
-	handle_go_to();
+	LLVector3d pos = LLToolPie::getInstance()->getPick().mPosGlobal;
+	gAgent.startAutoPilotGlobal(pos, std::string(), NULL, NULL, NULL, 0.f, 0.03f, FALSE);
 }
 
 // When we get object properties after left-clicking on an object
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index da6b18bb7797a917f67c611e8a96c41505028f18..6c9fe5e39b9e954bf0d1d642828ad17d172e1a3e 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -1511,67 +1511,64 @@ void purge_descendents_of(const LLUUID& id, LLPointer<LLInventoryCallback> cb)
 	LLPointer<LLViewerInventoryCategory> cat = gInventory.getCategory(id);
 	if (cat.notNull())
 	{
-		if (LLClipboard::instance().hasContents() && LLClipboard::instance().isCutMode())
+		if (LLClipboard::instance().hasContents())
 		{
-			// Something on the clipboard is in "cut mode" and needs to be preserved
-			LL_DEBUGS(LOG_INV) << "purge_descendents_of clipboard case " << cat->getName()
-							   << " iterate and purge non hidden items" << LL_ENDL;
-			LLInventoryModel::cat_array_t* categories;
-			LLInventoryModel::item_array_t* items;
-			// Get the list of direct descendants in tha categoy passed as argument
-			gInventory.getDirectDescendentsOf(id, categories, items);
-			std::vector<LLUUID> list_uuids;
-			// Make a unique list with all the UUIDs of the direct descendants (items and categories are not treated differently)
-			// Note: we need to do that shallow copy as purging things will invalidate the categories or items lists
-			for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); it != categories->end(); ++it)
-			{
-				list_uuids.push_back((*it)->getUUID());
-			}
-			for (LLInventoryModel::item_array_t::const_iterator it = items->begin(); it != items->end(); ++it)
+			// Remove items from clipboard or it will remain active even if there is nothing to paste/copy
+			LLInventoryModel::cat_array_t categories;
+			LLInventoryModel::item_array_t items;
+			gInventory.collectDescendents(id, categories, items, TRUE);
+
+			for (LLInventoryModel::cat_array_t::const_iterator it = categories.begin(); it != categories.end(); ++it)
 			{
-				list_uuids.push_back((*it)->getUUID());
+				if (LLClipboard::instance().isOnClipboard((*it)->getUUID()))
+				{
+					// No sense in removing single items, partial 'paste' will result in confusion only
+					LLClipboard::instance().reset();
+					break;
+				}
 			}
-			// Iterate through the list and only purge the UUIDs that are not on the clipboard
-			for (std::vector<LLUUID>::const_iterator it = list_uuids.begin(); it != list_uuids.end(); ++it)
+			if (LLClipboard::instance().hasContents())
 			{
-				if (!LLClipboard::instance().isOnClipboard(*it))
+				for (LLInventoryModel::item_array_t::const_iterator it = items.begin(); it != items.end(); ++it)
 				{
-					remove_inventory_object(*it, NULL);
+					if (LLClipboard::instance().isOnClipboard((*it)->getUUID()))
+					{
+						LLClipboard::instance().reset();
+						break;
+					}
 				}
 			}
 		}
-		else
+
+		if (AISAPI::isAvailable())
 		{
-            if (AISAPI::isAvailable())
+			if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
 			{
-				if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
-				{
-					LL_WARNS() << "Purging not fetched folder: " << cat->getName() << LL_ENDL;
-				}
-                AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t();
-                AISAPI::PurgeDescendents(id, cr);
+				LL_WARNS() << "Purging not fetched folder: " << cat->getName() << LL_ENDL;
 			}
-			else // no cap
+			AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t();
+			AISAPI::PurgeDescendents(id, cr);
+		}
+		else // no cap
+		{
+			// Fast purge
+			LL_DEBUGS(LOG_INV) << "purge_descendents_of fast case " << cat->getName() << LL_ENDL;
+
+			// send it upstream
+			LLMessageSystem* msg = gMessageSystem;
+			msg->newMessage("PurgeInventoryDescendents");
+			msg->nextBlock("AgentData");
+			msg->addUUID("AgentID", gAgent.getID());
+			msg->addUUID("SessionID", gAgent.getSessionID());
+			msg->nextBlock("InventoryData");
+			msg->addUUID("FolderID", id);
+			gAgent.sendReliableMessage();
+
+			// Update model immediately because there is no callback mechanism.
+			gInventory.onDescendentsPurgedFromServer(id);
+			if (cb)
 			{
-				// Fast purge
-				LL_DEBUGS(LOG_INV) << "purge_descendents_of fast case " << cat->getName() << LL_ENDL;
-
-				// send it upstream
-				LLMessageSystem* msg = gMessageSystem;
-				msg->newMessage("PurgeInventoryDescendents");
-				msg->nextBlock("AgentData");
-				msg->addUUID("AgentID", gAgent.getID());
-				msg->addUUID("SessionID", gAgent.getSessionID());
-				msg->nextBlock("InventoryData");
-				msg->addUUID("FolderID", id);
-				gAgent.sendReliableMessage();
-
-				// Update model immediately because there is no callback mechanism.
-				gInventory.onDescendentsPurgedFromServer(id);
-				if (cb)
-				{
-					cb->fire(id);
-				}
+				cb->fire(id);
 			}
 		}
 	}
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index c68f6b8a156aa23ca19bded30c9c3b7ee2401b08..912b0e0b04878419acce4930ff1493e4301cf4f6 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -618,6 +618,7 @@ class LLAdvancedDumpInfoToConsole : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
+		gDebugView->mDebugConsolep->setVisible(TRUE);
 		std::string info_type = userdata.asString();
 		if ("region" == info_type)
 		{
@@ -8016,7 +8017,7 @@ void handle_report_bug(const LLSD& param)
 	LLUIString url(param.asString());
 	
 	LLStringUtil::format_map_t replace;
-	replace["[ENVIRONMENT]"] = LLURI::escape(LLAppViewer::instance()->getViewerInfoString());
+	replace["[ENVIRONMENT]"] = LLURI::escape(LLAppViewer::instance()->getShortViewerInfoString());
 	LLSLURL location_url;
 	LLAgentUI::buildSLURL(location_url);
 	replace["[LOCATION]"] = LLURI::escape(location_url.getSLURLString());
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 8d0c5af314f9c5eee7d7ba94fabad01fa1d7ab97..90355b7166e38a37f603ce5316d8ebeb7ff99bc7 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -799,7 +799,7 @@ void upload_new_resource(
 //     uploadInfo->setTransactionId(tid);
 
 
-	std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");
+	std::string url = gAgent.getRegionCapability("NewFileAgentInventory");
 
 	if ( !url.empty() )
 	{
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 06f868dc087913f51b65e329bfa295d33f7e3cfc..1ce18f54964f9916cd760497d9354660a4ee0ab3 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3569,7 +3569,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
 		LLAvatarName av_name;
 		if (LLAvatarNameCache::get(from_id, &av_name))
 		{
-			chat.mFromName = av_name.getDisplayName();
+			chat.mFromName = av_name.getCompleteName();
 		}
 		else
 		{
@@ -6851,14 +6851,10 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
 		// Get the message ID
 		msg->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, message_id);
 		big_reason = LLAgent::sTeleportErrorMessages[message_id];
-		if ( big_reason.size() > 0 )
-		{	// Substitute verbose reason from the local map
-			args["REASON"] = big_reason;
-		}
-		else
-		{	// Nothing found in the map - use what the server returned in the original message block
+		if ( big_reason.size() <= 0 )
+		{
+			// Nothing found in the map - use what the server returned in the original message block
 			msg->getStringFast(_PREHASH_Info, _PREHASH_Reason, big_reason);
-			args["REASON"] = big_reason;
 		}
 
 		LLSD llsd_block;
@@ -6873,6 +6869,16 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
 			}
 			else
 			{
+				if(llsd_block.has("REGION_NAME"))
+				{
+					std::string region_name = llsd_block["REGION_NAME"].asString();
+					if(!region_name.empty())
+					{
+						LLStringUtil::format_map_t name_args;
+						name_args["[REGION_NAME]"] = region_name;
+						LLStringUtil::format(big_reason, name_args);
+					}
+				}
 				// change notification name in this special case
 				if (handle_teleport_access_blocked(llsd_block, message_id, args["REASON"]))
 				{
@@ -6884,7 +6890,7 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
 				}
 			}
 		}
-
+		args["REASON"] = big_reason;
 	}
 	else
 	{	// Extra message payload not found - use what the simulator sent
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 1d6daed9cc0b832f02a6b4d6ef990a13dc8c512a..978a398986b426516991c64ba53f6fc5e13ebcdc 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -6216,7 +6216,7 @@ void LLViewerObject::resetChildrenRotationAndPosition(const std::vector<LLQuater
 }
 
 //counter-translation
-void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplified)
+void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplified, BOOL skip_avatar_child)
 {
 	if(mChildList.empty())
 	{
@@ -6246,6 +6246,7 @@ void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplif
 			iter != mChildList.end(); iter++)
 	{
 		LLViewerObject* childp = *iter;
+
 		if (!childp->isSelected() && childp->mDrawable.notNull())
 		{
 			if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
@@ -6255,14 +6256,16 @@ void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplif
 			}
 			else //avatar
 			{
-				LLVector3 reset_pos = ((LLVOAvatar*)childp)->mDrawable->mXform.getPosition() + child_offset ;
+				if(!skip_avatar_child)
+				{
+					LLVector3 reset_pos = ((LLVOAvatar*)childp)->mDrawable->mXform.getPosition() + child_offset ;
 
-				((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);
-				((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos);				
-				
-				LLManip::rebuild(childp);
-			}			
-		}		
+					((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);
+					((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos);
+					LLManip::rebuild(childp);
+				}
+			}
+		}
 	}
 
 	return ;
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 24fcf0517ec8f0975f8819ca6d044f88c0979e8c..7a490f69570d4ac2c4a887592bbd1ccc2c2ac0af 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -575,7 +575,7 @@ class LLViewerObject
 
 public:
 	//counter-translation
-	void resetChildrenPosition(const LLVector3& offset, BOOL simplified = FALSE) ;
+	void resetChildrenPosition(const LLVector3& offset, BOOL simplified = FALSE,  BOOL skip_avatar_child = FALSE) ;
 	//counter-rotation
 	void resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations, 
 											const std::vector<LLVector3>& positions) ;
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 8f98d66c0c334e9acd37ed12897fcf7580426ca1..3c83e3a0063b4fa7c1ee61c0b6317434b4473bc3 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -1247,9 +1247,11 @@ void LLViewerObjectList::clearDebugText()
 
 void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
 {
+	bool new_dead_object = true;
 	if (mDeadObjects.find(objectp->mID) != mDeadObjects.end())
 	{
 		LL_INFOS() << "Object " << objectp->mID << " already on dead list!" << LL_ENDL;	
+		new_dead_object = false;
 	}
 	else
 	{
@@ -1286,7 +1288,10 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
 	// Also, not cleaned up
 	removeDrawable(objectp->mDrawable);
 
-	mNumDeadObjects++;
+	if(new_dead_object)
+	{
+		mNumDeadObjects++;
+	}
 }
 
 static LLTrace::BlockTimerStatHandle FTM_REMOVE_DRAWABLE("Remove Drawable");
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 0ab3d2b4e7fbe887e91777464d1af9bd3a12429e..d31fc0d6069c92b791e1c1f8fe93ca901a415420 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -461,7 +461,7 @@ void LLViewerParcelMedia::processParcelMediaUpdate( LLMessageSystem *msg, void *
 // *TODO: I can not find any active code where this method is called...
 void LLViewerParcelMedia::sendMediaNavigateMessage(const std::string& url)
 {
-	std::string region_url = gAgent.getRegion()->getCapability("ParcelNavigateMedia");
+	std::string region_url = gAgent.getRegionCapability("ParcelNavigateMedia");
 	if (!region_url.empty())
 	{
 		// send navigate event to sim for link sharing
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index eb37613c955e64f2aa31186e89ea3aa8df4fc38b..3fd2af87defa00346d28fc8c4f33a5e623a30f58 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -532,7 +532,9 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
 	mDead(FALSE),
 	mLastVisitedEntry(NULL),
 	mInvisibilityCheckHistory(-1),
-	mPaused(FALSE)
+	mPaused(FALSE),
+	mRegionCacheHitCount(0),
+	mRegionCacheMissCount(0)
 {
 	mWidth = region_width_meters;
 	mImpl->mOriginGlobal = from_region_handle(handle); 
@@ -2440,6 +2442,7 @@ LLVOCacheEntry* LLViewerRegion::getCacheEntry(U32 local_id, bool valid)
 
 void LLViewerRegion::addCacheMiss(U32 id, LLViewerRegion::eCacheMissType miss_type)
 {
+	mRegionCacheMissCount++;
 #if 0
 	mCacheMissList.insert(CacheMissItem(id, miss_type));
 #else
@@ -2491,6 +2494,7 @@ bool LLViewerRegion::probeCache(U32 local_id, U32 crc, U32 flags, U8 &cache_miss
 		if (entry->getCRC() == crc)
 		{
 			// Record a hit
+			mRegionCacheHitCount++;
 			entry->recordHit();
 		cache_miss_type = CACHE_MISS_TYPE_NONE;
 			entry->setUpdateFlags(flags);
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 61ce5b454d84be9faf61a35b97f774ec184ef670..69fb9c4d4e41d04bf83cac38e7492cc07ecbe8d5 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -338,6 +338,8 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	LLVOCacheEntry* getCacheEntryForOctree(U32 local_id);
 	LLVOCacheEntry* getCacheEntry(U32 local_id, bool valid = true);
 	bool probeCache(U32 local_id, U32 crc, U32 flags, U8 &cache_miss_type);
+	U64 getRegionCacheHitCount() { return mRegionCacheHitCount; }
+	U64 getRegionCacheMissCount() { return mRegionCacheMissCount; }
 	void requestCacheMisses();
 	void addCacheMissFull(const U32 local_id);
 	//update object cache if the object receives a full-update or terse update
@@ -534,7 +536,9 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 		typedef std::list<CacheMissItem> cache_miss_list_t;
 	};
 	CacheMissItem::cache_miss_list_t   mCacheMissList;
-	
+	U64 mRegionCacheHitCount;
+	U64 mRegionCacheMissCount;
+
 	caps_received_signal_t mCapabilitiesReceivedSignal;		
 	caps_received_signal_t mSimulatorFeaturesReceivedSignal;		
 
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index af7412562ac737d8e76ad521cdd754e8672e1edc..5ce9ad03f699fe268f10a50f1f18acff68670d9b 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -490,7 +490,7 @@ void send_stats()
 	LLSD &system = body["system"];
 	
 	system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB().value();
-	system["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+	system["os"] = LLOSInfo::instance().getOSStringSimple();
 	system["cpu"] = gSysCPU.getCPUString();
 	unsigned char MACAddress[MAC_ADDRESS_BYTES];
 	LLUUID::getNodeID(MACAddress);
@@ -588,9 +588,6 @@ void send_stats()
 	misc["string_1"] = llformat("%d", window_size);
 	misc["string_2"] = llformat("Texture Time: %.2f, Total Time: %.2f", gTextureTimer.getElapsedTimeF32(), gFrameTimeSeconds.value());
 
-// 	misc["int_1"] = LLSD::Integer(gSavedSettings.getU32("RenderQualityPerformance")); // Steve: 1.21
-// 	misc["int_2"] = LLSD::Integer(gFrameStalls); // Steve: 1.21
-
 	F32 unbaked_time = LLVOAvatar::sUnbakedTime * 1000.f / gFrameTimeSeconds;
 	misc["int_1"] = LLSD::Integer(unbaked_time); // Steve: 1.22
 	F32 grey_time = LLVOAvatar::sGreyTime * 1000.f / gFrameTimeSeconds;
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index cd8dd54fa63128e2cfa79bfbf862e0bd6271a7de..e5a1bed48cbc06cda219213d65d26792c62a4e33 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1396,8 +1396,7 @@ void LLViewerFetchedTexture::addToCreateTexture()
 
 						{
 							//make a duplicate in case somebody else is using this raw image
-							mRawImage = mRawImage->duplicate(); 
-							mRawImage->scale(w >> i, h >> i) ;					
+							mRawImage = mRawImage->scaled(w >> i, h >> i);
 						}
 					}
 				}
@@ -2913,8 +2912,7 @@ void LLViewerFetchedTexture::setCachedRawImage()
 			
 			{
 				//make a duplicate in case somebody else is using this raw image
-				mRawImage = mRawImage->duplicate(); 
-				mRawImage->scale(w >> i, h >> i) ;
+				mRawImage = mRawImage->scaled(w >> i, h >> i);
 			}
 		}
 		mCachedRawImage = mRawImage;
@@ -3966,7 +3964,7 @@ void LLTexturePipelineTester::updateStablizingTime()
 }
 
 //virtual 
-void LLTexturePipelineTester::compareTestSessions(std::ofstream* os) 
+void LLTexturePipelineTester::compareTestSessions(llofstream* os) 
 {	
 	LLTexturePipelineTester::LLTextureTestSession* base_sessionp = dynamic_cast<LLTexturePipelineTester::LLTextureTestSession*>(mBaseSessionp);
 	LLTexturePipelineTester::LLTextureTestSession* current_sessionp = dynamic_cast<LLTexturePipelineTester::LLTextureTestSession*>(mCurrentSessionp);
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 8017d8260418e27b9a366af9c848535739d40771..c9dea17f63b77fa03036f3d450f0240f423d35fe 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -779,7 +779,7 @@ class LLTexturePipelineTester : public LLMetricPerformanceTesterWithSession
 	};
 
 	/*virtual*/ LLMetricPerformanceTesterWithSession::LLTestSession* loadTestSession(LLSD* log) ;
-	/*virtual*/ void compareTestSessions(std::ofstream* os) ;
+	/*virtual*/ void compareTestSessions(llofstream* os) ;
 };
 
 #endif
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index a2c5fa2630bd9f1b95f50681ccea755b5f2f1937..b052a484249e4377c7fa1d037b5621ab2f8b257c 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -4401,6 +4401,11 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, BOOL force_picke
 		LLViewerWindow::sSnapshotDir = gDirUtilp->getDirName(filepath);
 	}
 
+	if(LLViewerWindow::sSnapshotDir.empty())
+	{
+		return FALSE;
+	}
+
 // Check if there is enough free space to save snapshot
 #ifdef LL_WINDOWS
 	boost::filesystem::space_info b_space = boost::filesystem::space(utf8str_to_utf16str(sSnapshotDir));
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 80c6805eaddbf03567714611ffc12ece6e1bc4fe..efcdb07176e86f019ed6ffb9ec53eef30ff0f679 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3417,10 +3417,62 @@ void LLVOAvatar::updateDebugText()
 				std::string output;
 				if (motionp->getName().empty())
 				{
+					std::string name;
+					if (gAgent.isGodlikeWithoutAdminMenuFakery() || isSelf())
+					{
+						name = motionp->getID().asString();
+						LLVOAvatar::AnimSourceIterator anim_it = mAnimationSources.begin();
+						for (; anim_it != mAnimationSources.end(); ++anim_it)
+						{
+							if (anim_it->second == motionp->getID())
+							{
+								LLViewerObject* object = gObjectList.findObject(anim_it->first);
+								if (!object)
+								{
+									break;
+								}
+								if (object->isAvatar())
+								{
+									if (mMotionController.mIsSelf)
+									{
+										// Searching inventory by asset id is really long
+										// so just mark as inventory
+										// Also item is likely to be named by LLPreviewAnim
+										name += "(inventory)";
+									}
+								}
+								else
+								{
+									LLViewerInventoryItem* item = NULL;
+									if (!object->isInventoryDirty())
+									{
+										item = object->getInventoryItemByAsset(motionp->getID());
+									}
+									if (item)
+									{
+										name = item->getName();
+									}
+									else if (object->isAttachment())
+									{
+										name += "(" + getAttachmentItemName() + ")";
+									}
+									else
+									{
+										// in-world object, name or content unknown
+										name += "(in-world)";
+									}
+								}
+								break;
+							}
+						}
+					}
+					else
+					{
+						name = LLUUID::null.asString();
+					}
+
 					output = llformat("%s - %d",
-							  gAgent.isGodlikeWithoutAdminMenuFakery() ?
-							  motionp->getID().asString().c_str() :
-							  LLUUID::null.asString().c_str(),
+							  name.c_str(),
 							  (U32)motionp->getPriority());
 				}
 				else
@@ -5230,10 +5282,6 @@ LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)
 			if (use_new_walk_run)
 				result = ANIM_AGENT_FEMALE_RUN_NEW;
 		}
-		else if (id == ANIM_AGENT_SIT)
-		{
-			result = ANIM_AGENT_SIT_FEMALE;
-		}
 	}
 	else
 	{
@@ -8378,7 +8426,7 @@ void dump_sequential_xml(const std::string outprefix, const LLSD& content)
 {
 	std::string outfilename = get_sequential_numbered_file_name(outprefix,".xml");
 	std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename);
-	std::ofstream ofs(fullpath.c_str(), std::ios_base::out);
+	llofstream ofs(fullpath.c_str(), std::ios_base::out);
 	ofs << LLSDOStreamer<LLSDXMLFormatter>(content, LLSDFormatter::OPTIONS_PRETTY);
 	LL_DEBUGS("Avatar") << "results saved to: " << fullpath << LL_ENDL;
 }
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index d62862dfb8d1b898dbf2c6bf6cc350e9da2838b7..10af524ee72bde470ed13c2b60281cfb05593217 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -2744,7 +2744,7 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const
 //------------------------------------------------------------------------
 void LLVOAvatarSelf::sendHoverHeight() const
 {
-	std::string url = gAgent.getRegion()->getCapability("AgentPreferences");
+	std::string url = gAgent.getRegionCapability("AgentPreferences");
 
 	if (!url.empty())
 	{
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index fd1d57a9d0d367326e216213eeccf1102d0bc4c8..fb28d9bdb5ab31422705ab7c89c652aef1ae9273 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -1093,11 +1093,21 @@ void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version)
 	}
 	mCacheSize = llclamp(size, MIN_ENTRIES_TO_PURGE, MAX_NUM_OBJECT_ENTRIES);
 	mMetaInfo.mVersion = cache_version;
+
+#if defined(ADDRESS_SIZE)
+	U32 expected_address = ADDRESS_SIZE;
+#else
+	U32 expected_address = 32;
+#endif
+	mMetaInfo.mAddressSize = expected_address;
+
 	readCacheHeader();	
 
-	if(mMetaInfo.mVersion != cache_version) 
+	if( mMetaInfo.mVersion != cache_version
+		|| mMetaInfo.mAddressSize != expected_address) 
 	{
 		mMetaInfo.mVersion = cache_version ;
+		mMetaInfo.mAddressSize = expected_address;
 		if(mReadOnly) //disable cache
 		{
 			clearCacheInMemory();
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index 7aabde1b2da66d2ac36360dcaaf7db9080098efd..7d450c5231c9fb7661735ea0893bdc8b1b3628d5 100644
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -237,9 +237,10 @@ class LLVOCache : public LLSingleton<LLVOCache>
 
 	struct HeaderMetaInfo
 	{
-		HeaderMetaInfo() : mVersion(0){}
+		HeaderMetaInfo() : mVersion(0), mAddressSize(0) {}
 
 		U32 mVersion;
+		U32 mAddressSize;
 	};
 
 	struct header_entry_less
@@ -267,6 +268,9 @@ class LLVOCache : public LLSingleton<LLVOCache>
 
 	void setReadOnly(bool read_only) {mReadOnly = read_only;} 
 
+	U32 getCacheEntries() { return mNumEntries; }
+	U32 getCacheEntriesMax() { return mCacheSize; }
+
 private:
 	void setDirNames(ELLPath location);	
 	// determine the cache filename for the region from the region handle	
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index fe497ee3be2d95aaa10e6d0a45621f3d15bdb9ea..285ce298b0878e03dd1c4e4bcf0d016d467b7d9f 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -248,6 +248,7 @@ static bool sMuteListListener_listening = false;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////
 static LLProcessPtr sGatewayPtr;
+static LLEventStream sGatewayPump("VivoxDaemonPump", true);
 
 static bool isGatewayRunning()
 {
@@ -258,6 +259,7 @@ static void killGateway()
 {
 	if (sGatewayPtr)
 	{
+		sGatewayPump.stopListening("VivoxDaemonPump");
 		sGatewayPtr->kill();
 	}
 }
@@ -709,6 +711,19 @@ bool LLVivoxVoiceClient::endAndDisconnectSession()
     return true;
 }
 
+bool LLVivoxVoiceClient::callbackEndDaemon(const LLSD& data)
+{
+    if (!LLAppViewer::isExiting())
+    {
+        terminateAudioSession(false);
+        closeSocket();
+        cleanUp();
+        LLVoiceClient::getInstance()->setUserPTTState(false);
+        gAgent.setVoiceConnected(false);
+    }
+    sGatewayPump.stopListening("VivoxDaemonPump");
+    return false;
+}
 
 bool LLVivoxVoiceClient::startAndLaunchDaemon()
 {
@@ -779,6 +794,9 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
             params.args.add(LLVivoxSecurity::getInstance()->connectorHandle());
 #           endif // VIVOX_HANDLE_ARGS
 
+            params.postend = sGatewayPump.getName();
+            sGatewayPump.listen("VivoxDaemonPump", boost::bind(&LLVivoxVoiceClient::callbackEndDaemon, this, _1));
+
             sGatewayPtr = LLProcess::create(params);
 
             mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost").c_str(), gSavedSettings.getU32("VivoxVoicePort"));
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index dd146033f8a24178ab8359b3dbaa36cdb6ec9329..9d4af85c8ce2306007d26d873cadd63ae31315b4 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -623,6 +623,7 @@ class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>,
     bool startAndConnectSession();
     bool endAndDisconnectSession();
 
+    bool callbackEndDaemon(const LLSD& data);
     bool startAndLaunchDaemon();
     bool provisionVoiceAccount();
     bool establishVoiceConnection();
diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp
index 8026dc3ea8e32212441022fec1b3c9ed2442c716..b816225b072517bc51de2ba1392be260be4575e5 100644
--- a/indra/newview/llweb.cpp
+++ b/indra/newview/llweb.cpp
@@ -192,7 +192,7 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,
 	substitution["CHANNEL"] = LLVersionInfo::getChannel();
 	substitution["GRID"] = LLGridManager::getInstance()->getGridId();
 	substitution["GRID_LOWERCASE"] = utf8str_tolower(LLGridManager::getInstance()->getGridId());
-	substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+	substitution["OS"] = LLOSInfo::instance().getOSStringSimple();
 	substitution["SESSION_ID"] = gAgent.getSessionID();
 	substitution["FIRST_LOGIN"] = gAgent.isFirstLogin();
 
@@ -224,6 +224,22 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,
 	}
 	substitution["PARCEL_ID"] = llformat("%d", parcel_id);
 
+	// find the grid
+	std::string current_grid = LLGridManager::getInstance()->getGridId();
+	std::transform(current_grid.begin(), current_grid.end(), current_grid.begin(), ::tolower);
+	if (current_grid == "agni")
+	{
+		substitution["GRID"] = "secondlife.com";
+	}
+	else if (current_grid == "damballah")
+	{
+		// Staging grid has its own naming scheme.
+		substitution["GRID"] = "secondlife-staging.com";
+	}
+	else
+	{
+		substitution["GRID"] = llformat("%s.lindenlab.com", current_grid.c_str());
+	}
 	// expand all of the substitution strings and escape the url
 	std::string expanded_url = url;
 	LLStringUtil::format(expanded_url, substitution);
diff --git a/indra/newview/llwlhandlers.cpp b/indra/newview/llwlhandlers.cpp
index 87e8c3008e0d98cf5de505351d4897e3db237391..ea65a0c6d96a38bbe1a9d3aed6f4d857e3898608 100644
--- a/indra/newview/llwlhandlers.cpp
+++ b/indra/newview/llwlhandlers.cpp
@@ -74,7 +74,7 @@ void LLEnvironmentRequest::onRegionCapsReceived(const LLUUID& region_id)
 // static
 bool LLEnvironmentRequest::doRequest()
 {
-	std::string url = gAgent.getRegion()->getCapability("EnvironmentSettings");
+	std::string url = gAgent.getRegionCapability("EnvironmentSettings");
 	if (url.empty())
 	{
 		LL_INFOS("WindlightCaps") << "Skipping windlight setting request - we don't have this capability" << LL_ENDL;
@@ -162,7 +162,7 @@ bool LLEnvironmentApply::initiateRequest(const LLSD& content)
 	sLastUpdate = current;
 
 	// Send update request.
-	std::string url = gAgent.getRegion()->getCapability("EnvironmentSettings");
+	std::string url = gAgent.getRegionCapability("EnvironmentSettings");
 	if (url.empty())
 	{
 		LL_WARNS("WindlightCaps") << "Applying windlight settings not supported" << LL_ENDL;
diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp
index e62bb78f8ce43bf524caf25a057ef09e1ef36df2..7bc8af4a0b3413b0f964f5e56138a7ce2f37209a 100644
--- a/indra/newview/llxmlrpclistener.cpp
+++ b/indra/newview/llxmlrpclistener.cpp
@@ -312,7 +312,7 @@ class Poller
         }
         XMLRPC_RequestSetData(request, xparams);
 
-        mTransaction.reset(new LLXMLRPCTransaction(mUri, request));
+        mTransaction.reset(new LLXMLRPCTransaction(mUri, request, true, command.has("http_params")? LLSD(command["http_params"]) : LLSD()));
 		mPreviousStatus = mTransaction->status(NULL);
 
         // Free the XMLRPC_REQUEST object and the attached data values.
diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index dcde89d02fb9b4b475b4e40960319a1709d2b786..143c97fca45150fa0e8ab2729a363f3d29f3eb6a 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -208,7 +208,7 @@ class LLXMLRPCTransaction::Impl
 	std::string         mCertStore;
 	LLSD mErrorCertData;
 
-	Impl(const std::string& uri, XMLRPC_REQUEST request, bool useGzip);
+	Impl(const std::string& uri, XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams);
 	Impl(const std::string& uri,
 		const std::string& method, LLXMLRPCValue params, bool useGzip);
 	~Impl();
@@ -219,7 +219,7 @@ class LLXMLRPCTransaction::Impl
 	void setHttpStatus(const LLCore::HttpStatus &status);
 
 private:
-	void init(XMLRPC_REQUEST request, bool useGzip);
+	void init(XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams);
 };
 
 LLXMLRPCTransaction::Handler::Handler(LLCore::HttpRequest::ptr_t &request, 
@@ -309,13 +309,13 @@ void LLXMLRPCTransaction::Handler::onCompleted(LLCore::HttpHandle handle,
 //=========================================================================
 
 LLXMLRPCTransaction::Impl::Impl(const std::string& uri,
-		XMLRPC_REQUEST request, bool useGzip)
+		XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)
 	: mHttpRequest(),
 	  mStatus(LLXMLRPCTransaction::StatusNotStarted),
 	  mURI(uri),
 	  mResponse(0)
 {
-	init(request, useGzip);
+	init(request, useGzip, httpParams);
 }
 
 
@@ -331,7 +331,7 @@ LLXMLRPCTransaction::Impl::Impl(const std::string& uri,
 	XMLRPC_RequestSetRequestType(request, xmlrpc_request_call);
 	XMLRPC_RequestSetData(request, params.getValue());
 	
-	init(request, useGzip);
+	init(request, useGzip, LLSD());
     // DEV-28398: without this XMLRPC_RequestFree() call, it looks as though
     // the 'request' object is simply leaked. It's less clear to me whether we
     // should also ask to free request value data (second param 1), since the
@@ -339,7 +339,7 @@ LLXMLRPCTransaction::Impl::Impl(const std::string& uri,
     XMLRPC_RequestFree(request, 1);
 }
 
-void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
+void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)
 {
 	LLCore::HttpOptions::ptr_t httpOpts;
 	LLCore::HttpHeaders::ptr_t httpHeaders;
@@ -353,7 +353,15 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
 	// LLRefCounted starts with a 1 ref, so don't add a ref in the smart pointer
 	httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions()); 
 
-	httpOpts->setTimeout(40L);
+	// delay between repeats will start from 5 sec and grow to 20 sec with each repeat
+	httpOpts->setMinBackoff(5E6L);
+	httpOpts->setMaxBackoff(20E6L);
+
+	httpOpts->setTimeout(httpParams.has("timeout") ? httpParams["timeout"].asInteger() : 40L);
+	if (httpParams.has("retries"))
+	{
+		httpOpts->setRetries(httpParams["retries"].asInteger());
+	}
 
 	bool vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert");
 	mCertStore = gSavedSettings.getString("CertStore");
@@ -520,8 +528,8 @@ void LLXMLRPCTransaction::Impl::setHttpStatus(const LLCore::HttpStatus &status)
 
 
 LLXMLRPCTransaction::LLXMLRPCTransaction(
-	const std::string& uri, XMLRPC_REQUEST request, bool useGzip)
-: impl(* new Impl(uri, request, useGzip))
+	const std::string& uri, XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)
+: impl(* new Impl(uri, request, useGzip, httpParams))
 { }
 
 
diff --git a/indra/newview/llxmlrpctransaction.h b/indra/newview/llxmlrpctransaction.h
index 017b72ab5eb889af5f141a554bb5c59bb170359f..8065a2aff33cea59a5b4ced059474d98f87bf7d9 100644
--- a/indra/newview/llxmlrpctransaction.h
+++ b/indra/newview/llxmlrpctransaction.h
@@ -85,7 +85,7 @@ class LLXMLRPCTransaction
 {
 public:
 	LLXMLRPCTransaction(const std::string& uri,
-		XMLRPC_REQUEST request, bool useGzip = true);
+		XMLRPC_REQUEST request, bool useGzip = true, const LLSD& httpParams = LLSD());
 		// does not take ownership of the request object
 		// request can be freed as soon as the transaction is constructed
 
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 2a8eaf26ec4be48ef6665ef4d9f8c4ef04ab9dd2..a113c5cf783a6a9d023e18842f5916411b67d085 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -173,6 +173,7 @@
 	</menu>
 	<menu label="Hilfe" name="Help">
 		<menu_item_call label="Anweisungen..." name="How To"/>
+		<menu_item_call label="Kurzanleitung" name="Quickstart"/>
 		<menu_item_call label="Knowledge Base" name="Knowledge Base"/>
 		<menu_item_call label="Wiki" name="Wiki"/>
 		<menu_item_call label="Community-Foren" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
index 60e4fb19a76fd5cff57410ec89e6a827c537a96f..b8ddc63b93afc7f35d9e116fba7af69a333f6728 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
 	<text name="Cache:">
 		Cache:
 	</text>
-	<spinner label="Cache-Größe (64 – 9.984 MB)" name="cachesizespinner"/>
+	<spinner label="Cache-Größe (256 – 9.984 MB)" name="cachesizespinner"/>
 	<text name="text_box5">
 		MB
 	</text>
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index 1a55dc2e2ce46108413c32671dd27c480783defe..dddb258ed9260f6a4ccf1df6662a54006d482abb 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -15,6 +15,10 @@
      name="not_found">
         &apos;[TEXT]&apos; not found
     </floater.string>
+    <floater.string
+     name="not_found_text">
+        Resident wasn't found.
+    </floater.string>
     <floater.string
      name="no_one_near">
         No one near
diff --git a/indra/newview/skins/default/xui/en/floater_grid_status.xml b/indra/newview/skins/default/xui/en/floater_grid_status.xml
index b97bd8056dc5e347707c332e61bd5e572a15309d..bf782042824b56651d6bdf8b922079368e63b93b 100644
--- a/indra/newview/skins/default/xui/en/floater_grid_status.xml
+++ b/indra/newview/skins/default/xui/en/floater_grid_status.xml
@@ -12,7 +12,6 @@
   save_rect="true"
   save_visibility="true"
   title=""
-  initial_mime_type="text/html"
   width="780"
   tab_stop="true"
   filename="floater_web_content.xml"/>
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
index 519d3e043c59db827072c55be7c1a29f68cf03bf..1b4992b4ca50d44baf53a8ce2741e38567df73fb 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
@@ -2,7 +2,7 @@
 <floater
  legacy_header_height="18"
  can_minimize="false"
- height="440"
+ height="468"
  layout="topleft"
  name="Inventory Finder"
  help_topic="inventory_finder"
@@ -245,11 +245,36 @@
      layout="topleft"
      left="10"
      name="horiz_separator"
-     top_pad="8"
+     top_pad="10"
      width="260"/>
     <check_box
      height="16"
-     top="324"
+     label="Created by me"
+     layout="topleft"
+     left="8"
+     name="check_created_by_me"
+     top_delta="8"
+     width="130" />
+    <check_box
+     height="16"
+     label="Created by others"
+     layout="topleft"
+     left_pad="0"
+     name="check_created_by_others"
+     top_delta="0"
+     width="70" />
+    <view_border
+     bevel_style="none"
+     follows="top|left"
+     height="0"
+     layout="topleft"
+     left="10"
+     name="horiz_separator2"
+     top_pad="10"
+     width="260"/>
+    <check_box
+     height="16"
+     top="352"
      label="Since Logoff"
      layout="topleft"
      left_delta="0"
@@ -265,7 +290,7 @@
      layout="topleft"
      left_delta="0"
      name="- OR -"
-     top="342"
+     top="370"
      width="144">
         - OR -
     </text>
@@ -273,7 +298,7 @@
      height="16"
      layout="topleft"
      name="date_search_direction"
-     top="360"
+     top="388"
      left="8"
      width="270">
      <radio_item
@@ -343,6 +368,6 @@
      layout="topleft"
      name="Close"
      right="-6"
-     top="406"
+     top="434"
      width="76" />
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml
index 4473ce0cdac4cc4bd01a1ad14c4912825606654f..fe9ffba6cd4baebc41f0c7f1f243ab525bf898eb 100644
--- a/indra/newview/skins/default/xui/en/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/en/floater_web_content.xml
@@ -10,7 +10,6 @@
   help_topic="floater_web_content"
   save_rect="true"
   title=""
-  initial_mime_type="text/html"
   width="780">
   <layout_stack
     bottom="775"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index ec9f94733892ea0ec67f63fdcfa32ac9fb8b7e9c..5b453641277a850de949c5fea62647872376e874 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -569,6 +569,14 @@
          function="Inventory.DoToSelected"
          parameter="copy_uuid" />
     </menu_item_call>
+    <menu_item_call
+     label="Show in Main Panel"
+     layout="topleft"
+     name="Show in Main Panel">
+       <menu_item_call.on_click
+        function="Inventory.DoToSelected"
+        parameter="show_in_main_panel" />
+    </menu_item_call>
     <menu_item_separator
      layout="topleft" 
      name="Copy Separator" />
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index a4963edecb87acf4ef314ec4d9fcc3b7b114f30b..002dfd3ab9455f26cf41e2138a0b3ebb01fe9ba3 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -6587,6 +6587,13 @@ Topic: [SUBJECT], Message: [MESSAGE]
 Although you&apos;re very nice, you can&apos;t add yourself as a friend.
   </notification>
 
+  <notification
+   icon="notifytip.tga"
+   name="AddSelfRenderExceptions"
+   type="notifytip">
+You can&apos;t add yourself to the rendering exceptions list.
+  </notification>
+
   <notification
    icon="notifytip.tga"
    name="UploadingAuctionSnapshot"
diff --git a/indra/newview/skins/default/xui/en/panel_active_object_row.xml b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
index 3e3271b181132af98f99e242c1b99170ad4ce007..656171ff960cc5fd5c04e0ee2fc77e6f87716be7 100644
--- a/indra/newview/skins/default/xui/en/panel_active_object_row.xml
+++ b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
@@ -18,15 +18,7 @@
     left="5"
     height="25"
     width="25"
-    visible="false"
-    speaker.name="speaker_p2p"
-    speaker.width="20"
-    speaker.height="25"
-    speaker.left="25"
-    speaker.top="25"
-    speaker.auto_update="true"
-    speaker.draw_border="false"
-    speaker.visible="false">
+    visible="false">
   </chiclet_script>
   <chiclet_offer
     name="inv_offer_chiclet"
@@ -36,15 +28,7 @@
     left="5"
     height="25"
     width="25"
-    visible="false"
-    speaker.name="speaker_p2p"
-    speaker.width="20"
-    speaker.height="25"
-    speaker.left="25"
-    speaker.top="25"
-    speaker.auto_update="true"
-    speaker.draw_border="false"
-    speaker.visible="false">
+    visible="false">
   </chiclet_offer>
 	<text
     type="string"
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 0a85477bf4a383d21e7a9171c22d90c77a65142f..df7039859939380327058890d54099c58640c101 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -41,13 +41,37 @@
    text_pad_left="10"
    follows="left|top|right"
    height="23"
-   label="Filter Inventory"
+   label="Enter search text"
    layout="topleft"
    left="10"
    max_length_chars="300"
    name="inventory search editor"
    top="18"
-   width="303" />
+   width="208" />
+  <combo_box
+   height="23"
+   layout="topleft"
+   left_pad="4"
+   name="search_type"
+   follows="top|right"
+   width="90">
+    <item
+     label="Name"
+     name="Name"
+     value="search_by_name"/>
+    <item
+     label="Creator"
+     name="Creator"
+     value="search_by_creator"/>
+    <item
+     label="Description"
+     name="Description"
+     value="search_by_description"/>
+    <item
+     label="UUID"
+     name="UUID"
+     value="search_by_UUID"/>
+    </combo_box>
   <tab_container
      follows="all"
      halign="center"
@@ -92,6 +116,20 @@
      name="Recent Items"
      show_item_link_overlays="true"
      width="290" />
+       <inventory_panel
+      name="Worn Items"
+      label="WORN"
+      show_empty_message="false"
+      follows="all"
+      layout="topleft"
+      width="290"
+      bg_opaque_color="DkGray2"
+      bg_alpha_color="DkGray2"
+      background_visible="true"
+      border="false"
+      bevel_style="none"
+      scroll.reserve_scroll_corner="false">
+  </inventory_panel>
   </tab_container>
   <layout_stack
    animate="false"
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index e844a15118c7f4570b26ce40ebe1fb22b95385ee..2316beeb36c8cef72fe69dbd28852a079081a0b1 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -193,7 +193,7 @@
    follows="left|top" 
    height="16"
    increment="1" 
-   initial_val="256" 
+   initial_value="256" 
    label="" 
    label_width="0"
    left_delta="68" 
@@ -213,7 +213,7 @@
 	  follows="left|top" 
 	  height="16"
 	  increment="1"
-	  initial_val="256" 
+	  initial_value="256" 
 	  label=""
 	  label_width="0"
 	  left_delta="20" 
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 0cd56af6d7e437d259d1d391ec4b95a762f7e8f1..4f0bb9d3b775cfa3af90215367d6ab7635e803f2 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -32,12 +32,12 @@
    height="23"
    increment="64"
    initial_value="1024"
-   label="Cache size (64 - 9984MB)"
+   label="Cache size (256 - 9984MB)"
    label_width="150"
    layout="topleft"
    left="80"
    max_val="9984"
-   min_val="64"
+   min_val="256"
    top_pad="10"
    name="cachesizespinner"
    width="200" />
@@ -87,7 +87,7 @@
    height="23"
    layout="topleft"
    left="80"
-   max_length="4096"
+   max_length_bytes="4096"
    name="cache_location"
    top_pad="5"
    width="205" />
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 78f771cd516c57ee6134bede4be5f6fbb568c9ae..9e7023d2f2507b123af9137dace39e8516dbaf24 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
     border="true"
-    has_border="true"
     height="408"
     label="Text Chat"
     layout="topleft"
@@ -541,7 +540,7 @@
         height="23"
         layout="topleft"
         left_pad="55"
-        max_length="4096"
+        max_length_bytes="4096"
         name="log_path_string"
         top_delta="-5"
         width="185">
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 99aab42db8f79e5ec7515d137992e5626044dd48..1e6fa7b2c7adf194130b0519fcb324956ff41cba 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -173,6 +173,7 @@
 	</menu>
 	<menu label="Ayuda" name="Help">
 		<menu_item_call label="Cómo..." name="How To"/>
+		<menu_item_call label="Guía rápida" name="Quickstart"/>
 		<menu_item_call label="Base de Conocimientos" name="Knowledge Base"/>
 		<menu_item_call label="Wiki" name="Wiki"/>
 		<menu_item_call label="Foros comunitarios" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
index efa003c17e772cb867b7864dc2b4e3f8b57596ee..4cb816a12054e304d4ecfcf92d3694536839b053 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
 	<text name="Cache:">
 		Caché:
 	</text>
-	<spinner label="Tamaño de la caché (64 - 9984 MB)" name="cachesizespinner"/>
+	<spinner label="Tamaño de la caché (256 - 9984 MB)" name="cachesizespinner"/>
 	<text name="text_box5">
 		MB
 	</text>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 7cbd969ca04f30cffda434004ec96a8dcc9a0f56..2c7b27860d25e1995dbbef4618049e1c4550358e 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -78,7 +78,7 @@ Versión de Voice Server: [VOICE_VERSION]
 		Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
 	</string>
 	<string name="AboutTime">
-		[mes, fecha_hora, slt] [día, fecha_hora, slt] [año, fecha_hora, slt] [hora, fecha_hora, slt]:[min, fecha_hora, slt]:[segundo,fecha_hora,slt]
+		[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
 	</string>
 	<string name="ErrorFetchingServerReleaseNotesURL">
 		Error al obtener la URL de las notas de la versión del servidor.
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 98a69aa043352447faf6c8b80e9ab22fba09b45d..b59eee2539dbb4c8bfff40a6ade44ad486144766 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -173,6 +173,7 @@
 	</menu>
 	<menu label="Aide" name="Help">
 		<menu_item_call label="Aide rapide..." name="How To"/>
+		<menu_item_call label="Démarrage rapide" name="Quickstart"/>
 		<menu_item_call label="Base de connaissances" name="Knowledge Base"/>
 		<menu_item_call label="Wiki" name="Wiki"/>
 		<menu_item_call label="Forums de la communauté" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
index f61dc5aa35931fa0eace938046e8f37037bdd6e2..b96cb6dc49d3698fc01a8e87d059ba2b92a992e8 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
 	<text name="Cache:">
 		Cache :
 	</text>
-	<spinner label="Taille du cache (64 - 9984 Mo)" name="cachesizespinner"/>
+	<spinner label="Taille du cache (256 - 9984 Mo)" name="cachesizespinner"/>
 	<text name="text_box5">
 		Mo
 	</text>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 216af0e45861f6fca75869325050a5e6d994fff3..4e438c3c23d765f2929aa74031c187039d568d54 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -173,6 +173,7 @@
 	</menu>
 	<menu label="Aiuto" name="Help">
 		<menu_item_call label="Istruzioni..." name="How To"/>
+		<menu_item_call label="Guida introduttiva" name="Quickstart"/>
 		<menu_item_call label="Base di conoscenza" name="Knowledge Base"/>
 		<menu_item_call label="Wiki" name="Wiki"/>
 		<menu_item_call label="Forum della comunità" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
index 85cbfb92efca67cae91c0dbd0dd7c86829cf1eb4..87cee345fa17d6db50a76b8506c4ee9e66ab2997 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
 	<text name="Cache:">
 		Cache:
 	</text>
-	<spinner label="Dimensione cache (64 - 9984 MB)" name="cachesizespinner"/>
+	<spinner label="Dimensione cache (256 - 9984 MB)" name="cachesizespinner"/>
 	<text name="text_box5">
 		MB
 	</text>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index a8be8e7616391fb0c6a05f5de36a32d281148df2..c7525478eb5b390ed5a371bdd7e9caf37349d17e 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -173,6 +173,7 @@
 	</menu>
 	<menu label="ヘルプ" name="Help">
 		<menu_item_call label="ハウツー..." name="How To"/>
+		<menu_item_call label="クイックスタート" name="Quickstart"/>
 		<menu_item_call label="ナレッジベース" name="Knowledge Base"/>
 		<menu_item_call label="Wiki" name="Wiki"/>
 		<menu_item_call label="コミュニティフォーラム" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
index 62b8daeb4ef03d44b7ad0949ce8107ae91eb47a2..266809f4dab10c47b93a7d6e6d30336d1c44a5a3 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
 	<text name="Cache:">
 		キャッシュ:
 	</text>
-	<spinner label="キャッシュサイズ(64~9,984MB)" name="cachesizespinner"/>
+	<spinner label="キャッシュサイズ(256~9,984MB)" name="cachesizespinner"/>
 	<text name="text_box5">
 		MB
 	</text>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
index cc85ec20f6c6b3af05c633b86b27534702b9b21a..4609b2f9169952d6a83106b3233719c1dce8461d 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
@@ -3,7 +3,7 @@
 	<text name="Cache:">
 		Pamięć podręczna:
 	</text>
-	<spinner label="Rozmiar (64 - 9984 MB)" name="cachesizespinner" />
+	<spinner label="Rozmiar (256 - 9984 MB)" name="cachesizespinner" />
 	<button label="Wyczyść" label_selected="Wyczyść" name="clear_cache" />
 	<text name="Cache location">
 		Położenie buforu pamięci podręcznej:
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index 542734eb22391092d603635bce6340dabee3b014..4d132447d820165bbf15af791ce75dca16340538 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -173,6 +173,7 @@
 	</menu>
 	<menu label="Ajuda" name="Help">
 		<menu_item_call label="Como..." name="How To"/>
+		<menu_item_call label="Início rápido" name="Quickstart"/>
 		<menu_item_call label="Base de conhecimento" name="Knowledge Base"/>
 		<menu_item_call label="Wiki" name="Wiki"/>
 		<menu_item_call label="Fóruns da comunidade" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
index 15340a9a5fae6027ac776adf6a8527e9d8cd5b66..56065d95a3d3be50a12128cd640bfe64c9d8cd72 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
 	<text name="Cache:">
 		Cache:
 	</text>
-	<spinner label="Cache (64 - 9984 MB)" name="cachesizespinner"/>
+	<spinner label="Cache (256 - 9984 MB)" name="cachesizespinner"/>
 	<text name="text_box5">
 		MB
 	</text>
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
index e0d88612258eb48efe663943530a068270961953..8ac457dea44e2ce15f6650baa707ab5475ca878e 100644
--- a/indra/newview/skins/default/xui/ru/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -170,6 +170,7 @@
 	</menu>
 	<menu label="Справка" name="Help">
 		<menu_item_call label="Инструкции..." name="How To"/>
+		<menu_item_call label="Краткое руководство" name="Quickstart"/>
 		<menu_item_call label="База знаний" name="Knowledge Base"/>
 		<menu_item_call label="Wiki" name="Wiki"/>
 		<menu_item_call label="Форумы сообщества" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml
index 88bcc224143dcc49e2166c94f72613dca09fa735..03295084dc866f03fdaf557eb29689dc75245dae 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
 	<text name="Cache:">
 		Кэш:
 	</text>
-	<spinner label="Размер кэша (64 - 9984 МБ)" name="cachesizespinner"/>
+	<spinner label="Размер кэша (256 - 9984 МБ)" name="cachesizespinner"/>
 	<text name="text_box5">
 		МБ
 	</text>
diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml
index ef001a86875c3f6e5dd2db76d62f08e59945b51b..e6e5a037ac904cc04b365ce7404b5ba4a7653912 100644
--- a/indra/newview/skins/default/xui/tr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml
@@ -171,6 +171,7 @@
 	</menu>
 	<menu label="Yardım" name="Help">
 		<menu_item_call label="Nasıl yapılır..." name="How To"/>
+		<menu_item_call label="Hızlı Başlangıç" name="Quickstart"/>
 		<menu_item_call label="Bilgi Bankası" name="Knowledge Base"/>
 		<menu_item_call label="Wiki" name="Wiki"/>
 		<menu_item_call label="Topluluk Forumları" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml
index c3ac198d08a2572cf2573c462e6d5eedd1ec671a..f8aa17f0c6eef7a788e8c9d979d0820890ff39b7 100644
--- a/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
 	<text name="Cache:">
 		Önbellek:
 	</text>
-	<spinner label="Önbellek boyutu (64-9984 MB)" name="cachesizespinner"/>
+	<spinner label="Önbellek boyutu (256-9984 MB)" name="cachesizespinner"/>
 	<text name="text_box5">
 		MB
 	</text>
diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml
index a58e1bb0fa865ddf70c3ee562aec890bcca5faa9..ede9942f6970f74a7108ecd6b28745e42f0c22dc 100644
--- a/indra/newview/skins/default/xui/zh/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml
@@ -171,6 +171,7 @@
 	</menu>
 	<menu label="幫助" name="Help">
 		<menu_item_call label="簡易教學…" name="How To"/>
+		<menu_item_call label="快速上手" name="Quickstart"/>
 		<menu_item_call label="知識庫" name="Knowledge Base"/>
 		<menu_item_call label="維基" name="Wiki"/>
 		<menu_item_call label="社群論壇" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
index 170cdddb8cc44ad025f2c7adb0fa450e98e5a388..47f1069254f1aba977b1e10761b177e9acac37c6 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
 	<text name="Cache:">
 		快取:
 	</text>
-	<spinner label="快取大小 (64 - 9984MB)" name="cachesizespinner"/>
+	<spinner label="快取大小 (256 - 9984MB)" name="cachesizespinner"/>
 	<text name="text_box5">
 		MB
 	</text>
diff --git a/indra/test/test.cpp b/indra/test/test.cpp
index 8e5529e46aaae596369eb1761295773b81519118..80c84d9beaae0a95b0ebdfcf09ddcf146f76efb9 100644
--- a/indra/test/test.cpp
+++ b/indra/test/test.cpp
@@ -136,7 +136,7 @@ class RecordToTempFile : public LLError::Recorder, public boost::noncopyable
 
 private:
 	NamedTempFile mTempFile;
-	std::ofstream mFile;
+	llofstream mFile;
 };
 
 class LLReplayLogReal: public LLReplayLog, public boost::noncopyable
@@ -569,7 +569,7 @@ int main(int argc, char **argv)
 	apr_status_t apr_err;
 	const char* opt_arg = NULL;
 	int opt_id = 0;
-	boost::scoped_ptr<std::ofstream> output;
+	boost::scoped_ptr<llofstream> output;
 	const char *touch = NULL;
 
 	while(true)
@@ -599,7 +599,7 @@ int main(int argc, char **argv)
 				verbose_mode = true;
 				break;
 			case 'o':
-				output.reset(new std::ofstream);
+				output.reset(new llofstream);
 				output->open(opt_arg);
 				break;
 			case 's':	// --sourcedir
@@ -673,7 +673,7 @@ int main(int argc, char **argv)
 
 	if (touch && success)
 	{
-		std::ofstream s;
+		llofstream s;
 		s.open(touch);
 		s << "ok" << std::endl;
 		s.close();
diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp
index 167acf6ac7b623745613429b08022ea8db981797..267224a79bfe4b7ab4282081be0b7688198357aa 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.cpp
+++ b/indra/win_crash_logger/llcrashloggerwindows.cpp
@@ -377,7 +377,7 @@ bool LLCrashLoggerWindows::initCrashServer()
 	std::wstring wpipe_name;
 	wpipe_name = mCrashReportPipeStr + std::wstring(wstringize(mPID));
 
-	std::wstring wdump_path( wstringize(dump_path) );
+	std::wstring wdump_path(utf8str_to_utf16str(dump_path));
 		
 	//Pipe naming conventions:  http://msdn.microsoft.com/en-us/library/aa365783%28v=vs.85%29.aspx
 	mCrashHandler = new CrashGenerationServer( wpipe_name,
diff --git a/indra/win_crash_logger/win_crash_logger.cpp b/indra/win_crash_logger/win_crash_logger.cpp
index 7466dbb76638a131d86d4f353a019ccd43d06eff..58746eba02559fc9becbb21d1c620bd2ff381a17 100644
--- a/indra/win_crash_logger/win_crash_logger.cpp
+++ b/indra/win_crash_logger/win_crash_logger.cpp
@@ -29,15 +29,26 @@
 #include <stdlib.h>
 #include "llcrashloggerwindows.h"
 
+#ifdef _UNICODE
+int APIENTRY wWinMain(HINSTANCE hInstance,
+                      HINSTANCE hPrevInstance,
+                      LPWSTR    lpCmdLine,
+                      int       nCmdShow)
+#else
 int APIENTRY WinMain(HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPSTR     lpCmdLine,
                      int       nCmdShow)
+#endif //_UNICODE
 {
 	LL_INFOS() << "Starting crash reporter with args" << &lpCmdLine << LL_ENDL;
 	LLCrashLoggerWindows app;
 	app.setHandle(hInstance);
+#ifdef _UNICODE
+	app.parseCommandOptions(__argc, __wargv);
+#else
 	app.parseCommandOptions(__argc, __argv);
+#endif //_UNICODE
 
 	LLSD options = LLApp::instance()->getOptionData(
                    LLApp::PRIORITY_COMMAND_LINE);