diff --git a/.hgtags b/.hgtags
index c36ce93d0e16c756c78f8a5f20b24b6cd5732cc5..0f990fc3b913e3a6a3630033ed24e0328217b292 100755
--- a/.hgtags
+++ b/.hgtags
@@ -480,3 +480,4 @@ d076568ff7883b41c149e6afb421f39c29dbfe2b 3.7.4-release
 fc066b82343fca51f9c1b8eda0abc6bee9bb4503 3.7.5-release
 d029faf69f20a23007f32420a1ac6a3b89a6d441 3.7.6-release
 83959480cb986522d07b151a0c778ab7f920d41b 3.7.7-release
+bba9b3722eea08949e4ff69591f736bf0f808434 3.7.8-release
diff --git a/indra/cmake/FMODEX.cmake b/indra/cmake/FMODEX.cmake
index 163260137bcf4af312ca0486dcddb1c720b34e6e..65bc1cabeb8fd77340ea80cf78d50dd1c7bd5d75 100644
--- a/indra/cmake/FMODEX.cmake
+++ b/indra/cmake/FMODEX.cmake
@@ -39,7 +39,7 @@ if (FMODEX)
             optimized fmodex)
       endif (WINDOWS)
       set(FMODEX_LIBRARIES ${FMODEX_LIBRARY})
-      set(FMODEX_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/)
+      set(FMODEX_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/fmodex)
     endif (FMODEX_LIBRARY AND FMODEX_INCLUDE_DIR)
   endif (STANDALONE)
 endif (FMODEX)
diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp
index 27add74b2680025407ed85587ec6369d90f63a2a..20a7afc748edca6b14535ae4a48559d1a93b31e0 100755
--- a/indra/llaudio/llaudiodecodemgr.cpp
+++ b/indra/llaudio/llaudiodecodemgr.cpp
@@ -572,9 +572,14 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs)
 				// We had an error when decoding, abort.
 				LL_WARNS("AudioEngine") << mCurrentDecodep->getUUID() << " has invalid vorbis data, aborting decode" << LL_ENDL;
 				mCurrentDecodep->flushBadFile();
-				LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID());
-				adp->setHasValidData(false);
-				adp->setHasCompletedDecode(true);
+
+				if (gAudiop)
+				{
+					LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID());
+					adp->setHasValidData(false);
+					adp->setHasCompletedDecode(true);
+				}
+
 				mCurrentDecodep = NULL;
 				done = TRUE;
 			}
@@ -586,7 +591,7 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs)
 			}
 			else if (mCurrentDecodep)
 			{
-				if (mCurrentDecodep->finishDecode())
+				if (gAudiop && mCurrentDecodep->finishDecode())
 				{
 					// We finished!
 					LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID());
@@ -628,7 +633,7 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs)
 				LLUUID uuid;
 				uuid = mDecodeQueue.front();
 				mDecodeQueue.pop_front();
-				if (gAudiop->hasDecodedFile(uuid))
+				if (!gAudiop || gAudiop->hasDecodedFile(uuid))
 				{
 					// This file has already been decoded, don't decode it again.
 					continue;
@@ -674,7 +679,7 @@ void LLAudioDecodeMgr::processQueue(const F32 num_secs)
 
 BOOL LLAudioDecodeMgr::addDecodeRequest(const LLUUID &uuid)
 {
-	if (gAudiop->hasDecodedFile(uuid))
+	if (gAudiop && gAudiop->hasDecodedFile(uuid))
 	{
 		// Already have a decoded version, don't need to decode it.
 		LL_DEBUGS("AudioEngine") << "addDecodeRequest for " << uuid << " has decoded file already" << LL_ENDL;
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp
index 5fc5e2ac46c01f05e2e52ac22260f191dde73733..f49028aad51955fbc5a606cda3ebcf9f2985e43e 100755
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -674,8 +674,8 @@ void LLAudioEngine::cleanupBuffer(LLAudioBuffer *bufferp)
 bool LLAudioEngine::preloadSound(const LLUUID &uuid)
 {
 	LL_DEBUGS("AudioEngine")<<"( "<<uuid<<" )"<<LL_ENDL;
-	
-	gAudiop->getAudioData(uuid);	// We don't care about the return value, this is just to make sure
+
+	getAudioData(uuid);	// We don't care about the return value, this is just to make sure
 									// that we have an entry, which will mean that the audio engine knows about this
 
 	if (gAudioDecodeMgrp->addDecodeRequest(uuid))
@@ -828,7 +828,7 @@ void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_i
 	source_id.generate();
 
 	LLAudioSource *asp = new LLAudioSource(source_id, owner_id, gain, type);
-	gAudiop->addAudioSource(asp);
+	addAudioSource(asp);
 	if (pos_global.isExactlyZero())
 	{
 		asp->setAmbient(true);
@@ -1212,8 +1212,8 @@ void LLAudioEngine::startNextTransfer()
 	if (asset_id.notNull())
 	{
 		LL_INFOS() << "Getting asset data for: " << asset_id << LL_ENDL;
-		gAudiop->mCurrentTransfer = asset_id;
-		gAudiop->mCurrentTransferTimer.reset();
+		mCurrentTransfer = asset_id;
+		mCurrentTransferTimer.reset();
 		gAssetStorage->getAssetData(asset_id, LLAssetType::AT_SOUND,
 									assetCallback, NULL);
 	}
@@ -1227,6 +1227,12 @@ void LLAudioEngine::startNextTransfer()
 // static
 void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status)
 {
+	if (!gAudiop)
+	{
+		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+		return;
+	}
+
 	if (result_code)
 	{
 		LL_INFOS() << "Boom, error in audio file transfer: " << LLAssetStorage::getErrorString( result_code ) << " (" << result_code << ")" << LL_ENDL;
@@ -1351,7 +1357,12 @@ void LLAudioSource::updatePriority()
 		// Priority is based on distance
 		LLVector3 dist_vec;
 		dist_vec.setVec(getPositionGlobal());
-		dist_vec -= gAudiop->getListenerPos();
+
+		if (gAudiop)
+		{
+			dist_vec -= gAudiop->getListenerPos();
+		}
+
 		F32 dist_squared = llmax(1.f, dist_vec.magVecSquared());
 
 		mPriority = mGain / dist_squared;
@@ -1369,6 +1380,11 @@ bool LLAudioSource::setupChannel()
 		return false;
 	}
 
+	if (!gAudiop)
+	{
+		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+		return false;
+	}
 
 	if (!mChannelp)
 	{
@@ -1412,6 +1428,12 @@ bool LLAudioSource::play(const LLUUID &audio_uuid)
 	// Reset our age timeout if someone attempts to play the source.
 	mAgeTimer.reset();
 
+	if (!gAudiop)
+	{
+		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+		return false;
+	}
+
 	LLAudioData *adp = gAudiop->getAudioData(audio_uuid);
 	addAudioData(adp);
 
@@ -1519,6 +1541,13 @@ void LLAudioSource::addAudioData(LLAudioData *adp, const bool set_current)
 {
 	// Only handle a single piece of audio data associated with a source right now,
 	// until I implement prefetch.
+
+	if (!gAudiop)
+	{
+		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+		return;
+	}
+
 	if (set_current)
 	{
 		if (!mCurrentDatap)
@@ -1689,6 +1718,12 @@ void LLAudioChannel::setSource(LLAudioSource *sourcep)
 
 bool LLAudioChannel::updateBuffer()
 {
+	if (!gAudiop)
+	{
+		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+		return false;
+	}
+
 	if (!mCurrentSourcep)
 	{
 		// This channel isn't associated with any source, nothing
@@ -1697,10 +1732,7 @@ bool LLAudioChannel::updateBuffer()
 	}
 
 	// Initialize the channel's gain setting for this sound.
-	if(gAudiop)
-	{
-		setSecondaryGain(gAudiop->getSecondaryGain(mCurrentSourcep->getType()));
-	}
+	setSecondaryGain(gAudiop->getSecondaryGain(mCurrentSourcep->getType()));
 
 	LLAudioBuffer *bufferp = mCurrentSourcep->getCurrentBuffer();
 	if (bufferp == mCurrentBufferp)
@@ -1757,8 +1789,14 @@ LLAudioData::LLAudioData(const LLUUID &uuid) :
 		// This is a null sound.
 		return;
 	}
+
+	if (!gAudiop)
+	{
+		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+		return;
+	}
 	
-	if (gAudiop && gAudiop->hasDecodedFile(uuid))
+	if (gAudiop->hasDecodedFile(uuid))
 	{
 		// Already have a decoded version, don't need to decode it.
 		setHasLocalData(true);
@@ -1781,6 +1819,12 @@ bool LLAudioData::load()
 		LL_INFOS() << "Already have a buffer for this sound, don't bother loading!" << LL_ENDL;
 		return true;
 	}
+
+	if (!gAudiop)
+	{
+		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+		return false;
+	}
 	
 	mBufferp = gAudiop->getFreeBuffer();
 	if (!mBufferp)
diff --git a/indra/llcommon/llinitparam.h b/indra/llcommon/llinitparam.h
index 880cd0a37083983009ddf3f52f45bfdb1b94870c..25325663191cac0094207b80328fc7dec86ae31a 100755
--- a/indra/llcommon/llinitparam.h
+++ b/indra/llcommon/llinitparam.h
@@ -502,10 +502,10 @@ namespace LLInitParam
 			{
 				return found_it->second(*this, (void*)&param);
 			}
-			
+
 			return false;
 		}
-			
+
 		template <typename T> bool readValue(T& param, typename boost::enable_if<boost::is_enum<T> >::type* dummy = 0)
 		{
 			parser_read_func_map_t::iterator found_it = mParserReadFuncs->find(&typeid(T));
@@ -522,20 +522,20 @@ namespace LLInitParam
 					bool parsed = found_it->second(*this, (void*)&int_value);
 					param = (T)int_value;
 					return parsed;
-					}
 				}
-				return false;
 			}
+			return false;
+		}
 
 		template <typename T> bool writeValue(const T& param, name_stack_t& name_stack)
-			{
+		{
 			parser_write_func_map_t::iterator found_it = mParserWriteFuncs->find(&typeid(T));
 			if (found_it != mParserWriteFuncs->end())
-				{
+			{
 				return found_it->second(*this, (const void*)&param, name_stack);
-				}
-				return false;
 			}
+			return false;
+		}
 
 		// dispatch inspection to registered inspection functions, for each parameter in a param block
 		template <typename T> bool inspectValue(name_stack_t& name_stack, S32 min_count, S32 max_count, const possible_values_t* possible_values)
diff --git a/indra/llmath/v3dmath.h b/indra/llmath/v3dmath.h
index 578dcdc8ea5e1d85d425cc6947668b0e530b7a66..cab4c93a9f90661c29564747cf57ddbae2196a3c 100755
--- a/indra/llmath/v3dmath.h
+++ b/indra/llmath/v3dmath.h
@@ -101,25 +101,25 @@ class LLVector3d
 		F64 operator[](int idx) const { return mdV[idx]; }
 		F64 &operator[](int idx) { return mdV[idx]; }
 
-		friend LLVector3d operator+(const LLVector3d &a, const LLVector3d &b);	// Return vector a + b
-		friend LLVector3d operator-(const LLVector3d &a, const LLVector3d &b);	// Return vector a minus b
-		friend F64 operator*(const LLVector3d &a, const LLVector3d &b);		// Return a dot b
-		friend LLVector3d operator%(const LLVector3d &a, const LLVector3d &b);	// Return a cross b
-		friend LLVector3d operator*(const LLVector3d &a, const F64 k);				// Return a times scaler k
-		friend LLVector3d operator/(const LLVector3d &a, const F64 k);				// Return a divided by scaler k
-		friend LLVector3d operator*(const F64 k, const LLVector3d &a);				// Return a times scaler k
-		friend bool operator==(const LLVector3d &a, const LLVector3d &b);		// Return a == b
-		friend bool operator!=(const LLVector3d &a, const LLVector3d &b);		// Return a != b
-
-		friend const LLVector3d& operator+=(LLVector3d &a, const LLVector3d &b);	// Return vector a + b
-		friend const LLVector3d& operator-=(LLVector3d &a, const LLVector3d &b);	// Return vector a minus b
-		friend const LLVector3d& operator%=(LLVector3d &a, const LLVector3d &b);	// Return a cross b
-		friend const LLVector3d& operator*=(LLVector3d &a, const F64 k);				// Return a times scaler k
-		friend const LLVector3d& operator/=(LLVector3d &a, const F64 k);				// Return a divided by scaler k
-
-		friend LLVector3d operator-(const LLVector3d &a);					// Return vector -a
-
-		friend std::ostream&	 operator<<(std::ostream& s, const LLVector3d &a);		// Stream a
+		friend LLVector3d operator+(const LLVector3d& a, const LLVector3d& b);	// Return vector a + b
+		friend LLVector3d operator-(const LLVector3d& a, const LLVector3d& b);	// Return vector a minus b
+		friend F64 operator*(const LLVector3d& a, const LLVector3d& b);		// Return a dot b
+		friend LLVector3d operator%(const LLVector3d& a, const LLVector3d& b);	// Return a cross b
+		friend LLVector3d operator*(const LLVector3d& a, const F64 k);				// Return a times scaler k
+		friend LLVector3d operator/(const LLVector3d& a, const F64 k);				// Return a divided by scaler k
+		friend LLVector3d operator*(const F64 k, const LLVector3d& a);				// Return a times scaler k
+		friend bool operator==(const LLVector3d& a, const LLVector3d& b);		// Return a == b
+		friend bool operator!=(const LLVector3d& a, const LLVector3d& b);		// Return a != b
+
+		friend const LLVector3d& operator+=(LLVector3d& a, const LLVector3d& b);	// Return vector a + b
+		friend const LLVector3d& operator-=(LLVector3d& a, const LLVector3d& b);	// Return vector a minus b
+		friend const LLVector3d& operator%=(LLVector3d& a, const LLVector3d& b);	// Return a cross b
+		friend const LLVector3d& operator*=(LLVector3d& a, const F64 k);				// Return a times scaler k
+		friend const LLVector3d& operator/=(LLVector3d& a, const F64 k);				// Return a divided by scaler k
+
+		friend LLVector3d operator-(const LLVector3d& a);					// Return vector -a
+
+		friend std::ostream&	 operator<<(std::ostream& s, const LLVector3d& a);		// Stream a
 
 		static BOOL parseVector3d(const std::string& buf, LLVector3d* value);
 
@@ -298,59 +298,59 @@ inline F64	LLVector3d::lengthSquared(void) const
 	return mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2];
 }
 
-inline LLVector3d operator+(const LLVector3d &a, const LLVector3d &b)
+inline LLVector3d operator+(const LLVector3d& a, const LLVector3d& b)
 {
 	LLVector3d c(a);
 	return c += b;
 }
 
-inline LLVector3d operator-(const LLVector3d &a, const LLVector3d &b)
+inline LLVector3d operator-(const LLVector3d& a, const LLVector3d& b)
 {
 	LLVector3d c(a);
 	return c -= b;
 }
 
-inline F64  operator*(const LLVector3d &a, const LLVector3d &b)
+inline F64  operator*(const LLVector3d& a, const LLVector3d& b)
 {
 	return (a.mdV[0]*b.mdV[0] + a.mdV[1]*b.mdV[1] + a.mdV[2]*b.mdV[2]);
 }
 
-inline LLVector3d operator%(const LLVector3d &a, const LLVector3d &b)
+inline LLVector3d operator%(const LLVector3d& a, const LLVector3d& b)
 {
 	return LLVector3d( a.mdV[1]*b.mdV[2] - b.mdV[1]*a.mdV[2], a.mdV[2]*b.mdV[0] - b.mdV[2]*a.mdV[0], a.mdV[0]*b.mdV[1] - b.mdV[0]*a.mdV[1] );
 }
 
-inline LLVector3d operator/(const LLVector3d &a, const F64 k)
+inline LLVector3d operator/(const LLVector3d& a, const F64 k)
 {
 	F64 t = 1.f / k;
 	return LLVector3d( a.mdV[0] * t, a.mdV[1] * t, a.mdV[2] * t );
 }
 
-inline LLVector3d operator*(const LLVector3d &a, const F64 k)
+inline LLVector3d operator*(const LLVector3d& a, const F64 k)
 {
 	return LLVector3d( a.mdV[0] * k, a.mdV[1] * k, a.mdV[2] * k );
 }
 
-inline LLVector3d operator*(F64 k, const LLVector3d &a)
+inline LLVector3d operator*(F64 k, const LLVector3d& a)
 {
 	return LLVector3d( a.mdV[0] * k, a.mdV[1] * k, a.mdV[2] * k );
 }
 
-inline bool operator==(const LLVector3d &a, const LLVector3d &b)
+inline bool operator==(const LLVector3d& a, const LLVector3d& b)
 {
 	return (  (a.mdV[0] == b.mdV[0])
 			&&(a.mdV[1] == b.mdV[1])
 			&&(a.mdV[2] == b.mdV[2]));
 }
 
-inline bool operator!=(const LLVector3d &a, const LLVector3d &b)
+inline bool operator!=(const LLVector3d& a, const LLVector3d& b)
 {
 	return (  (a.mdV[0] != b.mdV[0])
 			||(a.mdV[1] != b.mdV[1])
 			||(a.mdV[2] != b.mdV[2]));
 }
 
-inline const LLVector3d& operator+=(LLVector3d &a, const LLVector3d &b)
+inline const LLVector3d& operator+=(LLVector3d& a, const LLVector3d& b)
 {
 	a.mdV[0] += b.mdV[0];
 	a.mdV[1] += b.mdV[1];
@@ -358,7 +358,7 @@ inline const LLVector3d& operator+=(LLVector3d &a, const LLVector3d &b)
 	return a;
 }
 
-inline const LLVector3d& operator-=(LLVector3d &a, const LLVector3d &b)
+inline const LLVector3d& operator-=(LLVector3d& a, const LLVector3d& b)
 {
 	a.mdV[0] -= b.mdV[0];
 	a.mdV[1] -= b.mdV[1];
@@ -366,14 +366,14 @@ inline const LLVector3d& operator-=(LLVector3d &a, const LLVector3d &b)
 	return a;
 }
 
-inline const LLVector3d& operator%=(LLVector3d &a, const LLVector3d &b)
+inline const LLVector3d& operator%=(LLVector3d& a, const LLVector3d& b)
 {
 	LLVector3d ret( a.mdV[1]*b.mdV[2] - b.mdV[1]*a.mdV[2], a.mdV[2]*b.mdV[0] - b.mdV[2]*a.mdV[0], a.mdV[0]*b.mdV[1] - b.mdV[0]*a.mdV[1]);
 	a = ret;
 	return a;
 }
 
-inline const LLVector3d& operator*=(LLVector3d &a, const F64 k)
+inline const LLVector3d& operator*=(LLVector3d& a, const F64 k)
 {
 	a.mdV[0] *= k;
 	a.mdV[1] *= k;
@@ -381,7 +381,7 @@ inline const LLVector3d& operator*=(LLVector3d &a, const F64 k)
 	return a;
 }
 
-inline const LLVector3d& operator/=(LLVector3d &a, const F64 k)
+inline const LLVector3d& operator/=(LLVector3d& a, const F64 k)
 {
 	F64 t = 1.f / k;
 	a.mdV[0] *= t;
@@ -390,12 +390,12 @@ inline const LLVector3d& operator/=(LLVector3d &a, const F64 k)
 	return a;
 }
 
-inline LLVector3d operator-(const LLVector3d &a)
+inline LLVector3d operator-(const LLVector3d& a)
 {
 	return LLVector3d( -a.mdV[0], -a.mdV[1], -a.mdV[2] );
 }
 
-inline F64	dist_vec(const LLVector3d &a, const LLVector3d &b)
+inline F64	dist_vec(const LLVector3d& a, const LLVector3d& b)
 {
 	F64 x = a.mdV[0] - b.mdV[0];
 	F64 y = a.mdV[1] - b.mdV[1];
@@ -403,7 +403,7 @@ inline F64	dist_vec(const LLVector3d &a, const LLVector3d &b)
 	return (F32) sqrt( x*x + y*y + z*z );
 }
 
-inline F64	dist_vec_squared(const LLVector3d &a, const LLVector3d &b)
+inline F64	dist_vec_squared(const LLVector3d& a, const LLVector3d& b)
 {
 	F64 x = a.mdV[0] - b.mdV[0];
 	F64 y = a.mdV[1] - b.mdV[1];
@@ -411,14 +411,14 @@ inline F64	dist_vec_squared(const LLVector3d &a, const LLVector3d &b)
 	return x*x + y*y + z*z;
 }
 
-inline F64	dist_vec_squared2D(const LLVector3d &a, const LLVector3d &b)
+inline F64	dist_vec_squared2D(const LLVector3d& a, const LLVector3d& b)
 {
 	F64 x = a.mdV[0] - b.mdV[0];
 	F64 y = a.mdV[1] - b.mdV[1];
 	return x*x + y*y;
 }
 
-inline LLVector3d lerp(const LLVector3d &a, const LLVector3d &b, const F64 u)
+inline LLVector3d lerp(const LLVector3d& a, const LLVector3d& b, const F64 u)
 {
 	return LLVector3d(
 		a.mdV[VX] + (b.mdV[VX] - a.mdV[VX]) * u,
@@ -450,7 +450,7 @@ inline F64 angle_between(const LLVector3d& a, const LLVector3d& b)
 	return angle;
 }
 
-inline BOOL are_parallel(const LLVector3d &a, const LLVector3d &b, const F64 epsilon)
+inline BOOL are_parallel(const LLVector3d& a, const LLVector3d& b, const F64 epsilon)
 {
 	LLVector3d an = a;
 	LLVector3d bn = b;
@@ -465,11 +465,22 @@ inline BOOL are_parallel(const LLVector3d &a, const LLVector3d &b, const F64 eps
 
 }
 
-inline LLVector3d projected_vec(const LLVector3d &a, const LLVector3d &b)
+inline LLVector3d projected_vec(const LLVector3d& a, const LLVector3d& b)
 {
 	LLVector3d project_axis = b;
 	project_axis.normalize();
 	return project_axis * (a * project_axis);
 }
 
+inline LLVector3d inverse_projected_vec(const LLVector3d& a, const LLVector3d& b)
+{
+	LLVector3d normalized_a = a;
+	normalized_a.normalize();
+	LLVector3d normalized_b = b;
+	F64 b_length = normalized_b.normalize();
+
+	F64 dot_product = normalized_a * normalized_b;
+	return normalized_a * (b_length / dot_product);
+}
+
 #endif // LL_V3DMATH_H
diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h
index 0432aeba4cca1a9bba7cfb77ce16d7042aa6bc51..c807a30f7bb0db33635397d8fcdb99c7e581565f 100755
--- a/indra/llmath/v3math.h
+++ b/indra/llmath/v3math.h
@@ -159,6 +159,9 @@ F32	dist_vec(const LLVector3 &a, const LLVector3 &b);		// Returns distance betwe
 F32	dist_vec_squared(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b
 F32	dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b ignoring Z component
 LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b
+// Returns a vector in direction of a, such that when projected onto b, gives you the same value as b
+// in other words: projected_vec(inverse_projected_vec(a, b), b) == b;
+LLVector3 inverse_projected_vec(const LLVector3 &a, const LLVector3 &b); 
 LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b (same as projected_vec)
 LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b); // Returns component of vector a not parallel to vector b (same as projected_vec)
 LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vector that is a linear interpolation between a and b
@@ -495,6 +498,18 @@ inline LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b)
 	return project_axis * (a * project_axis);
 }
 
+inline LLVector3 inverse_projected_vec(const LLVector3& a, const LLVector3& b)
+{
+	LLVector3 normalized_a = a;
+	normalized_a.normalize();
+	LLVector3 normalized_b = b;
+	F32 b_length = normalized_b.normalize();
+
+	F32 dot_product = normalized_a * normalized_b;
+	//NB: if a _|_ b, then returns an infinite vector
+	return normalized_a * (b_length / dot_product);
+}
+
 inline LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b)
 {
 	return projected_vec(a, b);
diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h
index 1cf940918b72ff4b8aaa0a89977d8714b7f58080..40d7b04a9042c7fa6b4b3879f8007b9e6b58177c 100755
--- a/indra/llmessage/llregionflags.h
+++ b/indra/llmessage/llregionflags.h
@@ -76,6 +76,8 @@ const U64 REGION_FLAGS_DENY_ANONYMOUS			= (1 << 23);
 
 const U64 REGION_FLAGS_ALLOW_PARCEL_CHANGES		= (1 << 26);
 
+const U64 REGION_FLAGS_BLOCK_FLYOVER = (1 << 27);
+
 const U64 REGION_FLAGS_ALLOW_VOICE = (1 << 28);
 
 const U64 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29);
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 847b1d8385d7537973d2c3e0e9b2739b4490585f..b0456e3ccf45b6032306e55fbf530538582bea10 100755
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -170,6 +170,11 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
 		return LLModel::BAD_ELEMENT;
 	}
 
+	if (!pos_source)
+	{
+		llwarns << "Unable to process mesh without position data; invalid model;  invalid model." << llendl;
+		return LLModel::BAD_ELEMENT;
+	}
 	
 	domPRef p = tri->getP();
 	domListOfUInts& idx = p->getValue();
@@ -179,19 +184,22 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
 	domListOfFloats& tc = tc_source ? tc_source->getFloat_array()->getValue() : dummy ;
 	domListOfFloats& n = norm_source ? norm_source->getFloat_array()->getValue() : dummy ;
 
-	if (pos_source)
-	{
-		face.mExtents[0].set(v[0], v[1], v[2]);
-		face.mExtents[1].set(v[0], v[1], v[2]);
-	}
-	
 	LLVolumeFace::VertexMapData::PointMap point_map;
-	
+		
 	U32 index_count  = idx.getCount();
 	U32 vertex_count = pos_source  ? v.getCount()  : 0;
 	U32 tc_count     = tc_source   ? tc.getCount() : 0;
 	U32 norm_count   = norm_source ? n.getCount()  : 0;
 
+	if (vertex_count == 0)
+	{
+		llwarns << "Unable to process mesh with empty position array; invalid model." << llendl;
+		return LLModel::BAD_ELEMENT;
+	}
+
+	face.mExtents[0].set(v[0], v[1], v[2]);
+	face.mExtents[1].set(v[0], v[1], v[2]);
+	
 	for (U32 i = 0; i < index_count; i += idx_stride)
 	{
 		LLVolumeFace::VertexData cv;
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index 53f2e15ed0a21a03ccc0a42bf57c62166dd01a72..b92e29834892085a836652bb11b926e720f31528 100755
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -629,6 +629,8 @@ bool LLFolderView::startDrag()
 void LLFolderView::commitRename( const LLSD& data )
 {
 	finishRenamingItem();
+	arrange( NULL, NULL );
+
 }
 
 void LLFolderView::draw()
@@ -1606,19 +1608,21 @@ void LLFolderView::update()
         return;
     }
 
-	if (getFolderViewModel()->getFilter().isModified() && getFolderViewModel()->getFilter().isNotDefault())
+	LLFolderViewFilter& filter_object = getFolderViewModel()->getFilter();
+
+	if (filter_object.isModified() && filter_object.isNotDefault())
 	{
 		mNeedsAutoSelect = TRUE;
 	}
     
 	// Filter to determine visibility before arranging
-	filter(getFolderViewModel()->getFilter());
+	filter(filter_object);
     
 	// Clear the modified setting on the filter only if the filter finished after running the filter process
 	// Note: if the filter count has timed out, that means the filter halted before completing the entire set of items
-    if (getFolderViewModel()->getFilter().isModified() && (!getFolderViewModel()->getFilter().isTimedOut()))
+    if (filter_object.isModified() && (!filter_object.isTimedOut()))
 	{
-		getFolderViewModel()->getFilter().clearModified();
+		filter_object.clearModified();
 	}
 
 	// automatically show matching items, and select first one if we had a selection
@@ -1637,7 +1641,7 @@ void LLFolderView::update()
 
 		// Open filtered folders for folder views with mAutoSelectOverride=TRUE.
 		// Used by LLPlacesFolderView.
-		if (getFolderViewModel()->getFilter().showAllResults())
+		if (filter_object.showAllResults())
 		{
 			// these are named variables to get around gcc not binding non-const references to rvalues
 			// and functor application is inherently non-const to allow for stateful functors
diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h
index f188fdd0dcc3d1b49f84b708d830b31a54308aa8..08e0a6220a7fcf30f84fccd32c61bfb958e46737 100755
--- a/indra/llui/llfolderview.h
+++ b/indra/llui/llfolderview.h
@@ -235,7 +235,7 @@ class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler
 	virtual S32	notify(const LLSD& info) ;
 	
 	bool useLabelSuffix() { return mUseLabelSuffix; }
-	void updateMenu();
+	virtual void updateMenu();
 
     // Note: We may eventually have to move that method up the hierarchy to LLFolderViewItem.
 	LLHandle<LLFolderView>	getHandle() const { return getDerivedHandle<LLFolderView>(); }
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index c665dce509780f8ae47af70ffcb290f7a766b8e6..8d98363c5fd59c1e520abe6d0ae2b4906126a11e 100755
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -393,27 +393,36 @@ template <typename SORT_TYPE, typename ITEM_TYPE, typename FOLDER_TYPE, typename
 class LLFolderViewModel : public LLFolderViewModelCommon
 {
 public:
-	LLFolderViewModel(){}
-	virtual ~LLFolderViewModel() {}
-
 	typedef SORT_TYPE		SortType;
 	typedef ITEM_TYPE		ItemType;
 	typedef FOLDER_TYPE		FolderType;
 	typedef FILTER_TYPE		FilterType;
 
-	virtual SortType& getSorter()					 { return mSorter; }
-	virtual const SortType& getSorter() const 		 { return mSorter; }
-	virtual void setSorter(const SortType& sorter) 	 { mSorter = sorter; requestSortAll(); }
+	LLFolderViewModel(SortType* sorter, FilterType* filter) 
+	:	mSorter(sorter),
+		mFilter(filter)
+	{}
 
-	virtual FilterType& getFilter() 				 { return mFilter; }
-	virtual const FilterType& getFilter() const		 { return mFilter; }
-	virtual void setFilter(const FilterType& filter) { mFilter = filter; }
+	virtual ~LLFolderViewModel() 
+	{
+		delete mSorter;
+		mSorter = NULL;
+		delete mFilter;
+		mFilter = NULL;
+	}
+
+	virtual SortType& getSorter()					 { return *mSorter; }
+	virtual const SortType& getSorter() const 		 { return *mSorter; }
+	virtual void setSorter(const SortType& sorter) 	 { mSorter = new SortType(sorter); requestSortAll(); }
+
+	virtual FilterType& getFilter() 				 { return *mFilter; }
+	virtual const FilterType& getFilter() const		 { return *mFilter; }
+	virtual void setFilter(const FilterType& filter) { mFilter = new FilterType(filter); }
 
 	// By default, we assume the content is available. If a network fetch mechanism is implemented for the model,
 	// this method needs to be overloaded and return the relevant fetch status.
 	virtual bool contentsReady()					{ return true; }
 
-
 	struct ViewModelCompare
 	{
 		ViewModelCompare(const SortType& sorter)
@@ -445,8 +454,8 @@ class LLFolderViewModel : public LLFolderViewModelCommon
 	}
 
 protected:
-	SortType		mSorter;
-	FilterType		mFilter;
+	SortType*		mSorter;
+	FilterType*		mFilter;
 };
 
 #endif // LLFOLDERVIEWMODEL_H
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 494666df8ab52f99604aa6153cee8ff5d2e166a9..c797b6acc557d91e2e5861ad145f61fba24becd1 100755
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -2338,7 +2338,8 @@ void LLTextEditor::autoIndent()
 	S32 i;
 
 	LLWString text = getWText();
-	while( ' ' == text[line_start] )
+	S32 offset = getLineOffsetFromDocIndex(mCursorPos);
+	while(( ' ' == text[line_start] ) && (space_count < offset))
 	{
 		space_count++;
 		line_start++;
diff --git a/indra/llwindow/llopenglview-objc.h b/indra/llwindow/llopenglview-objc.h
index 1e0e47cd0211afe3a17ceaac859a1693d6e2047b..f1fab3b2c6a8ad409e8b9ad09252dcd9011977c0 100644
--- a/indra/llwindow/llopenglview-objc.h
+++ b/indra/llwindow/llopenglview-objc.h
@@ -42,6 +42,7 @@
 	unsigned int mMarkedTextLength;
     bool mMarkedTextAllowed;
     bool mSimulatedRightClick;
+    bool mOldResize;
 }
 - (id) initWithSamples:(NSUInteger)samples;
 - (id) initWithSamples:(NSUInteger)samples andVsync:(BOOL)vsync;
@@ -49,6 +50,8 @@
 
 - (void)commitCurrentPreedit;
 
+- (void) setOldResize:(bool)oldresize;
+
 // rebuildContext
 // Destroys and recreates a context with the view's internal format set via setPixelFormat;
 // Use this in event of needing to rebuild a context for whatever reason, without needing to assign a new pixel format.
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index b393a3796dfeef267958e3b6e3f5045099c678e3..017ea3769cd5003fcd62508bb686c6e4dbcc023e 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -94,8 +94,11 @@ attributedStringInfo getSegments(NSAttributedString *str)
 // Force a high quality update after live resizing
 - (void) viewDidEndLiveResize
 {
-    NSSize size = [self frame].size;
-    callResize(size.width, size.height);
+    if (mOldResize)  //Maint-3135
+    {
+        NSSize size = [self frame].size;
+        callResize(size.width, size.height);
+    }
 }
 
 - (unsigned long)getVramSize
@@ -124,10 +127,18 @@ attributedStringInfo getSegments(NSAttributedString *str)
 											   object:[self window]];
 }
 
+- (void)setOldResize:(bool)oldresize
+{
+    mOldResize = oldresize;
+}
+
 - (void)windowResized:(NSNotification *)notification;
 {
-	//NSSize size = [self frame].size;
-	//callResize(size.width, size.height);
+    if (!mOldResize)  //Maint-3288
+    {
+        NSSize size = [self frame].size;
+        callResize(size.width, size.height);
+    }
 }
 
 - (void)dealloc
@@ -204,6 +215,8 @@ attributedStringInfo getSegments(NSAttributedString *str)
 		[glContext setValues:(const GLint*)0 forParameter:NSOpenGLCPSwapInterval];
 	}
 	
+    mOldResize = false;
+    
 	return self;
 }
 
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index ee1b0bbffb6b664856bec8d661fae3b522cd024b..0a30f4c807fefa91ca85edf89ab2bfc455584aec 100755
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -124,7 +124,7 @@ class LLWindow : public LLInstanceTracker<LLWindow>
 	virtual void swapBuffers() = 0;
 	virtual void bringToFront() = 0;
 	virtual void focusClient() { };		// this may not have meaning or be required on other platforms, therefore, it's not abstract
-	
+	virtual void setOldResize(bool oldresize) { };
 	// handy coordinate space conversion routines
 	// NB: screen to window and vice verse won't work on width/height coordinate pairs,
 	// as the conversion must take into account left AND right border widths, etc.
diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h
index 81b25601a94606034254d425e78366a6b6a23d95..d64525fbdd709611c2fd8507044d65a723b28425 100755
--- a/indra/llwindow/llwindowmacosx-objc.h
+++ b/indra/llwindow/llwindowmacosx-objc.h
@@ -74,6 +74,7 @@ void showNSCursor();
 void hideNSCursorTillMove(bool hide);
 void requestUserAttention();
 long showAlert(std::string title, std::string text, int type);
+void setResizeMode(bool oldresize, void* glview);
 
 NSWindowRef createNSWindow(int x, int y, int width, int height);
 
diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm
index 0768d0352e868f0bba26984c853461d805f09364..1a21bf84307c825bc68c9ac2f047fee425c99dfb 100755
--- a/indra/llwindow/llwindowmacosx-objc.mm
+++ b/indra/llwindow/llwindowmacosx-objc.mm
@@ -91,7 +91,7 @@ const unsigned short *copyFromPBoard()
 		NSArray *objToPaste = [pboard readObjectsForClasses:classArray options:[NSDictionary dictionary]];
 		str = [objToPaste objectAtIndex:0];
 	}
-	unichar* temp = (unichar*)calloc([str length], sizeof(unichar));
+	unichar* temp = (unichar*)calloc([str length]+1, sizeof(unichar));
 	[str getCharacters:temp];
 	[pool release];
 	return temp;
@@ -222,6 +222,11 @@ GLViewRef createOpenGLView(NSWindowRef window, unsigned int samples, bool vsync)
 	return glview;
 }
 
+void setResizeMode(bool oldresize, void* glview)
+{
+    [(LLOpenGLView *)glview setOldResize:oldresize];
+}
+
 void glSwapBuffers(void* context)
 {
 	[(NSOpenGLContext*)context flushBuffer];
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 6a6b39e6740b940c56e8d47de95dd696627d555f..825fd05c5f7cbdbfc499761e14aa534c56d59a68 100755
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -152,7 +152,10 @@ class LLWindowMacOSX : public LLWindow
 	BOOL	resetDisplayResolution();
 
 	BOOL	shouldPostQuit() { return mPostQuit; }
-
+    
+    //Satisfy MAINT-3135 and MAINT-3288 with a flag.
+    /*virtual */ void setOldResize(bool oldresize) {setResizeMode(oldresize, mGLView); }
+ 
 
 protected:
 	//
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index 2afa12fe9a754556d88bf7790b5194be1e6b8fc1..7772c95609269cc3a19c64749ef630a776fc15d2 100755
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -647,7 +647,8 @@ int yyerror(const char *fmt, ...);
 "REGION_FLAG_SANDBOX"		{ count(); yylval.ival = REGION_FLAGS_SANDBOX; return(INTEGER_CONSTANT); }
 "REGION_FLAG_DISABLE_COLLISIONS"		{ count(); yylval.ival = REGION_FLAGS_SKIP_COLLISIONS; return(INTEGER_CONSTANT); }
 "REGION_FLAG_DISABLE_PHYSICS"		{ count(); yylval.ival = REGION_FLAGS_SKIP_PHYSICS; return(INTEGER_CONSTANT); }
-"REGION_FLAG_BLOCK_FLY"		{ count(); yylval.ival = REGION_FLAGS_BLOCK_FLY; return(INTEGER_CONSTANT); }
+"REGION_FLAG_BLOCK_FLY"			{ count(); yylval.ival = REGION_FLAGS_BLOCK_FLY; return(INTEGER_CONSTANT); }
+"REGION_FLAG_BLOCK_FLYOVER"		{ count(); yylval.ival = REGION_FLAGS_BLOCK_FLYOVER; return(INTEGER_CONSTANT); }
 "REGION_FLAG_ALLOW_DIRECT_TELEPORT"		{ count(); yylval.ival = REGION_FLAGS_ALLOW_DIRECT_TELEPORT; return(INTEGER_CONSTANT); }
 "REGION_FLAG_RESTRICT_PUSHOBJECT"		{ count(); yylval.ival = REGION_FLAGS_RESTRICT_PUSHOBJECT; return(INTEGER_CONSTANT); }
 
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 529318be478843a006b3cf9f8afc0fa67a3daf1f..02b7b02c98af25c60206edeaab52dd9e212aef18 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -668,7 +668,6 @@ set(viewer_SOURCE_FILES
     llwearablelist.cpp
     llweb.cpp
     llwebprofile.cpp
-    llwebsharing.cpp
     llwind.cpp
     llwindowlistener.cpp
     llwlanimator.cpp
@@ -1256,7 +1255,6 @@ set(viewer_HEADER_FILES
     llwearablelist.h
     llweb.h
     llwebprofile.h
-    llwebsharing.h
     llwind.h
     llwindowlistener.h
     llwlanimator.h
diff --git a/indra/newview/SecondLife.nib b/indra/newview/SecondLife.nib
index 8b99b5a7707e9381e6ecab25844d092c1498d3fe..c4ddca50dc15061906b29abb4e547aa17d039b45 100644
Binary files a/indra/newview/SecondLife.nib and b/indra/newview/SecondLife.nib differ
diff --git a/indra/newview/SecondLife.xib b/indra/newview/SecondLife.xib
index 370df6bf5f7c9bcb801af46a798430dede91e494..ef25c648a7a6fdaa3478ca004cb3891e13184c53 100644
--- a/indra/newview/SecondLife.xib
+++ b/indra/newview/SecondLife.xib
@@ -120,7 +120,7 @@
 								</object>
 								<object class="NSMenuItem" id="755159360">
 									<reference key="NSMenu" ref="110575045"/>
-									<string key="NSTitle">Hide NewApplication</string>
+									<string key="NSTitle">Hide Second Life</string>
 									<string key="NSKeyEquiv">h</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index a0fc9e07cb13f797eae6c5d4900392f0e885e937..c77a7de85cc8816ef82364aadd61a614b8650ce0 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-3.7.8
+3.7.9
diff --git a/indra/newview/app_settings/keys.xml b/indra/newview/app_settings/keys.xml
index 6e3673e7d968fa9dae733c0340932d87de717dd1..a8037fec05a663e610807aaafb8ea214754d7e3f 100755
--- a/indra/newview/app_settings/keys.xml
+++ b/indra/newview/app_settings/keys.xml
@@ -293,11 +293,24 @@
     <!--these are for passing controls when sitting on vehicles-->
     <binding key="A" mask="SHIFT" command="slide_left"/>
     <binding key="D" mask="SHIFT" command="slide_right"/>
+    <binding key="W" mask="SHIFT" command="move_forward_sitting"/>
+	<binding key="S" mask="SHIFT" command="move_backward_sitting"/>
+	<binding key="E" mask="SHIFT" command="spin_over_sitting"/>
+	<binding key="C" mask="SHIFT" command="spin_under_sitting"/>
+
     <binding key="LEFT" mask="SHIFT" command="slide_left"/>
     <binding key="RIGHT" mask="SHIFT" command="slide_right"/>
+    <binding key="UP" mask="SHIFT" command="move_forward_sitting"/>
+	<binding key="DOWN" mask="SHIFT" command="move_backward_sitting"/>
+	<binding key="PGUP" mask="SHIFT" command="spin_over_sitting"/>
+	<binding key="PGDN" mask="SHIFT" command="spin_under_sitting"/>
 
     <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
     <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
+    <binding key="PAD_UP" mask="SHIFT" command="move_forward_sitting"/>
+	<binding key="PAD_DOWN" mask="SHIFT" command="move_backward_sitting"/>
+	<binding key="PAD_PGUP" mask="SHIFT" command="spin_over_sitting"/>
+	<binding key="PAD_PGDN" mask="SHIFT" command="spin_under_sitting"/> 
     <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
     <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
 
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index ad843bca14d1844fe57a864c6b0182da23de9808..17c70ef1c52def63f980f62bc21dd138a2a0eefe 100755
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -526,6 +526,7 @@ REGION_FLAG_SANDBOX					Used with llGetRegionFlags to find if a region is a sand
 REGION_FLAG_DISABLE_COLLISIONS		Used with llGetRegionFlags to find if a region has disabled collisions
 REGION_FLAG_DISABLE_PHYSICS			Used with llGetRegionFlags to find if a region has disabled physics
 REGION_FLAG_BLOCK_FLY				Used with llGetRegionFlags to find if a region blocks flying
+REGION_FLAG_BLOCK_FLYOVER			Used with llGetRegionFlags to find if a region enforces higher altitude parcel access rules
 REGION_FLAG_ALLOW_DIRECT_TELEPORT	Used with llGetRegionFlags to find if a region allows direct teleports
 REGION_FLAG_RESTRICT_PUSHOBJECT		Used with llGetRegionFlags to find if a region restricts llPushObject() calls
 
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index fb3fd8ddf429ae1716ccfe7372f296c40924d1b1..4a5e1229d114de999b54c85ab0052c0ba99ea358 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -11528,28 +11528,6 @@
       <key>Value</key>
       <integer>75</integer>
     </map>
-    <key>SnapshotSharingEnabled</key>
-    <map>
-      <key>Comment</key>
-      <string>Enable uploading of snapshots to a web service.</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>0</integer>
-    </map>
-    <key>SnapshotConfigURL</key>
-    <map>
-      <key>Comment</key>
-      <string>URL to fetch Snapshot Sharing configuration data from.</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>http://photos.apps.staging.avatarsunited.com/viewer_config</string>
-    </map>
     <key>SpeedTest</key>
     <map>
       <key>Comment</key>
@@ -15142,18 +15120,6 @@
     <key>Value</key>
     <integer>7000</integer>
   </map>
-  <key>DisablePrecacheDelayAfterTeleporting</key>
-  <map>
-    <key>Comment</key>
-    <string>Disables the artificial delay in the viewer that precaches some incoming assets</string>
-    <key>Persist</key>
-    <integer>0</integer>
-    <key>Type</key>
-    <string>Boolean</string>
-    <key>Value</key>
-    <integer>0</integer>
-  </map>
-
   <key>VersionChannelName</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
index a74290bfcd0c60ba2f123e535f862ed017e18f62..24871106242a9e334dfc470a4968e9ca21fe857e 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
@@ -40,7 +40,7 @@ mat4 getObjectSkinnedTransform();
 void main()
 {
 	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
-	
+		
 	mat4 mat = getObjectSkinnedTransform();
 	
 	mat = modelview_matrix * mat;
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 5268498d564b6434dc30d0acb495a5ac00567f91..6de5b18c3c8c7cd81839f7142029142d4115c804 100755
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -3825,7 +3825,7 @@
         <volume_morph
           name="BELLY"
           scale="0.075 0.04 0.03"
-          pos="0.07 0 -0.02"/>
+          pos="0.07 0 -0.07"/>
         <volume_morph
           name="PELVIS"
           scale="0.075 0.04 0.03"
@@ -4269,7 +4269,7 @@
      label_min="Big Pectorals"
      label_max="Sunken Chest"
      value_default="0"
-     value_min="-1.0"
+     value_min="-0.5"
      value_max="1.1"
      camera_elevation=".3"
      camera_distance="1.2">
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 8efc4ee87da47f64b5fa244469367eea7121c7cb..badbe486b965a72f41b6fde34a7af8c1459fa1e8 100755
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -327,7 +327,8 @@ Intel HD Graphics 4600					.*Intel.*HD Graphics 46.*							3	1	0	4.2
 Intel HD Graphics 4000					.*Intel.*HD Graphics 4.*							3	1	1	4.2
 Intel Intel Iris Pro Graphics 5200		.*Intel.*Iris Pro Graphics 52.*						4	1	0	4
 Intel Intel Iris Graphics 5100			.*Intel.*Iris Graphics 51.*							4	1	0	4
-Intel Intel Iris OpenGL Engine			.*Intel.*Iris (Pro )*OpenGL.*							4	1	0	4
+Intel Intel Iris OpenGL Engine			.*Intel.*Iris OpenGL.*							4	1	0	4
+Intel Intel Iris Pro OpenGL Engine			.*Intel.*Iris Pro OpenGL.*							5	1	0	4
 Intel HD Graphics 5000					.*Intel.*HD Graphics 5.*							4	1	0	4
 Intel HD Graphics						.*Intel.*HD Graphics.*								2	1	1	4
 Intel Mobile 4 Series					.*Intel.*Mobile.* 4 Series.*						0	1	1	2.1
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index c4f503ef4e2daaf1bbad96e716874edab9bbaaa7..ad5ab2264041a35d93cb2fbf826c51b313b82c13 100755
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -106,6 +106,7 @@ Var COMMANDLINE         ; command line passed to this installer, set in .onInit
 Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer
 Var SKIP_DIALOGS        ; set from command line in  .onInit. autoinstall 
                         ; GUI and the defaults.
+Var SKIP_AUTORUN		; skip automatic launch of viewer after install
 Var DO_UNINSTALL_V2     ; If non-null, path to a previous Viewer 2 installation that will be uninstalled.
 
 ;;; Function definitions should go before file includes, because calls to
@@ -122,24 +123,9 @@ Var DO_UNINSTALL_V2     ; If non-null, path to a previous Viewer 2 installation
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 Function .onInstSuccess
     Push $R0	# Option value, unused
-
-    StrCmp $SKIP_DIALOGS "true" label_launch 
-
-    ${GetOptions} $COMMANDLINE "/AUTOSTART" $R0
-    # If parameter was there (no error) just launch
-    # Otherwise ask
-    IfErrors label_ask_launch label_launch
-    
-label_ask_launch:
-    # Don't launch by default when silent
-    IfSilent label_no_launch
-	MessageBox MB_YESNO $(InstSuccesssQuestion) \
-        IDYES label_launch IDNO label_no_launch
-        
-label_launch:
+	StrCmp $SKIP_AUTORUN "true" +2;
 	# Assumes SetOutPath $INSTDIR
 	Exec '"$INSTDIR\$INSTEXE" $SHORTCUT_LANG_PARAM'
-label_no_launch:
 	Pop $R0
 FunctionEnd
 
@@ -872,7 +858,12 @@ Function .onInit
     IfErrors +2 0 ; If error jump past setting SKIP_DIALOGS
         StrCpy $SKIP_DIALOGS "true"
 
+	${GetOptions} $COMMANDLINE "/SKIP_AUTORUN" $0
+    IfErrors +2 0 ; If error jump past setting SKIP_AUTORUN
+		StrCpy $SKIP_AUTORUN "true"
+
     ${GetOptions} $COMMANDLINE "/LANGID=" $0   ; /LANGID=1033 implies US English
+
     ; If no language (error), then proceed
     IfErrors lbl_configure_default_lang
     ; No error means we got a language, so use it
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 3b9259a966435ccab339dc92e694d5ce40877aac..f98ec697327da500631b6c90e69874ee7e443c33 100755
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3181,6 +3181,13 @@ bool LLAppViewer::initWindow()
 
 	LLNotificationsUI::LLNotificationManager::getInstance();
 		
+    
+#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)
+       gViewerWindow->getWindow()->setOldResize(true);
+#endif
+    
 	if (gSavedSettings.getBOOL("WindowMaximized"))
 	{
 		gViewerWindow->getWindow()->maximize();
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 928c3baafa67dac91b8dc3c617b3649fc06c573f..b0537a83f16a02630fa12d5a3dd7045749bb32a2 100755
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -113,33 +113,29 @@ void LLChannelManager::onLoginCompleted()
 	}
 	else
 	{
-		// TODO: Seems this code leads to MAINT-3536 new crash in XML_ParserFree.
-		// Need to investigate this and fix possible problems with notifications in startup time
-		// Viewer can normally receive and show of postponed notifications about purchasing in marketplace on startup time.
-		// Other types of postponed notifications did not tested.
-		//// create a channel for the StartUp Toast
-		//LLScreenChannelBase::Params p;
-		//p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID"));
-		//p.channel_align = CA_RIGHT;
-		//mStartUpChannel = createChannel(p);
-
-		//if(!mStartUpChannel)
-		//{
-		//	onStartUpToastClose();
-		//}
-		//else
-		//{
-		//	gViewerWindow->getRootView()->addChild(mStartUpChannel);
-
-		//	// init channel's position and size
-		//	S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
-		//	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
-		//	mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound);
-		//	mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4));
-
-		//	mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this));
-		//	mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime"));
-		//}
+		// create a channel for the StartUp Toast
+		LLScreenChannelBase::Params p;
+		p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID"));
+		p.channel_align = CA_RIGHT;
+		mStartUpChannel = createChannel(p);
+
+		if(!mStartUpChannel)
+		{
+			onStartUpToastClose();
+		}
+		else
+		{
+			gViewerWindow->getRootView()->addChild(mStartUpChannel);
+
+			// init channel's position and size
+			S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
+			S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
+			mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound);
+			mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4));
+
+			mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this));
+			mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime"));
+		}
 	}
 
 	LLPersistentNotificationStorage::getInstance()->loadNotifications();
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index d8cdcdfc97f1bdef4c7cca48cdd8cd15f05574ff..dc74506c531b377792827e190397e01e536a5f2b 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -291,6 +291,9 @@ class LLConversationViewModel
 {
 public:
 	typedef LLFolderViewModel<LLConversationSort, LLConversationItem, LLConversationItem, LLConversationFilter> base_t;
+	LLConversationViewModel() 
+	:	base_t(new LLConversationSort(), new LLConversationFilter())
+	{}
 	
 	void sort(LLFolderViewFolder* folder);
 	bool contentsReady() { return true; }	// *TODO : we need to check that participants names are available somewhat
diff --git a/indra/newview/lldeferredsounds.cpp b/indra/newview/lldeferredsounds.cpp
index 9416e7cd293a6d025f4f1c0285267e9fca6be951..e1613e4719d0c78324a7d9c708a6f52f1a47e4a9 100755
--- a/indra/newview/lldeferredsounds.cpp
+++ b/indra/newview/lldeferredsounds.cpp
@@ -39,7 +39,10 @@ void LLDeferredSounds::playdeferredSounds()
 {
 	while(soundVector.size())
 	{
-		gAudiop->triggerSound(soundVector.back());
+		if (gAudiop)
+		{
+			gAudiop->triggerSound(soundVector.back());
+		}
 		soundVector.pop_back();
 	}
 }
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 0ecdabbbe92d0497541190fd5d05f9cceb98ad63..90e6dfe351e6fd97a194d071ff6d0ea9176a944b 100755
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1518,6 +1518,18 @@ void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>
 	}
 
 	//LL_INFOS() << "Rebuilt face " << face->getTEOffset() << " of " << face->getDrawable() << " at " << gFrameTimeSeconds << LL_ENDL;
+
+	// Let getGeometryVolume know if a texture matrix is in play
+	if (face->mTextureMatrix)
+	{
+		face->setState(LLFace::TEXTURE_ANIM);
+	}
+	else
+	{
+		face->clearState(LLFace::TEXTURE_ANIM);
+	}
+
+
 	face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
 
 	buffer->flush();
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 0b080cbdd7c1f5abf4365a632e427307f6f65894..32b510b21a57943efbe3692de6d6896a950ccf1f 100755
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -1638,7 +1638,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
 					do_xform = false;
 				}
 
-				if (getVirtualSize() >= MIN_TEX_ANIM_SIZE)
+				if (getVirtualSize() >= MIN_TEX_ANIM_SIZE || isState(LLFace::RIGGED))
 				{ //don't override texture transform during tc bake
 					tex_mode = 0;
 				}
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 8b219a5a9474f170f07c035389728afdb196ee1d..dfc246b61b2768a2a4bcae9ce99cab516125279a 100755
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -571,6 +571,7 @@ std::vector<std::string>* LLFilePicker::navOpenFilterProc(ELoadFilter filter) //
             allowedv->push_back("lsl");
             allowedv->push_back("dic");
             allowedv->push_back("xcu");
+            allowedv->push_back("gif");
         case FFLOAD_IMAGE:
             allowedv->push_back("jpg");
             allowedv->push_back("jpeg");
@@ -666,7 +667,7 @@ bool	LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filena
 		case FFSAVE_TGAPNG:
 			type = "PNG";
 			creator = "prvw";
-			extension = "png";
+			extension = "png,tga";
 			break;
 		case FFSAVE_BMP:
 			type = "BMPf";
diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm
index 13757904e3498b045b1dd87883d4d3f6a415aa64..1438e4dc0a993c69d23bae424a2b0363a0452bb2 100644
--- a/indra/newview/llfilepicker_mac.mm
+++ b/indra/newview/llfilepicker_mac.mm
@@ -107,7 +107,7 @@ std::string* doSaveDialog(const std::string* file,
     NSSavePanel *panel = [NSSavePanel savePanel]; 
     
     NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]];
-    NSArray *fileType = [[NSArray alloc] initWithObjects:extensionns,nil];
+    NSArray *fileType = [extensionns componentsSeparatedByString:@","];
     
     //[panel setMessage:@"Save Image File"]; 
     [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ];
diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp
index a303c2c6b3bb4ce74a945e63d53a3d9adf78f018..a358b7c10b62a17fcfd25fe5e39c90233e1fdaef 100755
--- a/indra/newview/llfloaterconversationpreview.cpp
+++ b/indra/newview/llfloaterconversationpreview.cpp
@@ -32,6 +32,7 @@
 #include "llfloaterimnearbychat.h"
 #include "llspinctrl.h"
 #include "lltrans.h"
+#include "llnotificationsutil.h"
 
 const std::string LL_FCP_COMPLETE_NAME("complete_name");
 const std::string LL_FCP_ACCOUNT_NAME("user_name");
@@ -45,14 +46,20 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i
 	mAccountName(session_id[LL_FCP_ACCOUNT_NAME]),
 	mCompleteName(session_id[LL_FCP_COMPLETE_NAME]),
 	mMutex(NULL),
-	mShowHistory(false)
+	mShowHistory(false),
+	mMessages(NULL),
+	mHistoryThreadsBusy(false),
+	mOpened(false)
+{
+}
+
+LLFloaterConversationPreview::~LLFloaterConversationPreview()
 {
 }
 
 BOOL LLFloaterConversationPreview::postBuild()
 {
 	mChatHistory = getChild<LLChatHistory>("chat_history");
-	LLLoadHistoryThread::setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2));
 
 	const LLConversation* conv = LLConversationLog::instance().getConversation(mSessionID);
 	std::string name;
@@ -79,31 +86,21 @@ BOOL LLFloaterConversationPreview::postBuild()
 	std::string title = getString("Title", args);
 	setTitle(title);
 
-	LLSD load_params;
-	load_params["load_all_history"] = true;
-	load_params["cut_off_todays_date"] = false;
-
-
-	LLSD loading;
-	loading[LL_IM_TEXT] = LLTrans::getString("loading_chat_logs");
-	mMessages.push_back(loading);
-	mPageSpinner = getChild<LLSpinCtrl>("history_page_spin");
-	mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this));
-	mPageSpinner->setMinValue(1);
-	mPageSpinner->set(1);
-	mPageSpinner->setEnabled(false);
-	LLLogChat::startChatHistoryThread(file, load_params);
 	return LLFloater::postBuild();
 }
 
-void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std::string& file_name)
+void LLFloaterConversationPreview::setPages(std::list<LLSD>* messages, const std::string& file_name)
 {
-	if(file_name == mChatHistoryFileName)
+	if(file_name == mChatHistoryFileName && messages)
 	{
 		// additional protection to avoid changes of mMessages in setPages()
 		LLMutexLock lock(&mMutex);
+		if (mMessages)
+		{
+			delete mMessages; // Clean up temporary message list with "Loading..." text
+		}
 		mMessages = messages;
-		mCurrentPage = (mMessages.size() ? (mMessages.size() - 1) / mPageSize : 0);
+		mCurrentPage = (mMessages->size() ? (mMessages->size() - 1) / mPageSize : 0);
 
 		mPageSpinner->setEnabled(true);
 		mPageSpinner->setMaxValue(mCurrentPage+1);
@@ -113,6 +110,11 @@ void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std:
 		getChild<LLTextBox>("page_num_label")->setValue(total_page_num);
 		mShowHistory = true;
 	}
+	LLLoadHistoryThread* loadThread = LLLogChat::getLoadHistoryThread(mSessionID);
+	if (loadThread)
+	{
+		loadThread->removeLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2));
+	}
 }
 
 void LLFloaterConversationPreview::draw()
@@ -127,24 +129,82 @@ void LLFloaterConversationPreview::draw()
 
 void LLFloaterConversationPreview::onOpen(const LLSD& key)
 {
+	if (mOpened)
+	{
+		return;
+	}
+	mOpened = true;
+	if (!LLLogChat::historyThreadsFinished(mSessionID))
+	{
+		LLNotificationsUtil::add("ChatHistoryIsBusyAlert");
+		mHistoryThreadsBusy = true;
+		closeFloater();
+		return;
+	}
+	LLSD load_params;
+	load_params["load_all_history"] = true;
+	load_params["cut_off_todays_date"] = false;
+
+	// The temporary message list with "Loading..." text
+	// Will be deleted upon loading completion in setPages() method
+	mMessages = new std::list<LLSD>();
+
+
+	LLSD loading;
+	loading[LL_IM_TEXT] = LLTrans::getString("loading_chat_logs");
+	mMessages->push_back(loading);
+	mPageSpinner = getChild<LLSpinCtrl>("history_page_spin");
+	mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this));
+	mPageSpinner->setMinValue(1);
+	mPageSpinner->set(1);
+	mPageSpinner->setEnabled(false);
+
+	// The actual message list to load from file
+	// Will be deleted in a separate thread LLDeleteHistoryThread not to freeze UI
+	// LLDeleteHistoryThread is started in destructor
+	std::list<LLSD>* messages = new std::list<LLSD>();
+
+	LLLogChat::cleanupHistoryThreads();
+	
+	LLLoadHistoryThread* loadThread = new LLLoadHistoryThread(mChatHistoryFileName, messages, load_params);
+	loadThread->setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2));
+	loadThread->start();
+	LLLogChat::addLoadHistoryThread(mSessionID, loadThread);
+
+	LLDeleteHistoryThread* deleteThread = new LLDeleteHistoryThread(messages, loadThread);
+	LLLogChat::addDeleteHistoryThread(mSessionID, deleteThread);
+
 	mShowHistory = true;
 }
 
+void LLFloaterConversationPreview::onClose(bool app_quitting)
+{
+	mOpened = false;
+	if (!mHistoryThreadsBusy)
+	{
+		LLDeleteHistoryThread* deleteThread = LLLogChat::getDeleteHistoryThread(mSessionID);
+		if (deleteThread)
+		{
+			deleteThread->start();
+		}
+	}
+}
+
 void LLFloaterConversationPreview::showHistory()
 {
 	// additional protection to avoid changes of mMessages in setPages
 	LLMutexLock lock(&mMutex);
-	if (!mMessages.size() || mCurrentPage * mPageSize >= mMessages.size())
+	if(mMessages == NULL || !mMessages->size() || mCurrentPage * mPageSize >= mMessages->size())
 	{
 		return;
 	}
 
 	mChatHistory->clear();
 	std::ostringstream message;
-	std::list<LLSD>::const_iterator iter = mMessages.begin();
+	std::list<LLSD>::const_iterator iter = mMessages->begin();
 	std::advance(iter, mCurrentPage * mPageSize);
 
-	for (int msg_num = 0; iter != mMessages.end() && msg_num < mPageSize; ++iter, ++msg_num)
+	for (int msg_num = 0; iter != mMessages->end() && msg_num < mPageSize; ++iter, ++msg_num)
 	{
 		LLSD msg = *iter;
 
diff --git a/indra/newview/llfloaterconversationpreview.h b/indra/newview/llfloaterconversationpreview.h
index b0488f4ff127d51bdd58417b3cf0629bdc01e318..a8dbbc9ffe0c112721f984dfcd1dd821afbe82e4 100755
--- a/indra/newview/llfloaterconversationpreview.h
+++ b/indra/newview/llfloaterconversationpreview.h
@@ -39,13 +39,14 @@ class LLFloaterConversationPreview : public LLFloater
 public:
 
 	LLFloaterConversationPreview(const LLSD& session_id);
-	virtual ~LLFloaterConversationPreview(){};
+	virtual ~LLFloaterConversationPreview();
 
 	virtual BOOL postBuild();
-	void setPages(std::list<LLSD>& messages,const std::string& file_name);
+	void setPages(std::list<LLSD>* messages,const std::string& file_name);
 
 	virtual void draw();
 	virtual void onOpen(const LLSD& key);
+	virtual void onClose(bool app_quitting);
 
 private:
 	void onMoreHistoryBtnClick();
@@ -58,11 +59,13 @@ class LLFloaterConversationPreview : public LLFloater
 	int				mCurrentPage;
 	int				mPageSize;
 
-	std::list<LLSD> mMessages;
+	std::list<LLSD>*	mMessages;
 	std::string		mAccountName;
 	std::string		mCompleteName;
-	std::string     mChatHistoryFileName;
+	std::string		mChatHistoryFileName;
 	bool			mShowHistory;
+	bool			mHistoryThreadsBusy;
+	bool			mOpened;
 };
 
 #endif /* LLFLOATERCONVERSATIONPREVIEW_H_ */
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index bb39a54f766e1b0e287b10953ad303e017371b92..ebb44561da6f2a46c7b7b81df722c62f539d9043 100755
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -1318,7 +1318,12 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
 	// Extract the single select info
 	bool is_single_select = (uuids.size() == 1);
 	const LLUUID& single_id = uuids.front();
-	
+
+	if ("can_chat_history" == item && is_single_select)
+	{
+		return LLLogChat::isTranscriptExist(uuids.front(),false);
+	}
+
 	// Handle options that are applicable to all including the user agent
     if ("can_view_profile" == item)
     {
diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp
index ec506d1c7e13641e83ffa719f8c0aca05d395dbb..f61359f87a52e4f0e5bd5ca4bd91881cad6588cc 100644
--- a/indra/newview/llfloaterimsession.cpp
+++ b/indra/newview/llfloaterimsession.cpp
@@ -716,7 +716,7 @@ void LLFloaterIMSession::setVisible(BOOL visible)
 	if (visible && isInVisibleChain())
 	{
 		sIMFloaterShowedSignal(mSessionID);
-        
+        updateMessages();
 	}
 
 }
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index e30bff1edf4083bdcd1b329ae49cab298a3710cc..7213064746a7fbbd88fb8b6216c49de2972745ca 100755
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -2336,7 +2336,7 @@ BOOL LLPanelLandAccess::postBuild()
 	childSetCommitCallback("public_access", onCommitPublicAccess, this);
 	childSetCommitCallback("limit_payment", onCommitAny, this);
 	childSetCommitCallback("limit_age_verified", onCommitAny, this);
-	childSetCommitCallback("GroupCheck", onCommitAny, this);
+	childSetCommitCallback("GroupCheck", onCommitGroupCheck, this);
 	childSetCommitCallback("PassCheck", onCommitAny, this);
 	childSetCommitCallback("pass_combo", onCommitAny, this);
 	childSetCommitCallback("PriceSpin", onCommitAny, this);
@@ -2501,11 +2501,11 @@ void LLPanelLandAccess::refresh()
 		}
 		
 		BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST);
-		getChild<LLUICtrl>("PassCheck")->setValue(use_pass );
+		getChild<LLUICtrl>("PassCheck")->setValue(use_pass);
 		LLCtrlSelectionInterface* passcombo = childGetSelectionInterface("pass_combo");
 		if (passcombo)
 		{
-			if (public_access || !use_pass || !use_group)
+			if (public_access || !use_pass)
 			{
 				passcombo->selectByValue("anyone");
 			}
@@ -2598,12 +2598,11 @@ void LLPanelLandAccess::refresh_ui()
 			getChildView("limit_age_verified")->setEnabled(FALSE);
 
 
-			BOOL group_access = getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean();
 			BOOL sell_passes = getChild<LLUICtrl>("PassCheck")->getValue().asBoolean();
 			getChildView("PassCheck")->setEnabled(can_manage_allowed);
 			if (sell_passes)
 			{
-				getChildView("pass_combo")->setEnabled(group_access && can_manage_allowed);
+				getChildView("pass_combo")->setEnabled(can_manage_allowed);
 				getChildView("PriceSpin")->setEnabled(can_manage_allowed);
 				getChildView("HoursSpin")->setEnabled(can_manage_allowed);
 			}
@@ -2662,6 +2661,32 @@ void LLPanelLandAccess::onCommitPublicAccess(LLUICtrl *ctrl, void *userdata)
 	onCommitAny(ctrl, userdata);
 }
 
+void LLPanelLandAccess::onCommitGroupCheck(LLUICtrl *ctrl, void *userdata)
+{
+	LLPanelLandAccess *self = (LLPanelLandAccess *)userdata;
+	LLParcel* parcel = self->mParcel->getParcel();
+	if (!parcel)
+	{
+		return;
+	}
+
+	BOOL use_pass_list = !self->getChild<LLUICtrl>("public_access")->getValue().asBoolean();
+	BOOL use_access_group = self->getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean();
+	LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
+	if (passcombo)
+	{
+		if (use_access_group && use_pass_list)
+		{
+			if (passcombo->getSelectedValue().asString() == "group")
+			{
+				passcombo->selectByValue("anyone");
+			}
+		}
+	}
+
+	onCommitAny(ctrl, userdata);
+}
+
 // static
 void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
 {
@@ -2699,14 +2724,14 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
 	{
 		use_access_list = TRUE;
 		use_pass_list = self->getChild<LLUICtrl>("PassCheck")->getValue().asBoolean();
-		if (use_access_group && use_pass_list)
+		LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
+		if (passcombo)
 		{
-			LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
-			if (passcombo)
+			if (use_access_group && use_pass_list)
 			{
 				if (passcombo->getSelectedValue().asString() == "group")
 				{
-					use_access_list = FALSE;
+					use_access_group = FALSE;
 				}
 			}
 		}
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index dccdfc9acbb6645b10d8f62e7a82bcf111d588c8..1d9bd33720ea5df87229272efa0d00ba684e11fd 100755
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -366,6 +366,7 @@ class LLPanelLandAccess
 
 	static void onCommitPublicAccess(LLUICtrl* ctrl, void *userdata);
 	static void onCommitAny(LLUICtrl* ctrl, void *userdata);
+	static void onCommitGroupCheck(LLUICtrl* ctrl, void *userdata);
 	static void onClickRemoveAccess(void*);
 	static void onClickRemoveBanned(void*);
 
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 8d1114e056b952f0e0682ae748a522e412df9060..d67089ff85e12fc8b29b22648fe079b3e7f5abe0 100755
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -366,6 +366,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
 
 	panel->getChild<LLUICtrl>("block_terraform_check")->setValue((region_flags & REGION_FLAGS_BLOCK_TERRAFORM) ? TRUE : FALSE );
 	panel->getChild<LLUICtrl>("block_fly_check")->setValue((region_flags & REGION_FLAGS_BLOCK_FLY) ? TRUE : FALSE );
+	panel->getChild<LLUICtrl>("block_fly_over_check")->setValue((region_flags & REGION_FLAGS_BLOCK_FLYOVER) ? TRUE : FALSE );
 	panel->getChild<LLUICtrl>("allow_damage_check")->setValue((region_flags & REGION_FLAGS_ALLOW_DAMAGE) ? TRUE : FALSE );
 	panel->getChild<LLUICtrl>("restrict_pushobject")->setValue((region_flags & REGION_FLAGS_RESTRICT_PUSHOBJECT) ? TRUE : FALSE );
 	panel->getChild<LLUICtrl>("allow_land_resell_check")->setValue((region_flags & REGION_FLAGS_BLOCK_LAND_RESELL) ? FALSE : TRUE );
@@ -635,6 +636,7 @@ BOOL LLPanelRegionGeneralInfo::postBuild()
 	// Enable the "Apply" button if something is changed. JC
 	initCtrl("block_terraform_check");
 	initCtrl("block_fly_check");
+	initCtrl("block_fly_over_check");
 	initCtrl("allow_damage_check");
 	initCtrl("allow_land_resell_check");
 	initCtrl("allow_parcel_changes_check");
@@ -816,6 +818,7 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
 	{
 		body["block_terraform"] = getChild<LLUICtrl>("block_terraform_check")->getValue();
 		body["block_fly"] = getChild<LLUICtrl>("block_fly_check")->getValue();
+		body["block_fly_over"] = getChild<LLUICtrl>("block_fly_over_check")->getValue();
 		body["allow_damage"] = getChild<LLUICtrl>("allow_damage_check")->getValue();
 		body["allow_land_resell"] = getChild<LLUICtrl>("allow_land_resell_check")->getValue();
 		body["agent_limit"] = getChild<LLUICtrl>("agent_limit_spin")->getValue();
@@ -891,6 +894,7 @@ BOOL LLPanelRegionDebugInfo::postBuild()
 	childSetAction("top_scripts_btn", onClickTopScripts, this);
 	childSetAction("restart_btn", onClickRestart, this);
 	childSetAction("cancel_restart_btn", onClickCancelRestart, this);
+	childSetAction("region_debug_console_btn", onClickDebugConsole, this);
 
 	return TRUE;
 }
@@ -912,6 +916,7 @@ bool LLPanelRegionDebugInfo::refreshFromRegion(LLViewerRegion* region)
 	getChildView("top_scripts_btn")->setEnabled(allow_modify);
 	getChildView("restart_btn")->setEnabled(allow_modify);
 	getChildView("cancel_restart_btn")->setEnabled(allow_modify);
+	getChildView("region_debug_console_btn")->setEnabled(allow_modify);
 
 	return LLPanelRegionInfo::refreshFromRegion(region);
 }
@@ -1074,6 +1079,11 @@ void LLPanelRegionDebugInfo::onClickCancelRestart(void* data)
 	self->sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings);
 }
 
+// static
+void LLPanelRegionDebugInfo::onClickDebugConsole(void* data)
+{
+	LLFloaterReg::showInstance("region_debug_console");
+}
 
 BOOL LLPanelRegionTerrainInfo::validateTextureSizes()
 {
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index dd961e21b2f751e0997401d768f10ce168e0f88d..5bc4273d5f81ca68f83f13d8689ed2f7119e10c6 100755
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -209,6 +209,7 @@ class LLPanelRegionDebugInfo : public LLPanelRegionInfo
 	static void onClickRestart(void* data);
 	bool callbackRestart(const LLSD& notification, const LLSD& response);
 	static void onClickCancelRestart(void* data);
+	static void onClickDebugConsole(void* data);
 	
 private:
 	LLUUID mTargetAvatar;
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 294596dd971153d39d9ac13e6506f836c3157507..960d3f35dd4bf4d8b41b4877791d8b06d85297a5 100755
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -47,7 +47,6 @@
 #include "lltoolfocus.h"
 #include "lltoolmgr.h"
 #include "llwebprofile.h"
-#include "llwebsharing.h"
 
 ///----------------------------------------------------------------------------
 /// Local function declarations, constants, enums, and typedefs
@@ -364,10 +363,6 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
 	ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat");
 	LLViewerWindow::ESnapshotType layer_type = getLayerType(floater);
 
-#if 0
-	floater->getChildView("share_to_web")->setVisible( gSavedSettings.getBOOL("SnapshotSharingEnabled"));
-#endif
-
 	floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));
 	enableAspectRatioCheckbox(floater, !floater->impl.mAspectRatioCheckOff);
 	setAspectRatioCheckboxValue(floater, gSavedSettings.getBOOL("KeepAspectForSnapshot"));
@@ -1054,12 +1049,6 @@ LLFloaterSnapshot::~LLFloaterSnapshot()
 
 BOOL LLFloaterSnapshot::postBuild()
 {
-	// Kick start Web Sharing, to fetch its config data if it needs to.
-	if (gSavedSettings.getBOOL("SnapshotSharingEnabled"))
-	{
-		LLWebSharing::instance().init();
-	}
-
 	mRefreshBtn = getChild<LLUICtrl>("new_snapshot_btn");
 	childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this);
 	mRefreshLabel = getChild<LLUICtrl>("refresh_lbl");
@@ -1331,7 +1320,7 @@ S32 LLFloaterSnapshot::notify(const LLSD& info)
 //static 
 void LLFloaterSnapshot::update()
 {
-	LLFloaterSnapshot* inst = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+	LLFloaterSnapshot* inst = findInstance();
 	LLFloaterFacebook* floater_facebook = LLFloaterReg::findTypedInstance<LLFloaterFacebook>("facebook"); 
 	LLFloaterFlickr* floater_flickr = LLFloaterReg::findTypedInstance<LLFloaterFlickr>("flickr"); 
 	LLFloaterTwitter* floater_twitter = LLFloaterReg::findTypedInstance<LLFloaterTwitter>("twitter"); 
@@ -1360,13 +1349,19 @@ LLFloaterSnapshot* LLFloaterSnapshot::getInstance()
 	return LLFloaterReg::getTypedInstance<LLFloaterSnapshot>("snapshot");
 }
 
+// static
+LLFloaterSnapshot* LLFloaterSnapshot::findInstance()
+{
+	return LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+}
+
 // static
 void LLFloaterSnapshot::saveTexture()
 {
 	LL_DEBUGS() << "saveTexture" << LL_ENDL;
 
 	// FIXME: duplicated code
-	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+	LLFloaterSnapshot* instance = findInstance();
 	if (!instance)
 	{
 		llassert(instance != NULL);
@@ -1387,7 +1382,7 @@ BOOL LLFloaterSnapshot::saveLocal()
 {
 	LL_DEBUGS() << "saveLocal" << LL_ENDL;
 	// FIXME: duplicated code
-	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+	LLFloaterSnapshot* instance = findInstance();
 	if (!instance)
 	{
 		llassert(instance != NULL);
@@ -1406,7 +1401,7 @@ BOOL LLFloaterSnapshot::saveLocal()
 // static
 void LLFloaterSnapshot::postSave()
 {
-	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+	LLFloaterSnapshot* instance = findInstance();
 	if (!instance)
 	{
 		llassert(instance != NULL);
@@ -1432,7 +1427,7 @@ LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()
 {
 	// FIXME: May not work for textures.
 
-	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+	LLFloaterSnapshot* instance = findInstance();
 	if (!instance)
 	{
 		llassert(instance != NULL);
@@ -1459,7 +1454,7 @@ LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()
 // static
 const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal()
 {
-	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+	LLFloaterSnapshot* instance = findInstance();
 	if (!instance)
 	{
 		llassert(instance != NULL);
@@ -1479,7 +1474,7 @@ const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal()
 // static
 void LLFloaterSnapshot::setAgentEmail(const std::string& email)
 {
-	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+	LLFloaterSnapshot* instance = findInstance();
 	if (instance)
 	{
 		LLSideTrayPanelContainer* panel_container = instance->getChild<LLSideTrayPanelContainer>("panel_container");
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index 3a279c194dce15b4f553c7e1c4e48b8d5b58c3f7..0bb9474bb5de72acac21028abb00c17d566a6ca2 100755
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -56,6 +56,7 @@ class LLFloaterSnapshot : public LLFloater
 
 	// TODO: create a snapshot model instead
 	static LLFloaterSnapshot* getInstance();
+	static LLFloaterSnapshot* findInstance();
 	static void saveTexture();
 	static BOOL saveLocal();
 	static void postSave();
diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h
index 9dcfdfa185f83f12c548ffaee3c2d7adcecdb2ce..8772185ad092b934dbc32e05595fec4f83bb1c91 100755
--- a/indra/newview/llfolderviewmodelinventory.h
+++ b/indra/newview/llfolderviewmodelinventory.h
@@ -105,6 +105,10 @@ class LLFolderViewModelInventory
 public:
 	typedef LLFolderViewModel<LLInventorySort,   LLFolderViewModelItemInventory, LLFolderViewModelItemInventory,   LLInventoryFilter> base_t;
 
+	LLFolderViewModelInventory(const std::string& name)
+	:	base_t(new LLInventorySort(), new LLInventoryFilter(LLInventoryFilter::Params().name(name)))
+	{}
+
 	void setTaskID(const LLUUID& id) {mTaskID = id;}
 
 	void sort(LLFolderViewFolder* folder);
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 9fa40bc6b9939d6bac8b6ef988f8e85c80bf402c..ffddeeb129e850fea5a77de769c9024581b74492 100755
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -1337,6 +1337,7 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)
 {
 	S32 in_len = in_str.length();
 
+	//return whole trigger, if received text equals to it
 	item_map_t::iterator it;
 	for (it = mActive.begin(); it != mActive.end(); ++it)
 	{
@@ -1344,7 +1345,24 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)
 		if (gesture)
 		{
 			const std::string& trigger = gesture->getTrigger();
-			
+			if (!LLStringUtil::compareInsensitive(in_str, trigger))
+			{
+				*out_str = trigger;
+				return TRUE;
+			}
+		}
+	}
+
+	//return common chars, if more than one trigger matches the prefix
+	std::string rest_of_match = "";
+	std::string buf = "";
+	for (it = mActive.begin(); it != mActive.end(); ++it)
+	{
+		LLMultiGesture* gesture = (*it).second;
+		if (gesture)
+		{
+			const std::string& trigger = gesture->getTrigger();
+
 			if (in_len > (S32)trigger.length())
 			{
 				// too short, bail out
@@ -1355,11 +1373,49 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)
 			LLStringUtil::truncate(trigger_trunc, in_len);
 			if (!LLStringUtil::compareInsensitive(in_str, trigger_trunc))
 			{
-				*out_str = trigger;
-				return TRUE;
+				if (rest_of_match.compare("") == 0)
+				{
+					rest_of_match = trigger.substr(in_str.size());
+				}
+				std::string cur_rest_of_match = trigger.substr(in_str.size());
+				buf = "";
+				S32 i=0;
+
+				while (i<rest_of_match.length() && i<cur_rest_of_match.length())
+				{
+					if (rest_of_match[i]==cur_rest_of_match[i])
+				    {
+						buf.push_back(rest_of_match[i]);
+				    }
+				    else
+				    {
+				    	if(i==0)
+				    	{
+				    		rest_of_match = "";
+				    	}
+				    	break;
+				    }
+					i++;
+				}
+				if (rest_of_match.compare("") == 0)
+				{
+					return FALSE;
+				}
+				if (buf.compare("") != 0)
+				{
+					rest_of_match = buf;
+				}
+
 			}
 		}
 	}
+
+	if (rest_of_match.compare("") != 0)
+	{
+		*out_str = in_str+rest_of_match;
+		return TRUE;
+	}
+
 	return FALSE;
 }
 
diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp
index 493dea62ffd2613cd3ad37468eb037d779cc9462..813d2081ce46811333d8ee4e22de58d66e579b9f 100755
--- a/indra/newview/llgiveinventory.cpp
+++ b/indra/newview/llgiveinventory.cpp
@@ -139,7 +139,7 @@ bool LLGiveInventory::isInventoryGiveAcceptable(const LLInventoryItem* item)
 			BOOL copyable = false;
 			if (item->getPermissions().allowCopyBy(gAgentID)) copyable = true;
 
-			if (!copyable && get_is_item_worn(item->getUUID()))
+			if (!copyable || get_is_item_worn(item->getUUID()))
 			{
 				acceptable = false;
 			}
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index bede9b1e6c231932a103f0b10443c08f8515dd9c..c386030329db1f06470b74730f62868ec88db7d6 100755
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -624,7 +624,8 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV
 	LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
 	LLGLDisable cull(GL_CULL_FACE);
 	
-	if (mCollisionBanned == BA_BANNED)
+	if (mCollisionBanned == BA_BANNED ||
+		regionp->getRegionFlag(REGION_FLAGS_BLOCK_FLYOVER))
 	{
 		collision_height = BAN_HEIGHT;
 	}
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 18cdc6ec6d42ab2fc25ed4fa6f48d23e51cae5eb..b2ad737a1d70fcd4bdd8f1222f4287116f2cdb6b 100755
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -611,6 +611,11 @@ void LLGroupMgrGroupData::recalcAgentPowers(const LLUUID& agent_id)
 	}
 }
 
+bool LLGroupMgrGroupData::isSingleMemberNotOwner()
+{
+	return mMembers.size() == 1 && !mMembers.begin()->second->isOwner();
+}
+
 bool packRoleUpdateMessageBlock(LLMessageSystem* msg, 
 								const LLUUID& group_id,
 								const LLUUID& role_id, 
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index d107fceb4978ca57b2fbef6f3841aea610953bcb..9b62ecac48d0289f88cb0c7a5b9585ec9d89947b 100755
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -243,6 +243,8 @@ friend class LLGroupMgr;
 	BOOL isRoleDataComplete() { return mRoleDataComplete; }
 	BOOL isRoleMemberDataComplete() { return mRoleMemberDataComplete; }
 	BOOL isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; }
+	
+	bool isSingleMemberNotOwner();
 
 	F32 getAccessTime() const { return mAccessTime; }
 	void setAccessed();
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 55904eb028eb2682641b9dc2e7de1ed1403795b3..000eee3317e5f735386045a0769cde13eeadeb5b 100755
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -938,7 +938,10 @@ void LLInventoryFilter::toParams(Params& params) const
 {
 	params.filter_ops.types = getFilterObjectTypes();
 	params.filter_ops.category_types = getFilterCategoryTypes();
-	params.filter_ops.wearable_types = getFilterWearableTypes();
+	if (getFilterObjectTypes() & FILTERTYPE_WEARABLE)
+	{
+		params.filter_ops.wearable_types = getFilterWearableTypes();
+	}
 	params.filter_ops.date_range.min_date = getMinDate();
 	params.filter_ops.date_range.max_date = getMaxDate();
 	params.filter_ops.hours_ago = getHoursAgo();
@@ -957,7 +960,10 @@ void LLInventoryFilter::fromParams(const Params& params)
 
 	setFilterObjectTypes(params.filter_ops.types);
 	setFilterCategoryTypes(params.filter_ops.category_types);
-	setFilterWearableTypes(params.filter_ops.wearable_types);
+	if (params.filter_ops.wearable_types.isProvided())
+	{
+		setFilterWearableTypes(params.filter_ops.wearable_types);
+	}
 	setDateRange(params.filter_ops.date_range.min_date,   params.filter_ops.date_range.max_date);
 	setHoursAgo(params.filter_ops.hours_ago);
 	setShowFolderState(params.filter_ops.show_folder_state);
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 2e592f731af2bba7fe866829c49aacbec0ffd38d..e74e58015a7c87b9fbd924ae08fca7ad8e21bf2c 100755
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -145,7 +145,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
 	mShowItemLinkOverlays(p.show_item_link_overlays),
 	mShowEmptyMessage(p.show_empty_message),
 	mViewsInitialized(false),
-	mInvFVBridgeBuilder(NULL)
+	mInvFVBridgeBuilder(NULL),
+	mInventoryViewModel(p.name)
 {
 	mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
 
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 92974b9cef7404aa7c08e2af4ff2fcac6a0310b5..06e517a8612144f6ce0d11bd91eb9cf31304b755 100755
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -206,7 +206,11 @@ class LLLogChatTimeScanner: public LLSingleton<LLLogChatTimeScanner>
 };
 
 LLLogChat::save_history_signal_t * LLLogChat::sSaveHistorySignal = NULL;
-LLLoadHistoryThread::load_end_signal_t * LLLoadHistoryThread::mLoadEndSignal = NULL;
+
+std::map<LLUUID,LLLoadHistoryThread *> LLLogChat::sLoadHistoryThreads;
+std::map<LLUUID,LLDeleteHistoryThread *> LLLogChat::sDeleteHistoryThreads;
+LLMutex* LLLogChat::sHistoryThreadsMutex = NULL;
+
 
 //static
 std::string LLLogChat::makeLogFileName(std::string filename)
@@ -337,83 +341,179 @@ void LLLogChat::saveHistory(const std::string& filename,
 void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params)
 {
 	if (file_name.empty())
-				{
-					LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL;
-					return ;
-				}
+	{
+		LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL;
+		return ;
+	}
 
-				bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
+	bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
 
-				LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
-				if (!fptr)
-				{
-					fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
-					if (!fptr)
-					{
-						return;						//No previous conversation with this name.
-					}
-				}
+	LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
+	if (!fptr)
+	{
+		fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
+		if (!fptr)
+		{
+			return;						//No previous conversation with this name.
+		}
+	}
 
-				char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/
-				char *bptr;
-				S32 len;
-				bool firstline = TRUE;
-
-				if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1  , SEEK_END))
-				{	//We need to load the whole historyFile or it's smaller than recall size, so get it all.
-					firstline = FALSE;
-					if (fseek(fptr, 0, SEEK_SET))
-					{
-						fclose(fptr);
-						return;
-					}
-				}
-			while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr))
-				{
-					len = strlen(buffer) - 1;		/*Flawfinder: ignore*/
-					for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0';
-
-					if (firstline)
-					{
-						firstline = FALSE;
-						continue;
-					}
-
-					std::string line(buffer);
-
-					//updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message
-					if (' ' == line[0])
-					{
-						line.erase(0, MULTI_LINE_PREFIX.length());
-						append_to_last_message(messages, '\n' + line);
-					}
-					else if (0 == len && ('\n' == line[0] || '\r' == line[0]))
-					{
-						//to support old format's multilined messages with new lines used to divide paragraphs
-						append_to_last_message(messages, line);
-					}
-					else
-					{
-						LLSD item;
-						if (!LLChatLogParser::parse(line, item, load_params))
-						{
-							item[LL_IM_TEXT] = line;
-						}
-						messages.push_back(item);
-					}
-				}
-				fclose(fptr);
+	char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/
+	char *bptr;
+	S32 len;
+	bool firstline = TRUE;
+
+	if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1  , SEEK_END))
+	{	//We need to load the whole historyFile or it's smaller than recall size, so get it all.
+		firstline = FALSE;
+		if (fseek(fptr, 0, SEEK_SET))
+		{
+			fclose(fptr);
+			return;
+		}
+	}
+	while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr))
+	{
+		len = strlen(buffer) - 1;		/*Flawfinder: ignore*/
+		for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0';
+
+		if (firstline)
+		{
+			firstline = FALSE;
+			continue;
+		}
+
+		std::string line(buffer);
+
+		//updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message
+		if (' ' == line[0])
+		{
+			line.erase(0, MULTI_LINE_PREFIX.length());
+			append_to_last_message(messages, '\n' + line);
+		}
+		else if (0 == len && ('\n' == line[0] || '\r' == line[0]))
+		{
+			//to support old format's multilined messages with new lines used to divide paragraphs
+			append_to_last_message(messages, line);
+		}
+		else
+		{
+			LLSD item;
+			if (!LLChatLogParser::parse(line, item, load_params))
+			{
+				item[LL_IM_TEXT] = line;
+			}
+			messages.push_back(item);
+		}
+	}
+	fclose(fptr);
+}
+
+// static
+bool LLLogChat::historyThreadsFinished(LLUUID session_id)
+{
+	LLMutexLock lock(historyThreadsMutex());
+	bool finished = true;
+	std::map<LLUUID,LLLoadHistoryThread *>::iterator it = sLoadHistoryThreads.find(session_id);
+	if (it != sLoadHistoryThreads.end())
+	{
+		finished = it->second->isFinished();
+	}
+	if (!finished)
+	{
+		return false;
+	}
+	std::map<LLUUID,LLDeleteHistoryThread *>::iterator dit = sDeleteHistoryThreads.find(session_id);
+	if (dit != sDeleteHistoryThreads.end())
+	{
+		finished = finished && dit->second->isFinished();
+	}
+	return finished;
+}
+
+// static
+LLLoadHistoryThread* LLLogChat::getLoadHistoryThread(LLUUID session_id)
+{
+	LLMutexLock lock(historyThreadsMutex());
+	std::map<LLUUID,LLLoadHistoryThread *>::iterator it = sLoadHistoryThreads.find(session_id);
+	if (it != sLoadHistoryThreads.end())
+	{
+		return it->second;
+	}
+	return NULL;
+}
 
+// static
+LLDeleteHistoryThread* LLLogChat::getDeleteHistoryThread(LLUUID session_id)
+{
+	LLMutexLock lock(historyThreadsMutex());
+	std::map<LLUUID,LLDeleteHistoryThread *>::iterator it = sDeleteHistoryThreads.find(session_id);
+	if (it != sDeleteHistoryThreads.end())
+	{
+		return it->second;
+	}
+	return NULL;
+}
 
+// static
+bool LLLogChat::addLoadHistoryThread(LLUUID& session_id, LLLoadHistoryThread* lthread)
+{
+	LLMutexLock lock(historyThreadsMutex());
+	std::map<LLUUID,LLLoadHistoryThread *>::const_iterator it = sLoadHistoryThreads.find(session_id);
+	if (it != sLoadHistoryThreads.end())
+	{
+		return false;
+	}
+	sLoadHistoryThreads[session_id] = lthread;
+	return true;
+}
+
+// static
+bool LLLogChat::addDeleteHistoryThread(LLUUID& session_id, LLDeleteHistoryThread* dthread)
+{
+	LLMutexLock lock(historyThreadsMutex());
+	std::map<LLUUID,LLDeleteHistoryThread *>::const_iterator it = sDeleteHistoryThreads.find(session_id);
+	if (it != sDeleteHistoryThreads.end())
+	{
+		return false;
+	}
+	sDeleteHistoryThreads[session_id] = dthread;
+	return true;
 }
 
-void LLLogChat::startChatHistoryThread(const std::string& file_name, const LLSD& load_params)
+// static
+void LLLogChat::cleanupHistoryThreads()
 {
+	LLMutexLock lock(historyThreadsMutex());
+	std::vector<LLUUID> uuids;
+	std::map<LLUUID,LLLoadHistoryThread *>::iterator lit = sLoadHistoryThreads.begin();
+	for (; lit != sLoadHistoryThreads.end(); lit++)
+	{
+		if (lit->second->isFinished() && sDeleteHistoryThreads[lit->first]->isFinished())
+		{
+			delete lit->second;
+			delete sDeleteHistoryThreads[lit->first];
+			uuids.push_back(lit->first);
+		}
+	}
+	std::vector<LLUUID>::iterator uuid_it = uuids.begin();
+	for ( ;uuid_it != uuids.end(); uuid_it++)
+	{
+		sLoadHistoryThreads.erase(*uuid_it);
+		sDeleteHistoryThreads.erase(*uuid_it);
+	}
+}
 
-	LLLoadHistoryThread* mThread = new LLLoadHistoryThread();
-	mThread->start();
-	mThread->setHistoryParams(file_name, load_params);
+//static
+LLMutex* LLLogChat::historyThreadsMutex()
+{
+	if (sHistoryThreadsMutex == NULL)
+	{
+		sHistoryThreadsMutex = new LLMutex(NULL);
+	}
+	return sHistoryThreadsMutex;
 }
+
 // static
 std::string LLLogChat::oldLogFileName(std::string filename)
 {
@@ -475,7 +575,7 @@ void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string
 				//Add Nearby chat history to the list of transcriptions
 				list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename));
 				LLFile::close(filep);
-				return;
+				continue;
 			}
 			char buffer[LOG_RECALL_SIZE];
 
@@ -845,31 +945,89 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
 	return true;  //parsed name and message text, maybe have a timestamp too
 }
 
-LLLoadHistoryThread::LLLoadHistoryThread() : LLThread("load chat history")
+LLDeleteHistoryThread::LLDeleteHistoryThread(std::list<LLSD>* messages, LLLoadHistoryThread* loadThread)
+	: LLActionThread("delete chat history"),
+	mMessages(messages),
+	mLoadThread(loadThread)
 {
-	mNewLoad = false;
+}
+LLDeleteHistoryThread::~LLDeleteHistoryThread()
+{
+}
+void LLDeleteHistoryThread::run()
+{
+	if (mLoadThread != NULL)
+	{
+		mLoadThread->waitFinished();
+	}
+	if (NULL != mMessages)
+	{
+		delete mMessages;
+	}
+	mMessages = NULL;
+	setFinished();
 }
 
-void LLLoadHistoryThread::run()
+LLActionThread::LLActionThread(const std::string& name)
+	: LLThread(name),
+	mMutex(NULL),
+	mRunCondition(NULL),
+	mFinished(false)
 {
-	while (!LLApp::isQuitting())
+}
+
+LLActionThread::~LLActionThread()
+{
+}
+
+void LLActionThread::waitFinished()
+{
+	mMutex.lock();
+	if (!mFinished)
 	{
-		if(mNewLoad)
-		{
-			loadHistory(mFileName,mMessages,mLoadParams);
-			break;
-		}
+		mMutex.unlock();
+		mRunCondition.wait();
+	}
+	else
+	{
+		mMutex.unlock();	
 	}
 }
 
-void LLLoadHistoryThread::setHistoryParams(const std::string& file_name, const LLSD& load_params)
+void LLActionThread::setFinished()
 {
-	mFileName   = file_name;
-	mLoadParams = load_params;
-	mNewLoad    = true;
+	mMutex.lock();
+	mFinished = true;
+	mMutex.unlock();
+	mRunCondition.signal();
 }
 
-void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params)
+LLLoadHistoryThread::LLLoadHistoryThread(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params)
+	: LLActionThread("load chat history"),
+	mMessages(messages),
+	mFileName(file_name),
+	mLoadParams(load_params),
+	mNewLoad(true),
+	mLoadEndSignal(NULL)
+{
+}
+
+LLLoadHistoryThread::~LLLoadHistoryThread()
+{
+}
+
+void LLLoadHistoryThread::run()
+{
+	if(mNewLoad)
+	{
+		loadHistory(mFileName, mMessages, mLoadParams);
+		int count = mMessages->size();
+		llinfos << "mMessages->size(): " << count << llendl;
+		setFinished();
+	}
+}
+
+void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params)
 {
 	if (file_name.empty())
 	{
@@ -878,8 +1036,8 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL
 	}
 
 	bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
-
 	LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
+
 	if (!fptr)
 	{
 		fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
@@ -892,6 +1050,7 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL
 	}
 
 	char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/
+
 	char *bptr;
 	S32 len;
 	bool firstline = TRUE;
@@ -908,29 +1067,31 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL
 		}
 	}
 
-	while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr))
+
+	while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr))
 	{
 		len = strlen(buffer) - 1;		/*Flawfinder: ignore*/
+
 		for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0';
 
+
 		if (firstline)
 		{
 			firstline = FALSE;
 			continue;
 		}
-
 		std::string line(buffer);
 
 		//updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message
 		if (' ' == line[0])
 		{
 			line.erase(0, MULTI_LINE_PREFIX.length());
-			append_to_last_message(messages, '\n' + line);
+			append_to_last_message(*messages, '\n' + line);
 		}
 		else if (0 == len && ('\n' == line[0] || '\r' == line[0]))
 		{
 			//to support old format's multilined messages with new lines used to divide paragraphs
-			append_to_last_message(messages, line);
+			append_to_last_message(*messages, line);
 		}
 		else
 		{
@@ -939,15 +1100,15 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL
 			{
 				item[LL_IM_TEXT] = line;
 			}
-			messages.push_back(item);
+			messages->push_back(item);
 		}
 	}
+
 	fclose(fptr);
 	mNewLoad = false;
 	(*mLoadEndSignal)(messages, file_name);
 }
-
-//static
+	
 boost::signals2::connection LLLoadHistoryThread::setLoadEndSignal(const load_end_signal_t::slot_type& cb)
 {
 	if (NULL == mLoadEndSignal)
@@ -957,3 +1118,13 @@ boost::signals2::connection LLLoadHistoryThread::setLoadEndSignal(const load_end
 
 	return mLoadEndSignal->connect(cb);
 }
+
+void LLLoadHistoryThread::removeLoadEndSignal(const load_end_signal_t::slot_type& cb)
+{
+	if (NULL != mLoadEndSignal)
+	{
+		mLoadEndSignal->disconnect_all_slots();
+		delete mLoadEndSignal;
+	}
+	mLoadEndSignal = NULL;
+}
diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h
index 86610f99b3c4697c414df7d3fba0a082f365c641..ca597599dddcb729f3b3aeee43150b7efbf856c9 100755
--- a/indra/newview/lllogchat.h
+++ b/indra/newview/lllogchat.h
@@ -29,23 +29,54 @@
 #include "llthread.h"
 
 class LLChat;
-class LLLoadHistoryThread : public LLThread
+
+class LLActionThread : public LLThread
 {
+public:
+	LLActionThread(const std::string& name);
+	~LLActionThread();
+
+	void waitFinished();
+	bool isFinished() { return mFinished; }
+protected:
+	void setFinished();
 private:
-	std::string mFileName;
-	std::list<LLSD> mMessages;
+	bool mFinished;
+	LLMutex	mMutex;
+	LLCondition mRunCondition;
+};
+
+class LLLoadHistoryThread : public LLActionThread
+{
+private:
+	const std::string& mFileName;
+	std::list<LLSD>* mMessages;
 	LLSD mLoadParams;
 	bool mNewLoad;
 public:
-	LLLoadHistoryThread();
-
-	void setHistoryParams(const std::string& file_name, const LLSD& load_params);
-	virtual void loadHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params);
+	LLLoadHistoryThread(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params);
+	~LLLoadHistoryThread();
+	//void setHistoryParams(const std::string& file_name, const LLSD& load_params);
+	virtual void loadHistory(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params);
     virtual void run();
 
-   typedef boost::signals2::signal<void (std::list<LLSD>& messages,const std::string& file_name)> load_end_signal_t;
-   static load_end_signal_t * mLoadEndSignal;
-   static boost::signals2::connection setLoadEndSignal(const load_end_signal_t::slot_type& cb);
+	typedef boost::signals2::signal<void (std::list<LLSD>* messages,const std::string& file_name)> load_end_signal_t;
+	load_end_signal_t * mLoadEndSignal;
+	boost::signals2::connection setLoadEndSignal(const load_end_signal_t::slot_type& cb);
+	void removeLoadEndSignal(const load_end_signal_t::slot_type& cb);
+};
+
+class LLDeleteHistoryThread : public LLActionThread
+{
+private:
+	std::list<LLSD>* mMessages;
+	LLLoadHistoryThread* mLoadThread;
+public:
+	LLDeleteHistoryThread(std::list<LLSD>* messages, LLLoadHistoryThread* loadThread);
+	~LLDeleteHistoryThread();
+
+	virtual void run();
+	static void deleteHistory();
 };
 
 class LLLogChat
@@ -74,7 +105,6 @@ class LLLogChat
 	static void getListOfTranscriptBackupFiles(std::vector<std::string>& list_of_transcriptions);
 
 	static void loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params = LLSD());
-	static void startChatHistoryThread(const std::string& file_name, const LLSD& load_params);
 
 	typedef boost::signals2::signal<void ()> save_history_signal_t;
 	static boost::signals2::connection setSaveHistorySignal(const save_history_signal_t::slot_type& cb);
@@ -91,9 +121,21 @@ class LLLogChat
 	static bool isTranscriptExist(const LLUUID& avatar_id, bool is_group=false);
 	static bool isNearbyTranscriptExist();
 
+	static bool historyThreadsFinished(LLUUID session_id);
+	static LLLoadHistoryThread* getLoadHistoryThread(LLUUID session_id);
+	static LLDeleteHistoryThread* getDeleteHistoryThread(LLUUID session_id);
+	static bool addLoadHistoryThread(LLUUID& session_id, LLLoadHistoryThread* lthread);
+	static bool addDeleteHistoryThread(LLUUID& session_id, LLDeleteHistoryThread* dthread);
+	static void cleanupHistoryThreads();
+
 private:
 	static std::string cleanFileName(std::string filename);
 	static save_history_signal_t * sSaveHistorySignal;
+
+	static std::map<LLUUID,LLLoadHistoryThread *> sLoadHistoryThreads;
+	static std::map<LLUUID,LLDeleteHistoryThread *> sDeleteHistoryThreads;
+	static LLMutex* sHistoryThreadsMutex;
+	static LLMutex* historyThreadsMutex();
 };
 
 /**
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index a63f6f424c04fa6c5ea4ce985d4302887902ec29..8c531e476d935e753111ec56cf8708bdd86ccfe6 100755
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -843,121 +843,85 @@ void LLManipScale::drag( S32 x, S32 y )
 // Scale around the 
 void LLManipScale::dragCorner( S32 x, S32 y )
 {
-	LLBBox bbox	= LLSelectMgr::getInstance()->getBBoxOfSelection();
-
 	// Suppress scale if mouse hasn't moved.
 	if (x == mLastMouseX && y == mLastMouseY)
 	{
-	//	sendUpdates(TRUE,TRUE,TRUE);
 		return;
 	}
-
 	mLastMouseX = x;
 	mLastMouseY = y;
 
-	LLVector3d drag_start_point_global	= mDragStartPointGlobal;
-	LLVector3d drag_start_center_global = mDragStartCenterGlobal;
-	LLVector3 drag_start_point_agent = gAgent.getPosAgentFromGlobal(drag_start_point_global);
-	LLVector3 drag_start_center_agent = gAgent.getPosAgentFromGlobal(drag_start_center_global);
+	LLVector3 drag_start_point_agent = gAgent.getPosAgentFromGlobal(mDragStartPointGlobal);
+	LLVector3 drag_start_center_agent = gAgent.getPosAgentFromGlobal(mDragStartCenterGlobal);
 
 	LLVector3d drag_start_dir_d;
-	drag_start_dir_d.setVec(drag_start_point_global - drag_start_center_global);
-	LLVector3 drag_start_dir_f;
-	drag_start_dir_f.setVec(drag_start_dir_d);
+	drag_start_dir_d.setVec(mDragStartPointGlobal - mDragStartCenterGlobal);
 
 	F32 s = 0;
 	F32 t = 0;
-
 	nearestPointOnLineFromMouse(x, y, 
-						drag_start_center_agent,
-						drag_start_point_agent,
-						s, t );
-
-	F32 drag_start_dist = dist_vec(drag_start_point_agent, drag_start_center_agent);
+								drag_start_center_agent,
+								drag_start_point_agent,
+								s, t );
 
 	if( s <= 0 )  // we only care about intersections in front of the camera
 	{
 		return;
 	}
+	mDragPointGlobal = lerp(mDragStartCenterGlobal, mDragStartPointGlobal, t);
 
-	LLVector3d drag_point_global = drag_start_center_global + t * drag_start_dir_d;
-
-	F32 scale_factor = t;
-
-	BOOL uniform = LLManipScale::getUniform();
-
-	if( !uniform )
-	{
-		scale_factor = 0.5f + (scale_factor * 0.5f);
-	}
+	LLBBox bbox	     = LLSelectMgr::getInstance()->getBBoxOfSelection();
+	F32 scale_factor = 1.f;
+	F32 max_scale    = partToMaxScale(mManipPart, bbox);
+	F32 min_scale    = partToMinScale(mManipPart, bbox);
+	BOOL uniform     = LLManipScale::getUniform();
 
 	// check for snapping
-	LLVector3 drag_center_agent = gAgent.getPosAgentFromGlobal(drag_point_global);
 	LLVector3 mouse_on_plane1;
-	getMousePointOnPlaneAgent(mouse_on_plane1, x, y, drag_center_agent, mScalePlaneNormal1);
-	LLVector3 mouse_on_plane2;
-	getMousePointOnPlaneAgent(mouse_on_plane2, x, y, drag_center_agent, mScalePlaneNormal2);
-	LLVector3 mouse_dir_1 = mouse_on_plane1 - mScaleCenter;
-	LLVector3 mouse_dir_2 = mouse_on_plane2 - mScaleCenter;
-	LLVector3 mouse_to_scale_line_1 = mouse_dir_1 - projected_vec(mouse_dir_1, mScaleDir);
-	LLVector3 mouse_to_scale_line_2 = mouse_dir_2 - projected_vec(mouse_dir_2, mScaleDir);
-	LLVector3 mouse_to_scale_line_dir_1 = mouse_to_scale_line_1;
-	mouse_to_scale_line_dir_1.normVec();
-	if (mouse_to_scale_line_dir_1 * mSnapGuideDir1 < 0.f)
-	{
-		// need to keep sign of mouse offset wrt to snap guide direction
-		mouse_to_scale_line_dir_1 *= -1.f;
-	}
-	LLVector3 mouse_to_scale_line_dir_2 = mouse_to_scale_line_2;
-	mouse_to_scale_line_dir_2.normVec();
-	if (mouse_to_scale_line_dir_2 * mSnapGuideDir2 < 0.f)
-	{
-		// need to keep sign of mouse offset wrt to snap guide direction
-		mouse_to_scale_line_dir_2 *= -1.f;
-	}
+	getMousePointOnPlaneAgent(mouse_on_plane1, x, y, mScaleCenter, mScalePlaneNormal1);
+	mouse_on_plane1 -= mScaleCenter;
 
-	F32 snap_dir_dot_mouse_offset1 = mSnapGuideDir1 * mouse_to_scale_line_dir_1;
-	F32 snap_dir_dot_mouse_offset2 = mSnapGuideDir2 * mouse_to_scale_line_dir_2;
+	LLVector3 mouse_on_plane2;
+	getMousePointOnPlaneAgent(mouse_on_plane2, x, y, mScaleCenter, mScalePlaneNormal2);
+	mouse_on_plane2 -= mScaleCenter;
 
-	F32 dist_from_scale_line_1 = mouse_to_scale_line_1 * mouse_to_scale_line_dir_1; 
-	F32 dist_from_scale_line_2 = mouse_to_scale_line_2 * mouse_to_scale_line_dir_2;
+	LLVector3 projected_drag_pos1 = inverse_projected_vec(mScaleDir, orthogonal_component(mouse_on_plane1, mSnapGuideDir1));
+	LLVector3 projected_drag_pos2 = inverse_projected_vec(mScaleDir, orthogonal_component(mouse_on_plane2, mSnapGuideDir2));
 
-	F32 max_scale = partToMaxScale(mManipPart, bbox);
-	F32 min_scale = partToMinScale(mManipPart, bbox);
+	LLVector3 mouse_offset_from_scale_line_1 = orthogonal_component(mouse_on_plane1, mScaleDir);
+	LLVector3 mouse_offset_from_scale_line_2 = orthogonal_component(mouse_on_plane2, mScaleDir);
 
 	BOOL snap_enabled = gSavedSettings.getBOOL("SnapEnabled");
-	if (snap_enabled && dist_from_scale_line_1 > mSnapRegimeOffset * snap_dir_dot_mouse_offset1)
+	if (snap_enabled && (mouse_on_plane1 - projected_drag_pos1) * mSnapGuideDir1 > mSnapRegimeOffset)
 	{
-		mInSnapRegime = TRUE;
-		LLVector3 projected_drag_pos = mouse_on_plane1 - (dist_from_scale_line_1 / snap_dir_dot_mouse_offset1) * mSnapGuideDir1;
-		F32 drag_dist = (projected_drag_pos - mScaleCenter) * mScaleDir;
+		F32 drag_dist = projected_drag_pos1.length();
 
-		F32 cur_subdivisions = llclamp(getSubdivisionLevel(projected_drag_pos, mScaleDir, mScaleSnapUnit1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
+		F32 cur_subdivisions = llclamp(getSubdivisionLevel(projected_drag_pos1, mScaleDir, mScaleSnapUnit1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
 		F32 snap_dist = mScaleSnapUnit1 / (2.f * cur_subdivisions);
 		F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit1 / cur_subdivisions);
 
 		mScaleSnapValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale);
 
-		scale_factor = mScaleSnapValue / drag_start_dist;
-		if( !uniform )
+		mInSnapRegime = TRUE;
+		scale_factor = mScaleSnapValue / dist_vec(drag_start_point_agent, drag_start_center_agent);
+		if (!uniform)
 		{
 			scale_factor *= 0.5f;
 		}
 	}
-	else if (snap_enabled && dist_from_scale_line_2 > mSnapRegimeOffset * snap_dir_dot_mouse_offset2)
+	else if (snap_enabled && (mouse_on_plane2 - projected_drag_pos2) * mSnapGuideDir2 > mSnapRegimeOffset )
 	{
-		mInSnapRegime = TRUE;
-		LLVector3 projected_drag_pos = mouse_on_plane2 - (dist_from_scale_line_2 / snap_dir_dot_mouse_offset2) * mSnapGuideDir2;
-		F32 drag_dist = (projected_drag_pos - mScaleCenter) * mScaleDir;
+		F32 drag_dist = projected_drag_pos2.length();
 
-		F32 cur_subdivisions = llclamp(getSubdivisionLevel(projected_drag_pos, mScaleDir, mScaleSnapUnit2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
+		F32 cur_subdivisions = llclamp(getSubdivisionLevel(projected_drag_pos2, mScaleDir, mScaleSnapUnit2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
 		F32 snap_dist = mScaleSnapUnit2 / (2.f * cur_subdivisions);
 		F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit2 / cur_subdivisions);
 
 		mScaleSnapValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale);
 
-		scale_factor = mScaleSnapValue / drag_start_dist;
-		if( !uniform )
+		mInSnapRegime = TRUE;
+		scale_factor = mScaleSnapValue / dist_vec(drag_start_point_agent, drag_start_center_agent);
+		if (!uniform)
 		{
 			scale_factor *= 0.5f;
 		}
@@ -965,8 +929,14 @@ void LLManipScale::dragCorner( S32 x, S32 y )
 	else 
 	{
 		mInSnapRegime = FALSE;
+		scale_factor = t;
+		if (!uniform)
+		{
+			scale_factor = 0.5f + (scale_factor * 0.5f);
+		}
 	}
 
+
 	F32 max_scale_factor = get_default_max_prim_scale() / MIN_PRIM_SCALE;
 	F32 min_scale_factor = MIN_PRIM_SCALE / get_default_max_prim_scale();
 
@@ -1069,9 +1039,6 @@ void LLManipScale::dragCorner( S32 x, S32 y )
 		}
 	}
 
-	
-
-	mDragPointGlobal = drag_point_global;
 }
 
 	
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index bf332d1ca7f7b397e66a1d3bc9f6960e8d5f9f0c..f4aab6bd4e64df6cc2f46ad233c53e9e258fcf1c 100755
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -49,6 +49,7 @@
 
 #include "llpanelgroupnotices.h"
 #include "llpanelgroupgeneral.h"
+#include "llpanelgrouproles.h"
 
 #include "llaccordionctrltab.h"
 #include "llaccordionctrl.h"
@@ -275,6 +276,7 @@ void LLPanelGroup::onBtnApply(void* user_data)
 {
 	LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data);
 	self->apply();
+	self->refreshData();
 }
 
 void LLPanelGroup::onBtnGroupCallClicked(void* user_data)
@@ -497,6 +499,22 @@ bool LLPanelGroup::apply(LLPanelGroupTab* tab)
 	{
 		//we skip refreshing group after ew manually apply changes since its very annoying
 		//for those who are editing group
+
+		LLPanelGroupRoles * roles_tab = dynamic_cast<LLPanelGroupRoles*>(tab);
+		if (roles_tab)
+		{
+			LLGroupMgr* gmgrp = LLGroupMgr::getInstance();
+			LLGroupMgrGroupData* gdatap = gmgrp->getGroupData(roles_tab->getGroupID());
+
+			// allow refresh only for one specific case:
+			// there is only one member in group and it is not owner
+			// it's a wrong situation and need refresh panels from server
+			if (gdatap && gdatap->isSingleMemberNotOwner())
+			{
+				return true;
+			}
+		}
+
 		mSkipRefresh = TRUE;
 		return true;
 	}
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index b941ee1f1b9c7bfa1a0c38f43f41a06a8658d9f4..343f2b413f79e1d04d2d67cfdd788413b928f04c 100755
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -716,6 +716,11 @@ void LLLandmarksPanel::updateListCommands()
 	mListCommands->getChildView(TRASH_BUTTON_NAME)->setEnabled(trash_enabled);
 }
 
+void LLLandmarksPanel::updateMenuVisibility(LLUICtrl* menu)
+{
+	onMenuVisibilityChange(menu, LLSD().with("visibility", true));
+}
+
 void LLLandmarksPanel::onActionsButtonClick()
 {
 	LLToggleableMenu* menu = mGearFolderMenu;
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index 8fae0f0b67f7db6862ccdfda46b2f3274d951235..80310d15242f8fcb026b0319b13effac24e14ace 100755
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -80,6 +80,8 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 
 	LLPlacesInventoryPanel* getLibraryInventoryPanel() { return mLibraryInventoryPanel; }
 
+	void updateMenuVisibility(LLUICtrl* menu);
+
 protected:
 	/**
 	 * @return true - if current selected panel is not null and selected item is a landmark
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
index 74c810ea79f2cdc294e16d89949928aec79d2cac..1cdd1b664e1ef4b3d71b4dacd63d2c40e9b2641e 100755
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -876,7 +876,10 @@ void LLPanelNearByMedia::onClickParcelAudioPlay()
 	// playing and updated as they cross to other parcels etc.
 	mParcelAudioAutoStart = true;
 	if (!gAudiop)
+	{
+		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
 		return;
+	}
 
 	if (LLAudioEngine::AUDIO_PAUSED == gAudiop->isInternetStreamPlaying())
 	{
@@ -896,7 +899,10 @@ void LLPanelNearByMedia::onClickParcelAudioStop()
 	// they explicitly start it again.
 	mParcelAudioAutoStart = false;
 	if (!gAudiop)
+	{
+		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
 		return;
+	}
 
 	LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
 }
@@ -904,7 +910,10 @@ void LLPanelNearByMedia::onClickParcelAudioStop()
 void LLPanelNearByMedia::onClickParcelAudioPause()
 {
 	if (!gAudiop)
+	{
+		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
 		return;
+	}
 
 	// 'true' means pause
 	gAudiop->pauseInternetStream(true);
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 77bfcec4e0e287526b0e9483aec10419564950be..665b9ab294137787389e0a8e49cd71101779d236 100755
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1491,7 +1491,8 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par
 	mFolders(NULL),
 	mHaveInventory(FALSE),
 	mIsInventoryEmpty(TRUE),
-	mInventoryNeedsUpdate(FALSE)
+	mInventoryNeedsUpdate(FALSE),
+	mInventoryViewModel(p.name)
 {
 	// Setup context menu callbacks
 	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2));
@@ -2010,3 +2011,46 @@ void LLPanelObjectInventory::clearItemIDs()
 	mItemMap.clear();
 }
 
+BOOL LLPanelObjectInventory::handleKeyHere( KEY key, MASK mask )
+{
+	BOOL handled = FALSE;
+	switch (key)
+	{
+	case KEY_DELETE:
+	case KEY_BACKSPACE:
+		// Delete selected items if delete or backspace key hit on the inventory panel
+		// Note: on Mac laptop keyboards, backspace and delete are one and the same
+		if (isSelectionRemovable() && mask == MASK_NONE)
+		{
+			LLInventoryAction::doToSelected(&gInventory, mFolders, "delete");
+			handled = TRUE;
+		}
+		break;
+	}
+	return handled;
+}
+
+BOOL LLPanelObjectInventory::isSelectionRemovable()
+{
+	if (!mFolders || !mFolders->getRoot())
+	{
+		return FALSE;
+	}
+	std::set<LLFolderViewItem*> selection_set = mFolders->getRoot()->getSelectionList();
+	if (selection_set.empty())
+	{
+		return FALSE;
+	}
+	for (std::set<LLFolderViewItem*>::iterator iter = selection_set.begin();
+		iter != selection_set.end();
+		++iter)
+	{
+		LLFolderViewItem *item = *iter;
+		const LLFolderViewModelItemInventory *listener = dynamic_cast<const LLFolderViewModelItemInventory*>(item->getViewModelItem());
+		if (!listener || !listener->isItemRemovable() || listener->isItemInTrash())
+		{
+			return FALSE;
+		}
+	}
+	return TRUE;
+}
diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h
index f497c695b352841da162bea78ce2399f1807d4e0..9559f7e886186e82597815d894aaf6a67b2f6553 100755
--- a/indra/newview/llpanelobjectinventory.h
+++ b/indra/newview/llpanelobjectinventory.h
@@ -94,6 +94,9 @@ class LLPanelObjectInventory : public LLPanel, public LLVOInventoryListener
 	void removeItemID(const LLUUID& id);
 	void clearItemIDs();
 
+	BOOL			handleKeyHere( KEY key, MASK mask );
+	BOOL			isSelectionRemovable();
+
 private:
 	std::map<LLUUID, LLFolderViewItem*> mItemMap;
 
diff --git a/indra/newview/llplacesfolderview.cpp b/indra/newview/llplacesfolderview.cpp
index 9e1b75b7e9b365d90a8400cb2508151a346ab8d1..fe89c1e3149d29c60c05686e5f08d0f2eddb1440 100755
--- a/indra/newview/llplacesfolderview.cpp
+++ b/indra/newview/llplacesfolderview.cpp
@@ -31,6 +31,7 @@
 
 #include "llplacesinventorypanel.h"
 #include "llpanellandmarks.h"
+#include "llmenugl.h"
 
 LLPlacesFolderView::LLPlacesFolderView(const LLFolderView::Params& p)
     : LLFolderView(p)
@@ -67,6 +68,16 @@ BOOL LLPlacesFolderView::handleRightMouseDown(S32 x, S32 y, MASK mask)
     return LLFolderView::handleRightMouseDown(x, y, mask);
 }
 
+void LLPlacesFolderView::updateMenu()
+{
+	LLFolderView::updateMenu();
+	LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
+	if (menu && menu->getVisible())
+	{
+		mParentLandmarksPanel->updateMenuVisibility(menu);
+	}
+}
+
 void LLPlacesFolderView::setupMenuHandle(LLInventoryType::EType asset_type, LLHandle<LLView> menu_handle)
 {
     mMenuHandlesByInventoryType[asset_type] = menu_handle;
diff --git a/indra/newview/llplacesfolderview.h b/indra/newview/llplacesfolderview.h
index 8c5be39b5e5c92a6840749b824e1dfcec954c0c1..65fe76007ac75674e2e120cc9ebcfc755034e1b6 100755
--- a/indra/newview/llplacesfolderview.h
+++ b/indra/newview/llplacesfolderview.h
@@ -51,6 +51,8 @@ class LLPlacesFolderView : public LLFolderView
 	 */
 	/*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
 
+	/*virtual*/ void updateMenu();
+
 	void setupMenuHandle(LLInventoryType::EType asset_type, LLHandle<LLView> menu_handle);
 
 	void setParentLandmarksPanel(LLLandmarksPanel* panel)
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 870304a7b8a71bb0524b30b607406c3dbd244f20..e694045f9a60dadbf4a4e0d805b353bf383d575e 100755
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -192,11 +192,11 @@ class LLFloaterScriptSearch : public LLFloater
 private:
 
 	LLScriptEdCore* mEditorCore;
-
 	static LLFloaterScriptSearch*	sInstance;
 
 protected:
 	LLLineEditor*			mSearchBox;
+	LLLineEditor*			mReplaceBox;
         void onSearchBoxCommit();
 };
 
@@ -205,6 +205,7 @@ LLFloaterScriptSearch* LLFloaterScriptSearch::sInstance = NULL;
 LLFloaterScriptSearch::LLFloaterScriptSearch(LLScriptEdCore* editor_core)
 :	LLFloater(LLSD()),
 	mSearchBox(NULL),
+	mReplaceBox(NULL),
 	mEditorCore(editor_core)
 {
 	buildFromFile("floater_script_search.xml");
@@ -227,6 +228,7 @@ LLFloaterScriptSearch::LLFloaterScriptSearch(LLScriptEdCore* editor_core)
 
 BOOL LLFloaterScriptSearch::postBuild()
 {
+	mReplaceBox = getChild<LLLineEditor>("replace_text");
 	mSearchBox = getChild<LLLineEditor>("search_text");
 	mSearchBox->setCommitCallback(boost::bind(&LLFloaterScriptSearch::onSearchBoxCommit, this));
 	mSearchBox->setCommitOnFocusLost(FALSE);
@@ -242,8 +244,12 @@ BOOL LLFloaterScriptSearch::postBuild()
 //static 
 void LLFloaterScriptSearch::show(LLScriptEdCore* editor_core)
 {
+	LLSD::String search_text;
+	LLSD::String replace_text;
 	if (sInstance && sInstance->mEditorCore && sInstance->mEditorCore != editor_core)
 	{
+		search_text=sInstance->mSearchBox->getValue().asString();
+		replace_text=sInstance->mReplaceBox->getValue().asString();
 		sInstance->closeFloater();
 		delete sInstance;
 	}
@@ -252,6 +258,8 @@ void LLFloaterScriptSearch::show(LLScriptEdCore* editor_core)
 	{
 		// sInstance will be assigned in the constructor.
 		new LLFloaterScriptSearch(editor_core);
+		sInstance->mSearchBox->setValue(search_text);
+		sInstance->mReplaceBox->setValue(replace_text);
 	}
 
 	sInstance->openFloater();
@@ -272,7 +280,7 @@ void LLFloaterScriptSearch::onBtnSearch(void *userdata)
 void LLFloaterScriptSearch::handleBtnSearch()
 {
 	LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text");
-	mEditorCore->mEditor->selectNext(getChild<LLUICtrl>("search_text")->getValue().asString(), caseChk->get());
+	mEditorCore->mEditor->selectNext(mSearchBox->getValue().asString(), caseChk->get());
 }
 
 // static 
@@ -285,7 +293,7 @@ void LLFloaterScriptSearch::onBtnReplace(void *userdata)
 void LLFloaterScriptSearch::handleBtnReplace()
 {
 	LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text");
-	mEditorCore->mEditor->replaceText(getChild<LLUICtrl>("search_text")->getValue().asString(), getChild<LLUICtrl>("replace_text")->getValue().asString(), caseChk->get());
+	mEditorCore->mEditor->replaceText(mSearchBox->getValue().asString(), mReplaceBox->getValue().asString(), caseChk->get());
 }
 
 // static 
@@ -298,7 +306,7 @@ void LLFloaterScriptSearch::onBtnReplaceAll(void *userdata)
 void LLFloaterScriptSearch::handleBtnReplaceAll()
 {
 	LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text");
-	mEditorCore->mEditor->replaceTextAll(getChild<LLUICtrl>("search_text")->getValue().asString(), getChild<LLUICtrl>("replace_text")->getValue().asString(), caseChk->get());
+	mEditorCore->mEditor->replaceTextAll(mSearchBox->getValue().asString(), mReplaceBox->getValue().asString(), caseChk->get());
 }
 
 bool LLFloaterScriptSearch::hasAccelerators() const
@@ -329,7 +337,7 @@ void LLFloaterScriptSearch::onSearchBoxCommit()
 	if (mEditorCore && mEditorCore->mEditor)
 	{
 		LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text");
-		mEditorCore->mEditor->selectNext(getChild<LLUICtrl>("search_text")->getValue().asString(), caseChk->get());
+		mEditorCore->mEditor->selectNext(mSearchBox->getValue().asString(), caseChk->get());
 	}
 }
 
@@ -518,6 +526,10 @@ void LLScriptEdCore::initMenu()
 	menuItem->setClickCallback(boost::bind(&LLTextEditor::selectAll, mEditor));
 	menuItem->setEnableCallback(boost::bind(&LLTextEditor::canSelectAll, mEditor));
 
+	menuItem = getChild<LLMenuItemCallGL>("Deselect");
+	menuItem->setClickCallback(boost::bind(&LLTextEditor::deselect, mEditor));
+	menuItem->setEnableCallback(boost::bind(&LLTextEditor::canDeselect, mEditor));
+
 	menuItem = getChild<LLMenuItemCallGL>("Search / Replace...");
 	menuItem->setClickCallback(boost::bind(&LLFloaterScriptSearch::show, this));
 
@@ -1864,7 +1876,7 @@ void LLLiveLSLEditor::loadAsset()
 			mIsModifiable = item && gAgent.allowOperation(PERM_MODIFY, 
 										item->getPermissions(),
 				   						GP_OBJECT_MANIPULATE);
-			
+			refreshFromItem();
 			// This is commented out, because we don't completely
 			// handle script exports yet.
 			/*
diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp
index 33d2d015ad2c45fce515be71c3bf2e76226ccf80..11b81a58fcf44c1c4dad617c79e32f487114fadc 100755
--- a/indra/newview/llpreviewsound.cpp
+++ b/indra/newview/llpreviewsound.cpp
@@ -55,7 +55,9 @@ BOOL	LLPreviewSound::postBuild()
 	{
 		getChild<LLUICtrl>("desc")->setValue(item->getDescription());
 		if (gAudiop)
+		{
 			gAudiop->preloadSound(item->getAssetUUID()); // preload the sound
+		}
 	}
 	
 	childSetAction("Sound play btn",&LLPreviewSound::playSound,this);
@@ -94,6 +96,6 @@ void LLPreviewSound::auditionSound( void *userdata )
 	if(item && gAudiop)
 	{
 		LLVector3d lpos_global = gAgent.getPositionGlobal();
-		gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_UI, lpos_global);
+		gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_SFX, lpos_global);
 	}
 }
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 1ed48a978fffa2693494b8e55221b0d4c8340e9f..5c41c5ad9725b6a274ea5f76c60876f591452d6c 100755
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -127,9 +127,28 @@ BOOL LLPreviewTexture::postBuild()
 			getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
 		}
 	}
+
+	// Fill in ratios list with common aspect ratio values
+	mRatiosList.clear();
+	mRatiosList.push_back(LLTrans::getString("Unconstrained"));
+	mRatiosList.push_back("1:1");
+	mRatiosList.push_back("4:3");
+	mRatiosList.push_back("10:7");
+	mRatiosList.push_back("3:2");
+	mRatiosList.push_back("16:10");
+	mRatiosList.push_back("16:9");
+	mRatiosList.push_back("2:1");
 	
-	childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this);
+	// Now fill combo box with provided list
 	LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
+	combo->removeall();
+
+	for (std::vector<std::string>::const_iterator it = mRatiosList.begin(); it != mRatiosList.end(); ++it)
+	{
+		combo->add(*it);
+	}
+
+	childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this);
 	combo->setCurrentByIndex(0);
 	
 	return LLPreview::postBuild();
@@ -414,6 +433,13 @@ void LLPreviewTexture::updateDimensions()
 	{
 		return;
 	}
+
+	if (mAssetStatus != PREVIEW_ASSET_LOADED)
+	{
+		mAssetStatus = PREVIEW_ASSET_LOADED;
+		// Asset has been fully loaded, adjust aspect ratio
+		adjustAspectRatio();
+	}
 	
 	// Update the width/height display every time
 	getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]",  llformat("%d", mImage->getFullWidth()));
@@ -501,6 +527,46 @@ LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()
 	return mAssetStatus;
 }
 
+void LLPreviewTexture::adjustAspectRatio()
+{
+	S32 w = mImage->getFullWidth();
+    S32 h = mImage->getFullHeight();
+
+	// Determine aspect ratio of the image
+	S32 tmp;
+    while (h != 0)
+    {
+        tmp = w % h;
+        w = h;
+        h = tmp;
+    }
+	S32 divisor = w;
+	S32 num = mImage->getFullWidth() / divisor;
+	S32 denom = mImage->getFullHeight() / divisor;
+
+	if (setAspectRatio(num, denom))
+	{
+		// Select corresponding ratio entry in the combo list
+		LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
+		if (combo)
+		{
+			std::ostringstream ratio;
+			ratio << num << ":" << denom;
+			std::vector<std::string>::const_iterator found = std::find(mRatiosList.begin(), mRatiosList.end(), ratio.str());
+			if (found == mRatiosList.end())
+			{
+				combo->setCurrentByIndex(0);
+			}
+			else
+			{
+				combo->setCurrentByIndex(found - mRatiosList.begin());
+			}
+		}
+	}
+
+	mUpdateDimensions = TRUE;
+}
+
 void LLPreviewTexture::updateImageID()
 {
 	const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem());
diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h
index cd16bacde2e9aaf7a2a31872f6127ddf284d7b9e..97e74706cca5bc490ace1e5a6a09b0d48713b083 100755
--- a/indra/newview/llpreviewtexture.h
+++ b/indra/newview/llpreviewtexture.h
@@ -70,6 +70,7 @@ class LLPreviewTexture : public LLPreview
 	/* virtual */ BOOL	postBuild();
 	bool				setAspectRatio(const F32 width, const F32 height);
 	static void			onAspectRatioCommit(LLUICtrl*,void* userdata);
+	void				adjustAspectRatio();
 	
 private:
 	void				updateImageID(); // set what image is being uploaded.
@@ -95,5 +96,6 @@ class LLPreviewTexture : public LLPreview
 	F32 mAspectRatio;	
 
 	LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ; 
+	std::vector<std::string>		mRatiosList;
 };
 #endif  // LL_LLPREVIEWTEXTURE_H
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 243d4cf910b6b91e899964e4dfbf03bd605a893a..2556714792e27278202db2eaa4023b53e6e61c6e 100755
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -710,13 +710,13 @@ void LLSidepanelInventory::clearSelections(bool clearMain, bool clearInbox)
 		
 		if (inv_panel)
 		{
-			inv_panel->clearSelection();
+			inv_panel->getRootFolder()->clearSelection();
 		}
 	}
 	
 	if (clearInbox && mInboxEnabled && mInventoryPanelInbox.get())
 	{
-		mInventoryPanelInbox.get()->clearSelection();
+		mInventoryPanelInbox.get()->getRootFolder()->clearSelection();
 	}
 	
 	updateVerbs();
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index dc99dfcb6dfd64527f377bd3eb6797dbfd1af60b..a1965af4a5848a5088d8599fc950528d162bf328 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -54,7 +54,6 @@
 #include "llviewerstats.h"
 #include "llvfile.h"
 #include "llvfs.h"
-#include "llwebsharing.h"
 #include "llwindow.h"
 #include "llworld.h"
 
@@ -1029,32 +1028,3 @@ BOOL LLSnapshotLivePreview::saveLocal()
 	return success;
 }
 
-void LLSnapshotLivePreview::saveWeb()
-{
-    // Update mFormattedImage if necessary
-    getFormattedImage();
-    
-	// *FIX: Will break if the window closes because of CloseSnapshotOnKeep!
-	// Needs to pass on ownership of the image.
-	LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get());
-	if(!jpg)
-	{
-		LL_WARNS() << "Formatted image not a JPEG" << LL_ENDL;
-		return;
-	}
-
-	LLSD metadata;
-	metadata["description"] = getChild<LLLineEditor>("description")->getText();
-
-	LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(gAgentCamera.getCameraPositionGlobal(),
-		boost::bind(&LLSnapshotLivePreview::regionNameCallback, this, jpg, metadata, _1, _2, _3, _4));
-
-	gViewerWindow->playSnapshotAnimAndSound();
-}
-
-void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z)
-{
-	metadata["slurl"] = LLSLURL(name, LLVector3d(x, y, z)).getSLURLString();
-
-	LLWebSharing::instance().shareSnapshot(snapshot, metadata);
-}
diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h
index 7e19f77e264a917e47f9c20acdf58248cd4e320c..e1937187a3d90f004ac1103079048e57e4798b22 100644
--- a/indra/newview/llsnapshotlivepreview.h
+++ b/indra/newview/llsnapshotlivepreview.h
@@ -107,7 +107,6 @@ class LLSnapshotLivePreview : public LLView
     void setFilter(std::string filter_name) { mFilterName = filter_name; }
     std::string  getFilter() const { return mFilterName; }
 	void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f);
-	void saveWeb();
 	void saveTexture();
 	BOOL saveLocal();
 
@@ -129,9 +128,6 @@ class LLSnapshotLivePreview : public LLView
 	// Returns TRUE when snapshot generated, FALSE otherwise.
 	static BOOL onIdle( void* snapshot_preview );
 
-	// callback for region name resolve
-	void regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z);
-
 private:
     LLView*                     mViewContainer;
     
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index a72b93e84e90ded0039ffe0ccf0e5559e754112c..a76b4bbe0946cb196d24de32bbd4c2341ac1cf04 100755
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -622,25 +622,22 @@ bool idle_startup()
 
 		if (FALSE == gSavedSettings.getBOOL("NoAudio"))
 		{
+			delete gAudiop;
 			gAudiop = NULL;
 
 #ifdef LL_FMODEX		
-			if (!gAudiop
 #if !LL_WINDOWS
-			    && NULL == getenv("LL_BAD_FMODEX_DRIVER")
+			if (NULL == getenv("LL_BAD_FMODEX_DRIVER"))
 #endif // !LL_WINDOWS
-			    )
 			{
 				gAudiop = (LLAudioEngine *) new LLAudioEngine_FMODEX(gSavedSettings.getBOOL("FMODExProfilerEnable"));
 			}
 #endif
 
 #ifdef LL_OPENAL
-			if (!gAudiop
 #if !LL_WINDOWS
-			    && NULL == getenv("LL_BAD_OPENAL_DRIVER")
+			if (NULL == getenv("LL_BAD_OPENAL_DRIVER"))
 #endif // !LL_WINDOWS
-			    )
 			{
 				gAudiop = (LLAudioEngine *) new LLAudioEngine_OpenAL();
 			}
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 9d1290b86dc4e8a04aecfd6fd4157cc32021c7be..c12753acb0963054690216f7f3fedfd50a35db49 100755
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -242,7 +242,7 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id)
 		LLUUID item_id = findItemID(mImageAssetID, FALSE);
 		if (item_id.isNull())
 		{
-			mInventoryPanel->clearSelection();
+			mInventoryPanel->getRootFolder()->clearSelection();
 		}
 		else
 		{
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 12086dad5ff3aa2543c74b2a2c8d11324eadb3b0..d307a31843c59f68cbd874b56bca1ed985000009 100755
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -1611,16 +1611,19 @@ static void show_item_sharing_confirmation(const std::string name,
 		llassert(NULL != inv_item);
 		return;
 	}
-
-	LLSD substitutions;
-	substitutions["RESIDENTS"] = name;
-	substitutions["ITEMS"] = inv_item->getName();
-	LLSD payload;
-	payload["agent_id"] = dest_agent;
-	payload["item_id"] = inv_item->getUUID();
-	payload["session_id"] = session_id;
-	payload["d&d_dest"] = dest.asString();
-	LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb);
+	if(gInventory.getItem(inv_item->getUUID())
+		&& LLGiveInventory::isInventoryGiveAcceptable(inv_item))
+	{
+		LLSD substitutions;
+		substitutions["RESIDENTS"] = name;
+		substitutions["ITEMS"] = inv_item->getName();
+		LLSD payload;
+		payload["agent_id"] = dest_agent;
+		payload["item_id"] = inv_item->getUUID();
+		payload["session_id"] = session_id;
+		payload["d&d_dest"] = dest.asString();
+		LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb);
+	}
 }
 
 static void get_name_cb(const LLUUID& id,
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index b905ea2684748bea4c720c304d8d1c03346bc198..615064c782a1686ba32b1d02c731b54969a8ec21 100755
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -34,6 +34,7 @@
 #include "llfloaterreg.h"
 #include "llfloatersidepanelcontainer.h"
 #include "llfloaterworldmap.h"
+#include "llnotifications.h"
 #include "llpanellogin.h"
 #include "llregionhandle.h"
 #include "llslurl.h"
@@ -253,13 +254,15 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL&
 //---------------------------------------------------------------------------
 // Teleportation links are handled here because they are tightly coupled
 // to SLURL parsing and sim-fragment parsing
+
 class LLTeleportHandler : public LLCommandHandler
 {
 public:
 	// Teleport requests *must* come from a trusted browser
 	// inside the app, otherwise a malicious web page could
 	// cause a constant teleport loop.  JC
-	LLTeleportHandler() : LLCommandHandler("teleport", UNTRUSTED_BLOCK) { }
+	LLTeleportHandler() : LLCommandHandler("teleport", UNTRUSTED_THROTTLE) { }
+
 
 	bool handle(const LLSD& tokens, const LLSD& query_map,
 				LLMediaCtrl* web)
@@ -276,18 +279,50 @@ class LLTeleportHandler : public LLCommandHandler
 							   tokens[3].asReal());
 		}
 		
+		LLSD args;
+		args["LOCATION"] = tokens[0];
+
 		// Region names may be %20 escaped.
-		
 		std::string region_name = LLURI::unescape(tokens[0]);
 
+		LLSD payload;
+		payload["region_name"] = region_name;
+		payload["callback_url"] = LLSLURL(region_name, coords).getSLURLString();
+
+		LLNotificationsUtil::add("TeleportViaSLAPP", args, payload);
+		return true;
+	}
+
+	static void teleport_via_slapp(std::string region_name, std::string callback_url)
+	{
+
 		LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name,
 			LLURLDispatcherImpl::regionHandleCallback,
-			LLSLURL(region_name, coords).getSLURLString(),
+			callback_url,
 			true);	// teleport
-		return true;
 	}
+
+	static bool teleport_via_slapp_callback(const LLSD& notification, const LLSD& response)
+	{
+		S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+		std::string region_name = notification["payload"]["region_name"].asString();
+		std::string callback_url = notification["payload"]["callback_url"].asString();
+
+		if (option == 0)
+		{
+			teleport_via_slapp(region_name, callback_url);
+			return true;
+		}
+
+		return false;
+	}
+
 };
 LLTeleportHandler gTeleportHandler;
+static LLNotificationFunctorRegistration open_landmark_callback_reg("TeleportViaSLAPP", LLTeleportHandler::teleport_via_slapp_callback);
+
+
 
 //---------------------------------------------------------------------------
 
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index e27ebe86631924fdfd2939ec516a5ee07ebbdfce..7ce9d858dd89ee068bcd51a77fcb529098a8df0e 100755
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -94,7 +94,12 @@ void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI)
 
 	switch (mFadeState)
 	{
-		case FADE_IDLE:
+	case FADE_IDLE:
+		if (!gAudiop)
+		{
+			LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+			break;
+		}
 		// If a stream is playing fade it out first
 		if (!gAudiop->getInternetStreamURL().empty())
 		{
@@ -116,18 +121,18 @@ void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI)
 			break;
 		}
 
-		case FADE_OUT:
-			startFading();
-			registerIdleListener();
-			break;
+	case FADE_OUT:
+		startFading();
+		registerIdleListener();
+		break;
 
-		case FADE_IN:
-			registerIdleListener();
-			break;
+	case FADE_IN:
+		registerIdleListener();
+		break;
 
-		default:
-			LL_WARNS() << "Unknown fading state: " << mFadeState << LL_ENDL;
-			break;
+	default:
+		LL_WARNS() << "Unknown fading state: " << mFadeState << LL_ENDL;
+		break;
 	}
 }
 
@@ -158,19 +163,26 @@ bool LLViewerAudio::onIdleUpdate()
 		// we have finished the current fade operation
 		if (mFadeState == FADE_OUT)
 		{
-			// Clear URI
-			gAudiop->startInternetStream(LLStringUtil::null);
-			gAudiop->stopInternetStream();
+			if (gAudiop)
+			{
+				// Clear URI
+				gAudiop->startInternetStream(LLStringUtil::null);
+				gAudiop->stopInternetStream();
+			}
 				
 			if (!mNextStreamURI.empty())
 			{
 				mFadeState = FADE_IN;
 
-				LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl();
-				if(stream && stream->supportsAdjustableBufferSizes())
-					stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"),gSavedSettings.getU32("FMODExDecodeBufferSize"));
+				if (gAudiop)
+				{
+					LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl();
+					if(stream && stream->supportsAdjustableBufferSizes())
+						stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"),gSavedSettings.getU32("FMODExDecodeBufferSize"));
+
+					gAudiop->startInternetStream(mNextStreamURI);
+				}
 
-				gAudiop->startInternetStream(mNextStreamURI);
 				startFading();
 			}
 			else
@@ -182,7 +194,7 @@ bool LLViewerAudio::onIdleUpdate()
 		}
 		else if (mFadeState == FADE_IN)
 		{
-			if (mNextStreamURI != gAudiop->getInternetStreamURL())
+			if (gAudiop && mNextStreamURI != gAudiop->getInternetStreamURL())
 			{
 				mFadeState = FADE_OUT;
 				startFading();
@@ -204,9 +216,12 @@ void LLViewerAudio::stopInternetStreamWithAutoFade()
 	mFadeState = FADE_IDLE;
 	mNextStreamURI = LLStringUtil::null;
 	mDone = true;
-
-	gAudiop->startInternetStream(LLStringUtil::null);
-	gAudiop->stopInternetStream();
+	
+	if (gAudiop)
+	{
+		gAudiop->startInternetStream(LLStringUtil::null);
+		gAudiop->stopInternetStream();
+	}
 }
 
 void LLViewerAudio::startFading()
@@ -268,7 +283,7 @@ F32 LLViewerAudio::getFadeVolume()
 
 void LLViewerAudio::onTeleportStarted()
 {
-	if (!LLViewerAudio::getInstance()->getForcedTeleportFade())
+	if (gAudiop && !LLViewerAudio::getInstance()->getForcedTeleportFade())
 	{
 		// Even though the music was turned off it was starting up (with autoplay disabled) occasionally
 		// after a failed teleport or after an intra-parcel teleport.  Also, the music sometimes was not
@@ -394,9 +409,10 @@ void audio_update_volume(bool force_update)
 	}
 	F32 mute_volume = mute_audio ? 0.0f : 1.0f;
 
-	// Sound Effects
 	if (gAudiop) 
 	{
+		// Sound Effects
+
 		gAudiop->setMasterGain ( master_volume );
 
 		gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler"));
@@ -426,11 +442,9 @@ void audio_update_volume(bool force_update)
 								  gSavedSettings.getBOOL("MuteUI") ? 0.f : gSavedSettings.getF32("AudioLevelUI"));
 		gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_AMBIENT,
 								  gSavedSettings.getBOOL("MuteAmbient") ? 0.f : gSavedSettings.getF32("AudioLevelAmbient"));
-	}
 
-	// Streaming Music
-	if (gAudiop) 
-	{
+		// Streaming Music
+
 		if (!progress_view_visible && LLViewerAudio::getInstance()->getForcedTeleportFade())
 		{
 			LLViewerAudio::getInstance()->setWasPlaying(!gAudiop->getInternetStreamURL().empty());
@@ -528,6 +542,12 @@ void audio_update_wind(bool force_update)
 			volume_delta = 1.f;
 		}
 
+		if (!gAudiop)
+		{
+			LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+			return;
+		}
+
 		// mute wind when not flying
 		if (gAgent.getFlying())
 		{
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 8e0b75cdb8fafc746177b3717bf763b1a35ad05f..7a1b25e194663062dcbb97f7cfd86a8b7f63a4ad 100755
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -67,7 +67,6 @@
 #include "llvoavatarself.h"
 #include "llvovolume.h"
 #include "llwebprofile.h"
-#include "llwebsharing.h"	// For LLWebSharing::setOpenIDCookie(), *TODO: find a better way to do this!
 #include "llwindow.h"
 #include "llvieweraudio.h"
 
@@ -1426,9 +1425,6 @@ void LLViewerMedia::setOpenIDCookie()
 		
 		getCookieStore()->setCookiesFromHost(sOpenIDCookie, authority.substr(host_start, host_end - host_start));
 
-		// *HACK: Doing this here is nasty, find a better way.
-		LLWebSharing::instance().setOpenIDCookie(sOpenIDCookie);
-
 		// Do a web profile get so we can store the cookie 
 		LLSD headers = LLSD::emptyMap();
 		headers["Accept"] = "*/*";
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 88f1dd14ff52f24f31b1d87688e367150edb7f51..9c08ec7e77d0945d95185a449235babf2db91374 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -8225,6 +8225,45 @@ class LLWorldEnvSettings : public view_listener_t
 	}
 };
 
+class LLWorldEnableEnvSettings : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+	{
+		bool result = false;
+		std::string tod = userdata.asString();
+
+		if (tod == "region")
+		{
+			return LLEnvManagerNew::instance().getUseRegionSettings();
+		}
+
+		if (LLEnvManagerNew::instance().getUseFixedSky())
+		{
+			if (tod == "sunrise")
+			{
+				result = (LLEnvManagerNew::instance().getSkyPresetName() == "Sunrise");
+			}
+			else if (tod == "noon")
+			{
+				result = (LLEnvManagerNew::instance().getSkyPresetName() == "Midday");
+			}
+			else if (tod == "sunset")
+			{
+				result = (LLEnvManagerNew::instance().getSkyPresetName() == "Sunset");
+			}
+			else if (tod == "midnight")
+			{
+				result = (LLEnvManagerNew::instance().getSkyPresetName() == "Midnight");
+			}
+			else
+			{
+				llwarns << "Unknown item" << llendl;
+			}
+		}
+		return result;
+	}
+};
+
 class LLWorldEnvPreset : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -8563,6 +8602,7 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLWorldCheckAlwaysRun(), "World.CheckAlwaysRun");
 	
 	view_listener_t::addMenu(new LLWorldEnvSettings(), "World.EnvSettings");
+	view_listener_t::addMenu(new LLWorldEnableEnvSettings(), "World.EnableEnvSettings");
 	view_listener_t::addMenu(new LLWorldEnvPreset(), "World.EnvPreset");
 	view_listener_t::addMenu(new LLWorldEnableEnvPreset(), "World.EnableEnvPreset");
 	view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess");
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 1122eeeee4f0158cfbb9e48ace8f66e09d454584..9199e7fd97c1b3627767111cdce91375796df7b8 100755
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -495,7 +495,9 @@ class LLFileEnableCloseAllWindows : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
-		bool open_children = gFloaterView->allChildrenClosed() && !LLFloaterSnapshot::getInstance()->isInVisibleChain();
+		LLFloaterSnapshot* floater_snapshot = LLFloaterSnapshot::findInstance();
+		bool is_floater_snapshot_opened = floater_snapshot && floater_snapshot->isInVisibleChain();
+		bool open_children = gFloaterView->allChildrenClosed() && !is_floater_snapshot_opened;
 		return !open_children;
 	}
 };
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 65afdddd16c7505a7b06659df26b24bc4505ccd5..00d28a43074141639ecba06a7df7baeba863329d 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3529,6 +3529,12 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
 	}
 	else
 	{
+		// make sure that we don't have an empty or all-whitespace name
+		LLStringUtil::trim(from_name);
+		if (from_name.empty())
+		{
+			from_name = LLTrans::getString("Unnamed");
+		}
 		chat.mFromName = from_name;
 	}
 
@@ -4664,7 +4670,11 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data)
 
 void process_sound_trigger(LLMessageSystem *msg, void **)
 {
-	if (!gAudiop) return;
+	if (!gAudiop)
+	{
+		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+		return;
+	}
 
 	U64		region_handle = 0;
 	F32		gain = 0;
@@ -4724,6 +4734,7 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data)
 {
 	if (!gAudiop)
 	{
+		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
 		return;
 	}
 
@@ -4754,9 +4765,9 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data)
 	LLVector3d pos_global = objectp->getPositionGlobal();
 	if (gAgent.canAccessMaturityAtGlobal(pos_global))
 	{
-	// Add audioData starts a transfer internally.
-	sourcep->addAudioData(datap, FALSE);
-}
+		// Add audioData starts a transfer internally.
+		sourcep->addAudioData(datap, FALSE);
+	}
 }
 
 void process_attached_sound(LLMessageSystem *msg, void **user_data)
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index db1f9ac11af9db77fd9271dcbcfee9c030ba2cd7..1dabe0794272753096e80202da46b30e6c849d98 100755
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -5175,6 +5175,7 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow
 {
 	if (!gAudiop)
 	{
+		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
 		return;
 	}
 	
@@ -5257,7 +5258,10 @@ LLAudioSource *LLViewerObject::getAudioSource(const LLUUID& owner_id)
 		LLAudioSourceVO *asvop = new LLAudioSourceVO(mID, owner_id, 0.01f, this);
 
 		mAudioSourcep = asvop;
-		if(gAudiop) gAudiop->addAudioSource(asvop);
+		if(gAudiop)
+		{
+			gAudiop->addAudioSource(asvop);
+		}
 	}
 
 	return mAudioSourcep;
@@ -5265,10 +5269,6 @@ LLAudioSource *LLViewerObject::getAudioSource(const LLUUID& owner_id)
 
 void LLViewerObject::adjustAudioGain(const F32 gain)
 {
-	if (!gAudiop)
-	{
-		return;
-	}
 	if (mAudioSourcep)
 	{
 		mAudioGain = gain;
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 7f6a8186a526e6ea4333f190ea66660e772f07de..00d3900a88c1fe79e1d51ff1787b30a09d944322 100755
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -117,7 +117,7 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	void setAllowSetHome(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_SET_HOME, b); }
 	void setResetHomeOnTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_RESET_HOME_ON_TELEPORT, b); }
 	void setSunFixed(BOOL b) { setRegionFlag(REGION_FLAGS_SUN_FIXED, b); }
-	void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); }
+	//void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); }		Never used
 	void setAllowDirectTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, b); }
 
 
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 69f9bbdff85ded1ed9c45ec947df974cb2767178..0c4f55d704240a7a6c7817f1b951e83cbc06cda7 100755
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -542,8 +542,8 @@ LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const
 			case LLAssetType::AT_BODYPART:		img_name = "Inv_Skin";		break;
 			case LLAssetType::AT_ANIMATION:		img_name = "Inv_Animation";	break;
 			case LLAssetType::AT_GESTURE:		img_name = "Inv_Gesture";	break;
-			case LLAssetType::AT_MESH:          img_name = "Inv_Mesh";	    break;
-			default: llassert(0);
+			case LLAssetType::AT_MESH:      	img_name = "Inv_Mesh";	    break;
+			default:                        	img_name = "Inv_Invalid";   break; // use the Inv_Invalid icon for undefined object types (see MAINT-3981)
 		}
 
 		return LLUI::getUIImage(img_name);
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index aa75bae712967f155a2ff173f68195b2ea6491fb..ec794e527d71cf08cf078fafa6e56036a6d0c07f 100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -443,10 +443,7 @@ class LLDebugText
 		}
 		if (gDisplayWindInfo)
 		{
-			if (gAudiop)
-			{
-				audio_text= llformat("Audio for wind: %d", gAudiop->isWindEnabled());
-			}
+			audio_text = llformat("Audio for wind: %d", gAudiop ? gAudiop->isWindEnabled() : -1);
 			addText(xpos, ypos, audio_text);  ypos += y_inc;
 		}
 		if (gDisplayFOV)
@@ -3246,6 +3243,8 @@ void LLViewerWindow::updateUI()
 
 	updateLayout();
 
+	saveLastMouse(mCurrentMousePoint);
+
 	// cleanup unused selections when no modal dialogs are open
 	if (LLModalDialog::activeCount() == 0)
 	{
diff --git a/indra/newview/llwebsharing.cpp b/indra/newview/llwebsharing.cpp
deleted file mode 100755
index 3a80051b9b7896a06ac604ae025d3d5750b23db3..0000000000000000000000000000000000000000
--- a/indra/newview/llwebsharing.cpp
+++ /dev/null
@@ -1,603 +0,0 @@
-/** 
- * @file llwebsharing.cpp
- * @author Aimee
- * @brief Web Snapshot Sharing
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llwebsharing.h"
-
-#include "llagentui.h"
-#include "llbufferstream.h"
-#include "llhttpclient.h"
-#include "llhttpstatuscodes.h"
-#include "llsdserialize.h"
-#include "llsdutil.h"
-#include "llurl.h"
-#include "llviewercontrol.h"
-
-#include <boost/regex.hpp>
-#include <boost/algorithm/string/replace.hpp>
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLWebSharingConfigResponder : public LLHTTPClient::Responder
-{
-	LOG_CLASS(LLWebSharingConfigResponder);
-public:
-	/// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response.
-	virtual void completedRaw(U32 status, const std::string& reason,
-							  const LLChannelDescriptors& channels,
-							  const LLIOPipe::buffer_ptr_t& buffer)
-	{
-		LLSD content;
-		LLBufferStream istr(channels, buffer.get());
-		LLPointer<LLSDParser> parser = new LLSDNotationParser();
-
-		if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
-		{
-			LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL;
-		}
-		else
-		{
-			completed(status, reason, content);
-		}
-	}
-
-	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content)
-	{
-		LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL;
-	}
-
-	virtual void result(const LLSD& content)
-	{
-		LLWebSharing::instance().receiveConfig(content);
-	}
-};
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLWebSharingOpenIDAuthResponder : public LLHTTPClient::Responder
-{
-	LOG_CLASS(LLWebSharingOpenIDAuthResponder);
-public:
-	/* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
-	{
-		completed(status, reason, content);
-	}
-
-	/* virtual */ void completedRaw(U32 status, const std::string& reason,
-									const LLChannelDescriptors& channels,
-									const LLIOPipe::buffer_ptr_t& buffer)
-	{
-		/// Left empty to override the default LLSD parsing behaviour.
-	}
-
-	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content)
-	{
-		if (HTTP_UNAUTHORIZED == status)
-		{
-			LL_WARNS("WebSharing") << "AU account not authenticated." << LL_ENDL;
-			// *TODO: No account found on AU, so start the account creation process here.
-		}
-		else
-		{
-			LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL;
-			LLWebSharing::instance().retryOpenIDAuth();
-		}
-
-	}
-
-	virtual void result(const LLSD& content)
-	{
-		if (content.has("set-cookie"))
-		{
-			// OpenID request succeeded and returned a session cookie.
-			LLWebSharing::instance().receiveSessionCookie(content["set-cookie"].asString());
-		}
-	}
-};
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLWebSharingSecurityTokenResponder : public LLHTTPClient::Responder
-{
-	LOG_CLASS(LLWebSharingSecurityTokenResponder);
-public:
-	/// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response.
-	virtual void completedRaw(U32 status, const std::string& reason,
-							  const LLChannelDescriptors& channels,
-							  const LLIOPipe::buffer_ptr_t& buffer)
-	{
-		LLSD content;
-		LLBufferStream istr(channels, buffer.get());
-		LLPointer<LLSDParser> parser = new LLSDNotationParser();
-
-		if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
-		{
-			LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL;
-			LLWebSharing::instance().retryOpenIDAuth();
-		}
-		else
-		{
-			completed(status, reason, content);
-		}
-	}
-
-	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content)
-	{
-		LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL;
-		LLWebSharing::instance().retryOpenIDAuth();
-	}
-
-	virtual void result(const LLSD& content)
-	{
-		if (content[0].has("st") && content[0].has("expires"))
-		{
-			const std::string& token   = content[0]["st"].asString();
-			const std::string& expires = content[0]["expires"].asString();
-			if (LLWebSharing::instance().receiveSecurityToken(token, expires))
-			{
-				// Sucessfully received a valid security token.
-				return;
-			}
-		}
-		else
-		{
-			LL_WARNS("WebSharing") << "No security token received." << LL_ENDL;
-		}
-
-		LLWebSharing::instance().retryOpenIDAuth();
-	}
-};
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLWebSharingUploadResponder : public LLHTTPClient::Responder
-{
-	LOG_CLASS(LLWebSharingUploadResponder);
-public:
-	/// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response.
-	virtual void completedRaw(U32 status, const std::string& reason,
-							  const LLChannelDescriptors& channels,
-							  const LLIOPipe::buffer_ptr_t& buffer)
-	{
-/*
-		 // Dump the body, for debugging.
-
-		 LLBufferStream istr1(channels, buffer.get());
-		 std::ostringstream ostr;
-		 std::string body;
-
-		 while (istr1.good())
-		 {
-			char buf[1024];
-			istr1.read(buf, sizeof(buf));
-			body.append(buf, istr1.gcount());
-		 }
-		 LL_DEBUGS("WebSharing") << body << LL_ENDL;
-*/
-		LLSD content;
-		LLBufferStream istr(channels, buffer.get());
-		LLPointer<LLSDParser> parser = new LLSDNotationParser();
-
-		if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
-		{
-			LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL;
-		}
-		else
-		{
-			completed(status, reason, content);
-		}
-	}
-
-	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content)
-	{
-		LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL;
-	}
-
-	virtual void result(const LLSD& content)
-	{
-		if (content[0].has("result") && content[0].has("id") &&
-			content[0]["id"].asString() == "newMediaItem")
-		{
-			// *TODO: Upload successful, continue from here to post metadata and create AU activity.
-		}
-		else
-		{
-			LL_WARNS("WebSharing") << "Error [" << content[0]["code"].asString()
-								   << "]: " << content[0]["message"].asString() << LL_ENDL;
-		}
-	}
-};
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLWebSharing::LLWebSharing()
-:	mConfig(),
-	mSecurityToken(LLSD::emptyMap()),
-	mEnabled(false),
-	mRetries(0),
-	mImage(NULL),
-	mMetadata(LLSD::emptyMap())
-{
-}
-
-void LLWebSharing::init()
-{
-	if (!mEnabled)
-	{
-		sendConfigRequest();
-	}
-}
-
-bool LLWebSharing::shareSnapshot(LLImageJPEG* snapshot, LLSD& metadata)
-{
-	LL_INFOS("WebSharing") << metadata << LL_ENDL;
-
-	if (mImage)
-	{
-		// *TODO: Handle this possibility properly, queue them up?
-		LL_WARNS("WebSharing") << "Snapshot upload already in progress." << LL_ENDL;
-		return false;
-	}
-
-	mImage = snapshot;
-	mMetadata = metadata;
-
-	// *TODO: Check whether we have a valid security token already and re-use it.
-	sendOpenIDAuthRequest();
-	return true;
-}
-
-bool LLWebSharing::setOpenIDCookie(const std::string& cookie)
-{
-	LL_DEBUGS("WebSharing") << "Setting OpenID cookie " << cookie << LL_ENDL;
-	mOpenIDCookie = cookie;
-	return validateConfig();
-}
-
-bool LLWebSharing::receiveConfig(const LLSD& config)
-{
-	LL_DEBUGS("WebSharing") << "Received config data: " << config << LL_ENDL;
-	mConfig = config;
-	return validateConfig();
-}
-
-bool LLWebSharing::receiveSessionCookie(const std::string& cookie)
-{
-	LL_DEBUGS("WebSharing") << "Received AU session cookie: " << cookie << LL_ENDL;
-	mSessionCookie = cookie;
-
-	// Fetch a security token using the new session cookie.
-	LLWebSharing::instance().sendSecurityTokenRequest();
-
-	return (!mSessionCookie.empty());
-}
-
-bool LLWebSharing::receiveSecurityToken(const std::string& token, const std::string& expires)
-{
-	mSecurityToken["st"] = token;
-	mSecurityToken["expires"] = LLDate(expires);
-
-	if (!securityTokenIsValid(mSecurityToken))
-	{
-		LL_WARNS("WebSharing") << "Invalid security token received: \"" << token << "\" Expires: " << expires << LL_ENDL;
-		return false;
-	}
-
-	LL_DEBUGS("WebSharing") << "Received security token: \"" << token << "\" Expires: " << expires << LL_ENDL;
-	mRetries = 0;
-
-	// Continue the upload process now that we have a security token.
-	sendUploadRequest();
-
-	return true;
-}
-
-void LLWebSharing::sendConfigRequest()
-{
-	std::string config_url = gSavedSettings.getString("SnapshotConfigURL");
-	LL_DEBUGS("WebSharing") << "Requesting Snapshot Sharing config data from: " << config_url << LL_ENDL;
-
-	LLSD headers = LLSD::emptyMap();
-	headers["Accept"] = "application/json";
-
-	LLHTTPClient::get(config_url, new LLWebSharingConfigResponder(), headers);
-}
-
-void LLWebSharing::sendOpenIDAuthRequest()
-{
-	std::string auth_url = mConfig["openIdAuthUrl"];
-	LL_DEBUGS("WebSharing") << "Starting OpenID Auth: " << auth_url << LL_ENDL;
-
-	LLSD headers = LLSD::emptyMap();
-	headers["Cookie"] = mOpenIDCookie;
-	headers["Accept"] = "*/*";
-
-	// Send request, successful login will trigger fetching a security token.
-	LLHTTPClient::get(auth_url, new LLWebSharingOpenIDAuthResponder(), headers);
-}
-
-bool LLWebSharing::retryOpenIDAuth()
-{
-	if (mRetries++ >= MAX_AUTH_RETRIES)
-	{
-		LL_WARNS("WebSharing") << "Exceeded maximum number of authorization attempts, aborting." << LL_ENDL;
-		mRetries = 0;
-		return false;
-	}
-
-	LL_WARNS("WebSharing") << "Authorization failed, retrying (" << mRetries << "/" << MAX_AUTH_RETRIES << ")" << LL_ENDL;
-	sendOpenIDAuthRequest();
-	return true;
-}
-
-void LLWebSharing::sendSecurityTokenRequest()
-{
-	std::string token_url = mConfig["securityTokenUrl"];
-	LL_DEBUGS("WebSharing") << "Fetching security token from: " << token_url << LL_ENDL;
-
-	LLSD headers = LLSD::emptyMap();
-	headers["Cookie"] = mSessionCookie;
-
-	headers["Accept"] = "application/json";
-	headers["Content-Type"] = "application/json";
-
-	std::ostringstream body;
-	body << "{ \"gadgets\": [{ \"url\":\""
-		 << mConfig["gadgetSpecUrl"].asString()
-		 << "\" }] }";
-
-	// postRaw() takes ownership of the buffer and releases it later.
-	size_t size = body.str().size();
-	U8 *data = new U8[size];
-	memcpy(data, body.str().data(), size);
-
-	// Send request, receiving a valid token will trigger snapshot upload.
-	LLHTTPClient::postRaw(token_url, data, size, new LLWebSharingSecurityTokenResponder(), headers);
-}
-
-void LLWebSharing::sendUploadRequest()
-{
-	LLUriTemplate upload_template(mConfig["openSocialRpcUrlTemplate"].asString());
-	std::string upload_url(upload_template.buildURI(mSecurityToken));
-
-	LL_DEBUGS("WebSharing") << "Posting upload to: " << upload_url << LL_ENDL;
-
-	static const std::string BOUNDARY("------------abcdef012345xyZ");
-
-	LLSD headers = LLSD::emptyMap();
-	headers["Cookie"] = mSessionCookie;
-
-	headers["Accept"] = "application/json";
-	headers["Content-Type"] = "multipart/form-data; boundary=" + BOUNDARY;
-
-	std::ostringstream body;
-	body << "--" << BOUNDARY << "\r\n"
-		 << "Content-Disposition: form-data; name=\"request\"\r\n\r\n"
-		 << "[{"
-		 <<	  "\"method\":\"mediaItems.create\","
-		 <<	  "\"params\": {"
-		 <<	    "\"userId\":[\"@me\"],"
-		 <<	    "\"groupId\":\"@self\","
-		 <<	    "\"mediaItem\": {"
-		 <<	      "\"mimeType\":\"image/jpeg\","
-		 <<	      "\"type\":\"image\","
-		 <<       "\"url\":\"@field:image1\""
-		 <<	    "}"
-		 <<	  "},"
-		 <<	  "\"id\":\"newMediaItem\""
-		 <<	"}]"
-		 <<	"--" << BOUNDARY << "\r\n"
-		 <<	"Content-Disposition: form-data; name=\"image1\"\r\n\r\n";
-
-	// Insert the image data.
-	// *FIX: Treating this as a string will probably screw it up ...
-	U8* image_data = mImage->getData();
-	for (S32 i = 0; i < mImage->getDataSize(); ++i)
-	{
-		body << image_data[i];
-	}
-
-	body <<	"\r\n--" << BOUNDARY << "--\r\n";
-
-	// postRaw() takes ownership of the buffer and releases it later.
-	size_t size = body.str().size();
-	U8 *data = new U8[size];
-	memcpy(data, body.str().data(), size);
-
-	// Send request, successful upload will trigger posting metadata.
-	LLHTTPClient::postRaw(upload_url, data, size, new LLWebSharingUploadResponder(), headers);
-}
-
-bool LLWebSharing::validateConfig()
-{
-	// Check the OpenID Cookie has been set.
-	if (mOpenIDCookie.empty())
-	{
-		mEnabled = false;
-		return mEnabled;
-	}
-
-	if (!mConfig.isMap())
-	{
-		mEnabled = false;
-		return mEnabled;
-	}
-
-	// Template to match the received config against.
-	LLSD required(LLSD::emptyMap());
-	required["gadgetSpecUrl"] = "";
-	required["loginTokenUrl"] = "";
-	required["openIdAuthUrl"] = "";
-	required["photoPageUrlTemplate"] = "";
-	required["openSocialRpcUrlTemplate"] = "";
-	required["securityTokenUrl"] = "";
-	required["tokenBasedLoginUrlTemplate"] = "";
-	required["viewerIdUrl"] = "";
-
-	std::string mismatch(llsd_matches(required, mConfig));
-	if (!mismatch.empty())
-	{
-		LL_WARNS("WebSharing") << "Malformed config data response: " << mismatch << LL_ENDL;
-		mEnabled = false;
-		return mEnabled;
-	}
-
-	mEnabled = true;
-	return mEnabled;
-}
-
-// static
-bool LLWebSharing::securityTokenIsValid(LLSD& token)
-{
-	return (token.has("st") &&
-			token.has("expires") &&
-			(token["st"].asString() != "") &&
-			(token["expires"].asDate() > LLDate::now()));
-}
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLUriTemplate::LLUriTemplate(const std::string& uri_template)
-	:
-	mTemplate(uri_template)
-{
-}
-
-std::string LLUriTemplate::buildURI(const LLSD& vars)
-{
-	// *TODO: Separate parsing the template from building the URI.
-	// Parsing only needs to happen on construction/assignnment.
-
-	static const std::string VAR_NAME_REGEX("[[:alpha:]][[:alnum:]\\._-]*");
-	// Capture var name with and without surrounding {}
-	static const std::string VAR_REGEX("\\{(" + VAR_NAME_REGEX + ")\\}");
-	// Capture delimiter and comma separated list of var names.
-	static const std::string JOIN_REGEX("\\{-join\\|(&)\\|(" + VAR_NAME_REGEX + "(?:," + VAR_NAME_REGEX + ")*)\\}");
-
-	std::string uri = mTemplate;
-	boost::smatch results;
-
-	// Validate and expand join operators : {-join|&|var1,var2,...}
-
-	boost::regex join_regex(JOIN_REGEX);
-
-	while (boost::regex_search(uri, results, join_regex))
-	{
-		// Extract the list of var names from the results.
-		std::string delim = results[1].str();
-		std::string var_list = results[2].str();
-
-		// Expand the list of vars into a query string with their values
-		std::string query = expandJoin(delim, var_list, vars);
-
-		// Substitute the query string into the template.
-		uri = boost::regex_replace(uri, join_regex, query, boost::format_first_only);
-	}
-
-	// Expand vars : {var1}
-
-	boost::regex var_regex(VAR_REGEX);
-
-	std::set<std::string> var_names;
-	std::string::const_iterator start = uri.begin();
-	std::string::const_iterator end = uri.end();
-
-	// Extract the var names used.
-	while (boost::regex_search(start, end, results, var_regex))
-	{
-		var_names.insert(results[1].str());
-		start = results[0].second;
-	}
-
-	// Replace each var with its value.
-	for (std::set<std::string>::const_iterator it = var_names.begin(); it != var_names.end(); ++it)
-	{
-		std::string var = *it;
-		if (vars.has(var))
-		{
-			boost::replace_all(uri, "{" + var + "}", vars[var].asString());
-		}
-	}
-
-	return uri;
-}
-
-std::string LLUriTemplate::expandJoin(const std::string& delim, const std::string& var_list, const LLSD& vars)
-{
-	std::ostringstream query;
-
-	typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
-	boost::char_separator<char> sep(",");
-	tokenizer var_names(var_list, sep);
-	tokenizer::const_iterator it = var_names.begin();
-
-	// First var does not need a delimiter
-	if (it != var_names.end())
-	{
-		const std::string& name = *it;
-		if (vars.has(name))
-		{
-			// URL encode the value before appending the name=value pair.
-			query << name << "=" << escapeURL(vars[name].asString());
-		}
-	}
-
-	for (++it; it != var_names.end(); ++it)
-	{
-		const std::string& name = *it;
-		if (vars.has(name))
-		{
-			// URL encode the value before appending the name=value pair.
-			query << delim << name << "=" << escapeURL(vars[name].asString());
-		}
-	}
-
-	return query.str();
-}
-
-// static
-std::string LLUriTemplate::escapeURL(const std::string& unescaped)
-{
-	char* escaped = curl_escape(unescaped.c_str(), unescaped.size());
-	std::string result = escaped;
-	curl_free(escaped);
-	return result;
-}
-
diff --git a/indra/newview/llwebsharing.h b/indra/newview/llwebsharing.h
deleted file mode 100755
index ad9c99c224e7fd9031efd66c1819d6917bad71bc..0000000000000000000000000000000000000000
--- a/indra/newview/llwebsharing.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/** 
- * @file llwebsharing.h
- * @author Aimee
- * @brief Web Snapshot Sharing
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLWEBSHARING_H
-#define LL_LLWEBSHARING_H
-
-#include "llimagejpeg.h"
-#include "llsingleton.h"
-
-
-
-/**
- * @class LLWebSharing
- *
- * Manages authentication to, and interaction with, a web service allowing the
- * upload of snapshot images taken within the viewer, using OpenID and the
- * OpenSocial APIs.
- * http://www.opensocial.org/Technical-Resources/opensocial-spec-v09/RPC-Protocol.html
- */
-class LLWebSharing : public LLSingleton<LLWebSharing>
-{
-	LOG_CLASS(LLWebSharing);
-public:
-	/*
-	 * Performs initial setup, by requesting config data from the web service if
-	 * it has not already been received.
-	 */
-	void init();
-
-	/*
-	 * @return true if both the OpenID cookie and config data have been received.
-	 */
-	bool enabled() const { return mEnabled; };
-
-	/*
-	 * Sets the OpenID cookie to use for login to the web service.
-	 *
-	 * @param cookie a string containing the OpenID cookie.
-	 *
-	 * @return true if both the OpenID cookie and config data have been received.
-	 */
-	bool setOpenIDCookie(const std::string& cookie);
-
-	/*
-	 * Receive config data used to connect to the web service.
-	 *
-	 * @param config an LLSD map of URL templates for the web service end-points.
-	 *
-	 * @return true if both the OpenID cookie and config data have been received.
-	 *
-	 * @see sendConfigRequest()
-	 */
-	bool receiveConfig(const LLSD& config);
-
-	/*
-	 * Receive the session cookie from the web service, which is the result of
-	 * the OpenID login process.
-	 *
-	 * @see sendOpenIDAuthRequest()
-	 */
-	bool receiveSessionCookie(const std::string& cookie);
-
-	/*
-	 * Receive a security token for the upload service.
-	 *
-	 * @see sendSecurityTokenRequest()
-	 */
-	bool receiveSecurityToken(const std::string& token, const std::string& expires);
-
-	/*
-	 * Restarts the authentication process if the maximum number of retries has
-	 * not been exceeded.
-	 *
-	 * @return true if retrying, false if LLWebSharing::MAX_AUTH_RETRIES has been exceeded.
-	 */
-	bool retryOpenIDAuth();
-
-	/*
-	 * Post a snapshot to the upload service.
-	 *
-	 * @return true if accepted for upload, false if already uploading another image.
-	 */
-	bool shareSnapshot(LLImageJPEG* snapshot, LLSD& metadata);
-
-private:
-	static const S32 MAX_AUTH_RETRIES = 4;
-
-	friend class LLSingleton<LLWebSharing>;
-
-	LLWebSharing();
-	~LLWebSharing() {};
-
-	/*
-	 * Request a map of URLs and URL templates to the web service end-points.
-	 *
-	 * @see receiveConfig()
-	 */
-	void sendConfigRequest();
-
-	/*
-	 * Initiate the OpenID login process.
-	 *
-	 * @see receiveSessionCookie()
-	 */
-	void sendOpenIDAuthRequest();
-
-	/*
-	 * Request a security token for the upload service.
-	 *
-	 * @see receiveSecurityToken()
-	 */
-	void sendSecurityTokenRequest();
-
-	/*
-	 * Request a security token for the upload service.
-	 *
-	 * @see receiveSecurityToken()
-	 */
-	void sendUploadRequest();
-
-	/*
-	 * Checks all necessary config information has been received, and sets mEnabled.
-	 *
-	 * @return true if both the OpenID cookie and config data have been received.
-	 */
-	bool validateConfig();
-
-	/*
-	 * Checks the security token is present and has not expired.
-	 *
-	 * @param token an LLSD map containing the token string and the time it expires.
-	 *
-	 * @return true if the token is not empty and has not expired.
-	 */
-	static bool securityTokenIsValid(LLSD& token);
-
-	std::string mOpenIDCookie;
-	std::string mSessionCookie;
-	LLSD mSecurityToken;
-
-	LLSD mConfig;
-	bool mEnabled;
-
-	LLPointer<LLImageJPEG> mImage;
-	LLSD mMetadata;
-
-	S32 mRetries;
-};
-
-/**
- * @class LLUriTemplate
- *
- * @brief Builds complete URIs, given URI template and a map of keys and values
- *        to use for substition.
- *        Note: This is only a partial implementation of a draft standard required
- *        by the web API used by LLWebSharing.
- *        See: http://tools.ietf.org/html/draft-gregorio-uritemplate-03
- *
- * @see LLWebSharing
- */
-class LLUriTemplate
-{
-	LOG_CLASS(LLUriTemplate);
-public:
-	LLUriTemplate(const std::string& uri_template);
-	~LLUriTemplate() {};
-
-	/*
-	 * Builds a complete URI from the template.
-	 *
-	 * @param vars an LLSD map of keys and values for substitution.
-	 *
-	 * @return a string containing the complete URI.
-	 */
-	std::string buildURI(const LLSD& vars);
-
-private:
-	/*
-	 * Builds a URL query string.
-	 *
-	 * @param delim    a string containing the separator to use between name=value pairs.
-	 * @param var_list a string containing a comma separated list of variable names.
-	 * @param vars     an LLSD map of keys and values for substitution.
-	 *
-	 * @return a URL query string.
-	 */
-	std::string expandJoin(const std::string& delim, const std::string& var_list, const LLSD& vars);
-
-	/*
-	 * URL escape the given string.
-	 * LLWeb::escapeURL() only does a partial escape, so this uses curl_escape() instead.
-	 */
-	static std::string escapeURL(const std::string& unescaped);
-
-	std::string mTemplate;
-};
-
-
-
-#endif // LL_LLWEBSHARING_H
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index 11d100eeff5442c64af52f205be0c858a11f0dfb..74d160dfaec1ccb5cb20e1bac7f5a6edc0da5f63 100755
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -1172,7 +1172,8 @@ Prøv venligst om lidt igen.
 	<string name="InventoryNoTexture">
 		Du har ikke en kopi af denne tekstur i din beholdning
 	</string>
-	<string name="no_transfer" value=" (ikke overdragbar)"/>
+  <string name="Unconstrained">Ikke låst</string>
+  <string name="no_transfer" value=" (ikke overdragbar)"/>
 	<string name="no_modify" value=" (ikke redigere)"/>
 	<string name="no_copy" value=" (ikke kopiere)"/>
 	<string name="worn" value=" (båret)"/>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 4268b95370e795b42d5a1b4e00e4cb367314a689..082febd7096926011ce543d28777b664693d18d9 100755
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -1267,7 +1267,8 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
 	<string name="InventoryNoTexture">
 		Sie haben keine Kopie dieser Textur in Ihrem Inventar.
 	</string>
-	<string name="InventoryInboxNoItems">
+  <string name="Unconstrained">keines</string>
+  <string name="InventoryInboxNoItems">
 		Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen.
 	</string>
 	<string name="MarketplaceURL">
diff --git a/indra/newview/skins/default/xui/en/floater_places.xml b/indra/newview/skins/default/xui/en/floater_places.xml
index b241e265a9a7ba6bcc502e18d9443131ca6e6a2c..31dd6d2c64f120f0fc475dc459e0f81a61703272 100755
--- a/indra/newview/skins/default/xui/en/floater_places.xml
+++ b/indra/newview/skins/default/xui/en/floater_places.xml
@@ -2,6 +2,7 @@
 
 <floater
   positioning="cascading"
+  default_tab_group="1"
   legacy_header_height="18"
   can_resize="true"
   height="588"
@@ -16,6 +17,7 @@
   width="333">
     <panel
       top="18"
+      tab_group="1"
       class="panel_places"
       name="main_panel"
       filename="panel_places.xml"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
index 137e278ddcf562bc3732ede88379fead5094e654..e1e7e1c8c8119ac1e9962b6b04e96bbb0d80b5bf 100755
--- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
@@ -79,30 +79,6 @@
      width="108"
      name="combo_aspect_ratio"
      tool_tip="Preview at a fixed aspect ratio">
-    	<combo_item name="Unconstrained" value="Unconstrained">
-    		Unconstrained
-    	</combo_item>
-   	<combo_item name="1:1" value="1:1" tool_tip="Group insignia or Real World profile">
-		1:1
-	</combo_item>
-	<combo_item name="4:3" value="4:3" tool_tip="[SECOND_LIFE] profile">
-		4:3
-	</combo_item>
-	<combo_item name="10:7" value="10:7" tool_tip="Classifieds and search listings, landmarks">
-		10:7
-	</combo_item>
-	<combo_item name="3:2" value="3:2" tool_tip="About land">
-		3:2
-	</combo_item>
-	<combo_item name="16:10" value="16:10">
-		16:10
-	</combo_item>
-	<combo_item name="16:9" value="16:9" tool_tip="Profile picks">
-		16:9
-	</combo_item>
-	<combo_item name="2:1" value="2:1">
-		2:1
-	</combo_item>
 	</combo_box>
     <button
      follows="right|bottom"
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 52c4fb1613f135181fcc5f8910d26c1938a58531..e91eea04d137da0329c0f710e3881092685a7cb0 100755
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -35,14 +35,72 @@
      tear_off="true"
      name="Help">
         <menu_item_call
-         label="[SECOND_LIFE] Help"
-         name="Second Life Help"
+         label="How to..."
+         name="How To"
          shortcut="F1">
             <menu_item_call.on_click
-             function="ShowHelp"
-             parameter="f1_help" />
+             function="Help.ToggleHowTo"
+             parameter="" />
         </menu_item_call>
-        <menu_item_separator />
+        <menu_item_call
+           label="Quickstart"
+           name="Quickstart">
+            <menu_item_call.on_click
+            function="Advanced.ShowURL"
+            parameter="http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Quickstart/ta-p/1087919"/>
+        </menu_item_call>
+		<menu_item_separator/>
+        <menu_item_call
+             label="Knowledge Base"
+             name="Knowledge Base">
+             <menu_item_call.on_click
+                 function="Advanced.ShowURL"
+            parameter="http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-User-s-Guide/ta-p/1244857"/>
+        </menu_item_call>
+        <menu_item_call
+             label="Wiki"
+             name="Wiki">
+             <menu_item_call.on_click
+                 function="Advanced.ShowURL"
+                 parameter="http://wiki.secondlife.com"/>
+        </menu_item_call>
+        <menu_item_call
+             label="Community Forums"
+             name="Community Forums">
+             <menu_item_call.on_click
+                 function="Advanced.ShowURL"
+                 parameter="http://community.secondlife.com/t5/Forums/ct-p/Forums"/>
+        </menu_item_call>         
+        <menu_item_call
+             label="Support portal"
+             name="Support portal">
+             <menu_item_call.on_click
+                 function="Advanced.ShowURL"
+                 parameter="https://support.secondlife.com/"/>         
+        </menu_item_call>
+        <menu_item_separator/>
+        <menu_item_call
+             label="[SECOND_LIFE] News"
+             name="Second Life News">
+             <menu_item_call.on_click
+                 function="Advanced.ShowURL"
+                 parameter="http://community.secondlife.com/t5/Featured-News/bg-p/blog_feature_news"/>  
+        </menu_item_call>
+        <menu_item_call
+             label="[SECOND_LIFE] Blogs"
+             name="Second Life Blogs">
+             <menu_item_call.on_click
+                 function="Advanced.ShowURL"
+                 parameter="http://community.secondlife.com/t5/Blogs/ct-p/Blogs"/>
+        </menu_item_call>
+        <menu_item_separator/>       
+        <menu_item_call
+             label="Report Bug"
+             name="Report Bug">
+                <menu_item_call.on_click
+                 function="Advanced.ReportBug"/>
+            </menu_item_call>
+        <menu_item_separator/>
         <menu_item_call
          label="About [APP_NAME]"
          name="About Second Life">
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 31785eb1225e3dfe314d6ad4ad6c76de203840fa..65b80ff6225acc6db0ca98da247e4a9299abc8b2 100755
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -620,44 +620,59 @@
          label="Sun"
          name="Sun"
          tear_off="true">
-            <menu_item_call
+            <menu_item_check
              label="Sunrise"
              name="Sunrise">
-                <menu_item_call.on_click
+                <menu_item_check.on_click
                  function="World.EnvSettings"
                  parameter="sunrise" />
-            </menu_item_call>
-            <menu_item_call
+                <menu_item_check.on_check
+                 function="World.EnableEnvSettings" 
+                 parameter="sunrise" />
+            </menu_item_check>
+            <menu_item_check
              label="Midday"
              name="Noon"
              shortcut="control|shift|Y">
-                <menu_item_call.on_click
+                <menu_item_check.on_click
                  function="World.EnvSettings"
                  parameter="noon" />
-            </menu_item_call>
-            <menu_item_call
+                <menu_item_check.on_check
+                 function="World.EnableEnvSettings" 
+                 parameter="noon" />
+            </menu_item_check>
+            <menu_item_check
              label="Sunset"
              name="Sunset"
              shortcut="control|shift|N">
-                <menu_item_call.on_click
+                <menu_item_check.on_click
                  function="World.EnvSettings"
                  parameter="sunset" />
-            </menu_item_call>
-            <menu_item_call
+                <menu_item_check.on_check
+                 function="World.EnableEnvSettings" 
+                 parameter="sunset" />
+            </menu_item_check>
+            <menu_item_check
              label="Midnight"
              name="Midnight">
-                <menu_item_call.on_click
+                <menu_item_check.on_click
                  function="World.EnvSettings"
                  parameter="midnight" />
-            </menu_item_call>
+                <menu_item_check.on_check
+                 function="World.EnableEnvSettings" 
+                 parameter="midnight" />
+            </menu_item_check>
             <menu_item_separator/>
-            <menu_item_call
+            <menu_item_check
              label="Use Region Settings"
              name="Use Region Settings">
-                <menu_item_call.on_click
+                <menu_item_check.on_click
                  function="World.EnvSettings"
                  parameter="region" />
-            </menu_item_call>
+                <menu_item_check.on_check
+                 function="World.EnableEnvSettings" 
+                 parameter="region" />
+            </menu_item_check>
         </menu>
 	    
    
@@ -1564,7 +1579,8 @@
             <menu_item_check
              label="Highlight Transparent"
              name="Highlight Transparent"
-             shortcut="control|alt|T">
+             shortcut="control|alt|T"
+             use_mac_ctrl="true">
                 <menu_item_check.on_check
                  function="View.CheckHighlightTransparent" />
                 <menu_item_check.on_click
@@ -3178,18 +3194,6 @@
                 <menu_item_call.on_click
                  function="Advanced.PrintAgentInfo" />
             </menu_item_call>
-            <menu_item_check
-             label="Region Debug Console"
-             name="Region Debug Console"
-             shortcut="control|shift|`"
-             use_mac_ctrl="true">
-                <menu_item_check.on_check
-                 function="Floater.Visible"
-                 parameter="region_debug_console" />
-                <menu_item_check.on_click
-                 function="Floater.Toggle"
-                 parameter="region_debug_console" />
-            </menu_item_check>
             <menu_item_separator />
 
             <menu_item_check
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index ebf0407ed91f34950714ce72a6802f0b450c9e5d..bea291da91c24f1e51a29620b0288f8d6a05c1e6 100755
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4137,6 +4137,19 @@ Are you sure you want to teleport to &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
      notext="Cancel"
      yestext="Teleport"/>
   </notification>
+  
+  <notification
+   icon="alertmodal.tga"
+   name="TeleportViaSLAPP"
+   type="alertmodal">
+Are you sure you want to teleport to &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+    <tag>confirm</tag>
+    <usetemplate
+     ignoretext="Confirm that I want to teleport via SLAPP"
+     name="okcancelignore"
+     notext="Cancel"
+     yestext="Teleport"/>
+  </notification>	
 
   <notification
    icon="alertmodal.tga"
@@ -7648,7 +7661,7 @@ Are you sure you want to share the following items:
 
 With the following Residents:
 
-[RESIDENTS]
+&lt;nolink&gt;[RESIDENTS]&lt;/nolink&gt;
   <tag>confirm</tag>
 	<usetemplate
      name="okcancelbuttons"
@@ -7668,7 +7681,7 @@ Are you sure you want to share the following items:
 
 With the following Residents:
 
-[RESIDENTS]
+&lt;nolink&gt;[RESIDENTS]&lt;/nolink&gt;
   <tag>confirm</tag>
 	<usetemplate
      name="okcancelbuttons"
@@ -10238,4 +10251,14 @@ Cannot create large prims that intersect other players.  Please re-try when othe
      yestext="OK"/>
   </notification>
   
+  <notification
+   icon="alert.tga"
+   name="ChatHistoryIsBusyAlert"
+   type="alertmodal">
+   Chat history file is busy with previous operation. Please try again in a few minutes or choose chat with another person.
+    <usetemplate
+     name="okbutton"
+     yestext="OK"/>
+  </notification>
+  
 </notifications>
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index f169dbb70270af5192d1380e184effe6734a8d81..7d171490e852b1591184abc602e570be7f7b6db7 100755
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -27,6 +27,7 @@ background_visible="true"
      label="Filter My Places"
      max_length_chars="300"
      name="Filter"
+     tab_group="1"
      top="3"
      width="303" />
     <tab_container
@@ -39,7 +40,7 @@ background_visible="true"
      tab_min_width="80"
      tab_max_width="157"
      tab_height="30"
-     tab_group="1"
+     tab_group="2"
      tab_position="top"
      top_pad="10"
      width="315" />
diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml
index 81b2281adbf575ecc6074149cc21bd5dad16fffa..fea5f1b19f87f8ede892d403a1152bfe81fb2154 100755
--- a/indra/newview/skins/default/xui/en/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml
@@ -201,4 +201,14 @@
      tool_tip="Cancel region restart"
      top_delta="0"
      width="150" />
+    <button
+     follows="left|top"
+     height="20"
+     label="Region Debug Console"
+     layout="topleft"
+     left="10"
+     name="region_debug_console_btn"
+     tool_tip="Open Region Debug Console"
+     top_pad="5"
+     width="150" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml
index 44c84e69a1892ac7bbe27cea8c7fa5c07f9f089c..489d286e67fb69e190e8be84259e8f711910028d 100755
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -93,12 +93,21 @@
      top="90"
      width="80" />
     <check_box
+     height="20"
+     label="Block Parcel Fly Over"
+     layout="topleft"
+     left="10"
+     name="block_fly_over_check"
+     tool_tip="Extend access checks upwards to prevent flying over a parcel"
+     top="110"
+     width="90" />
+  <check_box
      height="20"
      label="Allow Damage"
      layout="topleft"
      left="10"
      name="allow_damage_check"
-     top="110"
+     top="130"
      width="80" />
     <check_box
      height="20"
@@ -106,7 +115,7 @@
      layout="topleft"
      left="10"
      name="restrict_pushobject"
-     top="130"
+     top="150"
      width="80" />
     <check_box
      height="20"
@@ -114,7 +123,7 @@
      layout="topleft"
      left="10"
      name="allow_land_resell_check"
-     top="150"
+     top="170"
      width="80" />
     <check_box
      height="20"
@@ -122,7 +131,7 @@
      layout="topleft"
      left="10"
      name="allow_parcel_changes_check"
-     top="170"
+     top="190"
      width="80" />
     <check_box
      height="20"
@@ -131,7 +140,7 @@
      left="10"
      name="block_parcel_search_check"
      tool_tip="Let people see this region and its parcels in search results"
-     top="190"
+     top="210"
      width="80" />
 	<spinner
      decimal_digits="0"
@@ -145,7 +154,7 @@
      max_val="100"
      min_val="1"
      name="agent_limit_spin"
-     top="240"
+     top="260"
      width="170" />
     <spinner
      follows="left|top"
@@ -158,7 +167,7 @@
      max_val="10"
      min_val="1"
      name="object_bonus_spin"
-     top="260"
+     top="280"
      width="170" />
     <text
      follows="left|top"
@@ -167,7 +176,7 @@
      layout="topleft"
      left="10"
      name="access_text"
-     top="290"
+     top="310"
      width="100">
         Rating:
     </text>
@@ -224,7 +233,7 @@
      layout="topleft"
      left="108"
      name="apply_btn"
-     top="320"
+     top="340"
      width="100"/> 
     <button
      follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 64e7fa40639e0f016768e3c477c9633dafd6afab..fca4a5cddcffd8e0133012fd07f5a9d7b1f9e7f1 100755
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2292,6 +2292,7 @@ The [[MARKETPLACE_CREATE_STORE_URL] Marketplace store] is returning errors.
 	<string name="Marketplace Error Internal Import">Error: There was a problem with this item.  Try again later.</string>
 
 	<string name="Open landmarks">Open landmarks</string>
+  <string name="Unconstrained">Unconstrained</string>
 
 	<!-- use value="" because they have preceding spaces -->
 	<string name="no_transfer" value=" (no transfer)" />
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 484511a08b0154adb1094ba5c21a86fffc828a75..2b91c542adae2d34d6fb0c5bf0a1895a05569040 100755
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -1252,7 +1252,8 @@ Intenta iniciar sesión de nuevo en unos instantes.
 	<string name="InventoryInboxNoItems">
 		Aquí aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario.
 	</string>
-	<string name="MarketplaceURL">
+  <string name="Unconstrained">Sin restricciones</string>
+  <string name="MarketplaceURL">
 		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
 	</string>
 	<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 78d846ff4f74e62c2d2ab343e2057ac88fa7c1bb..b8721420cb3b9bb95d686d15ecad85e16e5ec191 100755
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -1270,7 +1270,8 @@ Veuillez réessayer de vous connecter dans une minute.
 	<string name="InventoryInboxNoItems">
 		Les achats que vous avez effectués sur la Place du marché s&apos;affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser.
 	</string>
-	<string name="MarketplaceURL">
+  <string name="Unconstrained">Sans contraintes</string>
+  <string name="MarketplaceURL">
 		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
 	</string>
 	<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 60ed2b0929dbabfaaa3f76ac7a5c2374fb59a9c1..86d7f75b834bbfebb7ce3886b5de5b3c31d5a2e9 100755
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -1261,7 +1261,8 @@ Prova ad accedere nuovamente tra un minuto.
 	<string name="InventoryInboxNoItems">
 		Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli.
 	</string>
-	<string name="MarketplaceURL">
+  <string name="Unconstrained">Libero</string>
+  <string name="MarketplaceURL">
 		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
 	</string>
 	<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index a0f45e5a55d331a76d75f02a166bc9d94257bbbb..36966d6825ca9eb50091cde7c6209a546adab668 100755
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -1270,7 +1270,8 @@ support@secondlife.com にお問い合わせください。
 	<string name="InventoryInboxNoItems">
 		マーケットプレイスで購入した商品はここに表示されます。その後、アイテムをインベントリにドラッグすれば、それらのアイテムを使用できます。
 	</string>
-	<string name="MarketplaceURL">
+  <string name="Unconstrained">非拘束</string>
+  <string name="MarketplaceURL">
 		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
 	</string>
 	<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index f6dec8536bae4e6805f145fb49057482825528ff..f86e393646118e4615552bb34f9a89dbd50a1905 100755
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -1035,6 +1035,7 @@
 	<string name="InventoryNoTexture">
 		Nie posiadasz kopii tej tekstury w Twojej Szafie.
 	</string>
+  <string name="Unconstrained">Swobodny</string>
 	<string name="no_transfer" value=" (brak oddawania)"/>
 	<string name="no_modify" value=" (brak modyfikowania)"/>
 	<string name="no_copy" value=" (brak kopiowania)"/>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 2eb4c0a02e07594cb393afac27cda92375f9da5e..8436452228e4e3ac4ab8da7182242924a0b0ac91 100755
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -1216,7 +1216,8 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
 	<string name="InventoryInboxNoItems">
 		Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las.
 	</string>
-	<string name="MarketplaceURL">
+  <string name="Unconstrained">Sem limites</string>
+  <string name="MarketplaceURL">
 		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
 	</string>
 	<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 0f71edcee0811ed2868a73db3da4dde64abe3221..8faf834f8fc43b3ac31a1a2e6a95522b3534da46 100755
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -1267,7 +1267,8 @@ support@secondlife.com.
 	<string name="InventoryInboxNoItems">
 		Здесь будут показаны ваши покупки из торгового центра. Их можно будет перетащить в ваш инвентарь для использования.
 	</string>
-	<string name="MarketplaceURL">
+  <string name="Unconstrained">Без ограничения</string>
+  <string name="MarketplaceURL">
 		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
 	</string>
 	<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index c4b1530b2b767a465012dcb9a509564d7f6212ba..31c5d2d3107518fa1599a9847978fe579bbbcca0 100755
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -1267,7 +1267,8 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
 	<string name="InventoryInboxNoItems">
 		Pazaryerinda satın aldıklarınız burada görünecektir. Bunları kullanmak için envanterinize sürükleyebilirsiniz.
 	</string>
-	<string name="MarketplaceURL">
+  <string name="Unconstrained">Kısıtsız</string>
+  <string name="MarketplaceURL">
 		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
 	</string>
 	<string name="MarketplaceURL_CreateStore">