diff --git a/.hgtags b/.hgtags
index 4a743342a827e26e8f61f9d9b2ffc580ea13d034..d5726615d243aa51bbeb1b2da1849316c95bb89c 100644
--- a/.hgtags
+++ b/.hgtags
@@ -122,24 +122,22 @@ dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release
 8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release
 8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release
 77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-56_2.6.9-release
+77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-release
 8835e0e3c0d3a48244c287bc05811dfc2fba43ec 2.7.0-start
 43c7ee846b7eed80786acbbf35d03bd016a3e85d DRTVWR-59_2.7.0-beta1
 43c7ee846b7eed80786acbbf35d03bd016a3e85d 2.7.0-beta1
-77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-release
 54fd44ac92e4c61435ea33effe093a3527e18d98 2.7.1-start
 0c4d0c24278074f219e5a32e72b449e78301d11b DRTVWR-61_2.7.1-beta1
 0c4d0c24278074f219e5a32e72b449e78301d11b 2.7.1-beta1
-8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release
-8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release
-77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-56_2.6.9-release
 9f79a6ed8fdcd2f3dac33ea6b3236eeb278dccfe 2.7.2-start
 e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1
 e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1
 6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start
 6af10678de4736222b2c3f7e010e984fb5b327de 2.7.4-start
-77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-release
+be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1
+be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1
 a9abb9633a266c8d2fe62411cfd1c86d32da72bf DRTVWR-60_2.7.1-release
+be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1
+be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1
 a9abb9633a266c8d2fe62411cfd1c86d32da72bf 2.7.1-release
-e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1
-e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1
 19a498fa62570f352d7d246f17e3c81cc1d82d8b 2.7.5-start
diff --git a/autobuild.xml b/autobuild.xml
index 39b7fe8d0e5b3827377253a143145b82033c0fab..084fe2f2f41ca3a9034eba359409f66b957a6eba 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -1907,11 +1907,8 @@
             <map>
               <key>build</key>
               <map>
-                <key>arguments</key>
+                <key>filters</key>
                 <array>
-                  <string>|</string>
-                  <string>grep</string>
-                  <string>-v</string>
                   <string>setenv</string>
                 </array>
                 <key>command</key>
@@ -1964,11 +1961,8 @@
             <map>
               <key>build</key>
               <map>
-                <key>arguments</key>
+                <key>filters</key>
                 <array>
-                  <string>|</string>
-                  <string>grep</string>
-                  <string>-v</string>
                   <string>setenv</string>
                 </array>
                 <key>command</key>
@@ -2023,11 +2017,8 @@
             <map>
               <key>build</key>
               <map>
-                <key>arguments</key>
+                <key>filters</key>
                 <array>
-                  <string>|</string>
-                  <string>grep</string>
-                  <string>-v</string>
                   <string>setenv</string>
                 </array>
                 <key>command</key>
diff --git a/doc/contributions.txt b/doc/contributions.txt
index b744f4db3e1444cfa2be53df3076077e12981d1e..67e78e87ee690d8cf857dc95bc70268b8ebed92c 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -103,6 +103,8 @@ Ales Beaumont
 Alexandrea Fride
     STORM-255
 	STORM-960
+	STORM-1327
+	STORM-1406
 Alissa Sabre
 	VWR-81
 	VWR-83
@@ -158,6 +160,7 @@ Ann Congrejo
 	CT-193
 Ansariel Hiller
 	STORM-1101
+	VWR-25480
 Ardy Lay
 	STORM-859
 	VWR-19499
@@ -443,9 +446,20 @@ Jonathan Yap
 	STORM-1236
 	STORM-1259
 	STORM-787
+	VWR-25480
+	STORM-1334
 	STORM-1313
 	STORM-899
 	STORM-1273
+	STORM-457
+	STORM-1452
+	STORM-1406
+	STORM-1327
+	STORM-1396
+	STORM-1292
+	STORM-1392
+	STORM-1302
+	STORM-1326
 Kage Pixel
 	VWR-11
 Ken March
@@ -778,6 +792,7 @@ Strife Onizuka
 	SNOW-691
 TankMaster Finesmith
 	STORM-1100
+	STORM-1452
 Tayra Dagostino
 	SNOW-517
 	SNOW-543
@@ -910,6 +925,7 @@ WolfPup Lowenhar
 	STORM-825
 	STORM-859
 	STORM-1098
+	STORM-1393
 	VWR-20741
 	VWR-20933
 Zai Lynch
diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp
index 5f84be2c5d3f2009b1178cb1e649f4cd32d54748..c9fb8534f189e93b3170e8fdc718a8f7b48ce76d 100644
--- a/indra/llcharacter/llcharacter.cpp
+++ b/indra/llcharacter/llcharacter.cpp
@@ -38,7 +38,7 @@
 LLStringTable LLCharacter::sVisualParamNames(1024);
 
 std::vector< LLCharacter* > LLCharacter::sInstances;
-
+BOOL LLCharacter::sAllowInstancesChange = TRUE ;
 
 //-----------------------------------------------------------------------------
 // LLCharacter()
@@ -51,8 +51,10 @@ LLCharacter::LLCharacter()
 	mAppearanceSerialNum( 0 ),
 	mSkeletonSerialNum( 0 )
 {
-	mMotionController.setCharacter( this );
+	llassert_always(sAllowInstancesChange) ;
 	sInstances.push_back(this);
+
+	mMotionController.setCharacter( this );	
 	mPauseRequest = new LLPauseRequestHandle();
 }
 
@@ -62,18 +64,29 @@ LLCharacter::LLCharacter()
 // Class Destructor
 //-----------------------------------------------------------------------------
 LLCharacter::~LLCharacter()
-{
+{	
 	for (LLVisualParam *param = getFirstVisualParam(); 
 		param;
 		param = getNextVisualParam())
 	{
 		delete param;
 	}
-	std::vector<LLCharacter*>::iterator iter = std::find(sInstances.begin(), sInstances.end(), this);
-	if (iter != sInstances.end())
+
+	U32 i ;
+	U32 size = sInstances.size() ;
+	for(i = 0 ; i < size ; i++)
 	{
-		sInstances.erase(iter);
+		if(sInstances[i] == this)
+		{
+			break ;
+		}
 	}
+
+	llassert_always(i < size) ;
+
+	llassert_always(sAllowInstancesChange) ;
+	sInstances[i] = sInstances[size - 1] ;
+	sInstances.pop_back() ;
 }
 
 
diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h
index a6347fcc3ce1ca7f4d03c1fcf65ff4628119701a..e81a27c2bc1c8895fb37388429f6bfbcf2bc2e36 100644
--- a/indra/llcharacter/llcharacter.h
+++ b/indra/llcharacter/llcharacter.h
@@ -266,6 +266,7 @@ class LLCharacter
 	void			setSkeletonSerialNum( U32 num )	{ mSkeletonSerialNum = num; }
 
 	static std::vector< LLCharacter* > sInstances;
+	static BOOL sAllowInstancesChange ; //debug use
 
 protected:
 	LLMotionController	mMotionController;
diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp
index 9df033a4ca592c47f9f71bb5eb4f39034899f8d5..c6f45bffa2e941760730056b9c8b5a1af8ef7ae9 100644
--- a/indra/llcharacter/llkeyframemotion.cpp
+++ b/indra/llcharacter/llkeyframemotion.cpp
@@ -467,13 +467,15 @@ LLPointer<LLJointState>& LLKeyframeMotion::getJointState(U32 index)
 }
 
 //-----------------------------------------------------------------------------
-// getJoin()
+// getJoint()
 //-----------------------------------------------------------------------------
 LLJoint* LLKeyframeMotion::getJoint(U32 index)
 {
 	llassert_always (index < mJointStates.size());
 	LLJoint* joint = mJointStates[index]->getJoint();
-	llassert_always (joint);
+	
+	//Commented out 06-28-11 by Aura.
+	//llassert_always (joint);
 	return joint;
 }
 
@@ -821,7 +823,11 @@ void LLKeyframeMotion::initializeConstraint(JointConstraint* constraint)
 	S32 joint_num;
 	LLVector3 source_pos = mCharacter->getVolumePos(shared_data->mSourceConstraintVolume, shared_data->mSourceConstraintOffset);
 	LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[0]);
-
+	if ( !cur_joint )
+	{
+		return;
+	}
+	
 	F32 source_pos_offset = dist_vec(source_pos, cur_joint->getWorldPosition());
 
 	constraint->mTotalLength = constraint->mJointLengths[0] = dist_vec(cur_joint->getParent()->getWorldPosition(), source_pos);
@@ -872,6 +878,10 @@ void LLKeyframeMotion::activateConstraint(JointConstraint* constraint)
 	for (joint_num = 1; joint_num < shared_data->mChainLength; joint_num++)
 	{
 		LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+		if ( !cur_joint )
+		{
+			return;
+		}
 		constraint->mPositions[joint_num] = (cur_joint->getWorldPosition() - mPelvisp->getWorldPosition()) * ~mPelvisp->getWorldRotation();
 	}
 
@@ -932,6 +942,11 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 	}
 
 	LLJoint* root_joint = getJoint(shared_data->mJointStateIndices[shared_data->mChainLength]);
+	if (! root_joint) 
+	{
+		return;
+	}
+	
 	LLVector3 root_pos = root_joint->getWorldPosition();
 //	LLQuaternion root_rot = 
 	root_joint->getParent()->getWorldRotation();
@@ -943,6 +958,11 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 	for (joint_num = 0; joint_num <= shared_data->mChainLength; joint_num++)
 	{
 		LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+		if (!cur_joint)
+		{
+			return;
+		}
+		
 		if (joint_mask[cur_joint->getJointNum()] >= (0xff >> (7 - getPriority())))
 		{
 			// skip constraint
@@ -1033,7 +1053,14 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 
 	if (shared_data->mChainLength)
 	{
-		LLQuaternion end_rot = getJoint(shared_data->mJointStateIndices[0])->getWorldRotation();
+		LLJoint* end_joint = getJoint(shared_data->mJointStateIndices[0]);
+		
+		if (!end_joint)
+		{
+			return;
+		}
+		
+		LLQuaternion end_rot = end_joint->getWorldRotation();
 
 		// slam start and end of chain to the proper positions (rest of chain stays put)
 		positions[0] = lerp(keyframe_source_pos, target_pos, weight);
@@ -1042,7 +1069,14 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 		// grab keyframe-specified positions of joints	
 		for (joint_num = 1; joint_num < shared_data->mChainLength; joint_num++)
 		{
-			LLVector3 kinematic_position = getJoint(shared_data->mJointStateIndices[joint_num])->getWorldPosition() + 
+			LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+			
+			if (!cur_joint)
+			{
+				return;
+			}
+			
+			LLVector3 kinematic_position = cur_joint->getWorldPosition() + 
 				(source_to_target * constraint->mJointLengthFractions[joint_num]);
 
 			// convert intermediate joint positions to world coordinates
@@ -1088,7 +1122,17 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 		for (joint_num = shared_data->mChainLength; joint_num > 0; joint_num--)
 		{
 			LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+			
+			if (!cur_joint)
+			{
+				return;
+			}
 			LLJoint* child_joint = getJoint(shared_data->mJointStateIndices[joint_num - 1]);
+			if (!child_joint)
+			{
+				return;
+			}
+			
 			LLQuaternion parent_rot = cur_joint->getParent()->getWorldRotation();
 
 			LLQuaternion cur_rot = cur_joint->getWorldRotation();
@@ -1122,7 +1166,6 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 			cur_joint->setRotation(target_rot);
 		}
 
-		LLJoint* end_joint = getJoint(shared_data->mJointStateIndices[0]);
 		LLQuaternion end_local_rot = end_rot * ~end_joint->getParent()->getWorldRotation();
 
 		if (weight == 1.f)
@@ -1150,7 +1193,13 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 		//reset old joint rots
 		for (joint_num = 0; joint_num <= shared_data->mChainLength; joint_num++)
 		{
-			getJoint(shared_data->mJointStateIndices[joint_num])->setRotation(old_rots[joint_num]);
+			LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+			if (!cur_joint)
+			{
+				return;
+			}
+
+			cur_joint->setRotation(old_rots[joint_num]);
 		}
 	}
 	// simple positional constraint (pelvis only)
@@ -1775,7 +1824,15 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
 				constraintp->mJointStateIndices[i] = -1;
 				for (U32 j = 0; j < mJointMotionList->getNumJointMotions(); j++)
 				{
-					if(getJoint(j) == joint)
+					LLJoint* constraint_joint = getJoint(j);
+					
+					if ( !constraint_joint )
+					{
+						llwarns << "Invalid joint " << j << llendl;
+						return FALSE;
+					}
+					
+					if(constraint_joint == joint)
 					{
 						constraintp->mJointStateIndices[i] = (S32)j;
 						break;
diff --git a/indra/llcharacter/llkeyframemotion.h b/indra/llcharacter/llkeyframemotion.h
index 1fe9af40b361c5ccf762c7e1c24757622aec9315..b1422b2b903c742a0d4e13d1fd816666f0a3e9e1 100644
--- a/indra/llcharacter/llkeyframemotion.h
+++ b/indra/llcharacter/llkeyframemotion.h
@@ -70,7 +70,7 @@ class LLKeyframeMotion :
 private:
 	// private helper functions to wrap some asserts
 	LLPointer<LLJointState>& getJointState(U32 index);
-	LLJoint* getJoint(U32 index);
+	LLJoint* getJoint(U32 index );
 	
 public:
 	//-------------------------------------------------------------------------
diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp
index ca84fa8bb80abf27f3a4b6a1da50afe79f2f82e5..8c752fbe301e74f2767e4203555d6cc4bc7fd868 100644
--- a/indra/llmessage/lliosocket.cpp
+++ b/indra/llmessage/lliosocket.cpp
@@ -191,7 +191,7 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port)
 		port = PORT_EPHEMERAL;
 	}
 	rv->mPort = port;
-	rv->setOptions();
+	rv->setNonBlocking();
 	return rv;
 }
 
@@ -206,7 +206,7 @@ LLSocket::ptr_t LLSocket::create(apr_socket_t* socket, apr_pool_t* pool)
 	}
 	rv = ptr_t(new LLSocket(socket, pool));
 	rv->mPort = PORT_EPHEMERAL;
-	rv->setOptions();
+	rv->setNonBlocking();
 	return rv;
 }
 
@@ -227,10 +227,10 @@ bool LLSocket::blockingConnect(const LLHost& host)
 	{
 		return false;
 	}
-	apr_socket_timeout_set(mSocket, 1000);
+	setBlocking(1000);
 	ll_debug_socket("Blocking connect", mSocket);
 	if(ll_apr_warn_status(apr_socket_connect(mSocket, sa))) return false;
-	setOptions();
+	setNonBlocking();
 	return true;
 }
 
@@ -258,11 +258,27 @@ LLSocket::~LLSocket()
 	}
 }
 
-void LLSocket::setOptions()
+// See http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-13.html#ss13.4
+// for an explanation of how to get non-blocking sockets and timeouts with
+// consistent behavior across platforms.
+
+void LLSocket::setBlocking(S32 timeout)
+{
+	LLMemType m1(LLMemType::MTYPE_IO_TCP);
+	// set up the socket options
+	ll_apr_warn_status(apr_socket_timeout_set(mSocket, timeout));
+	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 0));
+	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE));
+	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE));
+
+}
+
+void LLSocket::setNonBlocking()
 {
 	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 	// set up the socket options
 	ll_apr_warn_status(apr_socket_timeout_set(mSocket, 0));
+	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 1));
 	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE));
 	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE));
 
diff --git a/indra/llmessage/lliosocket.h b/indra/llmessage/lliosocket.h
index 6806e5084a4211d7a819b1613e43fa0e17b94e05..e0f6c1e34d0ea15be627cb718f64f171cf506491 100644
--- a/indra/llmessage/lliosocket.h
+++ b/indra/llmessage/lliosocket.h
@@ -153,9 +153,16 @@ class LLSocket
 	LLSocket(apr_socket_t* socket, apr_pool_t* pool);
 
 	/** 
-	 * @brief Set default socket options.
+	 * @brief Set default socket options, with SO_NONBLOCK = 0 and a timeout in us.
+	 * @param timeout Number of microseconds to wait on this socket. Any
+	 * negative number means block-forever. TIMEOUT OF 0 IS NON-PORTABLE.
 	 */
-	void setOptions();
+	void setBlocking(S32 timeout);
+
+	/**
+	 * @brief Set default socket options, with SO_NONBLOCK = 1 and timeout = 0.
+	 */
+	void setNonBlocking();
 
 public:
 	/** 
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index a3aed4dd8abba758d7247fcbe436ed77b4f3faad..c224ab0e9bb20a8c6aefb7517315e1c9cf1a6180 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -568,6 +568,13 @@ bool LLGLManager::initGL()
 		glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &mMaxSampleMaskWords);
 	}
 
+#if LL_WINDOWS
+	if (mIsATI)
+	{ //using multisample textures on ATI results in black screen for some reason
+		mHasTextureMultisample = FALSE;
+	}
+#endif
+
 	if (mHasFramebufferObject)
 	{
 		glGetIntegerv(GL_MAX_SAMPLES, &mMaxSamples);
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 8e99f62de680ead157709bd7a895724d2b995153..ad2c662dfcacf784d89fa681003cb956d4bd3d6d 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -109,6 +109,11 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
 	// Create program
 	mProgramObject = glCreateProgramObjectARB();
 	
+	if (gGLManager.mGLVersion < 3.1f)
+	{ //force indexed texture channels to 1 if GL version is old (performance improvement for drivers with poor branching shader model support)
+		mFeatures.mIndexedTextureChannels = llmin(mFeatures.mIndexedTextureChannels, 1);
+	}
+
 	//compile new source
 	vector< pair<string,GLenum> >::iterator fileIter = mShaderFiles.begin();
 	for ( ; fileIter != mShaderFiles.end(); fileIter++ )
@@ -131,6 +136,11 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
 		return FALSE;
 	}
 
+	if (gGLManager.mGLVersion < 3.1f)
+	{ //attachShaderFeatures may have set the number of indexed texture channels, so set to 1 again
+		mFeatures.mIndexedTextureChannels = llmin(mFeatures.mIndexedTextureChannels, 1);
+	}
+
 	// Map attributes and uniforms
 	if (success)
 	{
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index bdc103b9170526602ae58aca40cd0dca6cb855a5..751b250d9687f6f78183a29a096120e01bda4ec1 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -462,7 +462,11 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
 	GLcharARB* text[1024];
 	GLuint count = 0;
 
-	if (gGLManager.mGLVersion < 3.f)
+	if (gGLManager.mGLVersion < 2.1f)
+	{
+		text[count++] = strdup("#version 110\n");
+	}
+	else if (gGLManager.mGLVersion < 3.f)
 	{
 		//set version to 1.20
 		text[count++] = strdup("#version 120\n");
@@ -524,7 +528,12 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
 		text[count++] = strdup("{\n");
 		
 		
-		if (gGLManager.mGLVersion >= 3.f)
+		if (texture_index_channels == 1)
+		{ //don't use flow control, that's silly
+			text[count++] = strdup("return texture2D(tex0, texcoord);\n");
+			text[count++] = strdup("}\n");
+		}
+		else if (gGLManager.mGLVersion >= 3.f)
 		{ 
 			text[count++] = strdup("\tswitch (int(vary_texture_index+0.25))\n");
 			text[count++] = strdup("\t{\n");
@@ -537,6 +546,8 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
 			}
 
 			text[count++] = strdup("\t}\n");
+			text[count++] = strdup("\treturn vec4(0,0,0,0);\n");
+			text[count++] = strdup("}\n");
 		}
 		else
 		{
@@ -557,10 +568,10 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
 				std::string if_str = llformat("if (ti == %d) return texture2D(tex%d, texcoord);\n", i, i);
 				text[count++] = strdup(if_str.c_str());
 			}
-		}			
 
-		text[count++] = strdup("\treturn vec4(0,0,0,0);\n");
-		text[count++] = strdup("}\n");
+			text[count++] = strdup("\treturn vec4(0,0,0,0);\n");
+			text[count++] = strdup("}\n");
+		}			
 	}
 
 	//copy file into memory
@@ -605,11 +616,6 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
 		}
 	}
 		
-	//free memory
-	for (GLuint i = 0; i < count; i++)
-	{
-		free(text[i]);
-	}
 	if (error == GL_NO_ERROR)
 	{
 		//check for errors
@@ -623,6 +629,16 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
 				//an error occured, print log
 				LL_WARNS("ShaderLoading") << "GLSL Compilation Error: (" << error << ") in " << filename << LL_ENDL;
 				dumpObjectLog(ret);
+
+				std::stringstream ostr;
+				//dump shader source for debugging
+				for (GLuint i = 0; i < count; i++)
+				{
+					ostr << i << ": " << text[i];
+				}
+
+				LL_WARNS("ShaderLoading") << "\n" << ostr.str() << llendl;
+
 				ret = 0;
 			}
 		}
@@ -633,6 +649,12 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
 	}
 	stop_glerror();
 
+	//free memory
+	for (GLuint i = 0; i < count; i++)
+	{
+		free(text[i]);
+	}
+
 	//successfully loaded, save results
 	if (ret)
 	{
diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp
index 06bad1f3712ff174d303598560da730869848bcb..04040200d053f7d727c16c5958d08a6e123e375b 100644
--- a/indra/llui/llconsole.cpp
+++ b/indra/llui/llconsole.cpp
@@ -132,6 +132,9 @@ void LLConsole::setFontSize(S32 size_index)
 
 void LLConsole::draw()
 {
+	// Units in pixels
+	static const F32 padding_horizontal = 10;
+	static const F32 padding_vertical = 3;
 	LLGLSUIDefault gls_ui;
 
 	// skip lines added more than mLinePersistTime ago
@@ -176,11 +179,9 @@ void LLConsole::draw()
 	// draw remaining lines
 	F32 y_pos = 0.f;
 
-	LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square");
+	LLUIImagePtr imagep = LLUI::getUIImage("transparent");
 
-//	F32 console_opacity = llclamp(gSavedSettings.getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
 	F32 console_opacity = llclamp(LLUI::sSettingGroups["config"]->getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
-//	LLColor4 color = LLUIColorTable::instance().getColor("ConsoleBackground");
 	LLColor4 color = LLUIColorTable::instance().getColor("ConsoleBackground");
 	color.mV[VALPHA] *= console_opacity;
 
@@ -188,8 +189,8 @@ void LLConsole::draw()
 
 	for(paragraph_it = mParagraphs.rbegin(); paragraph_it != mParagraphs.rend(); paragraph_it++)
 	{
-		S32 target_height = llfloor( (*paragraph_it).mLines.size() * line_height + 8);
-		S32 target_width =  llfloor( (*paragraph_it).mMaxWidth +15);
+		S32 target_height = llfloor( (*paragraph_it).mLines.size() * line_height + padding_vertical);
+		S32 target_width =  llfloor( (*paragraph_it).mMaxWidth + padding_horizontal);
 
 		y_pos += ((*paragraph_it).mLines.size()) * line_height;
 		imagep->drawSolid(-14, (S32)(y_pos + line_height - target_height), target_width, target_height, color);
@@ -234,7 +235,7 @@ void LLConsole::draw()
 				y_off += line_height;
 			}
 		}
-		y_pos  += 8;
+		y_pos  += padding_vertical;
 	}
 }
 
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
old mode 100755
new mode 100644
index 2372c19fb95029780ef33d822e02215418346ce1..b520650978e07d92f9076681ed807a53f0c74e20
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -5576,7 +5576,7 @@
     <key>Type</key>
     <string>Boolean</string>
     <key>Value</key>
-    <real>1</real>
+    <real>0</real>
   </map>
   <key>MeshImportUseSLM</key>
   <map>
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index 4da155efdab1c5f9fa7396a4762ba7b4418d27a2..5384660d4ca8f16a067cf34e68fdf80159ac36bb 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -1,4 +1,4 @@
-version 29
+version 30
 
 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences
 // Should be combined into one table
@@ -297,6 +297,7 @@ RenderDeferred				0	0
 
 list Intel
 RenderAnisotropic			1	0
+RenderVBOEnable				1	0
 
 list GeForce2
 RenderAnisotropic			1	0
diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt
index abe4ec99285d9aa3dc4774d963ba90fa3e46ad28..ce2adac221640015e9d3879ef9128e540ee10b51 100644
--- a/indra/newview/featuretable_xp.txt
+++ b/indra/newview/featuretable_xp.txt
@@ -1,4 +1,4 @@
-version 29
+version 30
 
 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences
 // Should be combined into one table
@@ -295,6 +295,7 @@ RenderDeferred				0	0
 
 list Intel
 RenderAnisotropic			1	0
+RenderVBOEnable				1	0
 
 list GeForce2
 RenderAnisotropic			1	0
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index cbbdcb2983fc6d47b767b23d817f49b5fb2d9ec3..955f19c82c64de7fcd28cae540d3d92a8bff6901 100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -773,6 +773,10 @@ bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
 // static
 bool LLAvatarActions::canOfferTeleport(const uuid_vec_t& ids)
 {
+	// We can't send more than 250 lures in a single message, so disable this
+	// button when there are too many id's selected.
+	if(ids.size() > 250) return false;
+	
 	bool result = true;
 	for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
 	{
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 01d19c5ba0442fa14d1aefe560c62b2704fd804f..79e6c7b66bd8c3599a3b0b73ecfeddad958bf8d6 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -386,6 +386,7 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b
 	{
 		bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
 		getChild<LLButton>("speak_flyout_btn")->setEnabled(voice_status);
+		gMenuBarView->getChild<LLView>("Nearby Voice")->setEnabled(voice_status);
 		if (voice_status)
 		{
 			LLFirstUse::speak(true);
@@ -570,7 +571,7 @@ BOOL LLBottomTray::postBuild()
 	// it takes some time between logging in to world and connecting to voice channel.
 	getChild<LLButton>("speak_btn")->setEnabled(false);
 	getChild<LLButton>("speak_flyout_btn")->setEnabled(false);
-
+	gMenuBarView->getChild<LLView>("Nearby Voice")->setEnabled(false);
 
 	// Registering Chat Bar to receive Voice client status change notifications.
 	LLVoiceClient::getInstance()->addObserver(this);
diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index b6d67899f8caab23f7a69923558bbbce6d1de24c..216cc66ef8637c624294fa7b9a85960d53e367d5 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -62,7 +62,8 @@ void LLDebugView::init()
 	LLRect r;
 	LLRect rect = getLocalRect();
 
-	r.set(10, rect.getHeight() - 100, rect.getWidth()/2, 100);
+	// Rectangle to draw debug data in (full height, 3/4 width)
+	r.set(10, rect.getHeight() - 100, ((rect.getWidth()*3)/4), 100);
 	LLConsole::Params cp;
 	cp.name("debug console");
 	cp.max_lines(20);
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
index c95b046707528ec1d7fb01472d00cbd0e6bd481c..c6743ca13b2aae31b2945f9d1869e484c530c846 100644
--- a/indra/newview/llfloaterauction.cpp
+++ b/indra/newview/llfloaterauction.cpp
@@ -55,6 +55,7 @@
 #include "llrender.h"
 #include "llsdutil.h"
 #include "llsdutil_math.h"
+#include "lltrans.h"
 
 ///----------------------------------------------------------------------------
 /// Local function declarations, constants, enums, and typedefs
@@ -457,7 +458,7 @@ void LLFloaterAuction::onClickSellToAnyone(void* data)
 		LLSD args;
 		args["LAND_SIZE"] = llformat("%d", area);
 		args["SALE_PRICE"] = llformat("%d", sale_price);
-		args["NAME"] = "Anyone";
+		args["NAME"] = LLTrans::getString("Anyone");
 
 		LLNotification::Params params("ConfirmLandSaleChange");	// Re-use existing dialog
 		params.substitutions(args)
diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp
index 8558a1277ce514d691fecc317c4e135eec595e9d..3434841d09b52d3d3e288079b86b9cc715b94b08 100644
--- a/indra/newview/llfloatersellland.cpp
+++ b/indra/newview/llfloatersellland.cpp
@@ -41,6 +41,7 @@
 #include "llviewerparcelmgr.h"
 #include "lluictrlfactory.h"
 #include "llviewerwindow.h"
+#include "lltrans.h"
 
 class LLAvatarName;
 
@@ -451,7 +452,7 @@ void LLFloaterSellLandUI::doSellLand(void *userdata)
 	// Do a confirmation
 	S32 sale_price = self->getChild<LLUICtrl>("price")->getValue();
 	S32 area = parcel->getArea();
-	std::string authorizedBuyerName = "Anyone";
+	std::string authorizedBuyerName = LLTrans::getString("Anyone");
 	bool sell_to_anyone = true;
 	if ("user" == self->getChild<LLUICtrl>("sell_to")->getValue().asString())
 	{
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 1b6feddb6c6bbada7a80e3f59bfe9204c937e2ca..dc71ade62157a4e3ef6887f729c9e1fbb6ca4fa0 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -423,8 +423,7 @@ void LLFloaterTools::refresh()
 	// Refresh object and prim count labels
 	LLLocale locale(LLLocale::USER_LOCALE);
 
-#if 0
-	if (gMeshRepo.meshRezEnabled())
+	if (!gMeshRepo.meshRezEnabled())
 	{		
 		std::string obj_count_string;
 		LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
@@ -448,7 +447,6 @@ void LLFloaterTools::refresh()
 		getChildView("RenderingCost")->setEnabled(have_selection && sShowObjectCost);
 	}
 	else
-#endif
 	{
 		F32 link_phys_cost  = LLSelectMgr::getInstance()->getSelection()->getSelectedLinksetPhysicsCost();
 		F32 link_cost  = LLSelectMgr::getInstance()->getSelection()->getSelectedLinksetCost();
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index f8a4ce7ad0fc8362fa220666026840dcf9394f19..b3910982d14e66637724d23e6a134ccba6423a88 100755
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -1527,17 +1527,24 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
 		mCompletingRegionName = "";
 	}
 	
-	// if match found, highlight it and go
-	if (!match.isUndefined())
+	if (num_results > 0)
 	{
-		list->selectByValue(match);
+		// if match found, highlight it and go
+		if (!match.isUndefined())
+		{
+			list->selectByValue(match);
+		}
+		// else select first found item
+		else
+		{
+			list->selectFirstItem();
+		}
 		getChild<LLUICtrl>("search_results")->setFocus(TRUE);
 		onCommitSearchResult();
 	}
-	
-	// if we found nothing, say "none"
-	if (num_results == 0)
+	else
 	{
+		// if we found nothing, say "none"
 		list->setCommentText(LLTrans::getString("worldmap_results_none_found"));
 		list->operateOnAll(LLCtrlListInterface::OP_DESELECT);
 	}
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
old mode 100755
new mode 100644
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index 11dc496311d3864b01c418ca9da3ba2a658e6b3f..957b6d5f94fc6d8498fd6e4a4dcd441d36da9573 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -268,6 +268,9 @@ bool	LLNearbyChatScreenChannel::createPoolToast()
 	
 	toast->setOnFadeCallback(boost::bind(&LLNearbyChatScreenChannel::onToastFade, this, _1));
 
+	// If the toast gets somehow prematurely destroyed, deactivate it to prevent crash (STORM-1352).
+	toast->setOnToastDestroyedCallback(boost::bind(&LLNearbyChatScreenChannel::onToastDestroyed, this, _1, false));
+
 	LL_DEBUGS("NearbyChat") << "Creating and pooling toast" << llendl;	
 	m_toast_pool.push_back(toast->getHandle());
 	return true;
@@ -369,8 +372,10 @@ void LLNearbyChatScreenChannel::arrangeToasts()
 	}
 }
 
-int sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second)
+static bool sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second)
 {
+	if (!first.get() || !second.get()) return false; // STORM-1352
+
 	F32 v1 = first.get()->getTimeLeftToLive();
 	F32 v2 = second.get()->getTimeLeftToLive();
 	return v1 > v2;
@@ -396,7 +401,11 @@ void LLNearbyChatScreenChannel::showToastsBottom()
 	for(toast_vec_t::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it)
 	{
 		LLToast* toast = it->get();
-		if (!toast) continue;
+		if (!toast)
+		{
+			llwarns << "NULL found in the active chat toasts list!" << llendl;
+			continue;
+		}
 
 		S32 toast_top = bottom + toast->getRect().getHeight() + margin;
 
@@ -472,7 +481,8 @@ void LLNearbyChatHandler::initChannel()
 
 
 
-void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
+void LLNearbyChatHandler::processChat(const LLChat& chat_msg,		// WARNING - not really const, see hack below changing chat_msg.mText
+									  const LLSD &args)
 {
 	if(chat_msg.mMuted == TRUE)
 		return;
@@ -480,7 +490,17 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
 	if(chat_msg.mText.empty())
 		return;//don't process empty messages
 
+	// Handle irc styled messages for toast panel
+	// HACK ALERT - changes mText, stripping out IRC style "/me" prefixes
 	LLChat& tmp_chat = const_cast<LLChat&>(chat_msg);
+	std::string original_message = tmp_chat.mText;			// Save un-modified version of chat text
+	if (tmp_chat.mChatStyle == CHAT_STYLE_IRC)
+	{
+		if(!tmp_chat.mFromName.empty())
+			tmp_chat.mText = tmp_chat.mFromName + tmp_chat.mText.substr(3);
+		else
+			tmp_chat.mText = tmp_chat.mText.substr(3);
+	}
 
 	LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
 	{
@@ -531,7 +551,7 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
 
 			LLViewerChat::getChatColor(chat_msg,txt_color);
 
-			LLFloaterScriptDebug::addScriptLine(chat_msg.mText,
+			LLFloaterScriptDebug::addScriptLine(original_message,		// Send full message with "/me" style prefix
 												chat_msg.mFromName,
 												txt_color,
 												chat_msg.mFromID);
@@ -562,15 +582,6 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
 		|| !mChannel->getShowToasts() ) // to prevent toasts in Busy mode
 		return;//no need in toast if chat is visible or if bubble chat is enabled
 
-	// Handle irc styled messages for toast panel
-	if (tmp_chat.mChatStyle == CHAT_STYLE_IRC)
-	{
-		if(!tmp_chat.mFromName.empty())
-			tmp_chat.mText = tmp_chat.mFromName + tmp_chat.mText.substr(3);
-		else
-			tmp_chat.mText = tmp_chat.mText.substr(3);
-	}
-
 	// arrange a channel on a screen
 	if(!mChannel->getVisible())
 	{
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 9ec4d3303603c49d506b0e66982a44144f8335bb..c38c8bad809b298974309697d40cb0f0d85185ca 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -639,6 +639,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
 	if (click_action == CLICK_ACTION_NONE				// not doing 1-click action
 		&& gSavedSettings.getBOOL("ClickToWalk")		// click to walk enabled
 		&& !gAgent.getFlying()							// don't auto-navigate while flying until that works
+		&& gAgentAvatarp
 		&& !gAgentAvatarp->isSitting()
 		&& !mBlockClickToWalk							// another behavior hasn't cancelled click to walk
 		&& !mPick.mPosGlobal.isExactlyZero()			// valid coordinates for pick
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index b840991bbc253a32ec7b6cb9fe01d2537ffa64a3..729f69ec3f6994f7cc8938096714bb552d6a3deb 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1507,7 +1507,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
 			log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
 			LLSD args;
 			args["MESSAGE"] = log_message;
-			LLNotificationsUtil::add("SystemMessage", args);
+			LLNotificationsUtil::add("SystemMessageTip", args);
 		}
 		break;
 
@@ -1681,7 +1681,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
 				log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
 				LLSD args;
 				args["MESSAGE"] = log_message;
-				LLNotificationsUtil::add("SystemMessage", args);
+				LLNotificationsUtil::add("SystemMessageTip", args);
 			}
 			
 			// we will want to open this item when it comes back.
@@ -1732,7 +1732,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
 
 				LLSD args;
 				args["MESSAGE"] = log_message;
-				LLNotificationsUtil::add("SystemMessage", args);
+				LLNotificationsUtil::add("SystemMessageTip", args);
 			}
 			
 			if (busy &&	(!mFromGroup && !mFromObject))
@@ -4332,8 +4332,11 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
 	}
 
 	// Don't play sounds from gestures if they are not enabled.
-	if (!gSavedSettings.getBOOL("EnableGestureSounds")) return;
-		
+	if (object_id == owner_id && !gSavedSettings.getBOOL("EnableGestureSounds"))
+	{
+		return;
+	}
+
 	gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global);
 }
 
@@ -6267,6 +6270,18 @@ void send_group_notice(const LLUUID& group_id,
 
 bool handle_lure_callback(const LLSD& notification, const LLSD& response)
 {
+	static const unsigned OFFER_RECIPIENT_LIMIT = 250;
+	if(notification["payload"]["ids"].size() > OFFER_RECIPIENT_LIMIT) 
+	{
+		// More than OFFER_RECIPIENT_LIMIT targets will overload the message
+		// producing an llerror.
+		LLSD args;
+		args["OFFERS"] = notification["payload"]["ids"].size();
+		args["LIMIT"] = static_cast<int>(OFFER_RECIPIENT_LIMIT);
+		LLNotificationsUtil::add("TooManyTeleportOffers", args);
+		return false;
+	}
+	
 	std::string text = response["message"].asString();
 	LLSLURL slurl;
 	LLAgentUI::buildSLURL(slurl);
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index da4d0548d02811699e19ca28df1d2457167253ab..592923ee0749b7558954890bd6f6d5d6754e18c9 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -722,6 +722,11 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
 	shaders.reserve(13);
 	S32 ch = gGLManager.mNumTextureImageUnits-1;
 
+	if (gGLManager.mGLVersion < 3.1f)
+	{ //force to 1 texture index channel for old drivers
+		ch = 1;
+	}
+
 	std::vector<S32> index_channels;
 	index_channels.push_back(-1);	 shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl",		mVertexShaderLevel[SHADER_WINDLIGHT] ) );
 	index_channels.push_back(-1);	 shaders.push_back( make_pair( "windlight/gammaF.glsl",					mVertexShaderLevel[SHADER_WINDLIGHT]) );
@@ -1209,7 +1214,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		{
 			if (multisample)
 			{
-				fragment = "deferred/sunlightSSAOMSF.glsl";
+				fragment = "deferred/sunLightSSAOMSF.glsl";
 			}
 			else
 			{
@@ -1220,7 +1225,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		{
 			if (multisample)
 			{
-				fragment = "deferred/sunlightMSF.glsl";
+				fragment = "deferred/sunLightMSF.glsl";
 			}
 			else
 			{
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index a1d9434d44e353af5e692fc3f8a277f37b20699e..d24174adeae4552368b4c70da3c55d687fb02234 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -76,7 +76,6 @@ LLStat LLViewerTextureList::sFormattedMemStat(32, TRUE);
 LLViewerTextureList gTextureList;
 static LLFastTimer::DeclareTimer FTM_PROCESS_IMAGES("Process Images");
 
-U32 LLViewerTextureList::sRenderThreadID = 0 ;
 ///////////////////////////////////////////////////////////////////////////////
 
 LLViewerTextureList::LLViewerTextureList() 
@@ -90,7 +89,6 @@ LLViewerTextureList::LLViewerTextureList()
 
 void LLViewerTextureList::init()
 {			
-	sRenderThreadID = LLThread::currentID() ;
 	mInitialized = TRUE ;
 	sNumImages = 0;
 	mUpdateStats = TRUE;
@@ -502,10 +500,9 @@ LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLUUID &image_id)
 	return iter->second;
 }
 
-void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image, U32 thread_id)
+void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
 {
 	llassert_always(mInitialized) ;
-	llassert_always(sRenderThreadID == thread_id);
 	llassert(image);
 	if (image->isInImageList())
 	{
@@ -519,10 +516,9 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image, U32 thre
 	image->setInImageList(TRUE) ;
 }
 
-void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id)
+void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
 {
 	llassert_always(mInitialized) ;
-	llassert_always(sRenderThreadID == thread_id);
 	llassert(image);
 	if (!image->isInImageList())
 	{
@@ -659,10 +655,7 @@ void LLViewerTextureList::updateImagesDecodePriorities()
 			const F32 LAZY_FLUSH_TIMEOUT = 30.f; // stop decoding
 			const F32 MAX_INACTIVE_TIME  = 50.f; // actually delete
 			S32 min_refs = 3; // 1 for mImageList, 1 for mUUIDMap, 1 for local reference
-			if (imagep->hasCallbacks())
-			{
-				min_refs++; // Add an extra reference if we're on the loaded callback list
-			}
+			
 			S32 num_refs = imagep->getNumRefs();
 			if (num_refs == min_refs)
 			{
@@ -719,9 +712,9 @@ void LLViewerTextureList::updateImagesDecodePriorities()
 			if ((decode_priority_test < old_priority_test * .8f) ||
 				(decode_priority_test > old_priority_test * 1.25f))
 			{
-				removeImageFromList(imagep, sRenderThreadID);
+				removeImageFromList(imagep);
 				imagep->setDecodePriority(decode_priority);
-				addImageToList(imagep, sRenderThreadID);
+				addImageToList(imagep);
 			}
 			update_counter--;
 		}
@@ -893,8 +886,6 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
 {
 	LLTimer timer;
 
-	llassert_always(sRenderThreadID == LLThread::currentID());
-
 	// Update texture stats and priorities
 	std::vector<LLPointer<LLViewerFetchedTexture> > image_list;
 	for (image_priority_list_t::iterator iter = mImageList.begin();
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index d02b6be6b5d8ec73b6d00677ad9c652f9c3a6fcc..7f4dd0ae8898bf00d40bef251bb4376c079e2eaf 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -121,8 +121,8 @@ class LLViewerTextureList
 	void addImage(LLViewerFetchedTexture *image);
 	void deleteImage(LLViewerFetchedTexture *image);
 
-	void addImageToList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID());
-	void removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID());
+	void addImageToList(LLViewerFetchedTexture *image);
+	void removeImageFromList(LLViewerFetchedTexture *image);
 
 	LLViewerFetchedTexture * getImage(const LLUUID &image_id,									 
 									 BOOL usemipmap = TRUE,
@@ -208,9 +208,6 @@ class LLViewerTextureList
 private:
 	static S32 sNumImages;
 	static void (*sUUIDCallback)(void**, const LLUUID &);
-
-	//debug use
-	static U32 sRenderThreadID;
 };
 
 class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIImageList>
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 4a9756bb8854cbb383271e70ea5523a6e23fcc4b..27f3a26f832c7b9d083bb691ba461169e97f2f32 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -8245,6 +8245,8 @@ U32 LLVOAvatar::getPartitionType() const
 //static
 void LLVOAvatar::updateImpostors() 
 {
+	LLCharacter::sAllowInstancesChange = FALSE ;
+
 	for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
 		 iter != LLCharacter::sInstances.end(); ++iter)
 	{
@@ -8254,6 +8256,8 @@ void LLVOAvatar::updateImpostors()
 			gPipeline.generateImpostor(avatar);
 		}
 	}
+
+	LLCharacter::sAllowInstancesChange = TRUE ;
 }
 
 BOOL LLVOAvatar::isImpostor() const
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 6ee6822e2fcdc4eae6b7bc4f9d1a49d337c98e2c..cd2bbad620951b4d2ec0121b958e0a3b40755562 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -195,12 +195,13 @@ static LLVivoxVoiceClientFriendsObserver *friendslist_listener = NULL;
 class LLVivoxVoiceClientCapResponder : public LLHTTPClient::Responder
 {
 public:
-	LLVivoxVoiceClientCapResponder(void){};
+	LLVivoxVoiceClientCapResponder(LLVivoxVoiceClient::state requesting_state) : mRequestingState(requesting_state) {};
 
 	virtual void error(U32 status, const std::string& reason);	// called with bad status codes
 	virtual void result(const LLSD& content);
 
 private:
+	LLVivoxVoiceClient::state mRequestingState;  // state 
 };
 
 void LLVivoxVoiceClientCapResponder::error(U32 status, const std::string& reason)
@@ -208,6 +209,7 @@ void LLVivoxVoiceClientCapResponder::error(U32 status, const std::string& reason
 	LL_WARNS("Voice") << "LLVivoxVoiceClientCapResponder::error("
 		<< status << ": " << reason << ")"
 		<< LL_ENDL;
+	LLVivoxVoiceClient::getInstance()->sessionTerminate();
 }
 
 void LLVivoxVoiceClientCapResponder::result(const LLSD& content)
@@ -216,12 +218,12 @@ void LLVivoxVoiceClientCapResponder::result(const LLSD& content)
 	
 	LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest response:" << ll_pretty_print_sd(content) << LL_ENDL;
 
+	std::string uri;
+	std::string credentials;
+	
 	if ( content.has("voice_credentials") )
 	{
 		LLSD voice_credentials = content["voice_credentials"];
-		std::string uri;
-		std::string credentials;
-
 		if ( voice_credentials.has("channel_uri") )
 		{
 			uri = voice_credentials["channel_uri"].asString();
@@ -231,7 +233,12 @@ void LLVivoxVoiceClientCapResponder::result(const LLSD& content)
 			credentials =
 				voice_credentials["channel_credentials"].asString();
 		}
-
+	}
+	
+	// set the spatial channel.  If no voice credentials or uri are 
+	// available, then we simply drop out of voice spatially.
+	if(LLVivoxVoiceClient::getInstance()->parcelVoiceInfoReceived(mRequestingState))
+	{
 		LLVivoxVoiceClient::getInstance()->setSpatialChannel(uri, credentials);
 	}
 }
@@ -551,18 +558,27 @@ void LLVivoxVoiceClient::userAuthorized(const std::string& user_id, const LLUUID
 
 void LLVivoxVoiceClient::requestVoiceAccountProvision(S32 retries)
 {
-	if ( gAgent.getRegion() && mVoiceEnabled )
+	LLViewerRegion *region = gAgent.getRegion();
+	
+	if ( region && mVoiceEnabled )
 	{
 		std::string url = 
-			gAgent.getRegion()->getCapability(
-				"ProvisionVoiceAccountRequest");
-
-		if ( url == "" ) return;
-
+		region->getCapability("ProvisionVoiceAccountRequest");
+		
+		if ( url.empty() ) 
+		{
+			// we've not received the capability yet, so return.
+			// the password will remain empty, so we'll remain in
+			// stateIdle
+			return;
+		}
+		
 		LLHTTPClient::post(
-			url,
-			LLSD(),
-			new LLVivoxVoiceAccountProvisionResponder(retries));
+						   url,
+						   LLSD(),
+						   new LLVivoxVoiceAccountProvisionResponder(retries));
+		
+		setState(stateConnectorStart);		
 	}
 }
 
@@ -673,7 +689,8 @@ std::string LLVivoxVoiceClient::state2string(LLVivoxVoiceClient::state inState)
 		CASE(stateVoiceFontsWait);
 		CASE(stateVoiceFontsReceived);
 		CASE(stateCreatingSessionGroup);
-		CASE(stateNoChannel);
+		CASE(stateNoChannel);		
+		CASE(stateRetrievingParcelVoiceInfo);
 		CASE(stateJoiningSession);
 		CASE(stateSessionJoined);
 		CASE(stateRunning);
@@ -741,42 +758,6 @@ void LLVivoxVoiceClient::stateMachine()
 		}
 	}
 	
-	// Check for parcel boundary crossing
-	{
-		LLViewerRegion *region = gAgent.getRegion();
-		LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
-		
-		if(region && parcel)
-		{
-			S32 parcelLocalID = parcel->getLocalID();
-			std::string regionName = region->getName();
-			std::string capURI = region->getCapability("ParcelVoiceInfoRequest");
-		
-//			LL_DEBUGS("Voice") << "Region name = \"" << regionName << "\", parcel local ID = " << parcelLocalID << ", cap URI = \"" << capURI << "\"" << LL_ENDL;
-
-			// The region name starts out empty and gets filled in later.  
-			// Also, the cap gets filled in a short time after the region cross, but a little too late for our purposes.
-			// If either is empty, wait for the next time around.
-			if(!regionName.empty())
-			{
-				if(!capURI.empty())
-				{
-					if((parcelLocalID != mCurrentParcelLocalID) || (regionName != mCurrentRegionName))
-					{
-						// We have changed parcels.  Initiate a parcel channel lookup.
-						mCurrentParcelLocalID = parcelLocalID;
-						mCurrentRegionName = regionName;
-						
-						parcelChanged();
-					}
-				}
-				else
-				{
-					LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability.  This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;
-				}
-			}
-		}
-	}
 
 	switch(getState())
 	{
@@ -1026,22 +1007,9 @@ void LLVivoxVoiceClient::stateMachine()
 			}
 			else if(!mAccountName.empty())
 			{
-				LLViewerRegion *region = gAgent.getRegion();
-				
-				if(region)
+				if ( mAccountPassword.empty() )
 				{
-					if ( region->getCapability("ProvisionVoiceAccountRequest") != "" )
-					{
-						if ( mAccountPassword.empty() )
-						{
-							requestVoiceAccountProvision();
-						}
-						setState(stateConnectorStart);
-					}
-					else
-					{
-						LL_WARNS_ONCE("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL;
-					}
+					requestVoiceAccountProvision();
 				}
 			}
 		break;
@@ -1382,11 +1350,7 @@ void LLVivoxVoiceClient::stateMachine()
 			setState(stateCreatingSessionGroup);
 			sessionGroupCreateSendMessage();
 #else
-			// Not using session groups -- skip the stateCreatingSessionGroup state.
-			setState(stateNoChannel);
-
-			// Initial kick-off of channel lookup logic
-			parcelChanged();		
+			setState(stateNoChannel);				
 #endif
 		break;
 		
@@ -1399,19 +1363,29 @@ void LLVivoxVoiceClient::stateMachine()
 			}
 			else if(!mMainSessionGroupHandle.empty())
 			{
-				setState(stateNoChannel);
-				
 				// Start looped recording (needed for "panic button" anti-griefing tool)
 				recordingLoopStart();
-
-				// Initial kick-off of channel lookup logic
-				parcelChanged();		
+				setState(stateNoChannel);	
 			}
 		break;
+			
+		//MARK: stateRetrievingParcelVoiceInfo
+		case stateRetrievingParcelVoiceInfo: 
+			// wait until parcel voice info is received.
+			if(mSessionTerminateRequested || !mVoiceEnabled)
+			{
+				// if a terminate request has been received,
+				// bail and go to the stateSessionTerminated
+				// state.  If the cap request is still pending,
+				// the responder will check to see if we've moved
+				// to a new session and won't change any state.
+				setState(stateSessionTerminated);
+			}
+			break;
+			
 					
 		//MARK: stateNoChannel
 		case stateNoChannel:
-			
 			LL_DEBUGS("Voice") << "State No Channel" << LL_ENDL;
 			mSpatialJoiningNum = 0;
 			// Do this here as well as inside sendPositionalUpdate().  
@@ -1432,6 +1406,16 @@ void LLVivoxVoiceClient::stateMachine()
 			{
 				setState(stateCaptureBufferPaused);
 			}
+			else if(checkParcelChanged() || (mNextAudioSession == NULL))
+			{
+				// the parcel is changed, or we have no pending audio sessions,
+				// so try to request the parcel voice info
+				// if we have the cap, we move to the appropriate state
+				if(requestParcelVoiceInfo())
+				{
+					setState(stateRetrievingParcelVoiceInfo);
+				}
+			}
 			else if(sessionNeedsRelog(mNextAudioSession))
 			{
 				requestRelog();
@@ -1466,32 +1450,28 @@ void LLVivoxVoiceClient::stateMachine()
 				notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINING);
 				setState(stateJoiningSession);
 			}
-			else if(!mSpatialSessionURI.empty())
-			{
-				// If we're not headed elsewhere and have a spatial URI, return to spatial.
-				switchChannel(mSpatialSessionURI, true, false, false, mSpatialSessionCredentials);
-			}
 		break;
-
+			
 		//MARK: stateJoiningSession
 		case stateJoiningSession:		// waiting for session handle
-		  
-		  // If this is true we have problem with connection to voice server (EXT-4313).
-		  // See descriptions of mSpatialJoiningNum and MAX_NORMAL_JOINING_SPATIAL_NUM.
-		  if(mSpatialJoiningNum == MAX_NORMAL_JOINING_SPATIAL_NUM) 
+			
+			// If this is true we have problem with connection to voice server (EXT-4313).
+			// See descriptions of mSpatialJoiningNum and MAX_NORMAL_JOINING_SPATIAL_NUM.
+			if(mSpatialJoiningNum == MAX_NORMAL_JOINING_SPATIAL_NUM) 
 		    {
-		      // Notify observers to let them know there is problem with voice
-		      notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED);
-		      llwarns << "There seems to be problem with connection to voice server. Disabling voice chat abilities." << llendl;
+				// Notify observers to let them know there is problem with voice
+				notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED);
+				llwarns << "There seems to be problem with connection to voice server. Disabling voice chat abilities." << llendl;
 		    }
-		  
-		  // Increase mSpatialJoiningNum only for spatial sessions- it's normal to reach this case for
-		  // example for p2p many times while waiting for response, so it can't be used to detect errors
-		  if(mAudioSession && mAudioSession->mIsSpatial)
+			
+			// Increase mSpatialJoiningNum only for spatial sessions- it's normal to reach this case for
+			// example for p2p many times while waiting for response, so it can't be used to detect errors
+			if(mAudioSession && mAudioSession->mIsSpatial)
 		    {
-		      mSpatialJoiningNum++;
+				
+				mSpatialJoiningNum++;
 		    }
-      
+			
 			// joinedAudioSession() will transition from here to stateSessionJoined.
 			if(!mVoiceEnabled)
 			{
@@ -1511,12 +1491,13 @@ void LLVivoxVoiceClient::stateMachine()
 					}
 				}
 			}
-		break;
-		
+			break;
+			
 		//MARK: stateSessionJoined
 		case stateSessionJoined:		// session handle received
 
-		  mSpatialJoiningNum = 0;
+
+			mSpatialJoiningNum = 0;
 			// It appears that I need to wait for BOTH the SessionGroup.AddSession response and the SessionStateChangeEvent with state 4
 			// before continuing from this state.  They can happen in either order, and if I don't wait for both, things can get stuck.
 			// For now, the SessionGroup.AddSession response handler sets mSessionHandle and the SessionStateChangeEvent handler transitions to stateSessionJoined.
@@ -1553,7 +1534,7 @@ void LLVivoxVoiceClient::stateMachine()
 					sessionMediaDisconnectSendMessage(mAudioSession);
 					setState(stateSessionTerminated);
 				}
-			}
+			}	
 		break;
 		
 		//MARK: stateRunning
@@ -1565,6 +1546,7 @@ void LLVivoxVoiceClient::stateMachine()
 			}
 			else
 			{
+				
 				if(!inSpatialChannel())
 				{
 					// When in a non-spatial channel, never send positional updates.
@@ -1572,8 +1554,22 @@ void LLVivoxVoiceClient::stateMachine()
 				}
 				else
 				{
+					if(checkParcelChanged())
+					{
+						// if the parcel has changed, attempted to request the
+						// cap for the parcel voice info.  If we can't request it
+						// then we don't have the cap URL so we do nothing and will
+						// recheck next time around
+						if(requestParcelVoiceInfo())
+						{
+							// we did get the cap, and we made the request,
+							// so go wait for the response.
+							setState(stateRetrievingParcelVoiceInfo);
+						}
+					}
 					// Do the calculation that enforces the listener<->speaker tether (and also updates the real camera position)
 					enforceTether();
+					
 				}
 				
 				// Do notifications for expiring Voice Fonts.
@@ -3840,7 +3836,7 @@ void LLVivoxVoiceClient::participantUpdatedEvent(
 
 					// also initialize voice moderate_mode depend on Agent's participant. See EXT-6937.
 					// *TODO: remove once a way to request the current voice channel moderation mode is implemented.
-					if (gAgentID == participant->mAvatarID)
+					if (gAgent.getID() == participant->mAvatarID)
 					{
 						speaker_manager->initVoiceModerateMode();
 					}
@@ -4073,7 +4069,7 @@ void LLVivoxVoiceClient::messageEvent(
 				}
 				
 				LL_DEBUGS("Voice") << "adding message, name " << session->mName << " session " << session->mIMSessionID << ", target " << session->mCallerID << LL_ENDL;
-				gIMMgr->addMessage(session->mIMSessionID,
+				LLIMMgr::getInstance()->addMessage(session->mIMSessionID,
 						session->mCallerID,
 						session->mName.c_str(),
 						message.c_str(),
@@ -4447,24 +4443,91 @@ LLVivoxVoiceClient::participantState* LLVivoxVoiceClient::findParticipantByID(co
 }
 
 
-void LLVivoxVoiceClient::parcelChanged()
+
+// Check for parcel boundary crossing
+bool LLVivoxVoiceClient::checkParcelChanged(bool update)
 {
-	if(getState() >= stateNoChannel)
+	LLViewerRegion *region = gAgent.getRegion();
+	LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+	
+	if(region && parcel)
 	{
-		// If the user is logged in, start a channel lookup.
-		LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL;
+		S32 parcelLocalID = parcel->getLocalID();
+		std::string regionName = region->getName();
+		
+		//			LL_DEBUGS("Voice") << "Region name = \"" << regionName << "\", parcel local ID = " << parcelLocalID << ", cap URI = \"" << capURI << "\"" << LL_ENDL;
+		
+		// The region name starts out empty and gets filled in later.  
+		// Also, the cap gets filled in a short time after the region cross, but a little too late for our purposes.
+		// If either is empty, wait for the next time around.
+		if(!regionName.empty())
+		{
+			if((parcelLocalID != mCurrentParcelLocalID) || (regionName != mCurrentRegionName))
+			{
+				// We have changed parcels.  Initiate a parcel channel lookup.
+				if (update)
+				{
+					mCurrentParcelLocalID = parcelLocalID;
+					mCurrentRegionName = regionName;
+				}
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
+bool LLVivoxVoiceClient::parcelVoiceInfoReceived(state requesting_state)
+{
+	// pop back to the state we were in when the parcel changed and we managed to 
+	// do the request.
+	if(getState() == stateRetrievingParcelVoiceInfo)
+	{
+		setState(requesting_state);
+		return true;
+	}
+	else
+	{
+		// we've dropped out of stateRetrievingParcelVoiceInfo
+		// before we received the cap result, due to a terminate
+		// or transition to a non-voice channel.  Don't switch channels.
+		return false;
+	}
+}
+
 
-		std::string url = gAgent.getRegion()->getCapability("ParcelVoiceInfoRequest");
+bool LLVivoxVoiceClient::requestParcelVoiceInfo()
+{
+	LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL;
+
+	// grab the cap for parcel voice info from the region.  
+	LLViewerRegion * region = gAgent.getRegion();
+	if (region == NULL)
+	{
+		return false;
+	}
+	// grab the cap.
+	std::string url = gAgent.getRegion()->getCapability("ParcelVoiceInfoRequest");
+	if (!url.empty())
+	{
+		// if we've already retrieved the cap from the region, go ahead and make the request,
+		// and return true so we can go into the state that waits for the response.
+		checkParcelChanged(true);
 		LLSD data;
+		LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL;
+		
 		LLHTTPClient::post(
-			url,
-			data,
-			new LLVivoxVoiceClientCapResponder);
+						   url,
+						   data,
+						   new LLVivoxVoiceClientCapResponder(getState()));
+		return true;
 	}
-	else
+	else 
 	{
-		// The transition to stateNoChannel needs to kick this off again.
-		LL_INFOS("Voice") << "not logged in yet, deferring" << LL_ENDL;
+		
+		// we don't have the cap yet, so return false so the caller can try again later.
+		LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest cap not yet available, deferring" << LL_ENDL;
+		return false;
 	}
 }
 
@@ -4488,6 +4551,7 @@ void LLVivoxVoiceClient::switchChannel(
 		case stateJoinSessionFailed:
 		case stateJoinSessionFailedWaiting:
 		case stateNoChannel:
+		case stateRetrievingParcelVoiceInfo:
 			// Always switch to the new URI from these states.
 			needsSwitch = true;
 		break;
@@ -4560,13 +4624,10 @@ void LLVivoxVoiceClient::switchChannel(
 			mNextAudioSession->mIsP2P = is_p2p;
 		}
 		
-		if(getState() <= stateNoChannel)
-		{
-			// We're already set up to join a channel, just needed to fill in the session URI
-		}
-		else
+		if(getState() >= stateRetrievingParcelVoiceInfo)
 		{
-			// State machine will come around and rejoin if uri/handle is not empty.
+			// If we're already in a channel, or if we're joining one, terminate
+			// so we can rejoin with the new session data.
 			sessionTerminate();
 		}
 	}
@@ -6267,13 +6328,13 @@ void LLVivoxVoiceClient::avatarNameResolved(const LLUUID &id, const std::string
 			{
 				session->mTextInvitePending = false;
 
-				// We don't need to call gIMMgr->addP2PSession() here.  The first incoming message will create the panel.				
+				// We don't need to call LLIMMgr::getInstance()->addP2PSession() here.  The first incoming message will create the panel.				
 			}
 			if(session->mVoiceInvitePending)
 			{
 				session->mVoiceInvitePending = false;
 
-				gIMMgr->inviteToSession(
+				LLIMMgr::getInstance()->inviteToSession(
 										session->mIMSessionID,
 										session->mName,
 										session->mCallerID, 
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index 471545de562cb76a3eac7818dc43b42abc931457..1142a1a49c7583a281eea990da63f136090ee030 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -380,7 +380,8 @@ class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>,
 		stateVoiceFontsWait,		// Awaiting the list of voice fonts
 		stateVoiceFontsReceived,	// List of voice fonts received
 		stateCreatingSessionGroup,	// Creating the main session group
-		stateNoChannel,				// 
+		stateNoChannel,				// Need to join a channel
+		stateRetrievingParcelVoiceInfo,    // waiting for parcel voice info request to return with spatial credentials
 		stateJoiningSession,		// waiting for session handle
 		stateSessionJoined,			// session handle received
 		stateRunning,				// in session, steady state
@@ -620,6 +621,8 @@ class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>,
 	void sessionMediaDisconnectSendMessage(sessionState *session);
 	void sessionTextDisconnectSendMessage(sessionState *session);
 
+	
+	
 	// Pokes the state machine to leave the audio session next time around.
 	void sessionTerminate();	
 	
@@ -629,6 +632,12 @@ class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>,
 	// Does the actual work to get out of the audio session
 	void leaveAudioSession();
 	
+	// notifies the voice client that we've received parcel voice info
+	bool parcelVoiceInfoReceived(state requesting_state);
+	
+	friend class LLVivoxVoiceClientCapResponder;
+	
+	
 	void lookupName(const LLUUID &id);
 	void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name);
 	void avatarNameResolved(const LLUUID &id, const std::string &name);
@@ -733,9 +742,11 @@ class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>,
 	bool mCaptureDeviceDirty;
 	bool mRenderDeviceDirty;
 	
+	
+	bool checkParcelChanged(bool update = false);
 	// This should be called when the code detects we have changed parcels.
 	// It initiates the call to the server that gets the parcel channel.
-	void parcelChanged();
+	bool requestParcelVoiceInfo();
 	
 	void switchChannel(std::string uri = std::string(), bool spatial = true, bool no_reconnect = false, bool is_p2p = false, std::string hash = "");
 	void joinSession(sessionState *session);
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index c5e2c56e4b298a8de20d4a09a0c0f525c33160de..e6da8eb89d8ec90617d1f70d354adff65008b19e 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -4495,6 +4495,11 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
 
 	S32 texture_index_channels = gGLManager.mNumTextureImageUnits-1; //always reserve one for shiny for now just for simplicity
 	
+	if (gGLManager.mGLVersion < 3.1f)
+	{
+		texture_index_channels = 1;
+	}
+
 	if (LLPipeline::sRenderDeferred && distance_sort)
 	{
 		texture_index_channels = gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels;
diff --git a/indra/newview/skins/default/xui/da/floater_settings_debug.xml b/indra/newview/skins/default/xui/da/floater_settings_debug.xml
index 016e5af378c0510372ee6c8d8596467d5801ce1e..f7eda56e4848203efb6cd4c67a7a63ed31727e5b 100644
--- a/indra/newview/skins/default/xui/da/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/da/floater_settings_debug.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="settings_debug" title="DEBUG INDSTILLINGER">
 	<radio_group name="boolean_combo">
-		<radio_item label="SANDT" name="TRUE" value="sand"/>
-		<radio_item label="FALSK" name="FALSE" value=""/>
+		<radio_item label="SANDT" name="TRUE" />
+		<radio_item label="FALSK" name="FALSE" />
 	</radio_group>
 	<color_swatch label="Farve" name="val_color_swatch"/>
 	<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/da/panel_people.xml b/indra/newview/skins/default/xui/da/panel_people.xml
index 925492b2d7d3b3077e6576ae39a2ee920be19dba..66a128cd13e7924b56795bf17905491654a8bb2f 100644
--- a/indra/newview/skins/default/xui/da/panel_people.xml
+++ b/indra/newview/skins/default/xui/da/panel_people.xml
@@ -66,16 +66,16 @@ Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap Verd
 			<layout_panel name="view_profile_btn_lp">
 				<button label="Profil" name="view_profile_btn" tool_tip="Vis billeder, grupper og anden beboer information"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="im_btn_lp">
 				<button label="IM" name="im_btn" tool_tip="Ã…ben session med privat besked (IM)"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="call_btn_lp">
 				<button label="Kald" name="call_btn" tool_tip="Opkald til denne beboer"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="share_btn_lp">
 				<button label="Del" name="share_btn" tool_tip="Del en genstand fra beholdning"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="teleport_btn_lp">
 				<button label="Teleportér" name="teleport_btn" tool_tip="Tilbyd teleport"/>
 			</layout_panel>
 		</layout_stack>
diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml
index 004792bbf531446352523b2c8e936925f1311cba..63a832a16555790e12363d895d317b51ce965282 100644
--- a/indra/newview/skins/default/xui/de/panel_people.xml
+++ b/indra/newview/skins/default/xui/de/panel_people.xml
@@ -66,16 +66,16 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte].
 			<layout_panel name="view_profile_btn_lp">
 				<button label="Profil" name="view_profile_btn" tool_tip="Bilder, Gruppen und andere Einwohner-Informationen anzeigen"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="im_btn_lp">
 				<button label="IM" name="im_btn" tool_tip="Instant Messenger öffnen"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="call_btn_lp">
 				<button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="share_btn_lp">
 				<button label="Teilen" name="share_btn" tool_tip="Inventarobjekt teilen"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="teleport_btn_lp">
 				<button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/>
 			</layout_panel>
 		</layout_stack>
diff --git a/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml
index 990193574e5f4aff2fac6462ddf1a587a74be247..fa659040eaa57c1c5e325093dcc427058ea160b3 100644
--- a/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml
+++ b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="LLScrollingPanelParamBase">
-	<slider label="[BESCHR]" name="param slider"/>
+	<slider label="[DESC]" name="param slider"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index 6e985e04769035b980ec7b80bd46225303e38833..ecd2b119c9a93dd4a9455d3662b8ce1395ac50ff 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -414,7 +414,7 @@
              right="-10"
              name="Cancel Land Sale"
              left_pad="5"
-             top_pad="-15"
+             top_pad="7"
              width="180" />
             <text
              type="string"
@@ -488,6 +488,7 @@
              width="186">
                 0
             </text>
+
             <button
              enabled="false"
              follows="left|top"
@@ -495,9 +496,20 @@
              label="Buy Land"
              layout="topleft"
              left_delta="52"
+			 top_pad="5"
              name="Buy Land..."
-             top_pad="7"
              width="130" />
+			<button
+             enabled="false"
+             follows="left|top"
+             height="23"
+             label="Linden Sale"
+             layout="topleft"
+             left="10"
+             name="Linden Sale..."
+             tool_tip="Land must be owned, set content, and not already for auction."
+             top_pad="-23"
+             width="150" />
             <button
              enabled="true"
              follows="left|top"
@@ -545,18 +557,7 @@
              layout="topleft"
              left_delta="0"
              name="Reclaim Land..."
-             top_delta="-50"
-             width="180" />
-            <button
-             enabled="false"
-             follows="left|top"
-             height="23"
-             label="Linden Sale"
-             layout="topleft"
-             left_delta="0"
-             name="Linden Sale..."
-             tool_tip="Land must be owned, set content, and not already for auction."
-             top_pad="2"
+             top_delta="-25"
              width="180" />
         </panel>
         <panel
@@ -2125,4 +2126,4 @@ Only large parcels can be listed in search.
              </panel>
         </panel>
     </tab_container>
-</floater>
+</floater>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index ec190ab656c97b261109b5b06a9dcd1be8dc72e5..89a0c4c287327eb53a2954310f9ab54f14b654f6 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -330,13 +330,13 @@
      increment="1"
      initial_value="75"
      label="Image quality"
-     label_width="100"
+     label_width="124"
      layout="topleft"
      left_delta="0"
      max_val="100"
      name="image_quality_slider"
      top_pad="5"
-     width="205" />
+     width="228" />
     <text
      type="string"
      length="1"
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 3ead67ca57f85efe27c303cc30c971a6109dbb01..a7d1aa963c7101f8c07676f1b4453de1e44f66f7 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -135,6 +135,14 @@
          name="login_panel_holder"
          width="1024"/>
 
+      <debug_view follows="all"
+                  left="0"
+                  top="0"
+                  mouse_opaque="false"
+                  height="500"
+                  name="DebugView"
+                  width="1024"/>
+
       <panel follows="all"
                     height="500"
                     left="0"
@@ -154,13 +162,6 @@
                       top="0"
                       width="1024"/>
       </panel>
-      <debug_view follows="all"
-                  left="0"
-                  top="0"
-                  mouse_opaque="false"
-                  height="500"
-                  name="DebugView"
-                  width="1024"/>
     </layout_panel>
   </layout_stack>
   <panel mouse_opaque="false"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 81046e99a0a6f0fb2a2e77970b92638c9a5cba7e..a0d0c8625ea64e967fff6d157ee39c7848ea89cc 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -232,6 +232,16 @@
              function="SideTray.PanelPeopleTab"
              parameter="nearby_panel" />
             </menu_item_call>
+        <menu_item_check
+         label="Nearby Voice"
+         name="Nearby Voice">
+            <menu_item_check.on_check
+             function="Floater.Visible"
+             parameter="voice_controls" />
+            <menu_item_check.on_click
+             function="Floater.Toggle"
+             parameter="voice_controls" />
+        </menu_item_check>
     </menu>
     <menu
      create_jump_keys="true"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
old mode 100755
new mode 100644
index 09105c1d287129f95ab51e7142c152b26336d9a0..db1cee5d0823e5323c40a8331b0b02fd83ea0448
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -3696,6 +3696,19 @@ Join me in [REGION]
     </form>
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="TooManyTeleportOffers"
+   type="alertmodal">
+You attempted to make [OFFERS] teleport offers
+which exceeds the limit of [LIMIT].
+    <tag>group</tag>
+    <tag>fail</tag>
+  <usetemplate
+     name="okbutton"
+     yestext="OK"/>
+  </notification>
+
   <notification
    icon="alertmodal.tga"
    name="OfferTeleportFromGod"
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
index 9f98019c948ad53a4d746444516041c5736d2a60..a0096adc0167614308428e3d7d2f77106410cd9e 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
@@ -14,9 +14,7 @@
      background_visible="true"
      bg_alpha_color="DkGray2"
      bg_opaque_color="DkGray2"
-     no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]."
-     no_matched_tabs_text.v_pad="10"
-     no_visible_tabs_text.value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]"
+
      follows="all"
      height="400"
      layout="topleft"
@@ -24,6 +22,13 @@
      name="outfits_accordion"
      top="0"
      width="309">
+       <no_matched_tabs_text
+         name="no_matched_outfits_msg"
+         value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]."
+         v_pad="10"/>
+       <no_visible_tabs_text
+         name="no_outfits_msg"
+         value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]"/>
     </accordion>
     <panel
      background_visible="true"
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 775805ad2e751b3517bc3fd95c5ca8c566ab3ce0..cc4522f9443711f50669c9b708e650b1f7e924bb 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -110,8 +110,9 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
            <layout_panel
              height="142"
              layout="topleft"
+             min_dim="100"
              mouse_opaque="false"
-             user_resize="false"
+             user_resize="true"
              visibility_control="NearbyListShowMap"
              width="313">
              <net_map
@@ -128,9 +129,9 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
            <layout_panel
              height="213"
              layout="topleft"
-             min_height="100"
+             min_dim="100"
              mouse_opaque="false"
-             user_resize="false"
+             user_resize="true"
              width="313">
              <avatar_list
                allow_select="true"
@@ -621,7 +622,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
 			height="23"
 			layout="bottomleft"
 			left_pad="3"
-			name="chat_btn_lp"
+			name="im_btn_lp"
 		    user_resize="false" 
 		    auto_resize="true"
 			width="41">
@@ -642,7 +643,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
 			height="23"
 			layout="bottomleft"
 			left_pad="3"
-			name="chat_btn_lp"
+			name="call_btn_lp"
 		    user_resize="false" 
 		    auto_resize="true"
 			width="52">
@@ -663,7 +664,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
 			height="23"
 			layout="bottomleft"
 			left_pad="3"
-			name="chat_btn_lp"
+			name="share_btn_lp"
 		    user_resize="false" 
 		    auto_resize="true"
 			width="66">
@@ -684,7 +685,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
 			height="23"
 			layout="bottomleft"
 			left_pad="3"
-			name="chat_btn_lp"
+			name="teleport_btn_lp"
 		    user_resize="false" 
 		    auto_resize="true"
 			width="77">
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index 1745c1e4b0e2f8b0fe862e697bfc0dcae47c743c..1f92244eb97d5c265214c85e1ccb621400faad1e 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -385,7 +385,7 @@
 		height="18"
 		image_name="Move_Walk_Off"
 		layout="topleft"
-    left_pad="170" 
+		left_pad="170" 
 		name="avatar_icon"
 		mouse_opaque="false"
 		visible="true"
@@ -496,8 +496,8 @@
     filename="panel_sound_devices.xml"
      visiblity_control="ShowDeviceSettings"
      name="device_settings_panel"
-    top="314"
-    width="345"
+    top_pad="0"
+    width="480"
     left="18"
     class="panel_voice_device_settings"/>
     </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml
index ccae7c535092dc796c89424f6ff0911a742e724b..0a20a4a96569012a13a4ad138e8bda07c91fb3bb 100644
--- a/indra/newview/skins/default/xui/en/panel_sound_devices.xml
+++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml
@@ -7,33 +7,46 @@
  layout="topleft"
  name="device_settings_panel"
  width="360">
-	<panel.string
-	  name="default_text">
-		Default
-	</panel.string>
-	<icon
-		   height="18"
-		   image_name="Microphone_On"
-		   left_delta="4"
-		   name="microphone_icon"
-		   mouse_opaque="false"
-		   top="7"
-       layout="topleft"
-		   visible="true"
-		   width="18" />
-	<text
+    <panel.string
+      name="default_text">
+        Default
+    </panel.string>
+    <icon
+     follows="left|top"
+     height="18"
+     image_name="Microphone_On"
+     left_delta="-5"
+     name="microphone_icon"
+     mouse_opaque="false"
+     top="7"
+     layout="topleft"
+     visible="true"
+     width="18" />
+    <icon
+     follows="left|top"
+     height="18"
+     image_name="Parcel_Voice_Dark"
+     layout="topleft"
+     left_pad="220" 
+     name="speaker_icon"
+     mouse_opaque="false"
+     top_delta="0"
+     visible="true"
+     width="22" />
+    <text
      type="string"
      length="1"
-      font.style="BOLD"
+     font.style="BOLD"
      follows="left|top"
      height="16"
      layout="topleft"
-     left_pad="3"
+     left_pad="-240"
+     top_delta="5"
      name="Input"
-     width="70">
-		Input
-	</text>
-	<combo_box
+     width="60">
+        Input
+    </text>
+    <combo_box
      height="23"
      control_name="VoiceInputAudioDevice"
      follows="left|top"
@@ -42,33 +55,57 @@
      max_chars="128"
      name="voice_input_device"
      top_delta="-5"
-     width="200" />
-	<text
-	  type="string"
-	  length="1"
-	  follows="left|top"
-	  height="16"
-	  layout="topleft"
-	  left_delta="-70"
-	  name="My volume label"
-	  top_pad="4"
-	  width="200">
-		My volume:
-	</text>
-	<slider_bar
-	  control_name="AudioLevelMic"
-   follows="top|right|left"
-   height="17"
-   increment="0.025"
-   initial_value="1.0"
-   layout="topleft"
-   left_delta="-6"
-   max_val="2"
-   name="mic_volume_slider"
-   tool_tip="Change the volume using this slider"
-   top_pad="-1"
-   width="220" />
-	<text
+     width="150" />
+    <text
+     font.style="BOLD"
+     type="string"
+     length="1"
+     follows="left|top"
+     height="15"
+     layout="topleft"
+     left_pad="30"
+     name="Output"
+     top_delta="5"
+     width="60">
+        Output
+    </text>
+    <combo_box
+     control_name="VoiceOutputAudioDevice"
+     height="23"
+     follows="left|top"
+     layout="topleft"
+     left_pad="0"
+     max_chars="128"
+     name="voice_output_device"
+     top_delta="-4"
+     width="150" />
+    <text
+     type="string"
+     halign="left"
+     length="1"
+     follows="left|top"
+     height="16"
+     layout="topleft"
+     left_delta="-300"
+     name="My volume label"
+     top_pad="14"
+     width="200">
+        My volume:
+    </text>
+    <slider_bar
+     control_name="AudioLevelMic"
+     follows="top|right|left"
+     height="17"
+     increment="0.025"
+     initial_value="1.0"
+     layout="topleft"
+     left_delta="95"
+     max_val="2"
+     name="mic_volume_slider"
+     tool_tip="Change the volume using this slider"
+     top_pad="-18"
+     width="110" />
+    <text
      type="string"
      text_color="EmphasisColor"
      length="1"
@@ -79,8 +116,8 @@
      name="wait_text"
      top_delta="-1"
      width="110">
-		Please wait
-	</text>
+        Please wait
+    </text>
   <locate
      follows="right|top"
      height="20"
@@ -121,35 +158,4 @@
      name="bar4"
      top_delta="0"
      width="20" />
-	<icon
-	   height="18"
-	   image_name="Parcel_Voice_Light"
-	   left="5"
-	   name="speaker_icon"
-	   mouse_opaque="false"
-	   top_pad="3"
-	   visible="true"
-	   width="22" />
-	<text
-     font.style="BOLD"
-     type="string"
-     length="1"
-     follows="left|top"
-     height="15"
-     layout="topleft"
-     left_pad="0"
-     name="Output"
-     width="70">
-		Output
-	</text>
-	<combo_box
-     control_name="VoiceOutputAudioDevice"
-     height="23"
-     follows="left|top"
-     layout="topleft"
-     left_pad="0"
-     max_chars="128"
-     name="voice_output_device"
-     top_delta="-3"
-     width="200" />
-</panel>
+</panel>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 71f48c833d9ad6c75bf22bfe4d0c88b92398cf02..143a989d321598dd435233770e441740853764aa 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2250,6 +2250,9 @@ Returns a string with the requested data about the region
 	<string name="IMMainland">mainland</string>
 	<string name="IMTeen">teen</string>
 
+    <!-- floater about land -->
+    <string name="Anyone">anyone</string>
+
 	<!-- floater region info -->
 	<!-- The following will replace variable [ALL_ESTATES] in notifications EstateAllowed*, EstateBanned*, EstateManager* -->
 	<string name="RegionInfoError">error</string>
diff --git a/indra/newview/skins/default/xui/es/floater_settings_debug.xml b/indra/newview/skins/default/xui/es/floater_settings_debug.xml
index bca1839f09ffef3b126abe7b6a820d9fe68685d6..1da2e491e1fbdb6b08dc234dcc5e42a1a38bdceb 100644
--- a/indra/newview/skins/default/xui/es/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/es/floater_settings_debug.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="settings_debug" title="CONFIGURACIONES DEL DEPURADOR">
 	<radio_group name="boolean_combo">
-		<radio_item label="VERDADERO" name="TRUE" value="verdadero"/>
-		<radio_item label="FALSO" name="FALSE" value=""/>
+		<radio_item label="VERDADERO" name="TRUE" />
+		<radio_item label="FALSO" name="FALSE" />
 	</radio_group>
 	<color_swatch label="Color" name="val_color_swatch"/>
 	<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml
index 9d29bc40bfa0adb047430487c506fc0bcb8dab21..78f18b745cabdca2ee78f6969e77e4307c0ef285 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -65,7 +65,7 @@
 	</radio_group>
 	<check_box label="Editar las partes enlazadas" name="checkbox edit linked parts"/>
 	<button label="Enlazar" name="link_btn"/>
-	<button label="Desenlazar" name="unlink_btn"/>
+	<button label="Desenlazar" name="unlink_btn" width="95"/>
 	<text name="RenderingCost" tool_tip="Muestra cuánto se calcula que cuesta renderizar este objeto">
 		þ: [COUNT]
 	</text>
diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml
index 01149e412ddcb63ea32684d84ea5152f4fb89abf..a9d38dca2502807bae6ed8b37651ad1bf088cdbd 100644
--- a/indra/newview/skins/default/xui/es/panel_people.xml
+++ b/indra/newview/skins/default/xui/es/panel_people.xml
@@ -66,16 +66,16 @@
 			<layout_panel name="view_profile_btn_lp">
 				<button label="Perfil" name="view_profile_btn" tool_tip="Mostrar imágenes, grupos y otra información del Residente"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="im_btn_lp">
 				<button label="MI" name="im_btn" tool_tip="Abrir una sesión de mensajes instantáneos"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="call_btn_lp">
 				<button label="Llamar" name="call_btn" tool_tip="Llamar a este Residente"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="share_btn_lp">
 				<button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="teleport_btn_lp">
 				<button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
 			</layout_panel>
 		</layout_stack>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml
index e6e4c132038c654f95d5be28a9cd283ae923db15..d47a6d718a688958078b3f889c057530dbf2a7ec 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml
@@ -39,6 +39,6 @@
 	<text name="floater_opacity">
 		Opacidad de la ventana:
 	</text>
-	<slider label="Activo:" name="active"/>
-	<slider label="Inactivo:" name="inactive"/>
+	<slider label="Activa:" name="active"/>
+	<slider label="Inactiva:" name="inactive"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
index fa7806a75aa7643628aacd5becefe3a661a4ca96..75d175b262b261881a3b137f4f8a16dd3cdee3fa 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
@@ -12,7 +12,7 @@
 	<slider label="Ambiental" name="Wind Volume"/>
 	<slider label="Efectos de sonido" name="SFX Volume"/>
 	<slider label="Música en streaming" name="Music Volume"/>
-	<check_box label="Activados" name="enable_music"/>
+	<check_box label="Activada" name="enable_music"/>
 	<slider label="Multimedia" name="Media Volume"/>
 	<check_box label="Activados" name="enable_media"/>
 	<slider label="Chat de voz" name="Voice Volume"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml
index 166f04b3e47ce7437342c57b6b7d4c910b6c663c..b24c340708490c1e6d7eaa6d3c4c9730e16c6b0b 100644
--- a/indra/newview/skins/default/xui/fr/panel_people.xml
+++ b/indra/newview/skins/default/xui/fr/panel_people.xml
@@ -66,16 +66,16 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife://
 			<layout_panel name="view_profile_btn_lp">
 				<button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="im_btn_lp">
 				<button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="call_btn_lp">
 				<button label="Appel" name="call_btn" tool_tip="Appeler ce résident"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="share_btn_lp">
 				<button label="Partager" name="share_btn" tool_tip="Partager un article de l&apos;inventaire"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="teleport_btn_lp">
 				<button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation"/>
 			</layout_panel>
 		</layout_stack>
diff --git a/indra/newview/skins/default/xui/it/floater_settings_debug.xml b/indra/newview/skins/default/xui/it/floater_settings_debug.xml
index aab00a26ce47a570fc005ba850b123cfcff48689..489d52d3b833f723c07650943fcfda2da0c0efe2 100644
--- a/indra/newview/skins/default/xui/it/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/it/floater_settings_debug.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="settings_debug" title="PARAMETRI DI DEBUG">
 	<radio_group name="boolean_combo">
-		<radio_item label="VERO" name="TRUE" value="vero"/>
-		<radio_item label="FALSO" name="FALSE" value=""/>
+		<radio_item label="VERO" name="TRUE" />
+		<radio_item label="FALSO" name="FALSE" />
 	</radio_group>
 	<color_swatch label="Colore" name="val_color_swatch"/>
 	<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/it/panel_people.xml b/indra/newview/skins/default/xui/it/panel_people.xml
index b24a4055f76dca969fec1b431f1e30f488489ef2..f903ae6e2c02a708e51f8bbc5ca8d5a35349b0a0 100644
--- a/indra/newview/skins/default/xui/it/panel_people.xml
+++ b/indra/newview/skins/default/xui/it/panel_people.xml
@@ -66,16 +66,16 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa
 			<layout_panel name="view_profile_btn_lp">
 				<button label="Profilo" name="view_profile_btn" tool_tip="Mostra immagine, gruppi e altre informazioni del residente"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="im_btn_lp">
 				<button label="IM" name="im_btn" tool_tip="Apri una sessione messaggio istantaneo"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="call_btn_lp">
 				<button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="share_btn_lp">
 				<button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell&apos;inventario"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="teleport_btn_lp">
 				<button label="Teleport" name="teleport_btn" tool_tip="Offri teleport"/>
 			</layout_panel>
 		</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml
index c7f71c6de093d22725a9b9a8779be028f2b8c2f4..1c90f7327eed51c75228c57a7d9594ac377363e1 100644
--- a/indra/newview/skins/default/xui/ja/panel_people.xml
+++ b/indra/newview/skins/default/xui/ja/panel_people.xml
@@ -66,16 +66,16 @@
 			<layout_panel name="view_profile_btn_lp">
 				<button label="プロフィール" name="view_profile_btn" tool_tip="写真、グループ、その他住人情報を表示"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="im_btn_lp">
 				<button label="IM" name="im_btn" tool_tip="インスタントメッセージを開きます"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="call_btn_lp">
 				<button label="コール" name="call_btn" tool_tip="この住人にコールする"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="share_btn_lp">
 				<button label="共有" name="share_btn" tool_tip="「持ち物」のアイテムを共有する"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="teleport_btn_lp">
 				<button label="テレポート" name="teleport_btn" tool_tip="テレポートを送ります"/>
 			</layout_panel>
 		</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index a6691fb7649efb061b457f860b262fd379f32362..ff22221aabaa8903c0fc15de485b4db7a56a36d0 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -3821,7 +3821,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
 		アドホックコンファレンス
 	</string>
 	<string name="conference-title-incoming">
-		[AGENT_NAME]とコンファレンスする
+		[AGENT_NAME] とコンファレンスする
 	</string>
 	<string name="inventory_item_offered-im">
 		持ち物アイテムを送りました
diff --git a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
index 7c29d52e7bbf81e9143d4d76f1388dc645d339a6..131f92d56f1010914a2239f20334f24015820aab 100644
--- a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="settings_debug" title="USTAWIENIA DEBUGOWANIA">
 	<radio_group name="boolean_combo">
-		<radio_item label="PRAWDA" name="TRUE" value="prawda"/>
-		<radio_item label="NIEPRAWDA" name="FALSE" value=""/>
+		<radio_item label="PRAWDA" name="TRUE" />
+		<radio_item label="NIEPRAWDA" name="FALSE" />
 	</radio_group>
 	<color_swatch label="Kolor" name="val_color_swatch"/>
 	<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_people.xml b/indra/newview/skins/default/xui/pl/panel_people.xml
index da9f84cb2e423b2ff3f4e880099e11ff5f23b5fe..ef52e2148b7610f3a263a2c6867e5e35843b6299 100644
--- a/indra/newview/skins/default/xui/pl/panel_people.xml
+++ b/indra/newview/skins/default/xui/pl/panel_people.xml
@@ -66,16 +66,16 @@ Chcesz spotkać ludzi? Spróbuj [secondlife:///app/worldmap Mapa Świata].
 			<layout_panel name="view_profile_btn_lp">
 				<button label="Profil" name="view_profile_btn" tool_tip="Pokaż zdjęcie, grupy i inne informacje o Rezydencie"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="im_btn_lp">
 				<button label="IM" name="im_btn" tool_tip="Otwórz wiadomości IM"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="call_btn_lp">
 				<button label="Dzwoń" name="call_btn" tool_tip="Zadzwoń do tego Rezydenta"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="share_btn_lp">
 				<button label="Udostępnij" name="share_btn" tool_tip="Udostępnij obiekt z Szafy"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="teleport_btn_lp">
 				<button label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleport"/>
 			</layout_panel>
 		</layout_stack>
diff --git a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
index c6694d13b282222f1be2dec908fdbef4525d971e..83f7b24572f4b01bde1715360cddf58af4f990ce 100644
--- a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="settings_debug" title="DEBUG SETTINGS">
 	<radio_group name="boolean_combo">
-		<radio_item label="TRUE" name="TRUE" value="verdadeiro"/>
-		<radio_item label="FALSE" name="FALSE" value=""/>
+		<radio_item label="TRUE" name="TRUE" />
+		<radio_item label="FALSE" name="FALSE" />
 	</radio_group>
 	<color_swatch label="Cor" name="val_color_swatch"/>
 	<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml
index aece30738ba21c6e7c13a703ff8a0339a1624286..f3af15b99161ec89b069fd2a7e0673652c53441b 100644
--- a/indra/newview/skins/default/xui/pt/panel_people.xml
+++ b/indra/newview/skins/default/xui/pt/panel_people.xml
@@ -66,16 +66,16 @@ Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa-
 			<layout_panel name="view_profile_btn_lp">
 				<button label="Perfil" name="view_profile_btn" tool_tip="Exibir fotografia, grupos e outras informações dos residentes"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="im_btn_lp">
 				<button label="MI" name="im_btn" tool_tip="Abrir sessão de mensagem instantânea"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="call_btn_lp">
 				<button label="Ligar" name="call_btn" tool_tip="Ligar para este residente"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="share_btn_lp">
 				<button label="Compartilhar" name="share_btn" tool_tip="Compartilhar item de inventário"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="teleport_btn_lp">
 				<button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/>
 			</layout_panel>
 		</layout_stack>
diff --git a/indra/newview/skins/default/xui/zh/panel_people.xml b/indra/newview/skins/default/xui/zh/panel_people.xml
index 8da75e334e6537494070c70d6bb87d2170e3aeec..4c6d6c76beb8bd7e309fc008c540e67740423a79 100644
--- a/indra/newview/skins/default/xui/zh/panel_people.xml
+++ b/indra/newview/skins/default/xui/zh/panel_people.xml
@@ -66,16 +66,16 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
 			<layout_panel name="view_profile_btn_lp">
 				<button label="檔案" name="view_profile_btn" tool_tip="Show picture, groups, and other Residents information"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="im_btn_lp">
 				<button label="IM" name="im_btn" tool_tip="開啟即時訊息會話"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="call_btn_lp">
 				<button label="通話" name="call_btn" tool_tip="Call this Resident"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="share_btn_lp">
 				<button label="分享" name="share_btn" tool_tip="分享一個收納區物品"/>
 			</layout_panel>
-			<layout_panel name="chat_btn_lp">
+			<layout_panel name="teleport_btn_lp">
 				<button label="瞬間傳送" name="teleport_btn" tool_tip="Offer teleport"/>
 			</layout_panel>
 		</layout_stack>
diff --git a/scripts/gpu_table_tester b/scripts/gpu_table_tester
old mode 100755
new mode 100644