diff --git a/autobuild.xml b/autobuild.xml
index e9845514557fa99b45d8a747a4396611c2b99eba..b240b13a948e9aac4bd4792c73666c61f03f496d 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -482,9 +482,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>2653c3627fd8687ff9e003425fd14834</string>
+              <string>439d92ec73f0500ba1671faad2bd8090</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/90199/821852/dullahan-1.12.3.202111032211_91.1.21_g9dd45fe_chromium-91.0.4472.114-darwin64-565428.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/104637/916643/dullahan-1.12.4.202209142017_91.1.21_g9dd45fe_chromium-91.0.4472.114-darwin64-575005.tar.bz2</string>
             </map>
             <key>name</key>
             <string>darwin64</string>
@@ -494,9 +494,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>b4003772562a5dd40bc112eec7cba5f5</string>
+              <string>2a7c01da15de77bc1fd1863327174d5e</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/90201/821871/dullahan-1.12.3.202111032221_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows-565428.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/104638/916654/dullahan-1.12.4.202209142021_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows-575005.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
@@ -506,16 +506,16 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>d9030d7a7390b3bda7de2adcc27e535a</string>
+              <string>d06bee9b2517fbb09ba1a65e6d675361</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/90200/821876/dullahan-1.12.3.202111032221_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows64-565428.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/104639/916659/dullahan-1.12.4.202209142021_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows64-575005.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows64</string>
           </map>
         </map>
         <key>version</key>
-        <string>1.12.3.202111032221_91.1.21_g9dd45fe_chromium-91.0.4472.114</string>
+        <string>1.12.4.202209142021_91.1.21_g9dd45fe_chromium-91.0.4472.114</string>
       </map>
       <key>expat</key>
       <map>
@@ -2401,9 +2401,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>6ce3cbaed968a69fb7a2cca80220874d</string>
+              <string>b583668b28fde0490e6953f10e93e4ab</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80380/758537/slvoice-4.10.0000.32327.5fc3fe7c.558436-darwin64-558436.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/98681/871545/slvoice-4.10.0000.32327.5fc3fe7c.571099-darwin64-571099.tar.bz2</string>
             </map>
             <key>name</key>
             <string>darwin64</string>
@@ -2425,9 +2425,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>2eb38c5eff4d0f18fbb89d0c30c4f0a4</string>
+              <string>6e0ed41653955afe8eeb8945776cf07b</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80382/758550/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows-558436.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/98683/871560/slvoice-4.10.0000.32327.5fc3fe7c.571099-windows-571099.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
@@ -2437,16 +2437,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>9ee8f3cbc5369c598a998c61961ed16d</string>
+              <string>c39735851fd05c194d0be09b8f9e8cb7</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80381/758551/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows64-558436.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/98682/871552/slvoice-4.10.0000.32327.5fc3fe7c.571099-windows64-571099.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows64</string>
           </map>
         </map>
         <key>version</key>
-        <string>4.10.0000.32327.5fc3fe7c.558436</string>
+        <string>4.10.0000.32327.5fc3fe7c.571099</string>
       </map>
       <key>threejs</key>
       <map>
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp
index e0ebbb76bd30770759ba12c201e4b29549aa74d0..9e897a7ce89820d6e9dce5a575d60e2053d203a5 100644
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -276,7 +276,7 @@ void LLAudioEngine::idle(F32 max_decode_time)
 		{
 			// The source is done playing, clean it up.
 			delete sourcep;
-			mAllSources.erase(iter++);
+            iter = mAllSources.erase(iter);
 			continue;
 		}
 
@@ -827,7 +827,8 @@ void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_i
 	addAudioSource(asp);
 	if (pos_global.isExactlyZero())
 	{
-		asp->setAmbient(true);
+		// For sound preview and UI
+		asp->setForcedPriority(true);
 	}
 	else
 	{
@@ -1273,7 +1274,7 @@ LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32
 	mPriority(0.f),
 	mGain(gain),
 	mSourceMuted(false),
-	mAmbient(false),
+	mForcedPriority(false),
 	mLoop(false),
 	mSyncMaster(false),
 	mSyncSlave(false),
@@ -1339,7 +1340,7 @@ void LLAudioSource::update()
 
 void LLAudioSource::updatePriority()
 {
-	if (isAmbient())
+	if (isForcedPriority())
 	{
 		mPriority = 1.f;
 	}
diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h
index b5fd4c27a19d9954ec85d47233e96eba247baa6d..e12fb970caccd953da46da2aba5e83a34ca75f35 100644
--- a/indra/llaudio/llaudioengine.h
+++ b/indra/llaudio/llaudioengine.h
@@ -266,8 +266,8 @@ class LLAudioSource
 
 	void addAudioData(LLAudioData *adp, bool set_current = TRUE);
 
-	void setAmbient(const bool ambient)						{ mAmbient = ambient; }
-	bool isAmbient() const									{ return mAmbient; }
+	void setForcedPriority(const bool ambient)						{ mForcedPriority = ambient; }
+	bool isForcedPriority() const									{ return mForcedPriority; }
 
 	void setLoop(const bool loop)							{ mLoop = loop; }
 	bool isLoop() const										{ return mLoop; }
@@ -326,7 +326,7 @@ class LLAudioSource
 	F32				mPriority;
 	F32				mGain;
 	bool			mSourceMuted;
-	bool			mAmbient;
+	bool			mForcedPriority; // ignore mute, set high priority, researved for sound preview and UI
 	bool			mLoop;
 	bool			mSyncMaster;
 	bool			mSyncSlave;
diff --git a/indra/llaudio/llaudioengine_fmodstudio.cpp b/indra/llaudio/llaudioengine_fmodstudio.cpp
index b0c87b02085b50a03bfdf61ed37b4af637483f05..e5752d3dad0962f84259f4e862e5b9ac6d7440b9 100644
--- a/indra/llaudio/llaudioengine_fmodstudio.cpp
+++ b/indra/llaudio/llaudioengine_fmodstudio.cpp
@@ -519,9 +519,9 @@ void LLAudioChannelFMODSTUDIO::update3DPosition()
         return;
     }
 
-    if (mCurrentSourcep->isAmbient())
+    if (mCurrentSourcep->isForcedPriority())
     {
-        // Ambient sound, don't need to do any positional updates.
+        // Prioritized UI and preview sounds don't need to do any positional updates.
         set3DMode(false);
     }
     else
diff --git a/indra/llaudio/llaudioengine_openal.cpp b/indra/llaudio/llaudioengine_openal.cpp
index 3bdd0302eedf16ff02d0c00b0c0c1e490e6190c3..305aa1ecb53a2f4e23832f1670993245739c372e 100644
--- a/indra/llaudio/llaudioengine_openal.cpp
+++ b/indra/llaudio/llaudioengine_openal.cpp
@@ -297,7 +297,7 @@ void LLAudioChannelOpenAL::update3DPosition()
 	{
 		return;
 	}
-	if (mCurrentSourcep->isAmbient())
+	if (mCurrentSourcep->isForcedPriority())
 	{
 		alSource3f(mALSource, AL_POSITION, 0.0, 0.0, 0.0);
 		alSource3f(mALSource, AL_VELOCITY, 0.0, 0.0, 0.0);
diff --git a/indra/llaudio/llstreamingaudio_fmodstudio.cpp b/indra/llaudio/llstreamingaudio_fmodstudio.cpp
index 1ad29a3f590d8662edeebee2ff499ea2501cb18b..85577992a64fe8b95f222cc43973509bd2ae7630 100644
--- a/indra/llaudio/llstreamingaudio_fmodstudio.cpp
+++ b/indra/llaudio/llstreamingaudio_fmodstudio.cpp
@@ -70,7 +70,11 @@ mRetryCount(0)
     // Must be larger than the usual Second Life frame stutter time.
     const U32 buffer_seconds = 10;		//sec
     const U32 estimated_bitrate = 128;	//kbit/sec
-    mSystem->setStreamBufferSize(estimated_bitrate * buffer_seconds * 128/*bytes/kbit*/, FMOD_TIMEUNIT_RAWBYTES);
+    FMOD_RESULT result = mSystem->setStreamBufferSize(estimated_bitrate * buffer_seconds * 128/*bytes/kbit*/, FMOD_TIMEUNIT_RAWBYTES);
+    if (result != FMOD_OK)
+    {
+        LL_WARNS("FMOD") << "setStreamBufferSize error: " << FMOD_ErrorString(result) << LL_ENDL;
+    }
 
     // Here's where we set the size of the network buffer and some buffering 
     // parameters.  In this case we want a network buffer of 16k, we want it 
@@ -134,7 +138,7 @@ void LLStreamingAudio_FMODSTUDIO::killDeadStreams()
         {
             LL_INFOS("FMOD") << "Closed dead stream" << LL_ENDL;
             delete streamp;
-            mDeadStreams.erase(iter++);
+            iter = mDeadStreams.erase(iter);
         }
         else
         {
@@ -404,7 +408,11 @@ FMOD::Channel *LLAudioStreamManagerFMODSTUDIO::startStream()
     if (mStreamChannel)
         return mStreamChannel;	//Already have a channel for this stream.
 
-    mSystem->playSound(mInternetStream, NULL, true, &mStreamChannel);
+    FMOD_RESULT result = mSystem->playSound(mInternetStream, NULL, true, &mStreamChannel);
+    if (result != FMOD_OK)
+    {
+        LL_WARNS("FMOD") << FMOD_ErrorString(result) << LL_ENDL;
+    }
     return mStreamChannel;
 }
 
@@ -445,16 +453,29 @@ bool LLAudioStreamManagerFMODSTUDIO::stopStream()
 FMOD_OPENSTATE LLAudioStreamManagerFMODSTUDIO::getOpenState(unsigned int* percentbuffered, bool* starving, bool* diskbusy)
 {
     FMOD_OPENSTATE state;
-    mInternetStream->getOpenState(&state, percentbuffered, starving, diskbusy);
+    FMOD_RESULT result = mInternetStream->getOpenState(&state, percentbuffered, starving, diskbusy);
+    if (result != FMOD_OK)
+    {
+        LL_WARNS("FMOD") << FMOD_ErrorString(result) << LL_ENDL;
+    }
     return state;
 }
 
 void LLStreamingAudio_FMODSTUDIO::setBufferSizes(U32 streambuffertime, U32 decodebuffertime)
 {
-    mSystem->setStreamBufferSize(streambuffertime / 1000 * 128 * 128, FMOD_TIMEUNIT_RAWBYTES);
+    FMOD_RESULT result = mSystem->setStreamBufferSize(streambuffertime / 1000 * 128 * 128, FMOD_TIMEUNIT_RAWBYTES);
+    if (result != FMOD_OK)
+    {
+        LL_WARNS("FMOD") << "setStreamBufferSize error: " << FMOD_ErrorString(result) << LL_ENDL;
+        return;
+    }
     FMOD_ADVANCEDSETTINGS settings;
     memset(&settings, 0, sizeof(settings));
     settings.cbSize = sizeof(settings);
     settings.defaultDecodeBufferSize = decodebuffertime;//ms
-    mSystem->setAdvancedSettings(&settings);
+    result = mSystem->setAdvancedSettings(&settings);
+    if (result != FMOD_OK)
+    {
+        LL_WARNS("FMOD") << "setAdvancedSettings error: " << FMOD_ErrorString(result) << LL_ENDL;
+    }
 }
diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp
index e906d81ce15229ae99aad55dd06c4bcecee4d5c6..c38614b0b427a2d0ad21c9e7e4d9dc9313d557b4 100644
--- a/indra/llcharacter/llbvhloader.cpp
+++ b/indra/llcharacter/llbvhloader.cpp
@@ -44,6 +44,14 @@ using namespace std;
 
 #define INCHES_TO_METERS 0.02540005f
 
+/// The .bvh does not have a formal spec, and different readers interpret things in their own way.
+/// In OUR usage, frame 0 is used in optimization and is not considered to be part of the animation.
+const S32 NUMBER_OF_IGNORED_FRAMES_AT_START = 1;
+/// In our usage, the last frame is used only to indicate what the penultimate frame should be interpolated towards.
+///  I.e., the animation only plays up to the start of the last frame. There is no hold or exptrapolation past that point..
+/// Thus there are two frame of the total that do not contribute to the total running time of the animation.
+const S32 NUMBER_OF_UNPLAYED_FRAMES = NUMBER_OF_IGNORED_FRAMES_AT_START + 1;
+
 const F32 POSITION_KEYFRAME_THRESHOLD_SQUARED = 0.03f * 0.03f;
 const F32 ROTATION_KEYFRAME_THRESHOLD = 0.01f;
 
@@ -865,7 +873,10 @@ ELoadStatus LLBVHLoader::loadBVHFile(const char *buffer, char* error_text, S32 &
 		return E_ST_NO_FRAME_TIME;
 	}
 
-	mDuration = (F32)mNumFrames * mFrameTime;
+	// If the user only supplies one animation frame (after the ignored reference frame 0), hold for mFrameTime.
+	// If the user supples exactly one total frame, it isn't clear if that is a pose or reference frame, and the
+	// behavior is not defined. In this case, retain historical undefined behavior.
+	mDuration = llmax((F32)(mNumFrames - NUMBER_OF_UNPLAYED_FRAMES), 1.0f) * mFrameTime;
 	if (!mLoop)
 	{
 		mLoopOutPoint = mDuration;
@@ -1355,12 +1366,13 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)
 
 		LLQuaternion::Order order = bvhStringToOrder( joint->mOrder );
 		S32 outcount = 0;
-		S32 frame = 1;
+		S32 frame = 0;
 		for (	ki = joint->mKeys.begin();
 				ki != joint->mKeys.end();
 				++ki )
 		{
-			if ((frame == 1) && joint->mRelativeRotationKey)
+
+			if ((frame == 0) && joint->mRelativeRotationKey)
 			{
 				first_frame_rot = mayaQ( ki->mRot[0], ki->mRot[1], ki->mRot[2], order);
 				
@@ -1373,7 +1385,7 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)
 				continue;
 			}
 
-			time = (F32)frame * mFrameTime;
+			time = llmax((F32)(frame - NUMBER_OF_IGNORED_FRAMES_AT_START), 0.0f) * mFrameTime; // Time elapsed before this frame starts.
 
 			if (mergeParent)
 			{
@@ -1433,12 +1445,12 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)
 			LLVector3 relPos = joint->mRelativePosition;
 			LLVector3 relKey;
 
-			frame = 1;
+			frame = 0;
 			for (	ki = joint->mKeys.begin();
 					ki != joint->mKeys.end();
 					++ki )
 			{
-				if ((frame == 1) && joint->mRelativePositionKey)
+				if ((frame == 0) && joint->mRelativePositionKey)
 				{
 					relKey.setVec(ki->mPos);
 				}
@@ -1449,7 +1461,7 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)
 					continue;
 				}
 
-				time = (F32)frame * mFrameTime;
+				time = llmax((F32)(frame - NUMBER_OF_IGNORED_FRAMES_AT_START), 0.0f) * mFrameTime; // Time elapsed before this frame starts.
 
 				LLVector3 inPos = (LLVector3(ki->mPos) - relKey) * ~first_frame_rot;// * fixup_rot;
 				LLVector3 outPos = inPos * frameRot * offsetRot;
diff --git a/indra/llcommon/llalignedarray.h b/indra/llcommon/llalignedarray.h
index b68e9e0f82d6eae65ea84c99e53776433119d6ae..da9d98c16ce0d75d0907ae706db00073db4e8433 100644
--- a/indra/llcommon/llalignedarray.h
+++ b/indra/llcommon/llalignedarray.h
@@ -116,14 +116,20 @@ void LLAlignedArray<T, alignment>::resize(U32 size)
 template <class T, U32 alignment>
 T& LLAlignedArray<T, alignment>::operator[](int idx)
 {
-	llassert(idx < mElementCount);
+	if(idx >= mElementCount || idx < 0)
+    {
+        LL_ERRS() << "Out of bounds LLAlignedArray, requested: " << (S32)idx << " size: " << mElementCount << LL_ENDL;
+    }
 	return mArray[idx];
 }
 
 template <class T, U32 alignment>
 const T& LLAlignedArray<T, alignment>::operator[](int idx) const
 {
-	llassert(idx < mElementCount);
+    if (idx >= mElementCount || idx < 0)
+    {
+        LL_ERRS() << "Out of bounds LLAlignedArray, requested: " << (S32)idx << " size: " << mElementCount << LL_ENDL;
+    }
 	return mArray[idx];
 }
 
diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp
index c2d353b0fc9b89ee44bfb43335bb4fdabf936851..14bfb98629d2e79bcd4b64a3ee0363489360e73d 100644
--- a/indra/llcommon/llcoros.cpp
+++ b/indra/llcommon/llcoros.cpp
@@ -35,6 +35,7 @@
 // STL headers
 // std headers
 #include <atomic>
+#include <stdexcept>
 // external library headers
 #include <boost/bind.hpp>
 #include <boost/fiber/fiber.hpp>
@@ -214,6 +215,22 @@ std::string LLCoros::logname()
     return data.mName.empty()? data.getKey() : data.mName;
 }
 
+void LLCoros::saveException(const std::string& name, std::exception_ptr exc)
+{
+    mExceptionQueue.emplace(name, exc);
+}
+
+void LLCoros::rethrow()
+{
+    if (! mExceptionQueue.empty())
+    {
+        ExceptionData front = mExceptionQueue.front();
+        mExceptionQueue.pop();
+        LL_WARNS("LLCoros") << "Rethrowing exception from coroutine " << front.name << LL_ENDL;
+        std::rethrow_exception(front.exception);
+    }
+}
+
 void LLCoros::setStackSize(S32 stacksize)
 {
     LL_DEBUGS("LLCoros") << "Setting coroutine stack size to " << stacksize << LL_ENDL;
@@ -302,11 +319,11 @@ U32 cpp_exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop,
     }
 }
 
-void LLCoros::winlevel(const std::string& name, const callable_t& callable)
+void LLCoros::sehHandle(const std::string& name, const LLCoros::callable_t& callable)
 {
     __try
     {
-        toplevelTryWrapper(name, callable);
+        LLCoros::toplevelTryWrapper(name, callable);
     }
     __except (cpp_exception_filter(GetExceptionCode(), GetExceptionInformation(), name))
     {
@@ -321,7 +338,6 @@ void LLCoros::winlevel(const std::string& name, const callable_t& callable)
         throw std::exception(integer_string);
     }
 }
-
 #endif
 
 void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& callable)
@@ -350,11 +366,19 @@ void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& call
     }
     catch (...)
     {
+#if LL_WINDOWS
         // Any OTHER kind of uncaught exception will cause the viewer to
-        // crash, hopefully informatively.
+        // crash, SEH handling should catch it and report to bugsplat.
         LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << name));
         // to not modify callstack
         throw;
+#else
+        // Stash any OTHER kind of uncaught exception in the rethrow() queue
+        // to be rethrown by the main fiber.
+        LL_WARNS("LLCoros") << "Capturing uncaught exception in coroutine "
+                            << name << LL_ENDL;
+        LLCoros::instance().saveException(name, std::current_exception());
+#endif
     }
 }
 
@@ -364,8 +388,9 @@ void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& call
 void LLCoros::toplevel(std::string name, callable_t callable)
 {
 #if LL_WINDOWS
-    // Can not use __try in functions that require unwinding, so use one more wrapper
-    winlevel(name, callable);
+    // Because SEH can's have unwinding, need to call a wrapper
+    // 'try' is inside SEH handling to not catch LLContinue
+    sehHandle(name, callable);
 #else
     toplevelTryWrapper(name, callable);
 #endif
diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h
index a94cfca19f88a06376ce245c63ccf6bac2b9cd91..dbff921f167eb5f69262de816911c73e7c9e3845 100644
--- a/indra/llcommon/llcoros.h
+++ b/indra/llcommon/llcoros.h
@@ -38,6 +38,8 @@
 #include "llinstancetracker.h"
 #include <boost/function.hpp>
 #include <string>
+#include <exception>
+#include <queue>
 
 // e.g. #include LLCOROS_MUTEX_HEADER
 #define LLCOROS_MUTEX_HEADER   <boost/fiber/mutex.hpp>
@@ -156,6 +158,19 @@ class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
      * LLCoros::launch()).
      */
     static std::string getName();
+    
+    /**
+     * rethrow() is called by the thread's main fiber to propagate an
+     * exception from any coroutine into the main fiber, where it can engage
+     * the normal unhandled-exception machinery, up to and including crash
+     * reporting.
+     *
+     * LLCoros maintains a queue of otherwise-uncaught exceptions from
+     * terminated coroutines. Each call to rethrow() pops the first of those
+     * and rethrows it. When the queue is empty (normal case), rethrow() is a
+     * no-op.
+     */
+    void rethrow();
 
     /**
      * This variation returns a name suitable for log messages: the explicit
@@ -292,13 +307,27 @@ class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
 
 private:
     std::string generateDistinctName(const std::string& prefix) const;
+    void toplevelTryWrapper(const std::string& name, const callable_t& callable);
 #if LL_WINDOWS
-    void winlevel(const std::string& name, const callable_t& callable);
+    void sehHandle(const std::string& name, const callable_t& callable); // calls toplevelTryWrapper
 #endif
-    void toplevelTryWrapper(const std::string& name, const callable_t& callable);
-    void toplevel(std::string name, callable_t callable);
+    void toplevel(std::string name, callable_t callable); // calls sehHandle or toplevelTryWrapper
     struct CoroData;
     static CoroData& get_CoroData(const std::string& caller);
+    void saveException(const std::string& name, std::exception_ptr exc);
+
+    struct ExceptionData
+    {
+        ExceptionData(const std::string& nm, std::exception_ptr exc):
+            name(nm),
+            exception(exc)
+        {}
+        // name of coroutine that originally threw this exception
+        std::string name;
+        // the thrown exception
+        std::exception_ptr exception;
+    };
+    std::queue<ExceptionData> mExceptionQueue;
 
     S32 mStackSize;
 
diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp
index 818df07bb2f45237f884f6632f9a770faf5d2d51..4a1a81f083875824e15358183d836321610110e1 100644
--- a/indra/llcommon/llprocessor.cpp
+++ b/indra/llcommon/llprocessor.cpp
@@ -118,7 +118,11 @@ namespace
 		eMONTIOR_MWAIT=33,
 		eCPLDebugStore=34,
 		eThermalMonitor2=35,
-		eAltivec=36
+		eAltivec=36,
+        eSSE3S_Features = 37,
+        eSSE4_1_Features = 38,
+        eSSE4_2_Features = 39,
+        eSSE4a_Features = 40,
 	};
 
 	const char* cpu_feature_names[] =
@@ -161,7 +165,11 @@ namespace
 		"CPL Qualified Debug Store",
 		"Thermal Monitor 2",
 
-		"Altivec"
+		"Altivec",
+        "SSE3S Instructions",
+        "SSE4.1 Instructions",
+        "SSE4.2 Instructions",
+        "SSE4a Instructions",
 	};
 
 	std::string intel_CPUFamilyName(int composed_family) 
@@ -250,6 +258,31 @@ class LLProcessorInfoImpl
 		return hasExtension(cpu_feature_names[eSSE2_Ext]);
 	}
 
+    bool hasSSE3() const
+    {
+        return hasExtension(cpu_feature_names[eSSE3_Features]);
+    }
+
+    bool hasSSE3S() const
+    {
+        return hasExtension(cpu_feature_names[eSSE3S_Features]);
+    }
+
+    bool hasSSE41() const
+    {
+        return hasExtension(cpu_feature_names[eSSE4_1_Features]);
+    }
+
+    bool hasSSE42() const
+    {
+        return hasExtension(cpu_feature_names[eSSE4_2_Features]);
+    }
+
+    bool hasSSE4a() const
+    {
+        return hasExtension(cpu_feature_names[eSSE4a_Features]);
+    }
+
 	bool hasAltivec() const 
 	{
 		return hasExtension("Altivec"); 
@@ -473,6 +506,12 @@ class LLProcessorInfoWindowsImpl : public LLProcessorInfoImpl
 		*((int*)(cpu_vendor+4)) = cpu_info[3];
 		*((int*)(cpu_vendor+8)) = cpu_info[2];
 		setInfo(eVendor, cpu_vendor);
+        std::string cmp_vendor(cpu_vendor);
+        bool is_amd = false;
+        if (cmp_vendor == "AuthenticAMD")
+        {
+            is_amd = true;
+        }
 
 		// Get the information associated with each valid Id
 		for(unsigned int i=0; i<=ids; ++i)
@@ -504,6 +543,7 @@ class LLProcessorInfoWindowsImpl : public LLProcessorInfoImpl
 
 				if(cpu_info[2] & 0x8)
 				{
+                    // intel specific SSE3 suplements
 					setExtension(cpu_feature_names[eMONTIOR_MWAIT]);
 				}
 				
@@ -516,7 +556,22 @@ class LLProcessorInfoWindowsImpl : public LLProcessorInfoImpl
 				{
 					setExtension(cpu_feature_names[eThermalMonitor2]);
 				}
-						
+
+                if (cpu_info[2] & 0x200)
+                {
+                    setExtension(cpu_feature_names[eSSE3S_Features]);
+                }
+
+                if (cpu_info[2] & 0x80000)
+                {
+                    setExtension(cpu_feature_names[eSSE4_1_Features]);
+                }
+
+                if (cpu_info[2] & 0x100000)
+                {
+                    setExtension(cpu_feature_names[eSSE4_2_Features]);
+                }
+
 				unsigned int feature_info = (unsigned int) cpu_info[3];
 				for(unsigned int index = 0, bit = 1; index < eSSE3_Features; ++index, bit <<= 1)
 				{
@@ -543,8 +598,17 @@ class LLProcessorInfoWindowsImpl : public LLProcessorInfoImpl
 			__cpuid(cpu_info, i);
 
 			// Interpret CPU brand string and cache information.
-			if  (i == 0x80000002)
-				memcpy(cpu_brand_string, cpu_info, sizeof(cpu_info));
+            if (i == 0x80000001)
+            {
+                if (is_amd)
+                {
+                    setExtension(cpu_feature_names[eSSE4a_Features]);
+                }
+            }
+            else if (i == 0x80000002)
+            {
+                memcpy(cpu_brand_string, cpu_info, sizeof(cpu_info));
+            }
 			else if  (i == 0x80000003)
 				memcpy(cpu_brand_string + 16, cpu_info, sizeof(cpu_info));
 			else if  (i == 0x80000004)
@@ -690,6 +754,41 @@ class LLProcessorInfoDarwinImpl : public LLProcessorInfoImpl
 		uint64_t ext_feature_info = getSysctlInt64("machdep.cpu.extfeature_bits");
 		S32 *ext_feature_infos = (S32*)(&ext_feature_info);
 		setConfig(eExtFeatureBits, ext_feature_infos[0]);
+
+
+        char cpu_features[1024];
+        len = sizeof(cpu_features);
+        memset(cpu_features, 0, len);
+        sysctlbyname("machdep.cpu.features", (void*)cpu_features, &len, NULL, 0);
+
+        std::string cpu_features_str(cpu_features);
+        cpu_features_str = " " + cpu_features_str + " ";
+
+        if (cpu_features_str.find(" SSE3 ") != std::string::npos)
+        {
+            setExtension(cpu_feature_names[eSSE3_Features]);
+        }
+
+        if (cpu_features_str.find(" SSSE3 ") != std::string::npos)
+        {
+            setExtension(cpu_feature_names[eSSE3S_Features]);
+        }
+
+        if (cpu_features_str.find(" SSE4.1 ") != std::string::npos)
+        {
+            setExtension(cpu_feature_names[eSSE4_1_Features]);
+        }
+
+        if (cpu_features_str.find(" SSE4.2 ") != std::string::npos)
+        {
+            setExtension(cpu_feature_names[eSSE4_2_Features]);
+        }
+
+        if (cpu_features_str.find(" SSE4A ") != std::string::npos)
+        {
+            // Not supposed to happen?
+            setExtension(cpu_feature_names[eSSE4a_Features]);
+        }
 	}
 };
 
@@ -800,6 +899,31 @@ class LLProcessorInfoLinuxImpl : public LLProcessorInfoImpl
 		{
 			setExtension(cpu_feature_names[eSSE2_Ext]);
 		}
+
+        if (flags.find(" pni ") != std::string::npos)
+        {
+            setExtension(cpu_feature_names[eSSE3_Features]);
+        }
+
+        if (flags.find(" ssse3 ") != std::string::npos)
+        {
+            setExtension(cpu_feature_names[eSSE3S_Features]);
+        }
+
+        if (flags.find(" sse4_1 ") != std::string::npos)
+        {
+            setExtension(cpu_feature_names[eSSE4_1_Features]);
+        }
+
+        if (flags.find(" sse4_2 ") != std::string::npos)
+        {
+            setExtension(cpu_feature_names[eSSE4_2_Features]);
+        }
+
+        if (flags.find(" sse4a ") != std::string::npos)
+        {
+            setExtension(cpu_feature_names[eSSE4a_Features]);
+        }
 	
 # endif // LL_X86
 	}
@@ -860,6 +984,11 @@ LLProcessorInfo::~LLProcessorInfo() {}
 F64MegahertzImplicit LLProcessorInfo::getCPUFrequency() const { return mImpl->getCPUFrequency(); }
 bool LLProcessorInfo::hasSSE() const { return mImpl->hasSSE(); }
 bool LLProcessorInfo::hasSSE2() const { return mImpl->hasSSE2(); }
+bool LLProcessorInfo::hasSSE3() const { return mImpl->hasSSE3(); }
+bool LLProcessorInfo::hasSSE3S() const { return mImpl->hasSSE3S(); }
+bool LLProcessorInfo::hasSSE41() const { return mImpl->hasSSE41(); }
+bool LLProcessorInfo::hasSSE42() const { return mImpl->hasSSE42(); }
+bool LLProcessorInfo::hasSSE4a() const { return mImpl->hasSSE4a(); }
 bool LLProcessorInfo::hasAltivec() const { return mImpl->hasAltivec(); }
 std::string LLProcessorInfo::getCPUFamilyName() const { return mImpl->getCPUFamilyName(); }
 std::string LLProcessorInfo::getCPUBrandName() const { return mImpl->getCPUBrandName(); }
diff --git a/indra/llcommon/llprocessor.h b/indra/llcommon/llprocessor.h
index b77eb22c3ab97bdefa13264919d6e4ec33047661..1a473ddc97d1eed6148c4f00fecf7fdfed473d1c 100644
--- a/indra/llcommon/llprocessor.h
+++ b/indra/llcommon/llprocessor.h
@@ -54,6 +54,11 @@ class LL_COMMON_API LLProcessorInfo
 	F64MegahertzImplicit getCPUFrequency() const;
 	bool hasSSE() const;
 	bool hasSSE2() const;
+    bool hasSSE3() const;
+    bool hasSSE3S() const;
+    bool hasSSE41() const;
+    bool hasSSE42() const;
+    bool hasSSE4a() const;
 	bool hasAltivec() const;
 	std::string getCPUFamilyName() const;
 	std::string getCPUBrandName() const;
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 45417bfa37f3029bd7750a3eb38c800a41a7be9b..9346f391e622f7a3d0164730f8004998f90c8653 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -597,6 +597,11 @@ LLCPUInfo::LLCPUInfo()
 	// proc.WriteInfoTextFile("procInfo.txt");
 	mHasSSE = proc.hasSSE();
 	mHasSSE2 = proc.hasSSE2();
+    mHasSSE3 = proc.hasSSE3();
+    mHasSSE3S = proc.hasSSE3S();
+    mHasSSE41 = proc.hasSSE41();
+    mHasSSE42 = proc.hasSSE42();
+    mHasSSE4a = proc.hasSSE4a();
 	mHasAltivec = proc.hasAltivec();
 	mCPUMHz = (F64)proc.getCPUFrequency();
 	mFamily = proc.getCPUFamilyName();
@@ -609,6 +614,35 @@ LLCPUInfo::LLCPUInfo()
 	}
 	mCPUString = out.str();
 	LLStringUtil::trim(mCPUString);
+
+    if (mHasSSE)
+    {
+        mSSEVersions.append("1");
+    }
+    if (mHasSSE2)
+    {
+        mSSEVersions.append("2");
+    }
+    if (mHasSSE3)
+    {
+        mSSEVersions.append("3");
+    }
+    if (mHasSSE3S)
+    {
+        mSSEVersions.append("3S");
+    }
+    if (mHasSSE41)
+    {
+        mSSEVersions.append("4.1");
+    }
+    if (mHasSSE42)
+    {
+        mSSEVersions.append("4.2");
+    }
+    if (mHasSSE4a)
+    {
+        mSSEVersions.append("4a");
+    }
 }
 
 bool LLCPUInfo::hasAltivec() const
@@ -626,6 +660,31 @@ bool LLCPUInfo::hasSSE2() const
 	return mHasSSE2;
 }
 
+bool LLCPUInfo::hasSSE3() const
+{
+    return mHasSSE3;
+}
+
+bool LLCPUInfo::hasSSE3S() const
+{
+    return mHasSSE3S;
+}
+
+bool LLCPUInfo::hasSSE41() const
+{
+    return mHasSSE41;
+}
+
+bool LLCPUInfo::hasSSE42() const
+{
+    return mHasSSE42;
+}
+
+bool LLCPUInfo::hasSSE4a() const
+{
+    return mHasSSE4a;
+}
+
 F64 LLCPUInfo::getMHz() const
 {
 	return mCPUMHz;
@@ -636,6 +695,11 @@ std::string LLCPUInfo::getCPUString() const
 	return mCPUString;
 }
 
+const LLSD& LLCPUInfo::getSSEVersions() const
+{
+    return mSSEVersions;
+}
+
 void LLCPUInfo::stream(std::ostream& s) const
 {
 	// gather machine information.
@@ -645,6 +709,11 @@ void LLCPUInfo::stream(std::ostream& s) const
 	// CPU's attributes regardless of platform
 	s << "->mHasSSE:     " << (U32)mHasSSE << std::endl;
 	s << "->mHasSSE2:    " << (U32)mHasSSE2 << std::endl;
+    s << "->mHasSSE3:    " << (U32)mHasSSE3 << std::endl;
+    s << "->mHasSSE3S:    " << (U32)mHasSSE3S << std::endl;
+    s << "->mHasSSE41:    " << (U32)mHasSSE41 << std::endl;
+    s << "->mHasSSE42:    " << (U32)mHasSSE42 << std::endl;
+    s << "->mHasSSE4a:    " << (U32)mHasSSE4a << std::endl;
 	s << "->mHasAltivec: " << (U32)mHasAltivec << std::endl;
 	s << "->mCPUMHz:     " << mCPUMHz << std::endl;
 	s << "->mCPUString:  " << mCPUString << std::endl;
diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h
index 538e61c5216243ebba82a3a29552f392dcb89a93..0f768938cbe60ab01850753e265948bace5eee6f 100644
--- a/indra/llcommon/llsys.h
+++ b/indra/llcommon/llsys.h
@@ -80,10 +80,16 @@ class LL_COMMON_API LLCPUInfo
 	void stream(std::ostream& s) const;
 
 	std::string getCPUString() const;
+	const LLSD& getSSEVersions() const;
 
 	bool hasAltivec() const;
 	bool hasSSE() const;
 	bool hasSSE2() const;
+    bool hasSSE3() const;
+    bool hasSSE3S() const;
+    bool hasSSE41() const;
+    bool hasSSE42() const;
+    bool hasSSE4a() const;
 	F64 getMHz() const;
 
 	// Family is "AMD Duron" or "Intel Pentium Pro"
@@ -92,10 +98,16 @@ class LL_COMMON_API LLCPUInfo
 private:
 	bool mHasSSE;
 	bool mHasSSE2;
+    bool mHasSSE3;
+    bool mHasSSE3S;
+    bool mHasSSE41;
+    bool mHasSSE42;
+    bool mHasSSE4a;
 	bool mHasAltivec;
 	F64 mCPUMHz;
 	std::string mFamily;
 	std::string mCPUString;
+    LLSD mSSEVersions;
 };
 
 //=============================================================================
diff --git a/indra/llfilesystem/lldiskcache.cpp b/indra/llfilesystem/lldiskcache.cpp
index 538446d732114b7511bcb744f14bd67163cbada1..022d206821a9b23d757656a9523414553958eaf2 100644
--- a/indra/llfilesystem/lldiskcache.cpp
+++ b/indra/llfilesystem/lldiskcache.cpp
@@ -355,6 +355,38 @@ void LLDiskCache::clearCache()
     }
 }
 
+void LLDiskCache::removeOldVFSFiles()
+{
+    //VFS files won't be created, so consider removing this code later
+    static const char CACHE_FORMAT[] = "inv.llsd";
+    static const char DB_FORMAT[] = "db2.x";
+
+    boost::system::error_code ec;
+#if LL_WINDOWS
+    std::wstring cache_path(utf8str_to_utf16str(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "")));
+#else
+    std::string cache_path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""));
+#endif
+    if (boost::filesystem::is_directory(cache_path, ec) && !ec.failed())
+    {
+        for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(cache_path, ec), {}))
+        {
+            if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed())
+            {
+                if ((entry.path().string().find(CACHE_FORMAT) != std::string::npos) ||
+                    (entry.path().string().find(DB_FORMAT) != std::string::npos))
+                {
+                    boost::filesystem::remove(entry, ec);
+                    if (ec.failed())
+                    {
+                        LL_WARNS() << "Failed to delete cache file " << entry << ": " << ec.message() << LL_ENDL;
+                    }
+                }
+            }
+        }
+    }
+}
+
 uintmax_t LLDiskCache::dirFileSize(const std::string dir)
 {
     uintmax_t total_file_size = 0;
diff --git a/indra/llfilesystem/lldiskcache.h b/indra/llfilesystem/lldiskcache.h
index 1cbd2c58aa60efc1dcd3b959bd7abe72643b1b4b..b60e74f8c9b9f7fab235e79cad5e53f6e1f17d1b 100644
--- a/indra/llfilesystem/lldiskcache.h
+++ b/indra/llfilesystem/lldiskcache.h
@@ -140,6 +140,8 @@ class LLDiskCache :
          */
         const std::string getCacheInfo();
 
+        void removeOldVFSFiles();
+
     private:
         /**
          * Utility function to gather the total size the files in a given
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index e25dae8a90113d4b70e17ae8acd320eaf8cdc4dc..134e7830531277e622af3c815f80631b6ccfcf87 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -234,6 +234,8 @@ void LLParcel::init(const LLUUID &owner_id,
 
     setRegionAllowEnvironmentOverride(FALSE);
     setParcelEnvironmentVersion(INVALID_PARCEL_ENVIRONMENT_VERSION);
+
+    setObscureMOAP(false);
 }
 
 void LLParcel::overrideOwner(const LLUUID& owner_id, BOOL is_group_owned)
@@ -540,6 +542,7 @@ void LLParcel::packMessage(LLSD& msg)
 	msg["see_avs"] = (LLSD::Boolean) getSeeAVs();
 	msg["group_av_sounds"] = (LLSD::Boolean) getAllowGroupAVSounds();
 	msg["any_av_sounds"] = (LLSD::Boolean) getAllowAnyAVSounds();
+    msg["obscure_moap"] = (LLSD::Boolean) getObscureMOAP();
 }
 
 
diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h
index 5d08c1f4c69a24249fbb7c20290ffe3cc820f98b..f5ee1241ab9697e7c6fab929fd7ff9c960257cd5 100644
--- a/indra/llinventory/llparcel.h
+++ b/indra/llinventory/llparcel.h
@@ -306,6 +306,7 @@ class LLParcel
 	void	setRestrictPushObject(BOOL b) { setParcelFlag(PF_RESTRICT_PUSHOBJECT, b); }
 	void	setAllowGroupAVSounds(BOOL b)	{ mAllowGroupAVSounds = b;		}
 	void	setAllowAnyAVSounds(BOOL b)		{ mAllowAnyAVSounds = b;		}
+    void    setObscureMOAP(bool b)  { mObscureMOAP = b; }
 
 	void	setDrawDistance(F32 dist)	{ mDrawDistance = dist; }
 	void	setSalePrice(S32 price)		{ mSalePrice = price; }
@@ -517,6 +518,8 @@ class LLParcel
 
 	BOOL	getAllowGroupAVSounds()	const	{ return mAllowGroupAVSounds;	} 
 	BOOL	getAllowAnyAVSounds()	const	{ return mAllowAnyAVSounds;		}
+ 
+    bool    getObscureMOAP() const { return mObscureMOAP; }
 
 	F32		getDrawDistance() const			{ return mDrawDistance; }
 	S32		getSalePrice() const			{ return mSalePrice; }
@@ -670,6 +673,7 @@ class LLParcel
     BOOL                mRegionAllowEnvironmentOverride;
 	BOOL				mAllowGroupAVSounds;
 	BOOL				mAllowAnyAVSounds;
+    bool                mObscureMOAP;
     S32                 mCurrentEnvironmentVersion;
 	
     bool                mIsDefaultDayCycle;
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 559d790d774e5b09e5cf63dc1b02f823a5d87f76..454969b912c626a1155f4aff1810a7ea3c2f0518 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -690,7 +690,7 @@ LLProfile::Face* LLProfile::addHole(const LLProfileParams& params, BOOL flat, F3
 
 	Face *face = addFace(mTotalOut, mTotal-mTotalOut,0,LL_FACE_INNER_SIDE, flat);
 
-	static LLAlignedArray<LLVector4a,64> pt;
+	static thread_local LLAlignedArray<LLVector4a,64> pt;
 	pt.resize(mTotal) ;
 
 	for (S32 i=mTotalOut;i<mTotal;i++)
@@ -6703,13 +6703,19 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
 			else
 			{
 				// Get s value for tex-coord.
-				if (!flat)
+                S32 index = mBeginS + s;
+                if (index >= profile.size())
+                {
+                    // edge?
+                    ss = flat ? 1.f - begin_stex : 1.f;
+                }
+				else if (!flat)
 				{
-					ss = profile[mBeginS + s][2];
+					ss = profile[index][2];
 				}
 				else
 				{
-					ss = profile[mBeginS + s][2] - begin_stex;
+					ss = profile[index][2] - begin_stex;
 				}
 			}
 
@@ -6895,7 +6901,7 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
 
 	LLVector4a* norm = mNormals;
 
-	static LLAlignedArray<LLVector4a, 64> triangle_normals;
+    static thread_local LLAlignedArray<LLVector4a, 64> triangle_normals;
     try
     {
         triangle_normals.resize(count);
diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp
index ae066112c1162344d2f950164934133e6b7aa36a..33a0b6abdb22e092da9848324bd7466a2425e780 100644
--- a/indra/llmessage/llavatarnamecache.cpp
+++ b/indra/llmessage/llavatarnamecache.cpp
@@ -194,6 +194,10 @@ void LLAvatarNameCache::requestAvatarNameCache_(std::string url, std::vector<LLU
             LLAvatarNameCache::getInstance()->handleAvNameCacheSuccess(results, httpResults);
         }
     }
+    catch (const LLCoros::Stop&)
+    {
+        LL_DEBUGS("AvNameCache") << "Received a shutdown exception" << LL_ENDL;
+    }
     catch (...)
     {
         LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << LLCoros::getName()
diff --git a/indra/llmessage/llcoproceduremanager.h b/indra/llmessage/llcoproceduremanager.h
index 2d460826ffb5d7894d4ad3b2f70d3427a6d20671..c5bc37dd0eab6973d1ddf871c70137d5f35ad6c3 100644
--- a/indra/llmessage/llcoproceduremanager.h
+++ b/indra/llmessage/llcoproceduremanager.h
@@ -32,7 +32,6 @@
 #include "llcoros.h"
 #include "llcorehttputil.h"
 #include "lluuid.h"
-#include <boost/smart_ptr/shared_ptr.hpp>
 
 class LLCoprocedurePool;
 
@@ -84,7 +83,7 @@ class LLCoprocedureManager : public LLSingleton < LLCoprocedureManager >
     
 private:
 
-    typedef boost::shared_ptr<LLCoprocedurePool> poolPtr_t;
+    typedef std::shared_ptr<LLCoprocedurePool> poolPtr_t;
     typedef std::map<std::string, poolPtr_t> poolMap_t;
 
     poolMap_t mPoolMap;
diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp
index 219b1855d213de990c4009bb0a7db5d77edc3cae..35dcbe383682fbd9c3249234a06d0689339444c2 100644
--- a/indra/llmessage/message_prehash.cpp
+++ b/indra/llmessage/message_prehash.cpp
@@ -1386,6 +1386,7 @@ char const* const _PREHASH_RegionAllowAccessBlock = LLMessageStringTable::getIns
 char const* const _PREHASH_RegionAllowAccessOverride = LLMessageStringTable::getInstance()->getString("RegionAllowAccessOverride");
 char const* const _PREHASH_ParcelEnvironmentBlock = LLMessageStringTable::getInstance()->getString("ParcelEnvironmentBlock");
 char const* const _PREHASH_ParcelEnvironmentVersion = LLMessageStringTable::getInstance()->getString("ParcelEnvironmentVersion");
+char const* const _PREHASH_ParcelExtendedFlags = LLMessageStringTable::getInstance()->getString("ParcelExtendedFlags");
 char const* const _PREHASH_RegionAllowEnvironmentOverride = LLMessageStringTable::getInstance()->getString("RegionAllowEnvironmentOverride");
 char const* const _PREHASH_UCoord = LLMessageStringTable::getInstance()->getString("UCoord");
 char const* const _PREHASH_VCoord = LLMessageStringTable::getInstance()->getString("VCoord");
diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h
index 8f6ee5a32790d3b72f16d12834e7c5f40039ad10..3015f438b5e98a47e100f316b21bf9458b635051 100644
--- a/indra/llmessage/message_prehash.h
+++ b/indra/llmessage/message_prehash.h
@@ -1386,6 +1386,7 @@ extern char const* const _PREHASH_RegionAllowAccessBlock;
 extern char const* const _PREHASH_RegionAllowAccessOverride;
 extern char const* const _PREHASH_ParcelEnvironmentBlock;
 extern char const* const _PREHASH_ParcelEnvironmentVersion;
+extern char const* const _PREHASH_ParcelExtendedFlags;
 extern char const* const _PREHASH_RegionAllowEnvironmentOverride;
 extern char const* const _PREHASH_UCoord;
 extern char const* const _PREHASH_VCoord;
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 6f88232c1dcdd2c8c55c65574bdf83cc7872b935..3e72710366c3f60ac36cfc6776d43c4c9f089900 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -1549,6 +1549,7 @@ void LLPluginClassMedia::seek(float time)
 	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "seek");
 
 	message.setValueReal("time", time);
+    mCurrentTime = time; // assume that it worked and we will receive an update later
 
 	sendMessage(message);
 }
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index eef22156bc3c5044eb130f185677228e37a04f51..1fbbad06d478ca19d9cd7d27150bcba76bb0bf83 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -999,7 +999,7 @@ void LLPluginProcessParent::poll(F64 timeout)
     while (itClean != sInstances.end())
     {
         if ((*itClean).second->isDone())
-            sInstances.erase(itClean++);
+            itClean = sInstances.erase(itClean);
         else
             ++itClean;
     }
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index eff47d9d9817841bbcfc82404d2a28072c010550..a6492f43d462c83cef25c5eb532797c28ac73113 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -886,7 +886,7 @@ LLSD LLModel::writeModel(
 					{
 						LLVector3 pos(face.mPositions[j].getF32ptr());
 
-						weight_list& weights = high->getJointInfluences(pos);
+						weight_list& weights = model[idx]->getJointInfluences(pos);
 
 						S32 count = 0;
 						for (weight_list::iterator iter = weights.begin(); iter != weights.end(); ++iter)
@@ -1596,6 +1596,25 @@ void LLMeshSkinInfo::updateHash()
     mHash = digest[0];
 }
 
+U32 LLMeshSkinInfo::sizeBytes() const
+{
+    U32 res = sizeof(LLUUID); // mMeshID
+
+    res += sizeof(std::vector<std::string>) + sizeof(std::string) * mJointNames.size();
+    for (U32 i = 0; i < mJointNames.size(); ++i)
+    {
+        res += mJointNames[i].size(); // actual size, not capacity
+    }
+
+    res += sizeof(std::vector<S32>) + sizeof(S32) * mJointNums.size();
+    res += sizeof(std::vector<LLMatrix4>) + 16 * sizeof(float) * mInvBindMatrix.size();
+    res += sizeof(std::vector<LLMatrix4>) + 16 * sizeof(float) * mAlternateBindMatrix.size();
+    res += 16 * sizeof(float); //mBindShapeMatrix
+    res += sizeof(float) + 3 * sizeof(bool);
+
+    return res;
+}
+
 LLModel::Decomposition::Decomposition(LLSD& data)
 {
 	fromLLSD(data);
@@ -1702,6 +1721,30 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp)
 	}
 }
 
+U32 LLModel::Decomposition::sizeBytes() const
+{
+    U32 res = sizeof(LLUUID); // mMeshID
+
+    res += sizeof(LLModel::convex_hull_decomposition) + sizeof(std::vector<LLVector3>) * mHull.size();
+    for (U32 i = 0; i < mHull.size(); ++i)
+    {
+        res += mHull[i].size() * sizeof(LLVector3);
+    }
+
+    res += sizeof(LLModel::hull) + sizeof(LLVector3) * mBaseHull.size();
+
+    res += sizeof(std::vector<LLModel::PhysicsMesh>) + sizeof(std::vector<LLModel::PhysicsMesh>) * mMesh.size();
+    for (U32 i = 0; i < mMesh.size(); ++i)
+    {
+        res += mMesh[i].sizeBytes();
+    }
+
+    res += sizeof(std::vector<LLModel::PhysicsMesh>) * 2;
+    res += mBaseHullMesh.sizeBytes() + mPhysicsShapeMesh.sizeBytes();
+
+    return res;
+}
+
 bool LLModel::Decomposition::hasHullList() const
 {
 	return !mHull.empty() ;
diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h
index 354ceb26b7e831361eb7467cbd80795ac683588f..a6ab96ab18400dcfd57c02064a1bc1eb6bbbdcdf 100644
--- a/indra/llprimitive/llmodel.h
+++ b/indra/llprimitive/llmodel.h
@@ -50,6 +50,7 @@ class LLMeshSkinInfo
 	void fromLLSD(LLSD& data);
 	LLSD asLLSD(bool include_joints, bool lock_scale_if_joint_position) const;
     void updateHash();
+    U32 sizeBytes() const;
 
 	LLUUID mMeshID;
 	std::vector<std::string> mJointNames;
@@ -112,6 +113,14 @@ class LLModel : public LLVolume
 		{
 			return mPositions.empty();
 		}
+
+        U32 sizeBytes() const
+        {
+            U32 res = sizeof(std::vector<LLVector3>) * 2;
+            res += sizeof(LLVector3) * mPositions.size();
+            res += sizeof(LLVector3) * mNormals.size();
+            return res;
+        }
 	};
 
 	class Decomposition
@@ -122,6 +131,7 @@ class LLModel : public LLVolume
 		void fromLLSD(LLSD& data);
 		LLSD asLLSD() const;
 		bool hasHullList() const;
+        U32 sizeBytes() const;
 
 		void merge(const Decomposition* rhs);
 
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index 6eb7da302f8a7714c62a81eba224cf5600073a69..01bd4aba26658946db7094b7f36f04253e11ab72 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -1284,7 +1284,12 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt
             if (pixels != nullptr)
             {
                 use_scratch = true;
-                scratch = new U32[width * height];
+                scratch = new(std::nothrow) U32[width * height];
+                if (!scratch)
+                {
+                    LL_ERRS() << "Failed to allocate " << (U32)(width * height * sizeof(U32))
+                              << " bytes for a manual image W" << width << " H" << height << LL_ENDL;
+                }
 
                 U32 pixel_count = (U32)(width * height);
                 for (U32 i = 0; i < pixel_count; i++)
@@ -1304,7 +1309,12 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt
             if (pixels != nullptr)
             {
                 use_scratch = true;
-                scratch = new U32[width * height];
+                scratch = new(std::nothrow) U32[width * height];
+                if (!scratch)
+                {
+                    LL_ERRS() << "Failed to allocate " << (U32)(width * height * sizeof(U32))
+                        << " bytes for a manual image W" << width << " H" << height << LL_ENDL;
+                }
 
                 U32 pixel_count = (U32)(width * height);
                 for (U32 i = 0; i < pixel_count; i++)
@@ -1327,7 +1337,12 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt
             if (pixels != nullptr)
             {
                 use_scratch = true;
-                scratch = new U32[width * height];
+                scratch = new(std::nothrow) U32[width * height];
+                if (!scratch)
+                {
+                    LL_ERRS() << "Failed to allocate " << (U32)(width * height * sizeof(U32))
+                        << " bytes for a manual image W" << width << " H" << height << LL_ENDL;
+                }
 
                 U32 pixel_count = (U32)(width * height);
                 for (U32 i = 0; i < pixel_count; i++)
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index c6a3ada777ccb63316f2c3c3f124c061e85311a8..d413fab2700206e3a24c6f36f7bcfee1c30c9bae 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -762,17 +762,13 @@ void LLFloater::closeFloater(bool app_quitting)
 		for(handle_set_iter_t dependent_it = mDependents.begin();
 			dependent_it != mDependents.end(); )
 		{
-			
 			LLFloater* floaterp = dependent_it->get();
-			if (floaterp)
-			{
-				++dependent_it;
-				floaterp->closeFloater(app_quitting);
-			}
-			else
-			{
-				mDependents.erase(dependent_it++);
-			}
+            dependent_it = mDependents.erase(dependent_it);
+            if (floaterp)
+            {
+                floaterp->mDependeeHandle = LLHandle<LLFloater>();
+                floaterp->closeFloater(app_quitting);
+            }
 		}
 		
 		cleanupHandles();
@@ -1443,7 +1439,7 @@ void LLFloater::cleanupHandles()
 		LLFloater* floaterp = dependent_it->get();
 		if (!floaterp)
 		{
-			mDependents.erase(dependent_it++);
+            dependent_it = mDependents.erase(dependent_it);
 		}
 		else
 		{
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 8f00d1274e0005988eb3f1246db634187dbd41c1..4264028338d6d40c3c17feceef38ecf5e016a7aa 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -3960,8 +3960,8 @@ void LLTearOffMenu::draw()
 	{
 		// animate towards target height
         reshape(getRect().getWidth(), llceil(lerp((F32)getRect().getHeight(), (F32)mTargetHeight, LLSmoothInterpolation::getInterpolant(0.05f))));
-        mMenu->needsArrange();
 	}
+	mMenu->needsArrange();
 	LLFloater::draw();
 }
 
diff --git a/indra/llui/llmodaldialog.cpp b/indra/llui/llmodaldialog.cpp
index 5cfa8ea9738cbe7ac36678a57fd8edbca6946685..3e5978eb592cc4d67f03432bde3a5d51625b8cc4 100644
--- a/indra/llui/llmodaldialog.cpp
+++ b/indra/llui/llmodaldialog.cpp
@@ -100,7 +100,10 @@ void LLModalDialog::onOpen(const LLSD& key)
 		if (!sModalStack.empty())
 		{
 			LLModalDialog* front = sModalStack.front();
-			front->setVisible(FALSE);
+            if (front != this)
+            {
+                front->setVisible(FALSE);
+            }
 		}
 	
 		// This is a modal dialog.  It sucks up all mouse and keyboard operations.
@@ -108,7 +111,14 @@ void LLModalDialog::onOpen(const LLSD& key)
 		LLUI::getInstance()->addPopup(this);
 		setFocus(TRUE);
 
-		sModalStack.push_front( this );
+        std::list<LLModalDialog*>::iterator iter = std::find(sModalStack.begin(), sModalStack.end(), this);
+        if (iter != sModalStack.end())
+        {
+            // if already present, we want to move it to front.
+            sModalStack.erase(iter);
+        }
+
+        sModalStack.push_front(this);
 	}
 }
 
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 11b0eb9f806d809ada95a0cdd53daf03a812b548..65c7b420ce725871710844a681ee63ebc8e4c19f 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -1388,6 +1388,84 @@ BOOL LLScrollListCtrl::selectItemByPrefix(const LLWString& target, BOOL case_sen
 	return found;
 }
 
+U32 LLScrollListCtrl::searchItems(const std::string& substring, bool case_sensitive, bool focus)
+{
+    return searchItems(utf8str_to_wstring(substring), case_sensitive, focus);
+}
+
+U32 LLScrollListCtrl::searchItems(const LLWString& substring, bool case_sensitive, bool focus)
+{
+    U32 found = 0;
+
+    LLWString substring_trimmed(substring);
+    S32 len = substring_trimmed.size();
+
+    if (0 == len)
+    {
+        // at the moment search for empty element is not supported
+        return 0;
+    }
+    else
+    {
+        deselectAllItems(TRUE);
+        if (!case_sensitive)
+        {
+            // do comparisons in lower case
+            LLWStringUtil::toLower(substring_trimmed);
+        }
+
+        for (item_list::iterator iter = mItemList.begin(); iter != mItemList.end(); iter++)
+        {
+            LLScrollListItem* item = *iter;
+            // Only select enabled items with matching names
+            if (!item->getEnabled())
+            {
+                continue;
+            }
+            LLScrollListCell* cellp = item->getColumn(getSearchColumn());
+            if (!cellp)
+            {
+                continue;
+            }
+            LLWString item_label = utf8str_to_wstring(cellp->getValue().asString());
+            if (!case_sensitive)
+            {
+                LLWStringUtil::toLower(item_label);
+            }
+            // remove extraneous whitespace from searchable label
+            LLWStringUtil::trim(item_label);
+
+            size_t found_iter = item_label.find(substring_trimmed);
+
+            if (found_iter != std::string::npos)
+            {
+                // find offset of matching text
+                cellp->highlightText(found_iter, substring_trimmed.size());
+                selectItem(item, -1, FALSE);
+
+                found++;
+
+                if (!mAllowMultipleSelection)
+                {
+                    break;
+                }
+            }
+        }
+    }
+
+    if (focus && found != 0)
+    {
+        mNeedsScroll = true;
+    }
+
+    if (mCommitOnSelectionChange)
+    {
+        commitIfChanged();
+    }
+
+    return found;
+}
+
 const std::string LLScrollListCtrl::getSelectedItemLabel(S32 column) const
 {
 	LLScrollListItem* item;
@@ -1912,6 +1990,7 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
 			registrar.add("Url.SendIM", boost::bind(&LLScrollListCtrl::sendIM, id));
 			registrar.add("Url.AddFriend", boost::bind(&LLScrollListCtrl::addFriend, id));
 			registrar.add("Url.RemoveFriend", boost::bind(&LLScrollListCtrl::removeFriend, id));
+            registrar.add("Url.ReportAbuse", boost::bind(&LLScrollListCtrl::reportAbuse, id, is_group));
 			registrar.add("Url.Execute", boost::bind(&LLScrollListCtrl::showNameDetails, id, is_group));
 			registrar.add("Url.CopyLabel", boost::bind(&LLScrollListCtrl::copyNameToClipboard, id, is_group));
 			registrar.add("Url.CopyUrl", boost::bind(&LLScrollListCtrl::copySLURLToClipboard, id, is_group));
@@ -1975,6 +2054,15 @@ void LLScrollListCtrl::removeFriend(std::string id)
 	LLUrlAction::removeFriend(slurl);
 }
 
+void LLScrollListCtrl::reportAbuse(std::string id, bool is_group)
+{
+    if (!is_group)
+    {
+        std::string slurl = "secondlife:///app/agent/" + id + "/about";
+        LLUrlAction::reportAbuse(slurl);
+    }
+}
+
 void LLScrollListCtrl::showNameDetails(std::string id, bool is_group)
 {
 	// open the resident's details or the group details
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 08134bbfc83afc69538aeb339be8596b2a9d9d7c..77d10fdec7239b2ee3299642cec3f5f3cc176cb4 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -267,6 +267,14 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
 	const std::string	getSelectedItemLabel(S32 column = 0) const;
 	LLSD			getSelectedValue();
 
+    // If multi select is on, select all element that include substring,
+    // otherwise select first match only.
+    // If focus is true will scroll to selection.
+    // Returns number of results.
+    // Note: at the moment search happens in one go and is expensive
+    U32			searchItems(const std::string& substring, bool case_sensitive = false, bool focus = true);
+    U32			searchItems(const LLWString& substring, bool case_sensitive = false, bool focus = true);
+
 	// DEPRECATED: Use LLSD versions of setCommentText() and getSelectedValue().
 	// "StringUUID" interface: use this when you're creating a list that contains non-unique strings each of which
 	// has an associated, unique UUID, and only one of which can be selected at a time.
@@ -325,6 +333,7 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
 	// support right-click context menus for avatar/group lists
 	enum ContextMenuType { MENU_NONE, MENU_AVATAR, MENU_GROUP };
 	void setContextMenu(const ContextMenuType &menu) { mContextMenuType = menu; }
+    ContextMenuType getContextMenuType() { return mContextMenuType; }
 
 	// Overridden from LLView
 	/*virtual*/ void    draw();
@@ -460,6 +469,7 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
 	static void		sendIM(std::string id);
 	static void		addFriend(std::string id);
 	static void		removeFriend(std::string id);
+    static void		reportAbuse(std::string id, bool is_group);
 	static void		showNameDetails(std::string id, bool is_group);
 	static void		copyNameToClipboard(std::string id, bool is_group);
 	static void		copySLURLToClipboard(std::string id, bool is_group);
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index c4a529e4ad011b1e1a7c5d59f3d865b4eb43ea3e..7e4aaa53bff730fa595b1a6f49ec3e93e61b2532 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -2049,6 +2049,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
 	registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));
 	registrar.add("Url.AddFriend", boost::bind(&LLUrlAction::addFriend, url));
 	registrar.add("Url.RemoveFriend", boost::bind(&LLUrlAction::removeFriend, url));
+    registrar.add("Url.ReportAbuse", boost::bind(&LLUrlAction::reportAbuse, url));
 	registrar.add("Url.SendIM", boost::bind(&LLUrlAction::sendIM, url));
 	registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url));
 	registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url));
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index 26702b2412b8fdf4b2d81b01bb40f2f618b9b814..1a10d2fd1ee206167f843651b4c3e657a5206451 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -196,6 +196,7 @@ class LLTextEditor :
 	const LLUUID&	getSourceID() const						{ return mSourceID; }
 
 	const LLTextSegmentPtr	getPreviousSegment() const;
+    const LLTextSegmentPtr	getLastSegment() const;
 	void			getSelectedSegments(segment_vec_t& segments) const;
 
 	void			setShowContextMenu(bool show) { mShowContextMenu = show; }
diff --git a/indra/llui/lltextutil.cpp b/indra/llui/lltextutil.cpp
index 538508b856d98dcd29c7b8288d83f9935a117665..78049319bc2df252e96db2ac5ac7538100a28edf 100644
--- a/indra/llui/lltextutil.cpp
+++ b/indra/llui/lltextutil.cpp
@@ -76,22 +76,6 @@ void LLTextUtil::textboxSetGreyedVal(LLTextBox *txtbox, const LLStyle::Params& n
     txtbox->appendText(text.substr(greyed_begin + greyed_len),  false, normal_style);
 }
 
-const std::string& LLTextUtil::formatPhoneNumber(const std::string& phone_str)
-{
-	static const std::string PHONE_SEPARATOR = LLUI::getInstance()->mSettingGroups["config"]->getString("AvalinePhoneSeparator");
-	static const S32 PHONE_PART_LEN = 2;
-
-	static std::string formatted_phone_str;
-	formatted_phone_str = phone_str;
-	S32 separator_pos = (S32)(formatted_phone_str.size()) - PHONE_PART_LEN;
-	for (; separator_pos >= PHONE_PART_LEN; separator_pos -= PHONE_PART_LEN)
-	{
-		formatted_phone_str.insert(separator_pos, PHONE_SEPARATOR);
-	}
-
-	return formatted_phone_str;
-}
-
 bool LLTextUtil::processUrlMatch(LLUrlMatch* match,LLTextBase* text_base, bool is_content_trusted)
 {
 	if (match == 0 || text_base == 0)
diff --git a/indra/llui/lltextutil.h b/indra/llui/lltextutil.h
index a9c143e4450d51d979fe2863994a399911c387c5..1adc3516f7685a45021fc5bebed9abf8600d45f3 100644
--- a/indra/llui/lltextutil.h
+++ b/indra/llui/lltextutil.h
@@ -58,18 +58,6 @@ namespace LLTextUtil
 	        const std::string& text,
 	        const std::string& greyed);
 
-	/**
-	 * Formats passed phone number to be more human readable.
-	 *
-	 * It just divides the number on parts by two digits from right to left. The first left part
-	 * can have 2 or 3 digits, i.e. +44-33-33-44-55-66 or 12-34-56-78-90. Separator is set in
-	 * application settings (AvalinePhoneSeparator)
-	 *
-	 * @param[in] phone_str string with original phone number
-	 * @return reference to string with formatted phone number
-	 */
-	const std::string& formatPhoneNumber(const std::string& phone_str);
-
 	/**
 	 * Adds icon before url if need.
 	 *
diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp
index 84ea770a8d80457ccd0c6fcc7dd7516a77869d18..8216046174668d162ca1b415e26cd29a3fa19e96 100644
--- a/indra/llui/llurlaction.cpp
+++ b/indra/llui/llurlaction.cpp
@@ -222,6 +222,15 @@ void LLUrlAction::removeFriend(std::string url)
 	}
 }
 
+void LLUrlAction::reportAbuse(std::string url)
+{
+    std::string id_str = getUserID(url);
+    if (LLUUID::validate(id_str))
+    {
+        executeSLURL("secondlife:///app/agent/" + id_str + "/reportAbuse");
+    }
+}
+
 void LLUrlAction::blockObject(std::string url)
 {
 	std::string object_id = getObjectId(url);
diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h
index 2d2a8dfef19835b75ffacedebe9bcc3890d454f2..c2c576254dc638055e43a0ab4216bc06a80aa958 100644
--- a/indra/llui/llurlaction.h
+++ b/indra/llui/llurlaction.h
@@ -82,6 +82,7 @@ class LLUrlAction
 	static void sendIM(std::string url);
 	static void addFriend(std::string url);
 	static void removeFriend(std::string url);
+    static void reportAbuse(std::string url);
 	static void blockObject(std::string url);
 	static void unblockObject(std::string url);
 
diff --git a/indra/llwindow/llkeyboard.cpp b/indra/llwindow/llkeyboard.cpp
index 5404ac50e5c5baefe53ec7e2f65bf6b5d0604388..e65cc7563e6a7010e1ffe54a0c5ab82342dd77a5 100644
--- a/indra/llwindow/llkeyboard.cpp
+++ b/indra/llwindow/llkeyboard.cpp
@@ -148,6 +148,22 @@ void LLKeyboard::addKeyName(KEY key, const std::string& name)
 	sNamesToKeys[nameuc] = key;
 }
 
+void LLKeyboard::resetKeyDownAndHandle()
+{
+    MASK mask = currentMask(FALSE);
+    for (S32 i = 0; i < KEY_COUNT; i++)
+    {
+        if (mKeyLevel[i])
+        {
+            mKeyDown[i] = FALSE;
+            mKeyLevel[i] = FALSE;
+            mKeyUp[i] = TRUE;
+            mCurTranslatedKey = (KEY)i;
+            mCallbacks->handleTranslatedKeyUp(i, mask);
+        }
+    }
+}
+
 // BUG this has to be called when an OS dialog is shown, otherwise modifier key state
 // is wrong because the keyup event is never received by the main window. JC
 void LLKeyboard::resetKeys()
diff --git a/indra/llwindow/llkeyboard.h b/indra/llwindow/llkeyboard.h
index 36bd8bcbed54784c4721f793f8e05dc19aeb2313..fb1ae10f50b6b21ff66a452f3c10d0dbacec23ce 100644
--- a/indra/llwindow/llkeyboard.h
+++ b/indra/llwindow/llkeyboard.h
@@ -58,7 +58,8 @@ class LLKeyboard
 	LLKeyboard();
 	virtual ~LLKeyboard();
 
-	void			resetKeys();
+    void			resetKeyDownAndHandle();
+    void			resetKeys();
 
 
 	F32				getCurKeyElapsedTime()	{ return getKeyDown(mCurScanKey) ? getKeyElapsedTime( mCurScanKey ) : 0.f; }
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index ceb80ed3490b9e430da7d1f8c694a3fcd1b541b0..9fed57ba53555e97288a3b605d64d4ea0d118397 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -501,14 +501,14 @@ attributedStringInfo getSegments(NSAttributedString *str)
     // e.g. OS Window for upload something or Input Window...
     // mModifiers instance variable is for insertText: or insertText:replacementRange:  (by Pell Smit)
 	mModifiers = [theEvent modifierFlags];
+    unichar ch = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];
+    bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers, ch);
 
-    bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers, [[theEvent characters] characterAtIndex:0]);
-    unichar ch;
     if (acceptsText &&
         !mMarkedTextAllowed &&
         !(mModifiers & (NSControlKeyMask | NSCommandKeyMask)) &&  // commands don't invoke InputWindow
         ![(LLAppDelegate*)[NSApp delegate] romanScript] &&
-        (ch = [[theEvent charactersIgnoringModifiers] characterAtIndex:0]) > ' ' &&
+        ch > ' ' &&
         ch != NSDeleteCharacter &&
         (ch < 0xF700 || ch > 0xF8FF))  // 0xF700-0xF8FF: reserved for function keys on the keyboard(from NSEvent.h)
     {
diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm
index f895c1764396b862aa4adf246c3f22e9b7816559..5ec9b017cf1db4144a3f370658e9cde0af271f00 100644
--- a/indra/llwindow/llwindowmacosx-objc.mm
+++ b/indra/llwindow/llwindowmacosx-objc.mm
@@ -100,13 +100,13 @@ const unsigned short *copyFromPBoard()
 CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY)
 {
 	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-	
+
 	// extra retain on the NSCursor since we want it to live for the lifetime of the app.
 	NSCursor *cursor =
 	[[[NSCursor alloc]
 	  initWithImage:
 	  [[[NSImage alloc] initWithContentsOfFile:
-		[NSString stringWithFormat:@"%s", fullpath]
+		[NSString stringWithUTF8String:fullpath]
 		]autorelease]
 	  hotSpot:NSMakePoint(hotspotX, hotspotY)
 	  ]retain];
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 4bcb9b3aeffdbc0f91cd6c56691eae6ea2300d33..3a5287f907f3d8c4142e4c05cf7588b1706dc1ac 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -1676,7 +1676,7 @@ void LLWindowMacOSX::hideCursor()
 
 void LLWindowMacOSX::showCursor()
 {
-	if(mCursorHidden)
+	if(mCursorHidden || !isCGCursorVisible())
 	{
 		//		LL_INFOS() << "showCursor: showing" << LL_ENDL;
 		mCursorHidden = FALSE;
diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index ea70e214145fe06ecc10087789561d69198984b9..43d3a32e6464bab8b88bf2c2a075a5f2f93cd0ef 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -34,6 +34,7 @@
 #include "llplugininstance.h"
 #include "llpluginmessage.h"
 #include "llpluginmessageclasses.h"
+#include "llstring.h"
 #include "volume_catcher.h"
 #include "media_plugin_base.h"
 
@@ -55,7 +56,7 @@ class MediaPluginCEF :
 	bool init();
 
 	void onPageChangedCallback(const unsigned char* pixels, int x, int y, const int width, const int height);
-	void onCustomSchemeURLCallback(std::string url);
+	void onCustomSchemeURLCallback(std::string url, bool user_gesture, bool is_redirect);
 	void onConsoleMessageCallback(std::string message, std::string source, int line);
 	void onStatusMessageCallback(std::string value);
 	void onTitleChangeCallback(std::string title);
@@ -299,11 +300,18 @@ void MediaPluginCEF::onOpenPopupCallback(std::string url, std::string target)
 
 ////////////////////////////////////////////////////////////////////////////////
 //
-void MediaPluginCEF::onCustomSchemeURLCallback(std::string url)
+void MediaPluginCEF::onCustomSchemeURLCallback(std::string url, bool user_gesture, bool is_redirect)
 {
 	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow");
-	message.setValue("uri", url);
-	message.setValue("nav_type", "clicked");	// TODO: differentiate between click and navigate to
+    message.setValue("uri", url);
+
+    // indicate if this interaction was from a user click (okay on a SLAPP) or 
+    // via a navigation (e.g. a data URL - see SL-18151) (not okay on a SLAPP)
+    const std::string nav_type = user_gesture ? "clicked" : "navigated";
+
+	message.setValue("nav_type", nav_type);
+    message.setValueBoolean("is_redirect", is_redirect);
+
 	sendMessage(message);
 }
 
@@ -592,7 +600,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
             {
                 // event callbacks from Dullahan
                 mCEFLib->setOnPageChangedCallback(std::bind(&MediaPluginCEF::onPageChangedCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5));
-                mCEFLib->setOnCustomSchemeURLCallback(std::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, std::placeholders::_1));
+                mCEFLib->setOnCustomSchemeURLCallback(std::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
                 mCEFLib->setOnConsoleMessageCallback(std::bind(&MediaPluginCEF::onConsoleMessageCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
                 mCEFLib->setOnStatusMessageCallback(std::bind(&MediaPluginCEF::onStatusMessageCallback, this, std::placeholders::_1));
                 mCEFLib->setOnTitleChangeCallback(std::bind(&MediaPluginCEF::onTitleChangeCallback, this, std::placeholders::_1));
@@ -616,9 +624,9 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
                 // dir as the executable that loaded it (SLPlugin.exe). The code in 
                 // Dullahan that tried to figure out the location automatically uses 
                 // the location of the exe which isn't helpful so we tell it explicitly.
-                char cur_dir_str[MAX_PATH];
-                GetCurrentDirectoryA(MAX_PATH, cur_dir_str);
-                settings.host_process_path = std::string(cur_dir_str);
+                std::vector<wchar_t> buffer(MAX_PATH + 1);
+                GetCurrentDirectoryW(MAX_PATH, &buffer[0]);
+                settings.host_process_path = ll_convert_wide_to_string(&buffer[0]);
 #endif
                 settings.accept_language_list = mHostLanguage;
 
diff --git a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
index 1afe25e9a162a24d04270e041b8fda4eea3ab2a2..89144922cca113bd03bc61b1519854e6961b10b6 100644
--- a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
+++ b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
@@ -73,6 +73,7 @@ class MediaPluginLibVLC :
 	static void display(void* data, void* id);
 
 	/*virtual*/ void setDirty(int left, int top, int right, int bottom) /* override, but that is not supported in gcc 4.6 */;
+    void setDurationDirty();
 
 	static void eventCallbacks(const libvlc_event_t* event, void* ptr);
 
@@ -93,8 +94,8 @@ class MediaPluginLibVLC :
 
 	bool mIsLooping;
 
-	float mCurTime;
-	float mDuration;
+	F64 mCurTime;
+	F64 mDuration;
 	EStatus mVlcStatus;
 };
 
@@ -213,6 +214,19 @@ void MediaPluginLibVLC::setDirty(int left, int top, int right, int bottom)
 	sendMessage(message);
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// *virtual*
+void MediaPluginLibVLC::setDurationDirty()
+{
+    LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated");
+
+    message.setValueReal("current_time", mCurTime);
+    message.setValueReal("duration", mDuration);
+    message.setValueReal("current_rate", 1.0f);
+
+    sendMessage(message);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 //
 void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)
@@ -233,6 +247,7 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)
 		parent->mDuration = (float)(libvlc_media_get_duration(parent->mLibVLCMedia)) / 1000.0f;
 		parent->mVlcStatus = STATUS_PLAYING;
 		parent->setVolumeVLC();
+        parent->setDurationDirty();
 		break;
 
 	case libvlc_MediaPlayerPaused:
@@ -245,6 +260,8 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)
 
 	case libvlc_MediaPlayerEndReached:
 		parent->mVlcStatus = STATUS_DONE;
+        parent->mCurTime = parent->mDuration;
+        parent->setDurationDirty();
 		break;
 
 	case libvlc_MediaPlayerEncounteredError:
@@ -253,6 +270,11 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)
 
 	case libvlc_MediaPlayerTimeChanged:
 		parent->mCurTime = (float)libvlc_media_player_get_time(parent->mLibVLCMediaPlayer) / 1000.0f;
+        if (parent->mVlcStatus == STATUS_DONE && libvlc_media_player_is_playing(parent->mLibVLCMediaPlayer))
+        {
+            parent->mVlcStatus = STATUS_PLAYING;
+        }
+        parent->setDurationDirty();
 		break;
 
 	case libvlc_MediaPlayerPositionChanged:
@@ -260,6 +282,7 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)
 
 	case libvlc_MediaPlayerLengthChanged:
 		parent->mDuration = (float)libvlc_media_get_duration(parent->mLibVLCMedia) / 1000.0f;
+        parent->setDurationDirty();
 		break;
 
 	case libvlc_MediaPlayerTitleChanged:
@@ -562,7 +585,24 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)
 						mTextureWidth = texture_width;
 						mTextureHeight = texture_height;
 
+                        libvlc_time_t time = 1000.0 * mCurTime;
+
 						playMedia();
+
+                        if (mLibVLCMediaPlayer)
+                        {
+                            libvlc_media_player_set_time(mLibVLCMediaPlayer, time);
+                            time = libvlc_media_player_get_time(mLibVLCMediaPlayer);
+                            if (time < 0)
+                            {
+                                // -1 if there is no media
+                                mCurTime = 0;
+                            }
+                            else
+                            {
+                                mCurTime = (F64)time / 1000.0;
+                            }
+                        }
 					};
 				};
 
@@ -594,6 +634,13 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)
 				{
 					if (mLibVLCMediaPlayer)
 					{
+                        if (mVlcStatus == STATUS_DONE && !libvlc_media_player_is_playing(mLibVLCMediaPlayer))
+                        {
+                            // stop or vlc will ignore 'play', it will just
+                            // make an MediaPlayerEndReached event even if
+                            // seek was used
+                            libvlc_media_player_stop(mLibVLCMediaPlayer);
+                        }
 						libvlc_media_player_play(mLibVLCMediaPlayer);
 					}
 				}
@@ -606,15 +653,32 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)
 				}
 				else if (message_name == "seek")
 				{
-					if (mDuration > 0)
-					{
-						F64 normalized_offset = message_in.getValueReal("time") / mDuration;
-						libvlc_media_player_set_position(mLibVLCMediaPlayer, normalized_offset);
-					}
+                    if (mLibVLCMediaPlayer)
+                    {
+                        libvlc_time_t time = 1000.0 * message_in.getValueReal("time");
+                        libvlc_media_player_set_time(mLibVLCMediaPlayer, time);
+                        time = libvlc_media_player_get_time(mLibVLCMediaPlayer);
+                        if (time < 0)
+                        {
+                            // -1 if there is no media
+                            mCurTime = 0;
+                        }
+                        else
+                        {
+                            mCurTime = (F64)time / 1000.0;
+                        }
+
+                        if (!libvlc_media_player_is_playing(mLibVLCMediaPlayer))
+                        {
+                            // if paused, won't trigger update, update now
+                            setDurationDirty();
+                        }
+                    }
 				}
 				else if (message_name == "set_loop")
 				{
-					mIsLooping = true;
+					bool loop = message_in.getValueBoolean("loop");
+					mIsLooping = loop;
 				}
 				else if (message_name == "set_volume")
 				{
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 100bcf7ab9297740eda4959bc145fad95ecb578d..11f336ed4ad20efd15902b1be0e23faa2e7f9d82 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -544,17 +544,6 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
-    <key>AvalinePhoneSeparator</key>
-    <map>
-      <key>Comment</key>
-      <string>Separator of phone parts to have Avaline numbers human readable in Voice Control Panel</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>-</string>
-    </map>
     <key>AvatarAxisDeadZone0</key>
     <map>
       <key>Comment</key>
@@ -4792,7 +4781,7 @@
       <key>Type</key>
       <string>String</string>
       <key>Value</key>
-      <string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
+      <string>https://search.[GRID]/?query_term=[QUERY]&amp;search_type=[TYPE][COLLECTION]&amp;maturity=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
     </map>
     <key>GuidebookURL</key>
     <map>
@@ -5840,6 +5829,17 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>DiskCacheVersion</key>
+    <map>
+      <key>Comment</key>
+      <string>Version number of disk cache</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>S32</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>LocalFileSystemBrowsingEnabled</key>
     <map>
       <key>Comment</key>
@@ -15729,6 +15729,17 @@
       <string>Boolean</string>
       <key>Value</key>
       <integer>1</integer>
+    </map>
+    <key>AllowSelectAvatar</key>
+    <map>
+      <key>Comment</key>
+      <string>Allows user to select and move avatars, move is viewer sided, does not propagate to server, also supresses avatar position updates while avatars are selected</string>
+      <key>Persist</key>
+      <integer>0</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
     </map>
      <key>WebProfileFloaterRect</key>
     <map>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 7f6f6e59974ae3a805f380d93f0c24136fce642c..999f4a9f20582583931260070781fc006221fc97 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -716,6 +716,9 @@ void LLAgent::moveYaw(F32 mag, bool reset_view)
     U32 mask = AGENT_CONTROL_YAW_POS | AGENT_CONTROL_YAW_NEG;
     if ((getControlFlags() & mask) == mask)
     {
+        // Rotation into both directions should cancel out
+        // But keep sending controls to simulator,
+        // it's needed for script based controls
         gAgentCamera.setYawKey(0);
     }
 
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index d5aa980d7e9cadf98124c9d2285c84f13d3e3986..b72022d008d1c155d280d55b021a9dd7c4fda011 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1449,6 +1449,8 @@ bool LLAppViewer::doFrame()
 			LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df suspend" )
 		// give listeners a chance to run
 		llcoro::suspend();
+		// if one of our coroutines threw an uncaught exception, rethrow it now
+		LLCoros::instance().rethrow();
 		}
 
 		if (!LLApp::isExiting())
@@ -3275,9 +3277,18 @@ LLSD LLAppViewer::getViewerInfo() const
 	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : "Undefined";
 	if(LLVoiceClient::getInstance()->voiceEnabled())
 	{
-		LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion();
+        LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion();
+        const std::string build_version = version.mBuildVersion;
 		std::ostringstream version_string;
-		version_string << version.serverType << " " << version.serverVersion << std::endl;
+        if (std::equal(build_version.begin(), build_version.begin() + version.serverVersion.size(),
+                       version.serverVersion.begin()))
+        {  // Normal case: Show type and build version.
+            version_string << version.serverType << " " << build_version << std::endl;
+        }
+        else
+        {  // Mismatch: Show both versions.
+            version_string << version.serverVersion << "/" << build_version << std::endl;
+        }
 		info["VOICE_VERSION"] = version_string.str();
 	}
 	else
@@ -4240,6 +4251,15 @@ U32 LLAppViewer::getTextureCacheVersion()
 	return TEXTURE_CACHE_VERSION ;
 }
 
+//static
+U32 LLAppViewer::getDiskCacheVersion()
+{
+    // Viewer disk cache version intorduced in Simple Cache Viewer, change if the cache format changes.
+    const U32 DISK_CACHE_VERSION = 1;
+
+    return DISK_CACHE_VERSION ;
+}
+
 //static
 U32 LLAppViewer::getObjectCacheVersion()
 {
@@ -4269,12 +4289,16 @@ bool LLAppViewer::initCache()
 	const bool enable_cache_debug_info = gSavedSettings.getBOOL("EnableDiskCacheDebugInfo");
 
 	bool texture_cache_mismatch = false;
+    bool remove_vfs_files = false;
 	if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getTextureCacheVersion())
 	{
 		texture_cache_mismatch = true;
 		if(!read_only)
 		{
 			gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getTextureCacheVersion());
+
+            //texture cache version was bumped up in Simple Cache Viewer, and at this point old vfs files are not needed
+            remove_vfs_files = true;   
 		}
 	}
 
@@ -4320,7 +4344,19 @@ bool LLAppViewer::initCache()
 
 	if (!read_only)
 	{
-		if (mPurgeCache)
+        if (gSavedSettings.getS32("DiskCacheVersion") != LLAppViewer::getDiskCacheVersion())
+        {
+            LLDiskCache::getInstance()->clearCache();
+            remove_vfs_files = true;
+            gSavedSettings.setS32("DiskCacheVersion", LLAppViewer::getDiskCacheVersion());
+        }
+
+        if (remove_vfs_files)
+        {
+            LLDiskCache::getInstance()->removeOldVFSFiles();
+        }
+        
+        if (mPurgeCache)
 		{
 		LLSplashScreen::update(LLTrans::getString("StartupClearingCache"));
 		purgeCache();
@@ -5398,7 +5434,7 @@ void LLAppViewer::disconnectViewer()
 		gFloaterView->restoreAll();
 	}
 
-	if (LLSelectMgr::getInstance())
+	if (LLSelectMgr::instanceExists())
 	{
 		LLSelectMgr::getInstance()->deselectAll();
 	}
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 7ab21f35cd624b2da2bb9ead48ea92e57522ebc9..f28a90c70396e2866baaf51e5f7bf790584a44e7 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -130,6 +130,7 @@ class LLAppViewer : public LLApp
 
 	static U32 getTextureCacheVersion() ;
 	static U32 getObjectCacheVersion() ;
+    static U32 getDiskCacheVersion() ;
 
 	const std::string& getSerialNumber() { return mSerialNumber; }
 
@@ -153,16 +154,16 @@ class LLAppViewer : public LLApp
 	void removeMarkerFiles();
 
 	void removeDumpDir();
-	// LLAppViewer testing helpers.
-	// *NOTE: These will potentially crash the viewer. Only for debugging.
-	virtual void forceErrorLLError();
-	virtual void forceErrorBreakpoint();
-	virtual void forceErrorBadMemoryAccess();
-	virtual void forceErrorInfiniteLoop();
-	virtual void forceErrorSoftwareException();
-	virtual void forceErrorDriverCrash();
-	virtual void forceErrorCoroutineCrash();
-	virtual void forceErrorThreadCrash();
+    // LLAppViewer testing helpers.
+    // *NOTE: These will potentially crash the viewer. Only for debugging.
+    virtual void forceErrorLLError();
+    virtual void forceErrorBreakpoint();
+    virtual void forceErrorBadMemoryAccess();
+    virtual void forceErrorInfiniteLoop();
+    virtual void forceErrorSoftwareException();
+    virtual void forceErrorDriverCrash();
+    virtual void forceErrorCoroutineCrash();
+    virtual void forceErrorThreadCrash();
 
 	// The list is found in app_settings/settings_files.xml
 	// but since they are used explicitly in code,
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index b0715a3afd38e54e22a6905e6371a6d684d00fee..c0990d9d113959d70839fcbdd7bb753d0d2688fa 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -241,21 +241,6 @@ void LLAvatarList::setDirty(bool val /*= true*/, bool force_refresh /*= false*/)
 	}
 }
 
-void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name)
-{
-	LL_DEBUGS("Avaline") << "Adding avaline item into the list: " << item_name << "|" << item_id << ", session: " << session_id << LL_ENDL;
-	LLAvalineListItem* item = new LLAvalineListItem(/*hide_number=*/false);
-	item->setAvatarId(item_id, session_id, true, false);
-	item->setName(item_name);
-	item->showLastInteractionTime(mShowLastInteractionTime);
-	item->showSpeakingIndicator(mShowSpeakingIndicator);
-	item->setOnline(false);
-
-	addItem(item, item_id);
-	mIDs.push_back(item_id);
-	sort();
-}
-
 //////////////////////////////////////////////////////////////////////////
 // PROTECTED SECTION
 //////////////////////////////////////////////////////////////////////////
@@ -296,18 +281,10 @@ void LLAvatarList::refresh()
 			{
 				// *NOTE: If you change the UI to show a different string,
 				// be sure to change the filter code below.
-				if (LLRecentPeople::instance().isAvalineCaller(buddy_id))
-				{
-					const LLSD& call_data = LLRecentPeople::instance().getData(buddy_id);
-					addAvalineItem(buddy_id, call_data["session_id"].asUUID(), call_data["call_number"].asString());
-				}
-				else
-				{
-					std::string display_name = getAvatarName(av_name);
-					addNewItem(buddy_id, 
-						display_name.empty() ? waiting_str : display_name, 
-						LLAvatarTracker::instance().isBuddyOnline(buddy_id));
-				}
+				std::string display_name = getAvatarName(av_name);
+				addNewItem(buddy_id, 
+					display_name.empty() ? waiting_str : display_name, 
+					LLAvatarTracker::instance().isBuddyOnline(buddy_id));
 				
 				modified = true;
 				nadded++;
@@ -463,7 +440,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is
 BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
 {
 	BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
-	if ( mContextMenu && !isAvalineItemSelected())
+	if ( mContextMenu)
 	{
 		uuid_vec_t selected_uuids;
 		getSelectedUUIDs(selected_uuids);
@@ -523,21 +500,6 @@ BOOL LLAvatarList::handleHover(S32 x, S32 y, MASK mask)
 	return handled;
 }
 
-bool LLAvatarList::isAvalineItemSelected()
-{
-	std::vector<LLPanel*> selected_items;
-	getSelectedItems(selected_items);
-	std::vector<LLPanel*>::iterator it = selected_items.begin();
-	
-	for(; it != selected_items.end(); ++it)
-	{
-		if (dynamic_cast<LLAvalineListItem*>(*it))
-			return true;
-	}
-
-	return false;
-}
-
 void LLAvatarList::setVisible(BOOL visible)
 {
 	if ( visible == FALSE && mContextMenu )
@@ -626,63 +588,3 @@ bool LLAvatarItemAgentOnTopComparator::doCompare(const LLAvatarListItem* avatar_
 	}
 	return LLAvatarItemNameComparator::doCompare(avatar_item1,avatar_item2);
 }
-
-/************************************************************************/
-/*             class LLAvalineListItem                                  */
-/************************************************************************/
-LLAvalineListItem::LLAvalineListItem(bool hide_number/* = true*/) : LLAvatarListItem(false)
-, mIsHideNumber(hide_number)
-{
-	// should not use buildPanel from the base class to ensure LLAvalineListItem::postBuild is called.
-	buildFromFile( "panel_avatar_list_item.xml");
-}
-
-BOOL LLAvalineListItem::postBuild()
-{
-	BOOL rv = LLAvatarListItem::postBuild();
-
-	if (rv)
-	{
-		setOnline(true);
-		showLastInteractionTime(false);
-		setShowProfileBtn(false);
-		setShowInfoBtn(false);
-		mAvatarIcon->setValue("Avaline_Icon");
-		mAvatarIcon->setToolTip(std::string(""));
-	}
-	return rv;
-}
-
-// to work correctly this method should be called AFTER setAvatarId for avaline callers with hidden phone number
-void LLAvalineListItem::setName(const std::string& name)
-{
-	if (mIsHideNumber)
-	{
-		static U32 order = 0;
-		typedef std::map<LLUUID, U32> avaline_callers_nums_t;
-		static avaline_callers_nums_t mAvalineCallersNums;
-
-		llassert(getAvatarId() != LLUUID::null);
-
-		const LLUUID &uuid = getAvatarId();
-
-		if (mAvalineCallersNums.find(uuid) == mAvalineCallersNums.end())
-		{
-			mAvalineCallersNums[uuid] = ++order;
-			LL_DEBUGS("Avaline") << "Set name for new avaline caller: " << uuid << ", order: " << order << LL_ENDL;
-		}
-		LLStringUtil::format_map_t args;
-		args["[ORDER]"] = llformat("%u", mAvalineCallersNums[uuid]);
-		std::string hidden_name = LLTrans::getString("AvalineCaller", args);
-
-		LL_DEBUGS("Avaline") << "Avaline caller: " << uuid << ", name: " << hidden_name << LL_ENDL;
-		LLAvatarListItem::setAvatarName(hidden_name);
-		LLAvatarListItem::setAvatarToolTip(hidden_name);
-	}
-	else
-	{
-		const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name);
-		LLAvatarListItem::setAvatarName(formatted_phone);
-		LLAvatarListItem::setAvatarToolTip(formatted_phone);
-	}
-}
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 1a672c279b1d94cec40d6f2fdc8a00dea0e5c372..48b0e70454c8d42b2ba4c1e980eb8eabca04b109 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -98,7 +98,6 @@ class LLAvatarList : public LLFlatListViewEx
 
 	virtual S32 notifyParent(const LLSD& info);
 
-	void addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name);
 	void handleDisplayNamesOptionChanged();
 
 	void setShowCompleteName(bool show) { mShowCompleteName = show;};
@@ -118,8 +117,6 @@ class LLAvatarList : public LLFlatListViewEx
 
 private:
 
-	bool isAvalineItemSelected();
-
 	bool mIgnoreOnlineStatus;
 	bool mShowLastInteractionTime;
 	bool mDirty;
@@ -189,27 +186,4 @@ class LLAvatarItemAgentOnTopComparator : public LLAvatarItemNameComparator
 	virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const;
 };
 
-/**
- * Represents Avaline caller in Avatar list in Voice Control Panel and group chats.
- */
-class LLAvalineListItem : public LLAvatarListItem
-{
-public:
-
-	/**
-	 * Constructor
-	 *
-	 * @param hide_number - flag indicating if number should be hidden.
-	 *		In this case It will be shown as "Avaline Caller 1", "Avaline Caller 1", etc.
-	 */
-	LLAvalineListItem(bool hide_number = true);
-
-	/*virtual*/ BOOL postBuild();
-
-	/*virtual*/ void setName(const std::string& name);
-
-private:
-	bool mIsHideNumber;
-};
-
 #endif // LL_LLAVATARLIST_H
diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp
index fe94cd27b6d5dfb0e9d938f37965d3bf7658cb9d..275f17b02ae23647bdedd8d95ea7759909a958a3 100644
--- a/indra/newview/llavatarrenderinfoaccountant.cpp
+++ b/indra/newview/llavatarrenderinfoaccountant.cpp
@@ -320,9 +320,16 @@ void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regio
         // make sure we won't re-report, coro will update timer with correct time later
         regionp->getRenderInfoReportTimer().resetWithExpiry(SECS_BETWEEN_REGION_REPORTS);
 
-        std::string coroname =
-            LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro",
-            boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro, url, regionp->getHandle()));
+        try
+        {
+            std::string coroname =
+                LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro",
+                    boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro, url, regionp->getHandle()));
+        }
+        catch (std::bad_alloc&)
+        {
+            LL_ERRS() << "LLCoros::launch() allocation failure" << LL_ENDL;
+        }
 	}
 }
 
@@ -343,10 +350,17 @@ void LLAvatarRenderInfoAccountant::getRenderInfoFromRegion(LLViewerRegion * regi
         // make sure we won't re-request, coro will update timer with correct time later
         regionp->getRenderInfoRequestTimer().resetWithExpiry(SECS_BETWEEN_REGION_REQUEST);
 
-		// First send a request to get the latest data
-        std::string coroname =
-            LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro",
-            boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro, url, regionp->getHandle()));
+        try
+        {
+            // First send a request to get the latest data
+            std::string coroname =
+                LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro",
+                    boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro, url, regionp->getHandle()));
+        }
+        catch (std::bad_alloc&)
+        {
+            LL_ERRS() << "LLCoros::launch() allocation failure" << LL_ENDL;
+        }
 	}
 }
 
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index bdd516e1def6b920c1b33fd2455ed008b08efbd1..7ff24f64acf08513b4cfdae57401e35123766866 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -48,6 +48,7 @@
 #include "llspeakers.h" //for LLIMSpeakerMgr
 #include "lltrans.h"
 #include "llfloaterreg.h"
+#include "llfloaterreporter.h"
 #include "llfloatersidepanelcontainer.h"
 #include "llmutelist.h"
 #include "llstylemap.h"
@@ -118,6 +119,7 @@ class LLChatHistoryHeader: public LLPanel
 		mSourceType(CHAT_SOURCE_UNKNOWN),
 		mFrom(),
 		mSessionID(),
+        mCreationTime(time_corrected()),
 		mMinUserNameWidth(0),
 		mUserNameFont(NULL),
 		mUserNameTextBox(NULL),
@@ -403,6 +405,48 @@ class LLChatHistoryHeader: public LLPanel
 		{
 			LLAvatarActions::pay(getAvatarId());
 		}
+        else if (level == "report_abuse")
+        {
+            std::string time_string;
+            if (mTime > 0) // have frame time
+            {
+                time_t current_time = time_corrected();
+                time_t message_time = current_time - LLFrameTimer::getElapsedSeconds() + mTime;
+
+                time_string = "[" + LLTrans::getString("TimeMonth") + "]/["
+                    + LLTrans::getString("TimeDay") + "]/["
+                    + LLTrans::getString("TimeYear") + "] ["
+                    + LLTrans::getString("TimeHour") + "]:["
+                    + LLTrans::getString("TimeMin") + "]";
+
+                LLSD substitution;
+
+                substitution["datetime"] = (S32)message_time;
+                LLStringUtil::format(time_string, substitution);
+            }
+            else
+            {
+                // From history. This might be empty or not full.
+                // See LLChatLogParser::parse
+                time_string = getChild<LLTextBox>("time_box")->getValue().asString();
+
+                // Just add current date if not full.
+                // Should be fine since both times are supposed to be stl
+                if (!time_string.empty() && time_string.size() < 7)
+                {
+                    time_string = "[" + LLTrans::getString("TimeMonth") + "]/["
+                        + LLTrans::getString("TimeDay") + "]/["
+                        + LLTrans::getString("TimeYear") + "] " + time_string;
+
+                    LLSD substitution;
+                    // To avoid adding today's date to yesterday's timestamp,
+                    // use creation time instead of current time
+                    substitution["datetime"] = (S32)mCreationTime;
+                    LLStringUtil::format(time_string, substitution);
+                }
+            }
+            LLFloaterReporter::showFromChat(mAvatarID, mFrom, time_string, mText);
+        }
 		else if(level == "block_unblock")
 		{
 			LLAvatarActions::toggleMute(getAvatarId(), LLMute::flagVoiceChat);
@@ -477,6 +521,10 @@ class LLChatHistoryHeader: public LLPanel
 		{
 			return canModerate(userdata);
 		}
+        else if (level == "report_abuse")
+        {
+            return gAgentID != mAvatarID;
+        }
 		else if (level == "can_ban_member")
 		{
 			return canBanGroupMember(getAvatarId());
@@ -634,6 +682,12 @@ class LLChatHistoryHeader: public LLPanel
 		mSessionID = chat.mSessionID;
 		mSourceType = chat.mSourceType;
 
+        // To be able to report a message, we need a copy of it's text
+        // and it's easier to store text directly than trying to get
+        // it from a lltextsegment or chat's mEditor
+        mText = chat.mText;
+        mTime = chat.mTime;
+
 		//*TODO overly defensive thing, source type should be maintained out there
 		if((chat.mFromID.isNull() && chat.mFromName.empty()) || (chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull()))
 		{
@@ -983,6 +1037,9 @@ class LLChatHistoryHeader: public LLPanel
 	EChatSourceType		mSourceType;
 	std::string			mFrom;
 	LLUUID				mSessionID;
+    std::string			mText;
+    F64					mTime; // IM's frame time
+    time_t				mCreationTime; // Views's time
 
 	S32					mMinUserNameWidth;
 	const LLFontGL*		mUserNameFont;
diff --git a/indra/newview/llconversationloglist.cpp b/indra/newview/llconversationloglist.cpp
index 86e23e7c83c5e4af85c62856b6bf55448a138a82..97b16a5e9305f9b16ac5542a481b6d1aab92d464 100644
--- a/indra/newview/llconversationloglist.cpp
+++ b/indra/newview/llconversationloglist.cpp
@@ -391,7 +391,8 @@ bool LLConversationLogList::isActionEnabled(const LLSD& userdata)
 			 "can_invite_to_group"	== command_name ||
 			 "can_share"			== command_name ||
 			 "can_block"			== command_name ||
-			 "can_pay"				== command_name)
+			 "can_pay"				== command_name ||
+			 "report_abuse"			== command_name)
 	{
 		return is_p2p;
 	}
diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
index a6856394275bdaef46472beea7374ba6cc8b9b45..9ec4fb085b2717b5790871b3ed341c39bdb33946 100644
--- a/indra/newview/llconversationmodel.cpp
+++ b/indra/newview/llconversationmodel.cpp
@@ -182,6 +182,7 @@ void LLConversationItem::buildParticipantMenuOptions(menuentry_vec_t& items, U32
 		items.push_back(std::string("map"));
 		items.push_back(std::string("share"));
 		items.push_back(std::string("pay"));
+        items.push_back(std::string("report_abuse"));
 		items.push_back(std::string("block_unblock"));
 		items.push_back(std::string("MuteText"));
 
diff --git a/indra/newview/lldonotdisturbnotificationstorage.cpp b/indra/newview/lldonotdisturbnotificationstorage.cpp
index 7d4961c598929c81e91c3cc059f54c23b14448ef..4d9ef99319fbd09448ab69216241879d68ad9888 100644
--- a/indra/newview/lldonotdisturbnotificationstorage.cpp
+++ b/indra/newview/lldonotdisturbnotificationstorage.cpp
@@ -80,9 +80,14 @@ LLDoNotDisturbNotificationStorage::~LLDoNotDisturbNotificationStorage()
 {
 }
 
+void LLDoNotDisturbNotificationStorage::reset()
+{
+    setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "dnd_notifications.xml"));
+}
+
 void LLDoNotDisturbNotificationStorage::initialize()
 {
-	setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "dnd_notifications.xml"));
+    reset();
 	getCommunicationChannel()->connectFailedFilter(boost::bind(&LLDoNotDisturbNotificationStorage::onChannelChanged, this, _1));
 }
 
diff --git a/indra/newview/lldonotdisturbnotificationstorage.h b/indra/newview/lldonotdisturbnotificationstorage.h
index c6f0bf1ab588ddd63fd52324bdf91f7dcd9d3516..237d58b4def8871397ec6d7e3fbc0d6c92694525 100644
--- a/indra/newview/lldonotdisturbnotificationstorage.h
+++ b/indra/newview/lldonotdisturbnotificationstorage.h
@@ -61,6 +61,7 @@ class LLDoNotDisturbNotificationStorage : public LLParamSingleton<LLDoNotDisturb
 	void loadNotifications();
     void updateNotifications();
     void removeNotification(const char * name, const LLUUID& id);
+    void reset();
 
 protected:
 
diff --git a/indra/newview/llfloater360capture.cpp b/indra/newview/llfloater360capture.cpp
index ffbb0bbee9a062c9af631e0937e9b69192289feb..c075f7e8bdd3f9be33733f96677bf866830bb0d5 100644
--- a/indra/newview/llfloater360capture.cpp
+++ b/indra/newview/llfloater360capture.cpp
@@ -114,6 +114,11 @@ BOOL LLFloater360Capture::postBuild()
     // by default each time vs restoring the last value
     mQualityRadioGroup->setSelectedIndex(0);
 
+    return true;
+}
+
+void LLFloater360Capture::onOpen(const LLSD& key)
+{
     // Construct a URL pointing to the first page to load. Although
     // we do not use this page for anything (after some significant
     // design changes), we retain the code to load the start page
@@ -154,8 +159,6 @@ BOOL LLFloater360Capture::postBuild()
     // We do an initial capture when the floater is opened, albeit at a 'preview'
     // quality level (really low resolution, but really fast)
     onCapture360ImagesBtn();
-
-    return true;
 }
 
 // called when the user choose a quality level using
diff --git a/indra/newview/llfloater360capture.h b/indra/newview/llfloater360capture.h
index 6da7ee074a399e4fa25f76af36aac1d0b18ab718..8f765c0b1be16019fd22089cacf0891c56017788 100644
--- a/indra/newview/llfloater360capture.h
+++ b/indra/newview/llfloater360capture.h
@@ -47,6 +47,7 @@ class LLFloater360Capture:
 
         ~LLFloater360Capture();
         BOOL postBuild() override;
+        void onOpen(const LLSD& key) override;
         void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) override;
 
         void changeInterestListMode(bool send_everything);
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index ab95bc06b889f1fcbdf7da58130dc6690561e77f..0186c4aebefa2dea030c0d903de74a928bc164ee 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -105,6 +105,7 @@ LLFloaterAvatarPicker::LLFloaterAvatarPicker(const LLSD& key)
 	mNumResultsReturned(0),
 	mNearMeListComplete(FALSE),
 	mCloseOnSelect(FALSE),
+    mExcludeAgentFromSearchResults(FALSE),
     mContextConeOpacity	(0.f),
     mContextConeInAlpha(0.f),
     mContextConeOutAlpha(0.f),
@@ -295,7 +296,7 @@ void LLFloaterAvatarPicker::populateNearMe()
 	for(U32 i=0; i<avatar_ids.size(); i++)
 	{
 		LLUUID& av = avatar_ids[i];
-		if(av == gAgent.getID()) continue;
+		if(mExcludeAgentFromSearchResults && (av == gAgent.getID())) continue;
 		LLSD element;
 		element["id"] = av; // value
 		LLAvatarName av_name;
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
index a3037ed651849076fd432f8eec79ba3319a71aca..392633bd7de67c947939e532ed7beb28c37d450c 100644
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -1047,7 +1047,12 @@ LLPreviewAnimation::LLPreviewAnimation(S32 width, S32 height) : LLViewerDynamicT
 	mDummyAvatar = (LLVOAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion(), LLViewerObject::CO_FLAG_UI_AVATAR);
 	mDummyAvatar->mSpecialRenderMode = 1;
 	mDummyAvatar->startMotion(ANIM_AGENT_STAND, BASE_ANIM_TIME_OFFSET);
-	mDummyAvatar->hideSkirt();
+
+    // on idle overall apperance update will set skirt to visible, so either
+    // call early or account for mSpecialRenderMode in updateMeshVisibility
+    mDummyAvatar->updateOverallAppearance();
+    mDummyAvatar->hideHair();
+    mDummyAvatar->hideSkirt();
 
 	// stop extraneous animations
 	mDummyAvatar->stopMotion( ANIM_AGENT_HEAD_ROT, TRUE );
@@ -1135,6 +1140,7 @@ BOOL	LLPreviewAnimation::render()
 		{
 			LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)face->getPool();
 			avatarp->dirtyMesh();
+            gPipeline.enableLightsPreview();
 			avatarPoolp->renderAvatars(avatarp);  // renders only one avatar
 		}
 	}
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index 1525bb9952f9518672e2fb03f27b56c5ecc355d0..703b5d0011b4098fac38052e603553367746cab4 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -45,6 +45,7 @@
 #include "llflashtimer.h"
 #include "llfloateravatarpicker.h"
 #include "llfloaterpreference.h"
+#include "llfloaterreporter.h"
 #include "llimview.h"
 #include "llnotificationsutil.h"
 #include "lltoolbarview.h"
@@ -1242,6 +1243,18 @@ void LLFloaterIMContainer::doToParticipants(const std::string& command, uuid_vec
 		{
 			LLAvatarActions::pay(userID);
 		}
+        else if ("report_abuse" == command)
+        {
+            LLAvatarName av_name;
+            if (LLAvatarNameCache::get(userID, &av_name))
+            {
+                LLFloaterReporter::showFromAvatar(userID, av_name.getCompleteName());
+            }
+            else
+            {
+                LLFloaterReporter::showFromAvatar(userID, "not avaliable");
+            }
+        }
 		else if ("block_unblock" == command)
 		{
 			LLAvatarActions::toggleMute(userID, LLMute::flagVoiceChat);
@@ -1507,7 +1520,11 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
 	}
 
 	// Handle all other options
-	if (("can_invite" == item) || ("can_chat_history" == item) || ("can_share" == item) || ("can_pay" == item))
+	if (("can_invite" == item)
+        || ("can_chat_history" == item)
+        || ("can_share" == item)
+        || ("can_pay" == item)
+        || ("report_abuse" == item))
 	{
 		// Those menu items are enable only if a single avatar is selected
 		return is_single_select;
diff --git a/indra/newview/llfloatermarketplacelistings.cpp b/indra/newview/llfloatermarketplacelistings.cpp
index 524162ba513badb0bf3ff12ee459a2649ba84968..e755e9924c067a01a6c0f0cd717e7c49352e81da 100644
--- a/indra/newview/llfloatermarketplacelistings.cpp
+++ b/indra/newview/llfloatermarketplacelistings.cpp
@@ -579,7 +579,25 @@ void LLFloaterMarketplaceListings::updateView()
 
         // Update the top message or flip to the tabs and folders view
         // *TODO : check those messages and create better appropriate ones in strings.xml
-        if (mRootFolderId.notNull())
+        if (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE)
+        {
+            std::string reason = LLMarketplaceData::instance().getSLMConnectionfailureReason();
+            if (reason.empty())
+            {
+                text = LLTrans::getString("InventoryMarketplaceConnectionError");
+            }
+            else
+            {
+                LLSD args;
+                args["[REASON]"] = reason;
+                text = LLTrans::getString("InventoryMarketplaceConnectionErrorReason", args);
+            }
+
+            title = LLTrans::getString("InventoryOutboxErrorTitle");
+            tooltip = LLTrans::getString("InventoryOutboxErrorTooltip");
+            LL_WARNS() << "Marketplace status code: " << mkt_status << LL_ENDL;
+        }
+        else if (mRootFolderId.notNull())
         {
             // "Marketplace listings is empty!" message strings
             text = LLTrans::getString("InventoryMarketplaceListingsNoItems", subs);
diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index 2afd889609ff1a56a0541b1c0156efcc4d8058d4..b34961e8a2a67d30fe3f7aac2b4abc9609232137 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -156,6 +156,18 @@ void LLFloaterMediaSettings::apply()
 	}
 }
 
+////////////////////////////////////////////////////////////////////////////////
+void LLFloaterMediaSettings::onOpen(const LLSD& key)
+{
+    if (mPanelMediaSettingsGeneral)
+    {
+        // media is expensive, so only load it when nessesary.
+        // If we need to preload it, set volume to 0 and any pause
+        // if applicable, then unpause here
+        mPanelMediaSettingsGeneral->updateMediaPreview();
+    }
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 void LLFloaterMediaSettings::onClose(bool app_quitting)
 {
diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h
index f93512eb3a6014e3d619c99f1c011f6e5ee043a3..151e43e6b9b95d7be0ab53cee9cb8fb1f840e472 100644
--- a/indra/newview/llfloatermediasettings.h
+++ b/indra/newview/llfloatermediasettings.h
@@ -42,6 +42,7 @@ class LLFloaterMediaSettings :
 	~LLFloaterMediaSettings();
 
 	/*virtual*/ BOOL postBuild();
+    /*virtual*/ void onOpen(const LLSD& key);
 	/*virtual*/ void onClose(bool app_quitting);
 
 	static LLFloaterMediaSettings* getInstance();
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index b7c98c915c64faedbf4737a549fdbc010cef0f7a..7c3f3da4cf6a0d53c8b00310f5fde230fb3c39ac 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -507,6 +507,15 @@ void LLFloaterModelPreview::onClickCalculateBtn()
 
 	toggleCalculateButton(false);
 	mUploadBtn->setEnabled(false);
+ 
+    //disable "simplification" UI
+    LLPanel* simplification_panel = getChild<LLPanel>("physics simplification");
+    LLView* child = simplification_panel->getFirstChild();
+    while (child)
+    {
+        child->setEnabled(false);
+        child = simplification_panel->findNextSibling(child);
+    }
 }
 
 // Modified cell_params, make sure to clear values if you have to reuse cell_params outside of this function
diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp
index 87973c2286e3863051eaccadfd18ef49649741b9..94261b2e4e612079f284a6de61a71b65eabbd10e 100644
--- a/indra/newview/llfloaterpay.cpp
+++ b/indra/newview/llfloaterpay.cpp
@@ -72,7 +72,7 @@ struct LLGiveMoneyInfo
 		mFloater(floater), mAmount(amount){}
 };
 
-typedef boost::shared_ptr<LLGiveMoneyInfo> give_money_ptr;
+typedef std::shared_ptr<LLGiveMoneyInfo> give_money_ptr;
 
 ///----------------------------------------------------------------------------
 /// Class LLFloaterPay
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 7b01e9050ba21ce52dc4178c380bae59bba2ff72..01ebdf6830dbd6ec01f5c72883ea3920daa667fe 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -2840,10 +2840,15 @@ void LLPanelPreferenceControls::cancel()
         if (mConflictHandler[i].hasUnsavedChanges())
         {
             mConflictHandler[i].clear();
+            if (mEditingMode == i)
+            {
+                // cancel() can be called either when preferences floater closes
+                // or when child floater closes (like advanced graphical settings)
+                // in which case we need to clear and repopulate table
+                regenerateControls();
+            }
         }
     }
-    pControlsTable->clearRows();
-    pControlsTable->clearColumns();
 }
 
 void LLPanelPreferenceControls::saveSettings()
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 296e155d28e7f7c194513aecd420bc71c9dfbd73..293ccc344c1c6dbc39bc4334316c5f8aac4f1f6f 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -1322,6 +1322,7 @@ void LLPanelRegionDebugInfo::onClickDebugConsole(void* data)
 
 BOOL LLPanelRegionTerrainInfo::validateTextureSizes()
 {
+    static const S32 MAX_TERRAIN_TEXTURE_SIZE = 1024;
 	for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
 	{
 		std::string buffer;
@@ -1343,17 +1344,19 @@ BOOL LLPanelRegionTerrainInfo::validateTextureSizes()
 			LLSD args;
 			args["TEXTURE_NUM"] = i+1;
 			args["TEXTURE_BIT_DEPTH"] = llformat("%d",components * 8);
+            args["MAX_SIZE"] = MAX_TERRAIN_TEXTURE_SIZE;
 			LLNotificationsUtil::add("InvalidTerrainBitDepth", args);
 			return FALSE;
 		}
 
-		if (width > 512 || height > 512)
+		if (width > MAX_TERRAIN_TEXTURE_SIZE || height > MAX_TERRAIN_TEXTURE_SIZE)
 		{
 
 			LLSD args;
 			args["TEXTURE_NUM"] = i+1;
 			args["TEXTURE_SIZE_X"] = width;
 			args["TEXTURE_SIZE_Y"] = height;
+            args["MAX_SIZE"] = MAX_TERRAIN_TEXTURE_SIZE;
 			LLNotificationsUtil::add("InvalidTerrainSize", args);
 			return FALSE;
 			
@@ -3683,7 +3686,7 @@ void LLPanelEstateAccess::searchAgent(LLNameListCtrl* listCtrl, const std::strin
 	if (!search_string.empty())
 	{
 		listCtrl->setSearchColumn(0); // name column
-		listCtrl->selectItemByPrefix(search_string, FALSE);
+		listCtrl->searchItems(search_string, false, true);
 	}
 	else
 	{
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index b73755cf4e21a54e5701b84428c179098c6ba4ca..2df4ca973d677f2f31ec7d5d1589f66708838ea5 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -54,6 +54,7 @@
 #include "llbutton.h"
 #include "llfloaterreg.h"
 #include "lltexturectrl.h"
+#include "lltexteditor.h"
 #include "llscrolllistctrl.h"
 #include "lldispatcher.h"
 #include "llviewerobject.h"
@@ -250,9 +251,6 @@ LLFloaterReporter::~LLFloaterReporter()
 
 	mPosition.setVec(0.0f, 0.0f, 0.0f);
 
-	std::for_each(mMCDList.begin(), mMCDList.end(), DeletePointer() );
-	mMCDList.clear();
-
 	delete mResourceDatap;
 }
 
@@ -661,6 +659,23 @@ void LLFloaterReporter::showFromAvatar(const LLUUID& avatar_id, const std::strin
 	show(avatar_id, avatar_name);
 }
 
+// static
+void LLFloaterReporter::showFromChat(const LLUUID& avatar_id, const std::string& avatar_name, const std::string& time, const std::string& description)
+{
+    show(avatar_id, avatar_name);
+
+    LLStringUtil::format_map_t args;
+    args["[MSG_TIME]"] = time;
+    args["[MSG_DESCRIPTION]"] = description;
+
+    LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
+    if (self)
+    {
+        std::string description = self->getString("chat_report_format", args);
+        self->getChild<LLUICtrl>("details_edit")->setValue(description);
+    }
+}
+
 void LLFloaterReporter::setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id)
 {
 	getChild<LLUICtrl>("object_name")->setValue(object_name);
@@ -1028,37 +1043,3 @@ void LLFloaterReporter::onClose(bool app_quitting)
 	mSnapshotTimer.stop();
 	gSavedPerAccountSettings.setBOOL("PreviousScreenshotForReport", app_quitting);
 }
-
-
-// void LLFloaterReporter::setDescription(const std::string& description, LLMeanCollisionData *mcd)
-// {
-// 	LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
-// 	if (self)
-// 	{
-// 		self->getChild<LLUICtrl>("details_edit")->setValue(description);
-
-// 		for_each(self->mMCDList.begin(), self->mMCDList.end(), DeletePointer());
-// 		self->mMCDList.clear();
-// 		if (mcd)
-// 		{
-// 			self->mMCDList.push_back(new LLMeanCollisionData(mcd));
-// 		}
-// 	}
-// }
-
-// void LLFloaterReporter::addDescription(const std::string& description, LLMeanCollisionData *mcd)
-// {
-// 	LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
-// 	if (self)
-// 	{
-// 		LLTextEditor* text = self->getChild<LLTextEditor>("details_edit");
-// 		if (text)
-// 		{	
-// 			text->insertText(description);
-// 		}
-// 		if (mcd)
-// 		{
-// 			self->mMCDList.push_back(new LLMeanCollisionData(mcd));
-// 		}
-// 	}
-// }
diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h
index c678df7155ae423466e2296457de673461ed7c2d..b6c70e866d1fb0b22f6265d58229ba9eba419dce 100644
--- a/indra/newview/llfloaterreporter.h
+++ b/indra/newview/llfloaterreporter.h
@@ -93,6 +93,7 @@ class LLFloaterReporter
 
 	static void showFromObject(const LLUUID& object_id, const LLUUID& experience_id = LLUUID::null);
 	static void showFromAvatar(const LLUUID& avatar_id, const std::string avatar_name);
+    static void showFromChat(const LLUUID& avatar_id, const std::string& avatar_name, const std::string& time, const std::string& description);
 	static void showFromExperience(const LLUUID& experience_id);
 
 	static void onClickSend			(void *userdata);
@@ -101,8 +102,6 @@ class LLFloaterReporter
 	void onClickSelectAbuser ();
 	static void closePickTool	(void *userdata);
 	static void uploadDoneCallback(const LLUUID &uuid, void* user_data, S32 result, LLExtStat ext_status);
-	static void addDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);
-	static void setDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);
 
 	void setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id);
 
@@ -114,10 +113,8 @@ class LLFloaterReporter
 	static void show(const LLUUID& object_id, const std::string& avatar_name = LLStringUtil::null, const LLUUID& experience_id = LLUUID::null);
 
 	void takeScreenshot(bool use_prev_screenshot = false);
-	void sendReportViaCaps(std::string url);
 	void uploadImage();
 	bool validateReport();
-	void setReporterID();
 	LLSD gatherReport();
 	void sendReportViaLegacy(const LLSD & report);
 	void sendReportViaCaps(std::string url, std::string sshot_url, const LLSD & report);
@@ -144,7 +141,6 @@ class LLFloaterReporter
 	BOOL 			mPicking;
 	LLVector3		mPosition;
 	BOOL			mCopyrightWarningSeen;
-	std::list<LLMeanCollisionData*> mMCDList;
 	std::string		mDefaultSummary;
 	LLResourceData* mResourceDatap;
 	boost::signals2::connection mAvatarNameCacheConnection;
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index 2e1fbb09e0e398a3bac23a5875b3c3d52fb54528..bb3ed77772c6e372baa54eec25a7fe17b0c8cd6d 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -57,10 +57,10 @@ class LLSearchHandler : public LLCommandHandler
 		const size_t parts = tokens.size();
 
 		// get the (optional) category for the search
-		std::string category;
+		std::string collection;
 		if (parts > 0)
 		{
-			category = tokens[0].asString();
+            collection = tokens[0].asString();
 		}
 
 		// get the (optional) search string
@@ -72,7 +72,7 @@ class LLSearchHandler : public LLCommandHandler
 
 		// create the LLSD arguments for the search floater
 		LLFloaterSearch::Params p;
-		p.search.category = category;
+		p.search.collection = collection;
 		p.search.query = LLURI::unescape(search_text);
 
 		// open the search floater and perform the requested search
@@ -83,8 +83,9 @@ class LLSearchHandler : public LLCommandHandler
 LLSearchHandler gSearchHandler;
 
 LLFloaterSearch::SearchQuery::SearchQuery()
-:	category("category", ""),
-	query("query")
+:   category("category", ""),
+    collection("collection", ""),
+    query("query")
 {}
 
 LLFloaterSearch::LLFloaterSearch(const Params& key) :
@@ -93,16 +94,16 @@ LLFloaterSearch::LLFloaterSearch(const Params& key) :
 {
 	// declare a map that transforms a category name into
 	// the URL suffix that is used to search that category
-	mCategoryPaths = LLSD::emptyMap();
-	mCategoryPaths["all"]          = "search";
-	mCategoryPaths["people"]       = "search/people";
-	mCategoryPaths["places"]       = "search/places";
-	mCategoryPaths["events"]       = "search/events";
-	mCategoryPaths["groups"]       = "search/groups";
-	mCategoryPaths["wiki"]         = "search/wiki";
-	mCategoryPaths["land"]         = "land";
-	mCategoryPaths["destinations"] = "destinations";
-	mCategoryPaths["classifieds"]  = "classifieds";
+
+    mSearchType.insert("standard");
+    mSearchType.insert("land");
+    mSearchType.insert("classified");
+
+    mCollectionType.insert("events");
+    mCollectionType.insert("destinations");
+    mCollectionType.insert("places");
+    mCollectionType.insert("groups");
+    mCollectionType.insert("people");
 }
 
 BOOL LLFloaterSearch::postBuild()
@@ -157,31 +158,49 @@ void LLFloaterSearch::search(const SearchQuery &p)
 
 	// work out the subdir to use based on the requested category
 	LLSD subs;
-	if (mCategoryPaths.has(p.category))
+	if (mSearchType.find(p.category) != mSearchType.end())
 	{
-		subs["CATEGORY"] = mCategoryPaths[p.category].asString();
+		subs["TYPE"] = p.category;
 	}
 	else
 	{
-		subs["CATEGORY"] = mCategoryPaths["all"].asString();
+		subs["TYPE"] = "standard";
 	}
 
 	// add the search query string
 	subs["QUERY"] = LLURI::escape(p.query);
 
+    subs["COLLECTION"] = "";
+    if (subs["TYPE"] == "standard")
+    {
+        if (mCollectionType.find(p.collection) != mCollectionType.end())
+        {
+            subs["COLLECTION"] = "&collection_chosen=" + std::string(p.collection);
+        }
+        else
+        {
+            std::string collection_args("");
+            for (std::set<std::string>::iterator it = mCollectionType.begin(); it != mCollectionType.end(); ++it)
+            {
+                collection_args += "&collection_chosen=" + std::string(*it);
+            }
+            subs["COLLECTION"] = collection_args;
+        }
+    }
+
 	// add the user's preferred maturity (can be changed via prefs)
 	std::string maturity;
 	if (gAgent.prefersAdult())
 	{
-		maturity = "42";  // PG,Mature,Adult
+		maturity = "gma";  // PG,Mature,Adult
 	}
 	else if (gAgent.prefersMature())
 	{
-		maturity = "21";  // PG,Mature
+		maturity = "gm";  // PG,Mature
 	}
 	else
 	{
-		maturity = "13";  // PG
+		maturity = "g";  // PG
 	}
 	subs["MATURITY"] = maturity;
 
diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h
index 35b268e1b28f0774fdcfde386ea1de0e4db14582..cc77ce696fccf3709b5b683344cd9b409e0a252c 100644
--- a/indra/newview/llfloatersearch.h
+++ b/indra/newview/llfloatersearch.h
@@ -49,6 +49,7 @@ class LLFloaterSearch :
 	struct SearchQuery : public LLInitParam::Block<SearchQuery>
 	{
 		Optional<std::string> category;
+        Optional<std::string> collection;
 		Optional<std::string> query;
 
 		SearchQuery();
@@ -84,7 +85,8 @@ class LLFloaterSearch :
 private:
 	/*virtual*/ BOOL postBuild();
 
-	LLSD        mCategoryPaths;
+    std::set<std::string> mSearchType;
+    std::set<std::string> mCollectionType;
 	U8          mSearchGodLevel;
 };
 
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 77a04bc5d7e9b1d6b278301734c98e4cffd401cd..b6acba6558b90cb2e8ac14aa548fb61655323add 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -46,7 +46,6 @@
 #include "llfloaterreg.h"
 #include "llfocusmgr.h"
 #include "llmediaentry.h"
-#include "llmediactrl.h"
 #include "llmenugl.h"
 #include "llnotificationsutil.h"
 #include "llpanelcontents.h"
@@ -240,7 +239,6 @@ BOOL	LLFloaterTools::postBuild()
 	mRadioGroupMove		= getChild<LLRadioGroup>("move_radio_group");
 	mRadioGroupEdit		= getChild<LLRadioGroup>("edit_radio_group");
 	mBtnGridOptions		= getChild<LLButton>("Options...");
-	mTitleMedia			= getChild<LLMediaCtrl>("title_media");
 	mBtnLink			= getChild<LLButton>("link_btn");
 	mBtnUnlink			= getChild<LLButton>("unlink_btn");
 	
@@ -329,7 +327,6 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
 
 	mCheckSnapToGrid(NULL),
 	mBtnGridOptions(NULL),
-	mTitleMedia(NULL),
 	mComboGridMode(NULL),
 	mCheckStretchUniform(NULL),
 	mCheckStretchTexture(NULL),
@@ -369,8 +366,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
 	mLandImpactsObserver(NULL),
 
 	mDirty(TRUE),
-	mHasSelection(TRUE),
-	mNeedMediaTitle(TRUE)
+	mHasSelection(TRUE)
 {
 	gFloaterTools = this;
 
@@ -394,9 +390,6 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
 	mCommitCallbackRegistrar.add("BuildTool.applyToSelection",	boost::bind(&click_apply_to_selection, this));
 	mCommitCallbackRegistrar.add("BuildTool.commitRadioLand",	boost::bind(&commit_radio_group_land,_1));
 	mCommitCallbackRegistrar.add("BuildTool.LandBrushForce",	boost::bind(&commit_slider_dozer_force,_1));
-	mCommitCallbackRegistrar.add("BuildTool.AddMedia",			boost::bind(&LLFloaterTools::onClickBtnAddMedia,this));
-	mCommitCallbackRegistrar.add("BuildTool.DeleteMedia",		boost::bind(&LLFloaterTools::onClickBtnDeleteMedia,this));
-	mCommitCallbackRegistrar.add("BuildTool.EditMedia",			boost::bind(&LLFloaterTools::onClickBtnEditMedia,this));
 
 	mCommitCallbackRegistrar.add("BuildTool.LinkObjects",		boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));
 	mCommitCallbackRegistrar.add("BuildTool.UnlinkObjects",		boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance()));
@@ -553,7 +546,7 @@ void LLFloaterTools::refresh()
 	mPanelObject->refresh();
 	mPanelVolume->refresh();
 	mPanelFace->refresh();
-	refreshMedia();
+    mPanelFace->refreshMedia();
 	mPanelContents->refresh();
 	mPanelLandInfo->refresh();
 
@@ -580,9 +573,6 @@ void LLFloaterTools::draw()
 		mDirty = FALSE;
 	}
 
-	// grab media name/title and update the UI widget
-	updateMediaTitle();
-
 	//	mCheckSelectIndividual->set(gSavedSettings.getBOOL("EditLinkedParts"));
 	LLFloater::draw();
 }
@@ -906,8 +896,7 @@ void LLFloaterTools::onClose(bool app_quitting)
 	LLViewerJoystick::getInstance()->moveAvatar(false);
 
 	// destroy media source used to grab media title
-	if( mTitleMedia )
-		mTitleMedia->unloadMediaSource();
+	mPanelFace->unloadMedia();
 
     // Different from handle_reset_view in that it doesn't actually 
 	//   move the camera if EditCameraMovement is not set.
@@ -1160,51 +1149,6 @@ void LLFloaterTools::onFocusReceived()
 	LLFloater::onFocusReceived();
 }
 
-// Media stuff
-void LLFloaterTools::refreshMedia()
-{
-	getMediaState();	
-}
-
-bool LLFloaterTools::selectedMediaEditable()
-{
-	U32 owner_mask_on;
-	U32 owner_mask_off;
-	U32 valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_OWNER, 
-																	  &owner_mask_on, &owner_mask_off );
-	U32 group_mask_on;
-	U32 group_mask_off;
-	U32 valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_GROUP, 
-																	  &group_mask_on, &group_mask_off );
-	U32 everyone_mask_on;
-	U32 everyone_mask_off;
-	S32 valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_EVERYONE, 
-																		 &everyone_mask_on, &everyone_mask_off );
-	
-	bool selected_Media_editable = false;
-	
-	// if perms we got back are valid
-	if ( valid_owner_perms &&
-		valid_group_perms && 
-		valid_everyone_perms )
-	{
-		
-		if ( ( owner_mask_on & PERM_MODIFY ) ||
-			( group_mask_on & PERM_MODIFY ) || 
-			( group_mask_on & PERM_MODIFY ) )
-		{
-			selected_Media_editable = true;
-		}
-		else
-			// user is NOT allowed to press the RESET button
-		{
-			selected_Media_editable = false;
-		};
-	};
-	
-	return selected_Media_editable;
-}
-
 void LLFloaterTools::updateLandImpacts()
 {
 	LLParcel *parcel = mParcelSelection->getParcel();
@@ -1221,784 +1165,3 @@ void LLFloaterTools::updateLandImpacts()
 	}
 }
 
-void LLFloaterTools::getMediaState()
-{
-	LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
-	LLViewerObject* first_object = selected_objects->getFirstObject();
-	LLTextBox* media_info = getChild<LLTextBox>("media_info");
-	
-	if( !(first_object 
-		  && first_object->getPCode() == LL_PCODE_VOLUME
-		  &&first_object->permModify() 
-	      ))
-	{
-		getChildView("add_media")->setEnabled(FALSE);
-		media_info->clear();
-		clearMediaSettings();
-		return;
-	}
-	
-	std::string url = first_object->getRegion()->getCapability("ObjectMedia");
-	bool has_media_capability = (!url.empty());
-	
-	if(!has_media_capability)
-	{
-		getChildView("add_media")->setEnabled(FALSE);
-		LL_WARNS("LLFloaterToolsMedia") << "Media not enabled (no capability) in this region!" << LL_ENDL;
-		clearMediaSettings();
-		return;
-	}
-	
-	BOOL is_nonpermanent_enforced = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode() 
-		&& LLSelectMgr::getInstance()->selectGetRootsNonPermanentEnforced())
-		|| LLSelectMgr::getInstance()->selectGetNonPermanentEnforced();
-	bool editable = is_nonpermanent_enforced && (first_object->permModify() || selectedMediaEditable());
-
-	// Check modify permissions and whether any selected objects are in
-	// the process of being fetched.  If they are, then we're not editable
-	if (editable)
-	{
-		LLObjectSelection::iterator iter = selected_objects->begin(); 
-		LLObjectSelection::iterator end = selected_objects->end();
-		for ( ; iter != end; ++iter)
-		{
-			LLSelectNode* node = *iter;
-			LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject());
-			if (NULL != object)
-			{
-				if (!object->permModify())
-				{
-					LL_INFOS("LLFloaterToolsMedia")
-						<< "Selection not editable due to lack of modify permissions on object id "
-						<< object->getID() << LL_ENDL;
-					
-					editable = false;
-					break;
-				}
-				// XXX DISABLE this for now, because when the fetch finally 
-				// does come in, the state of this floater doesn't properly
-				// update.  Re-selecting fixes the problem, but there is 
-				// contention as to whether this is a sufficient solution.
-//				if (object->isMediaDataBeingFetched())
-//				{
-//					LL_INFOS("LLFloaterToolsMedia")
-//						<< "Selection not editable due to media data being fetched for object id "
-//						<< object->getID() << LL_ENDL;
-//						
-//					editable = false;
-//					break;
-//				}
-			}
-		}
-	}
-
-	// Media settings
-	bool bool_has_media = false;
-	struct media_functor : public LLSelectedTEGetFunctor<bool>
-	{
-		bool get(LLViewerObject* object, S32 face)
-		{
-			LLTextureEntry *te = object->getTE(face);
-			if (te)
-			{
-				return te->hasMedia();
-			}
-			return false;
-		}
-	} func;
-	
-	
-	// check if all faces have media(or, all dont have media)
-	LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, bool_has_media );
-	
-	const LLMediaEntry default_media_data;
-	
-	struct functor_getter_media_data : public LLSelectedTEGetFunctor< LLMediaEntry>
-    {
-		functor_getter_media_data(const LLMediaEntry& entry): mMediaEntry(entry) {}	
-
-        LLMediaEntry get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return *(object->getTE(face)->getMediaData());
-			return mMediaEntry;
-        };
-		
-		const LLMediaEntry& mMediaEntry;
-		
-    } func_media_data(default_media_data);
-
-	LLMediaEntry media_data_get;
-    LLFloaterMediaSettings::getInstance()->mMultipleMedia = !(selected_objects->getSelectedTEValue( &func_media_data, media_data_get ));
-	
-	std::string multi_media_info_str = LLTrans::getString("Multiple Media");
-	std::string media_title = "";
-	// update UI depending on whether "object" (prim or face) has media
-	// and whether or not you are allowed to edit it.
-	
-	getChildView("add_media")->setEnabled(editable);
-	// IF all the faces have media (or all dont have media)
-	if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
-	{
-		// TODO: get media title and set it.
-		media_info->clear();
-		// if identical is set, all faces are same (whether all empty or has the same media)
-		if(!(LLFloaterMediaSettings::getInstance()->mMultipleMedia) )
-		{
-			// Media data is valid
-			if(media_data_get!=default_media_data)
-			{
-				// initial media title is the media URL (until we get the name)
-				media_title = media_data_get.getHomeURL();
-			}
-			// else all faces might be empty. 
-		}
-		else // there' re Different Medias' been set on on the faces.
-		{
-			media_title = multi_media_info_str;
-		}
-		
-		getChildView("delete_media")->setEnabled(bool_has_media && editable );
-			// TODO: display a list of all media on the face - use 'identical' flag
-	}
-	else // not all face has media but at least one does.
-	{
-		// seleted faces have not identical value
-		LLFloaterMediaSettings::getInstance()->mMultipleValidMedia = selected_objects->isMultipleTEValue(&func_media_data, default_media_data );
-	
-		if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
-		{
-			media_title = multi_media_info_str;
-		}
-		else
-		{
-			// Media data is valid
-			if(media_data_get!=default_media_data)
-			{
-				// initial media title is the media URL (until we get the name)
-				media_title = media_data_get.getHomeURL();
-			}
-		}
-		
-		getChildView("delete_media")->setEnabled(TRUE);
-	}
-
-	navigateToTitleMedia(media_title);
-	media_info->setText(media_title);
-	
-	// load values for media settings
-	updateMediaSettings();
-	
-	LLFloaterMediaSettings::initValues(mMediaSettings, editable );
-}
-
-
-//////////////////////////////////////////////////////////////////////////////
-// called when a user wants to add media to a prim or prim face
-void LLFloaterTools::onClickBtnAddMedia()
-{
-	// check if multiple faces are selected
-	if(LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected())
-	{
-		LLNotificationsUtil::add("MultipleFacesSelected", LLSD(), LLSD(), multipleFacesSelectedConfirm);
-	}
-	else
-	{
-		onClickBtnEditMedia();
-	}
-}
-
-// static
-bool LLFloaterTools::multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response)
-{
-	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-	switch( option )
-	{
-		case 0:  // "Yes"
-			gFloaterTools->onClickBtnEditMedia();
-			break;
-		case 1:  // "No"
-		default:
-			break;
-	}
-	return false;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// called when a user wants to edit existing media settings on a prim or prim face
-// TODO: test if there is media on the item and only allow editing if present
-void LLFloaterTools::onClickBtnEditMedia()
-{
-	refreshMedia();
-	LLFloaterReg::showInstance("media_settings");	
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// called when a user wants to delete media from a prim or prim face
-void LLFloaterTools::onClickBtnDeleteMedia()
-{
-	LLNotificationsUtil::add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm);
-}
-
-
-// static
-bool LLFloaterTools::deleteMediaConfirm(const LLSD& notification, const LLSD& response)
-{
-	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-	switch( option )
-	{
-		case 0:  // "Yes"
-			LLSelectMgr::getInstance()->selectionSetMedia( 0, LLSD() );
-			if(LLFloaterReg::instanceVisible("media_settings"))
-			{
-				LLFloaterReg::hideInstance("media_settings");
-			}
-			break;
-			
-		case 1:  // "No"
-		default:
-			break;
-	}
-	return false;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-void LLFloaterTools::clearMediaSettings()
-{
-	LLFloaterMediaSettings::clearValues(false);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-void LLFloaterTools::navigateToTitleMedia( const std::string url )
-{
-	std::string multi_media_info_str = LLTrans::getString("Multiple Media");
-	if (url.empty() || multi_media_info_str == url)
-	{
-		// nothing to show
-		mNeedMediaTitle = false;
-	}
-	else if (mTitleMedia)
-	{
-		LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin();
-
-		if ( media_plugin ) // Shouldn't this be after navigateTo creates plugin?
-		{
-			// if it's a movie, we don't want to hear it
-			media_plugin->setVolume( 0 );
-		};
-
-		// check if url changed or if we need a new media source
-		if (mTitleMedia->getCurrentNavUrl() != url || media_plugin == NULL)
-		{
-			mTitleMedia->navigateTo( url );
-		}
-
-		// flag that we need to update the title (even if no request were made)
-		mNeedMediaTitle = true;
-	}
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-void LLFloaterTools::updateMediaTitle()
-{
-	// only get the media name if we need it
-	if ( ! mNeedMediaTitle )
-		return;
-
-	// get plugin impl
-	LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin();
-	if ( media_plugin )
-	{
-		// get the media name (asynchronous - must call repeatedly)
-		std::string media_title = media_plugin->getMediaName();
-
-		// only replace the title if what we get contains something
-		if ( ! media_title.empty() )
-		{
-			// update the UI widget
-			LLTextBox* media_title_field = getChild<LLTextBox>("media_info");
-			if ( media_title_field )
-			{
-				media_title_field->setText( media_title );
-
-				// stop looking for a title when we get one
-				// FIXME: check this is the right approach
-				mNeedMediaTitle = false;
-			};
-		};
-	};
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-void LLFloaterTools::updateMediaSettings()
-{
-    bool identical( false );
-    std::string base_key( "" );
-    std::string value_str( "" );
-    int value_int = 0;
-    bool value_bool = false;
-	LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
-    // TODO: (CP) refactor this using something clever or boost or both !!
-
-    const LLMediaEntry default_media_data;
-
-    // controls 
-    U8 value_u8 = default_media_data.getControls();
-    struct functor_getter_controls : public LLSelectedTEGetFunctor< U8 >
-    {
-		functor_getter_controls(const LLMediaEntry &entry) : mMediaEntry(entry) {}
-		
-        U8 get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return object->getTE(face)->getMediaData()->getControls();
-            return mMediaEntry.getControls();
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_controls(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_controls, value_u8 );
-    base_key = std::string( LLMediaEntry::CONTROLS_KEY );
-    mMediaSettings[ base_key ] = value_u8;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // First click (formerly left click)
-    value_bool = default_media_data.getFirstClickInteract();
-    struct functor_getter_first_click : public LLSelectedTEGetFunctor< bool >
-    {
-		functor_getter_first_click(const LLMediaEntry& entry): mMediaEntry(entry) {}		
-		
-        bool get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return object->getTE(face)->getMediaData()->getFirstClickInteract();
-            return mMediaEntry.getFirstClickInteract();
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_first_click(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_first_click, value_bool );
-    base_key = std::string( LLMediaEntry::FIRST_CLICK_INTERACT_KEY );
-    mMediaSettings[ base_key ] = value_bool;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // Home URL
-    value_str = default_media_data.getHomeURL();
-    struct functor_getter_home_url : public LLSelectedTEGetFunctor< std::string >
-    {
-		functor_getter_home_url(const LLMediaEntry& entry): mMediaEntry(entry) {}		
-		
-        std::string get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return object->getTE(face)->getMediaData()->getHomeURL();
-            return mMediaEntry.getHomeURL();
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_home_url(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_home_url, value_str );
-    base_key = std::string( LLMediaEntry::HOME_URL_KEY );
-    mMediaSettings[ base_key ] = value_str;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // Current URL
-    value_str = default_media_data.getCurrentURL();
-    struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string >
-    {
-		functor_getter_current_url(const LLMediaEntry& entry): mMediaEntry(entry) {}
-        
-		std::string get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return object->getTE(face)->getMediaData()->getCurrentURL();
-            return mMediaEntry.getCurrentURL();
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_current_url(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_current_url, value_str );
-    base_key = std::string( LLMediaEntry::CURRENT_URL_KEY );
-    mMediaSettings[ base_key ] = value_str;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // Auto zoom
-    value_bool = default_media_data.getAutoZoom();
-    struct functor_getter_auto_zoom : public LLSelectedTEGetFunctor< bool >
-    {
-		
-		functor_getter_auto_zoom(const LLMediaEntry& entry)	: mMediaEntry(entry) {}	
-		
-        bool get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return object->getTE(face)->getMediaData()->getAutoZoom();
-            return mMediaEntry.getAutoZoom();
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_auto_zoom(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_auto_zoom, value_bool );
-    base_key = std::string( LLMediaEntry::AUTO_ZOOM_KEY );
-    mMediaSettings[ base_key ] = value_bool;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // Auto play
-    //value_bool = default_media_data.getAutoPlay();
-	// set default to auto play TRUE -- angela  EXT-5172
-	value_bool = true;
-    struct functor_getter_auto_play : public LLSelectedTEGetFunctor< bool >
-    {
-		functor_getter_auto_play(const LLMediaEntry& entry)	: mMediaEntry(entry) {}	
-			
-        bool get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return object->getTE(face)->getMediaData()->getAutoPlay();
-            //return mMediaEntry.getAutoPlay(); set default to auto play TRUE -- angela  EXT-5172
-			return true;
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_auto_play(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_auto_play, value_bool );
-    base_key = std::string( LLMediaEntry::AUTO_PLAY_KEY );
-    mMediaSettings[ base_key ] = value_bool;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-	
-    // Auto scale
-	// set default to auto scale TRUE -- angela  EXT-5172
-    //value_bool = default_media_data.getAutoScale();
-	value_bool = true;
-    struct functor_getter_auto_scale : public LLSelectedTEGetFunctor< bool >
-    {
-		functor_getter_auto_scale(const LLMediaEntry& entry): mMediaEntry(entry) {}	
-
-        bool get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return object->getTE(face)->getMediaData()->getAutoScale();
-           // return mMediaEntry.getAutoScale();  set default to auto scale TRUE -- angela  EXT-5172
-			return true;
-		};
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_auto_scale(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_auto_scale, value_bool );
-    base_key = std::string( LLMediaEntry::AUTO_SCALE_KEY );
-    mMediaSettings[ base_key ] = value_bool;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // Auto loop
-    value_bool = default_media_data.getAutoLoop();
-    struct functor_getter_auto_loop : public LLSelectedTEGetFunctor< bool >
-    {
-		functor_getter_auto_loop(const LLMediaEntry& entry)	: mMediaEntry(entry) {}	
-
-        bool get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return object->getTE(face)->getMediaData()->getAutoLoop();
-            return mMediaEntry.getAutoLoop();
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_auto_loop(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_auto_loop, value_bool );
-    base_key = std::string( LLMediaEntry::AUTO_LOOP_KEY );
-    mMediaSettings[ base_key ] = value_bool;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // width pixels (if not auto scaled)
-    value_int = default_media_data.getWidthPixels();
-    struct functor_getter_width_pixels : public LLSelectedTEGetFunctor< int >
-    {
-		functor_getter_width_pixels(const LLMediaEntry& entry): mMediaEntry(entry) {}		
-
-        int get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return object->getTE(face)->getMediaData()->getWidthPixels();
-            return mMediaEntry.getWidthPixels();
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_width_pixels(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_width_pixels, value_int );
-    base_key = std::string( LLMediaEntry::WIDTH_PIXELS_KEY );
-    mMediaSettings[ base_key ] = value_int;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // height pixels (if not auto scaled)
-    value_int = default_media_data.getHeightPixels();
-    struct functor_getter_height_pixels : public LLSelectedTEGetFunctor< int >
-    {
-		functor_getter_height_pixels(const LLMediaEntry& entry)	: mMediaEntry(entry) {}
-        
-		int get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return object->getTE(face)->getMediaData()->getHeightPixels();
-            return mMediaEntry.getHeightPixels();
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_height_pixels(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_height_pixels, value_int );
-    base_key = std::string( LLMediaEntry::HEIGHT_PIXELS_KEY );
-    mMediaSettings[ base_key ] = value_int;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // Enable Alt image
-    value_bool = default_media_data.getAltImageEnable();
-    struct functor_getter_enable_alt_image : public LLSelectedTEGetFunctor< bool >
-    {
-		functor_getter_enable_alt_image(const LLMediaEntry& entry): mMediaEntry(entry) {}
-        
-		bool get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return object->getTE(face)->getMediaData()->getAltImageEnable();
-            return mMediaEntry.getAltImageEnable();
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_enable_alt_image(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_enable_alt_image, value_bool );
-    base_key = std::string( LLMediaEntry::ALT_IMAGE_ENABLE_KEY );
-    mMediaSettings[ base_key ] = value_bool;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // Perms - owner interact
-    value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_OWNER );
-    struct functor_getter_perms_owner_interact : public LLSelectedTEGetFunctor< bool >
-    {
-		functor_getter_perms_owner_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
-        
-		bool get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_OWNER));
-            return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_OWNER );
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_perms_owner_interact(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_perms_owner_interact, value_bool );
-    base_key = std::string( LLPanelContents::PERMS_OWNER_INTERACT_KEY );
-    mMediaSettings[ base_key ] = value_bool;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // Perms - owner control
-    value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_OWNER );
-    struct functor_getter_perms_owner_control : public LLSelectedTEGetFunctor< bool >
-    {
-		functor_getter_perms_owner_control(const LLMediaEntry& entry)	: mMediaEntry(entry) {}
-        
-        bool get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_OWNER));
-            return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_OWNER );
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_perms_owner_control(default_media_data);
-    identical = selected_objects ->getSelectedTEValue( &func_perms_owner_control, value_bool );
-    base_key = std::string( LLPanelContents::PERMS_OWNER_CONTROL_KEY );
-    mMediaSettings[ base_key ] = value_bool;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // Perms - group interact
-    value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_GROUP );
-    struct functor_getter_perms_group_interact : public LLSelectedTEGetFunctor< bool >
-    {
-		functor_getter_perms_group_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
-        
-        bool get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_GROUP));
-            return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_GROUP );
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_perms_group_interact(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_perms_group_interact, value_bool );
-    base_key = std::string( LLPanelContents::PERMS_GROUP_INTERACT_KEY );
-    mMediaSettings[ base_key ] = value_bool;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // Perms - group control
-    value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_GROUP );
-    struct functor_getter_perms_group_control : public LLSelectedTEGetFunctor< bool >
-    {
-		functor_getter_perms_group_control(const LLMediaEntry& entry): mMediaEntry(entry) {}
-        
-        bool get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_GROUP));
-            return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_GROUP );
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_perms_group_control(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_perms_group_control, value_bool );
-    base_key = std::string( LLPanelContents::PERMS_GROUP_CONTROL_KEY );
-    mMediaSettings[ base_key ] = value_bool;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // Perms - anyone interact
-    value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_ANYONE );
-    struct functor_getter_perms_anyone_interact : public LLSelectedTEGetFunctor< bool >
-    {
-		functor_getter_perms_anyone_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
-        
-        bool get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_ANYONE));
-            return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_ANYONE );
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_perms_anyone_interact(default_media_data);
-    identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_perms_anyone_interact, value_bool );
-    base_key = std::string( LLPanelContents::PERMS_ANYONE_INTERACT_KEY );
-    mMediaSettings[ base_key ] = value_bool;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // Perms - anyone control
-    value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_ANYONE );
-    struct functor_getter_perms_anyone_control : public LLSelectedTEGetFunctor< bool >
-    {
-		functor_getter_perms_anyone_control(const LLMediaEntry& entry)	: mMediaEntry(entry) {}
-        
-        bool get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_ANYONE));
-            return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_ANYONE );
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_perms_anyone_control(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_perms_anyone_control, value_bool );
-    base_key = std::string( LLPanelContents::PERMS_ANYONE_CONTROL_KEY );
-    mMediaSettings[ base_key ] = value_bool;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // security - whitelist enable
-    value_bool = default_media_data.getWhiteListEnable();
-    struct functor_getter_whitelist_enable : public LLSelectedTEGetFunctor< bool >
-    {
-		functor_getter_whitelist_enable(const LLMediaEntry& entry)	: mMediaEntry(entry) {}
-        
-        bool get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return object->getTE(face)->getMediaData()->getWhiteListEnable();
-            return mMediaEntry.getWhiteListEnable();
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_whitelist_enable(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_whitelist_enable, value_bool );
-    base_key = std::string( LLMediaEntry::WHITELIST_ENABLE_KEY );
-    mMediaSettings[ base_key ] = value_bool;
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-	
-    // security - whitelist URLs
-    std::vector<std::string> value_vector_str = default_media_data.getWhiteList();
-    struct functor_getter_whitelist_urls : public LLSelectedTEGetFunctor< std::vector<std::string> >
-    {
-		functor_getter_whitelist_urls(const LLMediaEntry& entry): mMediaEntry(entry) {}
-        
-        std::vector<std::string> get( LLViewerObject* object, S32 face )
-        {
-            if ( object )
-                if ( object->getTE(face) )
-                    if ( object->getTE(face)->getMediaData() )
-                        return object->getTE(face)->getMediaData()->getWhiteList();
-            return mMediaEntry.getWhiteList();
-        };
-		
-		const LLMediaEntry &mMediaEntry;
-		
-    } func_whitelist_urls(default_media_data);
-    identical = selected_objects->getSelectedTEValue( &func_whitelist_urls, value_vector_str );
-    base_key = std::string( LLMediaEntry::WHITELIST_KEY );
-	mMediaSettings[ base_key ].clear();
-    std::vector< std::string >::iterator iter = value_vector_str.begin();
-    while( iter != value_vector_str.end() )
-    {
-        std::string white_list_url = *iter;
-        mMediaSettings[ base_key ].append( white_list_url );
-        ++iter;
-    };
-	
-    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
-}
-
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index ffff564ad41b03fd5d5cc2101c6402edbc6be17b..3bb6492a6e2cbbaaef2ccb8e1504d51704cbadfa 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -44,7 +44,6 @@ class LLRadioGroup;
 class LLSlider;
 class LLTabContainer;
 class LLTextBox;
-class LLMediaCtrl;
 class LLTool;
 class LLParcelSelection;
 class LLObjectSelection;
@@ -98,11 +97,6 @@ class LLFloaterTools
 	static void setEditTool(void* data);
 	void setTool(const LLSD& user_data);
 	void saveLastTool();
-	void onClickBtnDeleteMedia();
-	void onClickBtnAddMedia();
-	void onClickBtnEditMedia();
-	void clearMediaSettings();
-	bool selectedMediaEditable();
 	void updateLandImpacts();
 
 	static void setGridMode(S32 mode);
@@ -111,13 +105,6 @@ class LLFloaterTools
 
 private:
 	void refresh();
-	void refreshMedia();
-	void getMediaState();
-	void updateMediaSettings();
-	void navigateToTitleMedia( const std::string url ); // navigate if changed
-	void updateMediaTitle();
-	static bool deleteMediaConfirm(const LLSD& notification, const LLSD& response);
-	static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);
 	static void setObjectType( LLPCode pcode );
 	void onClickGridOptions();
 
@@ -193,19 +180,12 @@ class LLFloaterTools
 	LLParcelSelectionHandle	mParcelSelection;
 	LLObjectSelectionHandle	mObjectSelection;
 
-	LLMediaCtrl				*mTitleMedia;
-	bool					mNeedMediaTitle;
-
 private:
 	BOOL					mDirty;
 	BOOL                    mHasSelection;
 
 	std::map<std::string, std::string> mStatusText;
 
-
-protected:
-	LLSD				mMediaSettings;
-
 public:
 	static bool		sShowObjectCost;
 	static bool		sPreviousFocusOnAvatar;
diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp
index d5c2ad5f81f7f74dbe2f7caf03d5a57ce4424ed0..917d6dfcd0aebba72fc9cb88748a8b48eb2ac1fd 100644
--- a/indra/newview/llfloaterurlentry.cpp
+++ b/indra/newview/llfloaterurlentry.cpp
@@ -112,16 +112,6 @@ void LLFloaterURLEntry::headerFetchComplete(S32 status, const std::string& mime_
 		panel_media->setMediaType(mime_type);
 		panel_media->setMediaURL(mMediaURLEdit->getValue().asString());
 	}
-	else
-	{
-		LLPanelFace* panel_face = dynamic_cast<LLPanelFace*>(mPanelLandMediaHandle.get());
-		if(panel_face)
-		{
-			panel_face->setMediaType(mime_type);
-			panel_face->setMediaURL(mMediaURLEdit->getValue().asString());
-		}
-
-	}
 
 	getChildView("loading_label")->setVisible( false);
 	closeFloater();
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 09235d8fb2f9a3e3b6d465dc88541c264dfcb135..977023cfe4aa2b18483a6642ebadbf69b604b6f1 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -1008,7 +1008,7 @@ void LLFloaterWorldMap::clearAvatarSelection(BOOL clear_ui)
 	{
 		mTrackedStatus = LLTracker::TRACKING_NOTHING;
 		LLCtrlListInterface *list = mListFriendCombo;
-		if (list)
+		if (list && list->getSelectedValue().asString() != "None")
 		{
 			list->selectByValue( "None" );
 		}
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index 0be748ace9df10e4938a526acfdec8ffaaa96a24..e395da7f1e66d29e6f9e709cf2243e423a1389c9 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -327,22 +327,63 @@ void LLFriendCardsManager::syncFriendCardsFolders()
 /************************************************************************/
 /*		Private Methods                                                 */
 /************************************************************************/
-const LLUUID& LLFriendCardsManager::findFriendFolderUUIDImpl() const
+const LLUUID& LLFriendCardsManager::findFirstCallingCardSubfolder(const LLUUID &parent_id) const
 {
-	const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
+    if (parent_id.isNull())
+    {
+        return LLUUID::null;
+    }
 
-	std::string friendFolderName = get_friend_folder_name();
+    LLInventoryModel::cat_array_t* cats;
+    LLInventoryModel::item_array_t* items;
+    gInventory.getDirectDescendentsOf(parent_id, cats, items);
 
-	return findChildFolderUUID(callingCardsFolderID, friendFolderName);
+    if (!cats || !items || cats->size() == 0)
+    {
+        // call failed
+        return LLUUID::null;
+    }
+
+    if (cats->size() > 1)
+    {
+        const LLViewerInventoryCategory* friendFolder = gInventory.getCategory(parent_id);
+        if (friendFolder)
+        {
+            LL_WARNS_ONCE() << friendFolder->getName() << " folder contains more than one folder" << LL_ENDL;
+        }
+    }
+
+    for (LLInventoryModel::cat_array_t::const_iterator iter = cats->begin();
+        iter != cats->end();
+        ++iter)
+    {
+        const LLInventoryCategory* category = (*iter);
+        if (category->getPreferredType() == LLFolderType::FT_CALLINGCARD)
+        {
+            return category->getUUID();
+        }
+    }
+
+    return LLUUID::null;
 }
 
-const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const
+// Inventorry ->
+//   Calling Cards - >
+//     Friends - > (the only expected folder)
+//       All (the only expected folder)
+
+const LLUUID& LLFriendCardsManager::findFriendFolderUUIDImpl() const
 {
-	LLUUID friendFolderUUID = findFriendFolderUUIDImpl();
+    const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
+
+    return findFirstCallingCardSubfolder(callingCardsFolderID);
+}
 
-	std::string friendAllSubfolderName = get_friend_all_subfolder_name();
+const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const
+{
+    LLUUID friendFolderUUID = findFriendFolderUUIDImpl();
 
-	return findChildFolderUUID(friendFolderUUID, friendAllSubfolderName);
+    return findFirstCallingCardSubfolder(friendFolderUUID);
 }
 
 const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const
diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h
index 2fb912a93048b87340a4b6e4e8d32e0a230f14f6..f5679d7d85d97749e494f803895bd11b866be87e 100644
--- a/indra/newview/llfriendcard.h
+++ b/indra/newview/llfriendcard.h
@@ -116,6 +116,7 @@ class LLFriendCardsManager
 	}
 
 	const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const;
+    const LLUUID& findFirstCallingCardSubfolder(const LLUUID &parent_id) const;
 	const LLUUID& findFriendFolderUUIDImpl() const;
 	const LLUUID& findFriendAllSubfolderUUIDImpl() const;
 	const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID);
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index 91ab445273563b9bd92427e7c1d541209a14742c..7c8e8279c257ee49038a071f58d3a9dae4a4943a 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -185,7 +185,7 @@ class LLGestureMgr : public LLSingleton<LLGestureMgr>, public LLInventoryFetchIt
 	std::set<LLUUID> mLoadingAssets;
 
 	// LLEventHost interface
-	boost::shared_ptr<LLGestureListener> mListener;
+	std::shared_ptr<LLGestureListener> mListener;
 };
 
 #endif
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index e7bc2a926852104ce4d70d75f4ca22a750669098..84a12787679e0846b1804172972831a6de85be6d 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -196,7 +196,7 @@ LLFetchLeaveGroupData* gFetchLeaveGroupData = NULL;
 // static
 void LLGroupActions::search()
 {
-	LLFloaterReg::showInstance("search");
+	LLFloaterReg::showInstance("search", LLSD().with("collection", "groups"));
 }
 
 // static
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index 7be35ac2600a1139c184f3b915d5d19f5676c01a..5952edfc4449cefc88f11a9bf1a98b553243e869 100644
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -330,7 +330,7 @@ void LLHUDText::updateVisibility()
 
 	if (!mSourceObject)
 	{
-		LL_WARNS() << "HUD text: mSourceObject is NULL,  mOnHUDAttachment: " << mOnHUDAttachment << LL_ENDL;
+        // Beacons
 		mVisible = TRUE;
 		if (mOnHUDAttachment)
 		{
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index b7e0a6a794a003cb4ff4cb7160fe7c2f2e40b25e..98c1d65f9215f8a9d5ae0befd1dbc3356cdf2825 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -532,7 +532,6 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 	mSessionInitialized(false),
 	mCallBackEnabled(true),
 	mTextIMPossible(true),
-	mOtherParticipantIsAvatar(true),
 	mStartCallOnInitialize(false),
 	mStartedAsIMCall(voice),
 	mIsDNDsend(false),
@@ -544,13 +543,6 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 	if (IM_NOTHING_SPECIAL == mType || IM_SESSION_P2P_INVITE == mType)
 	{
 		mVoiceChannel  = new LLVoiceChannelP2P(session_id, name, other_participant_id);
-		mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
-
-		// check if it was AVALINE call
-		if (!mOtherParticipantIsAvatar)
-		{
-			mSessionType = AVALINE_SESSION;
-		} 
 	}
 	else
 	{
@@ -651,9 +643,6 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
 
 	switch(mSessionType)
 	{
-	case AVALINE_SESSION:
-		// no text notifications
-		break;
 	case P2P_SESSION:
 		LLAvatarNameCache::get(mOtherParticipantID, &av_name);
 		other_avatar_name = av_name.getUserName();
@@ -913,11 +902,6 @@ bool LLIMModel::LLIMSession::isGroupChat()
 	return IM_SESSION_GROUP_START == mType || (IM_SESSION_INVITE == mType && gAgent.isInGroup(mSessionID, TRUE));
 }
 
-bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
-{
-	return !mOtherParticipantIsAvatar;
-}
-
 LLUUID LLIMModel::LLIMSession::generateOutgoingAdHocHash() const
 {
 	LLUUID hash = LLUUID::null;
@@ -1795,7 +1779,6 @@ LLIMMgr::onConfirmForceCloseError(
 
 LLCallDialogManager::LLCallDialogManager():
 mPreviousSessionlName(""),
-mPreviousSessionType(LLIMModel::LLIMSession::P2P_SESSION),
 mCurrentSessionlName(""),
 mSession(NULL),
 mOldState(LLVoiceChannel::STATE_READY)
@@ -1826,12 +1809,6 @@ void LLCallDialogManager::onVoiceChannelChangedInt(const LLUUID &session_id)
 		mCurrentSessionlName = ""; // Empty string results in "Nearby Voice Chat" after substitution
 		return;
 	}
-	
-	if (mSession)
-	{
-		// store previous session type to process Avaline calls in dialogs
-		mPreviousSessionType = mSession->mSessionType;
-	}
 
 	mSession = session;
 
@@ -1857,7 +1834,6 @@ void LLCallDialogManager::onVoiceChannelChangedInt(const LLUUID &session_id)
 		mCallDialogPayload["session_name"] = mSession->mName;
 		mCallDialogPayload["other_user_id"] = mSession->mOtherParticipantID;
 		mCallDialogPayload["old_channel_name"] = mPreviousSessionlName;
-		mCallDialogPayload["old_session_type"] = mPreviousSessionType;
 		mCallDialogPayload["state"] = LLVoiceChannel::STATE_CALL_STARTED;
 		mCallDialogPayload["disconnected_channel_name"] = mSession->mName;
 		mCallDialogPayload["session_type"] = mSession->mSessionType;
@@ -1893,7 +1869,6 @@ void LLCallDialogManager::onVoiceChannelStateChangedInt(const LLVoiceChannel::ES
 	mCallDialogPayload["session_name"] = mSession->mName;
 	mCallDialogPayload["other_user_id"] = mSession->mOtherParticipantID;
 	mCallDialogPayload["old_channel_name"] = mPreviousSessionlName;
-	mCallDialogPayload["old_session_type"] = mPreviousSessionType;
 	mCallDialogPayload["state"] = new_state;
 	mCallDialogPayload["disconnected_channel_name"] = mSession->mName;
 	mCallDialogPayload["session_type"] = mSession->mSessionType;
@@ -1910,8 +1885,7 @@ void LLCallDialogManager::onVoiceChannelStateChangedInt(const LLVoiceChannel::ES
 		break;
 
 	case LLVoiceChannel::STATE_HUNG_UP:
-		// this state is coming before session is changed, so, put it into payload map
-		mCallDialogPayload["old_session_type"] = mSession->mSessionType;
+		// this state is coming before session is changed
 		break;
 
 	case LLVoiceChannel::STATE_CONNECTED :
@@ -2031,7 +2005,6 @@ void LLCallDialog::onOpen(const LLSD& key)
 
 void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)
 {
-	// *NOTE: 12/28/2009: check avaline calls: LLVoiceClient::isParticipantAvatar returns false for them
 	bool participant_is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
 
 	bool is_group = participant_is_avatar && gAgent.isInGroup(session_id, TRUE);
@@ -2052,8 +2025,8 @@ void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)
 	}
 	else
 	{
-		avatar_icon->setValue("Avaline_Icon");
-		avatar_icon->setToolTip(std::string(""));
+        LL_WARNS() << "Participant neither avatar nor group" << LL_ENDL;
+        group_icon->setValue(session_id);
 	}
 }
 
@@ -2097,13 +2070,7 @@ void LLOutgoingCallDialog::show(const LLSD& key)
 	// tell the user which voice channel they are leaving
 	if (!mPayload["old_channel_name"].asString().empty())
 	{
-		bool was_avaline_call = LLIMModel::LLIMSession::AVALINE_SESSION == mPayload["old_session_type"].asInteger();
-
 		std::string old_caller_name = mPayload["old_channel_name"].asString();
-		if (was_avaline_call)
-		{
-			old_caller_name = LLTextUtil::formatPhoneNumber(old_caller_name);
-		}
 
 		getChild<LLUICtrl>("leaving")->setTextArg("[CURRENT_CHAT]", old_caller_name);
 		show_oldchannel = true;
@@ -2116,10 +2083,6 @@ void LLOutgoingCallDialog::show(const LLSD& key)
 	if (!mPayload["disconnected_channel_name"].asString().empty())
 	{
 		std::string channel_name = mPayload["disconnected_channel_name"].asString();
-		if (LLIMModel::LLIMSession::AVALINE_SESSION == mPayload["session_type"].asInteger())
-		{
-			channel_name = LLTextUtil::formatPhoneNumber(channel_name);
-		}
 		getChild<LLUICtrl>("nearby")->setTextArg("[VOICE_CHANNEL_NAME]", channel_name);
 
 		// skipping "You will now be reconnected to nearby" in notification when call is ended by disabling voice,
@@ -2135,16 +2098,11 @@ void LLOutgoingCallDialog::show(const LLSD& key)
 	std::string callee_name = mPayload["session_name"].asString();
 
 	LLUUID session_id = mPayload["session_id"].asUUID();
-	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
 
-	if (callee_name == "anonymous")
+	if (callee_name == "anonymous") // obsolete? Likely was part of avaline support
 	{
 		callee_name = getString("anonymous");
 	}
-	else if (!is_avatar)
-	{
-		callee_name = LLTextUtil::formatPhoneNumber(callee_name);
-	}
 	
 	LLSD callee_id = mPayload["other_user_id"];
 	// Beautification:  Since you know who you called, just show display name
@@ -2344,18 +2302,11 @@ BOOL LLIncomingCallDialog::postBuild()
 		call_type = getString(notify_box_type);
 	}
 
-	// check to see if this is an Avaline call
-	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
-	if (caller_name == "anonymous")
+	if (caller_name == "anonymous") // obsolete?  Likely was part of avaline support
 	{
 		caller_name = getString("anonymous");
 		setCallerName(caller_name, caller_name, call_type);
 	}
-	else if (!is_avatar)
-	{
-		caller_name = LLTextUtil::formatPhoneNumber(caller_name);
-		setCallerName(caller_name, caller_name, call_type);
-	}
 	else
 	{
 		// Get the full name information
@@ -2375,7 +2326,7 @@ BOOL LLIncomingCallDialog::postBuild()
 
 	if(notify_box_type != "VoiceInviteGroup" && notify_box_type != "VoiceInviteAdHoc")
 	{
-		// starting notification's timer for P2P and AVALINE invitations
+		// starting notification's timer for P2P invitations
 		mLifetimeTimer.start();
 	}
 	else
@@ -2384,7 +2335,7 @@ BOOL LLIncomingCallDialog::postBuild()
 	}
 
 	//it's not possible to connect to existing Ad-Hoc/Group chat through incoming ad-hoc call
-	//and no IM for avaline
+	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
 	getChildView("Start IM")->setVisible( is_avatar && notify_box_type != "VoiceInviteAdHoc" && notify_box_type != "VoiceInviteGroup");
 
 	setCanDrag(FALSE);
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 79c831ebb6a6981d2f3695ee43c6bdc003bb615f..fdf9806e2ec22f2421e4e6801dea9062359cc4cb 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -72,7 +72,6 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 			P2P_SESSION,
 			GROUP_SESSION,
 			ADHOC_SESSION,
-			AVALINE_SESSION,
 			NONE_SESSION,
 		} SType;
 
@@ -92,12 +91,10 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 		bool isAdHoc();
 		bool isP2P();
 		bool isGroupChat();
-		bool isOtherParticipantAvaline();
 
 		bool isP2PSessionType() const { return mSessionType == P2P_SESSION;}
 		bool isAdHocSessionType() const { return mSessionType == ADHOC_SESSION;}
 		bool isGroupSessionType() const { return mSessionType == GROUP_SESSION;}
-		bool isAvalineSessionType() const { return mSessionType == AVALINE_SESSION;}
 
 		LLUUID generateOutgoingAdHocHash() const;
 
@@ -136,7 +133,6 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 		bool mCallBackEnabled;
 
 		bool mTextIMPossible;
-		bool mOtherParticipantIsAvatar;
 		bool mStartCallOnInitialize;
 
 		//if IM session is created for a voice call
@@ -516,7 +512,6 @@ class LLCallDialogManager : public LLSingleton<LLCallDialogManager>
 
 protected:
 	std::string mPreviousSessionlName;
-	LLIMModel::LLIMSession::SType mPreviousSessionType;
 	std::string mCurrentSessionlName;
 	LLIMModel::LLIMSession* mSession;
 	LLVoiceChannel::EState mOldState;
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 7abe48709b87f601a1fa77d9f60d1200688d1812..427e959ce100ce5bce4c0a91c0de485a232765f6 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -1121,7 +1121,10 @@ void LLInvFVBridge::addMarketplaceContextMenuOptions(U32 flags,
         LLInventoryModel::cat_array_t categories;
         LLInventoryModel::item_array_t items;
         gInventory.collectDescendents(local_version_folder_id, categories, items, FALSE);
-        if (categories.size() >= gSavedSettings.getU32("InventoryOutboxMaxFolderCount"))
+        LLCachedControl<U32> max_depth(gSavedSettings, "InventoryOutboxMaxFolderDepth", 4);
+        LLCachedControl<U32> max_count(gSavedSettings, "InventoryOutboxMaxFolderCount", 20);
+        if (categories.size() >= max_count
+            || depth > (max_depth + 1))
         {
             disabled_items.push_back(std::string("New Folder"));
         }
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index cc1bd846e5059e83be7804c0ba619a1128a7407d..bd106df2ccb9ecbb467ea02da49de4f533ea09fa 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -135,15 +135,7 @@ bool LLCanCache::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
 ///----------------------------------------------------------------------------
 /// Class LLInventoryValidationInfo
 ///----------------------------------------------------------------------------
-LLInventoryValidationInfo::LLInventoryValidationInfo():
-	mFatalErrorCount(0),
-	mWarningCount(0),
-    mLoopCount(0),
-    mOrphanedCount(0),
-	mInitialized(false),
-	mFatalNoRootFolder(false),
-	mFatalNoLibraryRootFolder(false),
-	mFatalQADebugMode(false)
+LLInventoryValidationInfo::LLInventoryValidationInfo()
 {
 }
 
@@ -165,7 +157,6 @@ std::ostream& operator<<(std::ostream& os, const LLInventoryValidationInfo& v)
 void LLInventoryValidationInfo::asLLSD(LLSD& sd) const
 {
 	sd["fatal_error_count"] = mFatalErrorCount;
-	sd["warning_count"] = mWarningCount;
     sd["loop_count"] = mLoopCount;
     sd["orphaned_count"] = mOrphanedCount;
 	sd["initialized"] = mInitialized;
@@ -173,6 +164,20 @@ void LLInventoryValidationInfo::asLLSD(LLSD& sd) const
 	sd["fatal_no_root_folder"] = mFatalNoRootFolder;
 	sd["fatal_no_library_root_folder"] = mFatalNoLibraryRootFolder;
 	sd["fatal_qa_debug_mode"] = mFatalQADebugMode;
+
+	sd["warning_count"] = mWarningCount;
+	if (mWarningCount>0)
+	{
+		sd["warnings"] = LLSD::emptyArray();
+		for (auto const& it : mWarnings)
+		{
+			S32 val =LLSD::Integer(it.second);
+			if (val>0)
+			{
+				sd["warnings"][it.first] = val;
+			}
+		}
+	}
 	if (mMissingRequiredSystemFolders.size()>0)
 	{
 		sd["missing_system_folders"] = LLSD::emptyArray();
@@ -342,13 +347,13 @@ const LLViewerInventoryCategory* LLInventoryModel::getFirstDescendantOf(const LL
 	return NULL;
 }
 
-LLInventoryModel::EAnscestorResult LLInventoryModel::getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const
+LLInventoryModel::EAncestorResult LLInventoryModel::getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const
 {
 	LLInventoryObject *object = getObject(object_id);
     if (!object)
     {
         LL_WARNS(LOG_INV) << "Unable to trace topmost ancestor, initial object " << object_id << " does not exist" << LL_ENDL;
-        return ANSCESTOR_MISSING;
+        return ANCESTOR_MISSING;
     }
 
     std::set<LLUUID> object_ids{ object_id }; // loop protection
@@ -358,19 +363,19 @@ LLInventoryModel::EAnscestorResult LLInventoryModel::getObjectTopmostAncestor(co
         if (object_ids.find(parent_id) != object_ids.end())
         {
             LL_WARNS(LOG_INV) << "Detected a loop on an object " << parent_id << " when searching for ancestor of " << object_id << LL_ENDL;
-            return ANSCESTOR_LOOP;
+            return ANCESTOR_LOOP;
         }
         object_ids.insert(parent_id);
         LLInventoryObject *parent_object = getObject(parent_id);
 		if (!parent_object)
 		{
 			LL_WARNS(LOG_INV) << "unable to trace topmost ancestor of " << object_id << ", missing item for uuid " << parent_id << LL_ENDL;
-			return ANSCESTOR_MISSING;
+			return ANCESTOR_MISSING;
 		}
 		object = parent_object;
 	}
 	result = object->getUUID();
-	return ANSCESTOR_OK;
+	return ANCESTOR_OK;
 }
 
 // Get the object by id. Returns NULL if not found.
@@ -539,9 +544,18 @@ void LLInventoryModel::consolidateForType(const LLUUID& main_id, LLFolderType::E
             LLViewerInventoryCategory* cat = getCategory(*it);
             changeCategoryParent(cat, main_id, TRUE);
         }
-        
+
         // Purge the emptied folder
-        removeCategory(folder_id);
+        // Note that this might be a system folder, don't validate removability
+        LLViewerInventoryCategory* cat = getCategory(folder_id);
+        if (cat)
+        {
+            const LLUUID trash_id = findCategoryUUIDForType(LLFolderType::FT_TRASH);
+            if (trash_id.notNull())
+            {
+                changeCategoryParent(cat, trash_id, TRUE);
+            }
+        }
         remove_inventory_category(folder_id, NULL);
 	}
 }
@@ -3901,9 +3915,9 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 {
 	LLPointer<LLInventoryValidationInfo> validation_info = new LLInventoryValidationInfo;
 	S32 fatal_errs = 0;
-	S32 warnings = 0;
-    S32 loops = 0;
-    S32 orphaned = 0;
+	S32 warning_count= 0;
+    S32 loop_count = 0;
+    S32 orphaned_count = 0;
 
 	if (getRootFolderID().isNull())
 	{
@@ -3924,7 +3938,9 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 		// ParentChild should be one larger because of the special entry for null uuid.
 		LL_INFOS("Inventory") << "unexpected sizes: cat map size " << mCategoryMap.size()
 							  << " parent/child " << mParentChildCategoryTree.size() << LL_ENDL;
-		warnings++;
+
+		validation_info->mWarnings["category_map_size"]++;
+		warning_count++;
 	}
 	S32 cat_lock = 0;
 	S32 item_lock = 0;
@@ -3943,32 +3959,35 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 		if (!cat)
 		{
 			LL_WARNS("Inventory") << "null cat" << LL_ENDL;
-			warnings++;
+			validation_info->mWarnings["null_cat"]++;
+			warning_count++;
 			continue;
 		}
 		LLUUID topmost_ancestor_id;
 		// Will leave as null uuid on failure
-        EAnscestorResult res = getObjectTopmostAncestor(cat_id, topmost_ancestor_id);
+        EAncestorResult res = getObjectTopmostAncestor(cat_id, topmost_ancestor_id);
         switch (res)
         {
-        case ANSCESTOR_MISSING:
-            orphaned++;
+        case ANCESTOR_MISSING:
+            orphaned_count++;
             break;
-        case ANSCESTOR_LOOP:
-            loops++;
+        case ANCESTOR_LOOP:
+            loop_count++;
             break;
-        case ANSCESTOR_OK:
+        case ANCESTOR_OK:
             break;
         default:
             LL_WARNS("Inventory") << "Unknown ancestor error for " << cat_id << LL_ENDL;
-            warnings++;
+			validation_info->mWarnings["unknown_ancestor_status"]++;
+            warning_count++;
             break;
         }
 
 		if (cat_id != cat->getUUID())
 		{
 			LL_WARNS("Inventory") << "cat id/index mismatch " << cat_id << " " << cat->getUUID() << LL_ENDL;
-			warnings++;
+			validation_info->mWarnings["cat_id_index_mismatch"]++;
+			warning_count++;
 		}
 
 		if (cat->getParentUUID().isNull())
@@ -3978,7 +3997,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 				LL_WARNS("Inventory") << "cat " << cat_id << " has no parent, but is not root ("
 									  << getRootFolderID() << ") or library root ("
 									  << getLibraryRootFolderID() << ")" << LL_ENDL;
-				warnings++;
+				validation_info->mWarnings["null_parent"]++;
+				warning_count++;
 			}
 		}
 		cat_array_t* cats;
@@ -3987,7 +4007,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 		if (!cats || !items)
 		{
 			LL_WARNS("Inventory") << "invalid direct descendents for " << cat_id << LL_ENDL;
-			warnings++;
+			validation_info->mWarnings["direct_descendents"]++;
+			warning_count++;
 			continue;
 		}
 		if (cat->getDescendentCount() == LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN)
@@ -4005,7 +4026,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 									  << " cached " << cat->getDescendentCount()
 									  << " expected " << cats->size() << "+" << items->size()
 									  << "=" << cats->size() +items->size() << LL_ENDL;
-				warnings++;
+				validation_info->mWarnings["invalid_descendent_count"]++;
+				warning_count++;
 			}
 		}
 		if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
@@ -4029,7 +4051,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 			if (!item)
 			{
 				LL_WARNS("Inventory") << "null item at index " << i << " for cat " << cat_id << LL_ENDL;
-				warnings++;
+				validation_info->mWarnings["null_item_at_index"]++;
+				warning_count++;
 				continue;
 			}
 
@@ -4040,7 +4063,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 				LL_WARNS("Inventory") << "wrong parent for " << item_id << " found "
 									  << item->getParentUUID() << " expected " << cat_id
 									  << LL_ENDL;
-				warnings++;
+				validation_info->mWarnings["wrong_parent_for_item"]++;
+				warning_count++;
 			}
 
 
@@ -4050,7 +4074,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 			{
 				LL_WARNS("Inventory") << "item " << item_id << " found as child of "
 									  << cat_id << " but not in top level mItemMap" << LL_ENDL;
-				warnings++;
+				validation_info->mWarnings["item_not_in_top_map"]++;
+				warning_count++;
 			}
 			else
 			{
@@ -4064,11 +4089,12 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 
 			// Topmost ancestor should be root or library.
 			LLUUID topmost_ancestor_id;
-            EAnscestorResult found = getObjectTopmostAncestor(item_id, topmost_ancestor_id);
-			if (found != ANSCESTOR_OK)
+            EAncestorResult found = getObjectTopmostAncestor(item_id, topmost_ancestor_id);
+			if (found != ANCESTOR_OK)
 			{
 				LL_WARNS("Inventory") << "unable to find topmost ancestor for " << item_id << LL_ENDL;
-				warnings++;
+				validation_info->mWarnings["topmost_ancestor_not_found"]++;
+				warning_count++;
 			}
 			else
 			{
@@ -4079,7 +4105,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 										  << " got " << topmost_ancestor_id
 										  << " expected " << getRootFolderID()
 										  << " or " << getLibraryRootFolderID() << LL_ENDL;
-					warnings++;
+					validation_info->mWarnings["topmost_ancestor_not_recognized"]++;
+					warning_count++;
 				}
 			}
 		}
@@ -4095,7 +4122,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 			{
 				LL_WARNS("Inventory") << "cat " << cat_id << " name [" << cat->getName()
 									  << "] orphaned - no child cat array for alleged parent " << parent_id << LL_ENDL;
-                orphaned++;
+                orphaned_count++;
 			}
 			else
 			{
@@ -4113,7 +4140,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 				{
 					LL_WARNS("Inventory") << "cat " << cat_id << " name [" << cat->getName()
 										  << "] orphaned - not found in child cat array of alleged parent " << parent_id << LL_ENDL;
-                    orphaned++;
+                    orphaned_count++;
 				}
 			}
 		}
@@ -4122,7 +4149,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 		LLFolderType::EType folder_type = cat->getPreferredType();
 		bool cat_is_in_library = false;
 		LLUUID topmost_id;
-		if (getObjectTopmostAncestor(cat->getUUID(),topmost_id) == ANSCESTOR_OK && topmost_id == getLibraryRootFolderID())
+		if (getObjectTopmostAncestor(cat->getUUID(),topmost_id) == ANCESTOR_OK && topmost_id == getLibraryRootFolderID())
 		{
 			cat_is_in_library = true;
 		}
@@ -4155,14 +4182,15 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 		if (item->getUUID() != item_id)
 		{
 			LL_WARNS("Inventory") << "item_id " << item_id << " does not match " << item->getUUID() << LL_ENDL;
-			warnings++;
+			validation_info->mWarnings["item_id_mismatch"]++;
+			warning_count++;
 		}
 
 		const LLUUID& parent_id = item->getParentUUID();
 		if (parent_id.isNull())
 		{
 			LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName() << "] has null parent id!" << LL_ENDL;
-            orphaned++;
+            orphaned_count++;
 		}
 		else
 		{
@@ -4173,7 +4201,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 			{
 				LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName()
 									  << "] orphaned - alleged parent has no child items list " << parent_id << LL_ENDL;
-                orphaned++;
+                orphaned_count++;
 			}
 			else
 			{
@@ -4190,7 +4218,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 				{
 					LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName()
 										  << "] orphaned - not found as child of alleged parent " << parent_id << LL_ENDL;
-                    orphaned++;
+                    orphaned_count++;
 				}
 			}
 				
@@ -4208,18 +4236,18 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 				LL_WARNS("Inventory") << "link " << item->getUUID() << " type " << item->getActualType()
 									  << " missing backlink info at target_id " << target_id
 									  << LL_ENDL;
-                orphaned++;
+                orphaned_count++;
 			}
 			// Links should have referents.
 			if (item->getActualType() == LLAssetType::AT_LINK && !target_item)
 			{
 				LL_WARNS("Inventory") << "broken item link " << item->getName() << " id " << item->getUUID() << LL_ENDL;
-                orphaned++;
+                orphaned_count++;
 			}
 			else if (item->getActualType() == LLAssetType::AT_LINK_FOLDER && !target_cat)
 			{
 				LL_WARNS("Inventory") << "broken folder link " << item->getName() << " id " << item->getUUID() << LL_ENDL;
-                orphaned++;
+                orphaned_count++;
 			}
 			if (target_item && target_item->getIsLinkType())
 			{
@@ -4291,13 +4319,15 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 				if (is_automatic)
 				{
 					LL_WARNS("Inventory") << "Fatal inventory corruption: cannot create system folder of type " << ft << LL_ENDL;
-                    fatal_errs++;
 					validation_info->mMissingRequiredSystemFolders.insert(folder_type);
+                    fatal_errs++;
 				}
 				else
 				{
 					// Can create, and will when needed.
-					warnings++;
+					// (Not sure this is really a warning, but worth logging)
+					validation_info->mWarnings["missing_system_folder_can_create"]++;
+					warning_count++;
 				}
 			}
 			else if (count_under_root > 1)
@@ -4308,6 +4338,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
                 {
                     // It is a fatal problem or can lead to fatal problems for COF,
                     // outfits, trash and other non-automatic folders.
+					validation_info->mFatalSystemDuplicate++;
                     fatal_errs++;
                 }
                 else
@@ -4315,13 +4346,15 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
                     // For automatic folders it's not a fatal issue and shouldn't
                     // break inventory or other functionality further
                     // Exception: FT_SETTINGS is not automatic, but only deserves a warning.
-                    warnings++;
+					validation_info->mWarnings["non_fatal_system_duplicate_under_root"]++;
+                    warning_count++;
                 }
 			}
 			if (count_elsewhere > 0)
 			{
 				LL_WARNS("Inventory") << "Found " << count_elsewhere << " extra folders of type " << ft << " outside of root" << LL_ENDL;
-				warnings++;
+				validation_info->mWarnings["non_fatal_system_duplicate_elsewhere"]++;
+				warning_count++;
 			}
 		}
 	}
@@ -4343,12 +4376,12 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
 
 	// FIXME need to fail login and tell user to retry, contact support if problem persists.
 	bool valid = (fatal_errs == 0);
-	LL_INFOS("Inventory") << "Validate done, fatal errors: " << fatal_errs << ", warnings: " << warnings << ", valid: " << valid << LL_ENDL;
+	LL_INFOS("Inventory") << "Validate done, fatal errors: " << fatal_errs << ", warnings: " << warning_count << ", valid: " << valid << LL_ENDL;
 
 	validation_info->mFatalErrorCount = fatal_errs;
-	validation_info->mWarningCount = warnings;
-    validation_info->mLoopCount = loops;
-    validation_info->mOrphanedCount = orphaned;
+	validation_info->mWarningCount = warning_count;
+    validation_info->mLoopCount = loop_count;
+    validation_info->mOrphanedCount = orphaned_count;
 
 	return validation_info; 
 }
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index 85343cf95c17da19b132585e095f6cc91fcad46f..cb960d8185cc79660195bdc357499b2d99d7dd1a 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -65,15 +65,19 @@ class LLInventoryValidationInfo: public LLRefCount
 	void toOstream(std::ostream& os) const;
 	void asLLSD(LLSD& sd) const;
 	
+	bool mInitialized{false};
+	S32 mWarningCount{0};
+	std::map<std::string,U32> mWarnings;
+
+    S32 mLoopCount{0}; // Presence of folders whose ancestors loop onto themselves
+    S32 mOrphanedCount{0}; // Missing or orphaned items, links and folders
+
+	S32 mFatalErrorCount{0};
+	bool mFatalNoRootFolder{false};
+	S32 mFatalSystemDuplicate{0};
+	bool mFatalNoLibraryRootFolder{false};
+	bool mFatalQADebugMode{false};
 
-	S32 mFatalErrorCount;
-	S32 mWarningCount;
-    S32 mLoopCount; // Presence of folders whose ansestors loop onto themselves
-    S32 mOrphanedCount; // Missing or orphaned items, links and folders
-	bool mInitialized;
-	bool mFatalNoRootFolder;
-	bool mFatalNoLibraryRootFolder;
-	bool mFatalQADebugMode;
 	std::set<LLFolderType::EType> mMissingRequiredSystemFolders;
 	std::set<LLFolderType::EType> mDuplicateRequiredSystemFolders;
 };
@@ -286,13 +290,13 @@ class LLInventoryModel
 	// Check if one object has a parent chain up to the category specified by UUID.
 	BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const;
     
-    enum EAnscestorResult{
-        ANSCESTOR_OK = 0,
-        ANSCESTOR_MISSING = 1,
-        ANSCESTOR_LOOP = 2,
+    enum EAncestorResult{
+        ANCESTOR_OK = 0,
+        ANCESTOR_MISSING = 1,
+        ANCESTOR_LOOP = 2,
     };
 	// Follow parent chain to the top.
-    EAnscestorResult getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const;
+    EAncestorResult getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const;
 
 	//--------------------------------------------------------------------
 	// Find
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index 79dbe17982aac21d4b7a5b7d186e60816e6511ba..af2a9f6afdde5c20a880edf4fdbf750d4de4c7a1 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -109,6 +109,8 @@ class LLLocationInputCtrl
 	LLLineEditor*			getTextEntry() const { return mTextEntry; }
 	void					handleLoginComplete();
 
+    bool isNavMeshDirty() { return mIsNavMeshDirty; }
+
 private:
 
 	enum EParcelIcon
diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp
index 044c76ce2c3c807d9a8483a5851cc2de0109c274..dd4ae4d201c11ddf03f139b5e89608e01c3e3c70 100644
--- a/indra/newview/llmarketplacefunctions.cpp
+++ b/indra/newview/llmarketplacefunctions.cpp
@@ -758,7 +758,14 @@ void LLMarketplaceData::initializeSLM(const status_updated_signal_t::slot_type&
     if (mMarketPlaceStatus != MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED)
     {
         // If already initialized, just confirm the status so the callback gets called
-        setSLMStatus(mMarketPlaceStatus);
+        if (mMarketPlaceFailureReason.empty())
+        {
+            setSLMStatus(mMarketPlaceStatus);
+        }
+        else
+        {
+            setSLMConnectionFailure(mMarketPlaceFailureReason);
+        }
     }
     else
     {
@@ -799,28 +806,27 @@ void LLMarketplaceData::getMerchantStatusCoro()
         if (httpCode == HTTP_NOT_FOUND)
         {
             log_SLM_infos("Get /merchant", httpCode, std::string("User is not a merchant"));
-            setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT);
+            LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT);
         }
         else if (httpCode == HTTP_SERVICE_UNAVAILABLE)
         {
             log_SLM_infos("Get /merchant", httpCode, std::string("Merchant is not migrated"));
-            setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT);
+            LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT);
         }
-        else if (httpCode == HTTP_INTERNAL_ERROR)
+        else
         {
-            // 499 includes timeout and ssl error - marketplace is down or having issues, we do not show it in this request according to MAINT-5938
             LL_WARNS("SLM") << "SLM Merchant Request failed with status: " << httpCode
                                     << ", reason : " << status.toString()
                                     << ", code : " << result["error_code"].asString()
                                     << ", description : " << result["error_description"].asString() << LL_ENDL;
-            LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE);
-        }
-        else
-        {
-            std::string err_code = result["error_code"].asString();
-            //std::string err_description = result["error_description"].asString();
-            log_SLM_warning("Get /merchant", httpCode, status.toString(), err_code, result["error_description"]);
-            setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE);
+            std::string reason = status.toString();
+            if (reason.empty())
+            {
+                reason = result["error_code"].asString();
+            }
+            // Since user might not even have a marketplace, there is no reason to report the error
+            // to the user, instead write it down into listings' floater
+            LLMarketplaceData::instance().setSLMConnectionFailure(reason);
         }
         return;
     }
@@ -1298,6 +1304,17 @@ std::string LLMarketplaceData::getSLMConnectURL(const std::string& route)
 void LLMarketplaceData::setSLMStatus(U32 status)
 {
     mMarketPlaceStatus = status;
+    mMarketPlaceFailureReason.clear();
+    if (mStatusUpdatedSignal)
+    {
+        (*mStatusUpdatedSignal)();
+    }
+}
+
+void LLMarketplaceData::setSLMConnectionFailure(const std::string& reason)
+{
+    mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE;
+    mMarketPlaceFailureReason = reason;
     if (mStatusUpdatedSignal)
     {
         (*mStatusUpdatedSignal)();
diff --git a/indra/newview/llmarketplacefunctions.h b/indra/newview/llmarketplacefunctions.h
index fee9225f77c5905d04f5530e2694c14ece2e1c74..088507d85098d8ed0a8632b28ec43a2155d07d48 100644
--- a/indra/newview/llmarketplacefunctions.h
+++ b/indra/newview/llmarketplacefunctions.h
@@ -198,7 +198,9 @@ class LLMarketplaceData
 	typedef boost::signals2::signal<void ()> status_updated_signal_t;
     void initializeSLM(const status_updated_signal_t::slot_type& cb);
 	U32  getSLMStatus() const { return mMarketPlaceStatus; }
+    std::string getSLMConnectionfailureReason() { return mMarketPlaceFailureReason; }
 	void setSLMStatus(U32 status);
+    void setSLMConnectionFailure(const std::string& reason);
     void getSLMListings();
     bool isEmpty() { return (mMarketplaceItems.size() == 0); }
     void setDataFetchedSignal(const status_updated_signal_t::slot_type& cb);
@@ -272,6 +274,7 @@ class LLMarketplaceData
 
     // Handling Marketplace connection and inventory connection
 	U32  mMarketPlaceStatus;
+    std::string mMarketPlaceFailureReason;
 	status_updated_signal_t* mStatusUpdatedSignal;
 	LLInventoryObserver* mInventoryObserver;
     bool mDirtyCount;   // If true, stock count value need to be updated at the next check
diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp
index 142977e9390ed2376f3a92496c936ada5b60d5aa..d3b981e205e176b918882f65acf6e3547ce824da 100644
--- a/indra/newview/llmediadataclient.cpp
+++ b/indra/newview/llmediadataclient.cpp
@@ -154,8 +154,7 @@ void mark_dead_and_remove_if(T &c, const PredicateMatchRequest &matchPred)
         if (matchPred(*it))
         {
             (*it)->markDead();
-            // *TDOO: When C++11 is in change the following line to: it = c.erase(it);
-            c.erase(it++);
+            it = c.erase(it);
         }
         else
         {
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 6fa71e130eaa8e6ccd162dfbc3705eca851e9e81..5b2326336b2442e009e4e236a5bb00f1e3077bbb 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -383,6 +383,9 @@ U32 LLMeshRepository::sLODPending = 0;
 
 U32 LLMeshRepository::sCacheBytesRead = 0;
 U32 LLMeshRepository::sCacheBytesWritten = 0;
+U32 LLMeshRepository::sCacheBytesHeaders = 0;
+U32 LLMeshRepository::sCacheBytesSkins = 0;
+U32 LLMeshRepository::sCacheBytesDecomps = 0;
 U32 LLMeshRepository::sCacheReads = 0;
 U32 LLMeshRepository::sCacheWrites = 0;
 U32 LLMeshRepository::sMaxLockHoldoffs = 0;
@@ -1874,6 +1877,7 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes
 			LLMutexLock lock(mHeaderMutex);
 			mMeshHeaderSize[mesh_id] = header_size;
 			mMeshHeader[mesh_id] = header;
+            LLMeshRepository::sCacheBytesHeaders += header_size;
 		}
 
 		
@@ -3013,27 +3017,6 @@ S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)
 	return -1;
 }
 
-void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)
-{
-	mThread->mMeshHeader[data.mUUID] = header;
-
-	// we cache the mesh for default parameters
-	LLVolumeParams volume_params;
-	volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
-	volume_params.setSculptID(data.mUUID, LL_SCULPT_TYPE_MESH);
-
-	for (U32 i = 0; i < 4; i++)
-	{
-		if (data.mModel[i].notNull())
-		{
-			LLPointer<LLVolume> volume = new LLVolume(volume_params, LLVolumeLODGroup::getVolumeScaleFromDetail(i));
-			volume->copyVolumeFaces(data.mModel[i]);
-			volume->setMeshAssetLoaded(TRUE);
-		}
-	}
-
-}
-
 // Handle failed or successful requests for mesh assets.
 //
 // Support for 200 responses was added for several reasons.  One,
@@ -3951,6 +3934,8 @@ void LLMeshRepository::notifyLoadedMeshes()
 void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo& info)
 {
 	mSkinMap[info.mMeshID] = info;
+    // Alternative: We can get skin size from header
+    sCacheBytesSkins += info.sizeBytes();
 
 	skin_load_map::iterator iter = mLoadingSkins.find(info.mMeshID);
 	if (iter != mLoadingSkins.end())
@@ -3974,10 +3959,14 @@ void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decom
 	{ //just insert decomp into map
 		mDecompositionMap[decomp->mMeshID] = decomp;
 		mLoadingDecompositions.erase(decomp->mMeshID);
+        sCacheBytesDecomps += decomp->sizeBytes();
 	}
 	else
 	{ //merge decomp with existing entry
+        sCacheBytesDecomps -= iter->second->sizeBytes();
 		iter->second->merge(decomp);
+        sCacheBytesDecomps += iter->second->sizeBytes();
+
 		mLoadingDecompositions.erase(decomp->mMeshID);
 		delete decomp;
 	}
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index 5459bbb4af4513ca41b0efd504a510a981dd8147..6fe4ea55143c8267314f6aa518bdb7fde6c5a942 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -552,6 +552,9 @@ class LLMeshRepository
 	static U32 sLODProcessing;
 	static U32 sCacheBytesRead;
 	static U32 sCacheBytesWritten;
+    static U32 sCacheBytesHeaders;
+    static U32 sCacheBytesSkins;
+    static U32 sCacheBytesDecomps;
 	static U32 sCacheReads;						
 	static U32 sCacheWrites;
 	static U32 sMaxLockHoldoffs;				// Maximum sequential locking failures
@@ -641,8 +644,6 @@ class LLMeshRepository
 	std::queue<LLUUID> mPendingPhysicsShapeRequests;
 	
 	U32 mMeshThreadCount;
-
-	void cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header);
 	
 	LLMeshRepoThread* mThread;
 	std::vector<LLMeshUploadThread*> mUploads;
diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index 4a85d459c5cd8e3797d3f4ac3d7f54a49433ac5f..4b5e9a6510f9169bdd08b7d17b753ffa429a0565 100644
--- a/indra/newview/llmodelpreview.cpp
+++ b/indra/newview/llmodelpreview.cpp
@@ -2755,7 +2755,6 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
             continue;
         }
 
-        LLModel* base_mdl = *base_iter;
         base_iter++;
 
         S32 num_faces = mdl->getNumVolumeFaces();
@@ -2830,7 +2829,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
                     //find closest weight to vf.mVertices[i].mPosition
                     LLVector3 pos(vf.mPositions[i].getF32ptr());
 
-                    const LLModel::weight_list& weight_list = base_mdl->getJointInfluences(pos);
+                    const LLModel::weight_list& weight_list = mdl->getJointInfluences(pos);
                     llassert(weight_list.size()>0 && weight_list.size() <= 4); // LLModel::loadModel() should guarantee this
 
                     LLVector4 w(0, 0, 0, 0);
@@ -2957,6 +2956,20 @@ void LLModelPreview::loadedCallback(
         {
             pPreview->lookupLODModelFiles(lod);
         }
+
+        const LLVOAvatar* avatarp = pPreview->getPreviewAvatar();
+        if (avatarp) { // set up ground plane for possible rendering
+            const LLVector3 root_pos = avatarp->mRoot->getPosition();
+            const LLVector4a* ext = avatarp->mDrawable->getSpatialExtents();
+            const LLVector4a min = ext[0], max = ext[1];
+            const F32 center = (max[2] - min[2]) * 0.5f;
+            const F32 ground = root_pos[2] - center;
+            auto plane = pPreview->mGroundPlane;
+            plane[0] = {min[0], min[1], ground};
+            plane[1] = {max[0], min[1], ground};
+            plane[2] = {max[0], max[1], ground};
+            plane[3] = {min[0], max[1], ground};
+        }
     }
 
 }
@@ -3164,6 +3177,9 @@ BOOL LLModelPreview::render()
                     // (note: all these UI updates need to be somewhere that is not render)
                     fmp->childSetValue("upload_skin", true);
                     mFirstSkinUpdate = false;
+                    upload_skin = true;
+                    skin_weight = true;
+                    mViewOption["show_skin_weight"] = true;
                 }
 
                 fmp->enableViewOption("show_skin_weight");
@@ -3768,6 +3784,7 @@ BOOL LLModelPreview::render()
                 {
                     getPreviewAvatar()->renderBones();
                 }
+                renderGroundPlane(mPelvisZOffset);
                 if (shader)
                 {
                     shader->bind();
@@ -3789,6 +3806,28 @@ BOOL LLModelPreview::render()
     return TRUE;
 }
 
+void LLModelPreview::renderGroundPlane(float z_offset)
+{   // Not necesarilly general - beware - but it seems to meet the needs of LLModelPreview::render
+
+	gGL.diffuseColor3f( 1.0f, 0.0f, 1.0f );
+
+	gGL.begin(LLRender::LINES);
+	gGL.vertex3fv(mGroundPlane[0].mV);
+	gGL.vertex3fv(mGroundPlane[1].mV);
+
+	gGL.vertex3fv(mGroundPlane[1].mV);
+	gGL.vertex3fv(mGroundPlane[2].mV);
+
+	gGL.vertex3fv(mGroundPlane[2].mV);
+	gGL.vertex3fv(mGroundPlane[3].mV);
+
+	gGL.vertex3fv(mGroundPlane[3].mV);
+	gGL.vertex3fv(mGroundPlane[0].mV);
+
+	gGL.end();
+}
+
+
 //-----------------------------------------------------------------------------
 // refresh()
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/llmodelpreview.h b/indra/newview/llmodelpreview.h
index 215f44357fb89d8982933856ece30c0020035065..7cb5fd68457ee9129047a27318cba1bc4e0346e6 100644
--- a/indra/newview/llmodelpreview.h
+++ b/indra/newview/llmodelpreview.h
@@ -224,6 +224,8 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
     LLVOAvatar* getPreviewAvatar(void) { return mPreviewAvatar; }
     // Count amount of original models, excluding sub-models
     static U32 countRootModels(LLModelLoader::model_list models);
+    LLVector3   mGroundPlane[4];
+	void		renderGroundPlane(float z_offset = 0.0f);
 
     typedef enum
     {
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index 4a8ef53a8ba03be21223eb4dfe777f065068d107..bf00d77dea955d897329eb9da79fffcbc09ea4d8 100644
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -352,7 +352,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
 
 void LLMuteList::updateAdd(const LLMute& mute)
 {
-	// External mutes (e.g. Avaline callers) are local only, don't send them to the server.
+	// External mutes are local only, don't send them to the server.
 	if (mute.mType == LLMute::EXTERNAL)
 	{
 		return;
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 5215126789a9ece96e47ece0e32b59f2a241cf8d..8058faa5c7c24b9ca7709e48d1d87163399f275a 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -271,6 +271,25 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
 	return handled;
 }
 
+// virtual
+BOOL LLNameListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+    LLNameListItem* hit_item = dynamic_cast<LLNameListItem*>(hitItem(x, y));
+    LLFloater* floater = gFloaterView->getParentFloater(this);
+    if (floater && floater->isFrontmost() && hit_item)
+    {
+        if(hit_item->isGroup())
+        {
+            ContextMenuType prev_menu = getContextMenuType();
+            setContextMenu(MENU_GROUP);
+            BOOL handled = LLScrollListCtrl::handleRightMouseDown(x, y, mask);
+            setContextMenu(prev_menu);
+            return handled;
+        }
+    }
+    return LLScrollListCtrl::handleRightMouseDown(x, y, mask);    
+}
+
 // public
 void LLNameListCtrl::addGroupNameItem(const LLUUID& group_id, EAddPosition pos,
 									  BOOL enabled)
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index ef0be135e618e1c2b9473553700332eead2ef1d7..5dd5da5892ade23c01e7851e0fd8a3d3b6a1b3a3 100644
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -170,6 +170,7 @@ class LLNameListCtrl
 	/*virtual*/ void updateColumns(bool force_update);
 
 	/*virtual*/ void mouseOverHighlightNthItem( S32 index );
+    /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 private:
 	void showInspector(const LLUUID& avatar_id, bool is_group, bool is_experience = false);
 	void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, std::string prefix, LLHandle<LLNameListItem> item);
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 19dbbeb60e500f92bf75a4a459de2af141c126e2..2dd7cfab27287f51869ce69be134161ed8c4019f 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -713,7 +713,7 @@ void LLNavigationBar::resizeLayoutPanel()
 }
 void LLNavigationBar::invokeSearch(std::string search_text)
 {
-	LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("query", LLSD(search_text)));
+	LLFloaterReg::showInstance("search", LLSD().with("category", "standard").with("query", LLSD(search_text)));
 }
 
 void LLNavigationBar::clearHistoryCache()
@@ -733,3 +733,8 @@ int LLNavigationBar::getDefFavBarHeight()
 {
 	return mDefaultFpRect.getHeight();
 }
+
+bool LLNavigationBar::isRebakeNavMeshAvailable()
+{
+    return mCmbLocation->isNavMeshDirty();
+}
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index 646911a62ca63458ab4a5f10e744d6746b189649..11c671294a3c4d745c3348c0ce39ad4068bf2871 100755
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -102,6 +102,8 @@ class LLNavigationBar
 
 	int getDefNavBarHeight();
 	int getDefFavBarHeight();
+
+    bool isRebakeNavMeshAvailable();
 	
 private:
 	// the distance between navigation panel and favorites panel in pixels
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 9a030f1d7d895806ac435183d1beddb830bff35f..ff33efe4aaded79771b1fed2a0cfa017c87019d2 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -120,7 +120,7 @@ void LLPanelProfileTab::setApplyProgress(bool started)
         }
     }
 
-    LLPanel* panel = findChild<LLPanel>("indicator_stack");
+    LLView* panel = findChild<LLView>("indicator_stack");
     if (panel)
     {
         panel->setVisible(started);
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index 6e897e2c7ece4ed752bee18933aeacc07a88d8cc..ea10aa75ae011aa7b7ce0da16ead9677519f2b16 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -1308,7 +1308,8 @@ void LLPanelEditWearable::changeCamera(U8 subpart)
         gMorphView->setCameraOffset( subpart_entry->mCameraOffset );
         if (gSavedSettings.getBOOL("AppearanceCameraMovement"))
         {
-            gAgentCamera.setFocusOnAvatar(FALSE, FALSE);
+            // Unlock focus from avatar but don't stop animation to not interrupt ANIM_AGENT_CUSTOMIZE
+            gAgentCamera.setFocusOnAvatar(FALSE, gAgentCamera.getCameraAnimating());
             gMorphView->updateCamera();
         }
 }
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 28b8a641319846fe0b1c1434a9ca2cffc8ca48d5..6498215e948af4e1bbfb1112fee2cd2a38567c43 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -49,11 +49,15 @@
 #include "llinventoryfunctions.h"
 #include "llinventorymodel.h" // gInventory
 #include "llinventorymodelbackgroundfetch.h"
+#include "llfloatermediasettings.h"
+#include "llfloaterreg.h"
 #include "lllineeditor.h"
 #include "llmaterialmgr.h"
+#include "llmediactrl.h"
 #include "llmediaentry.h"
 #include "llmenubutton.h"
 #include "llnotificationsutil.h"
+#include "llpanelcontents.h"
 #include "llradiogroup.h"
 #include "llresmgr.h"
 #include "llselectmgr.h"
@@ -115,10 +119,9 @@ std::string USE_TEXTURE;
 
 LLRender::eTexIndex LLPanelFace::getTextureChannelToEdit()
 {
-	LLComboBox* combobox_matmedia = getChild<LLComboBox>("combobox matmedia");
 	LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
 
-	LLRender::eTexIndex channel_to_edit = (combobox_matmedia && combobox_matmedia->getCurrentIndex() == MATMEDIA_MATERIAL) ?
+	LLRender::eTexIndex channel_to_edit = (mComboMatMedia && mComboMatMedia->getCurrentIndex() == MATMEDIA_MATERIAL) ?
 	                                                    (radio_mat_type ? (LLRender::eTexIndex)radio_mat_type->getSelectedIndex() : LLRender::DIFFUSE_MAP) : LLRender::DIFFUSE_MAP;
 
 	channel_to_edit = (channel_to_edit == LLRender::NORMAL_MAP)		? (getCurrentNormalMap().isNull()		? LLRender::DIFFUSE_MAP : channel_to_edit) : channel_to_edit;
@@ -177,6 +180,8 @@ BOOL	LLPanelFace::postBuild()
 	childSetCommitCallback("glossiness",&LLPanelFace::onCommitMaterialGloss, this);
 	childSetCommitCallback("environment",&LLPanelFace::onCommitMaterialEnv, this);
 	childSetCommitCallback("maskcutoff",&LLPanelFace::onCommitMaterialMaskCutoff, this);
+    childSetCommitCallback("add_media", &LLPanelFace::onClickBtnAddMedia, this);
+    childSetCommitCallback("delete_media", &LLPanelFace::onClickBtnDeleteMedia, this);
 
 	childSetAction("button align",&LLPanelFace::onClickAutoFix,this);
 	childSetAction("button align textures", &LLPanelFace::onAlignTexture, this);
@@ -321,11 +326,11 @@ BOOL	LLPanelFace::postBuild()
 		mComboTexGen->setFollows(FOLLOWS_LEFT | FOLLOWS_TOP);	
 	}
 
-    LLComboBox* combo_mat_media = findChild<LLComboBox>("combobox matmedia");
-	if(combo_mat_media)
+    mComboMatMedia = getChild<LLComboBox>("combobox matmedia");
+	if(mComboMatMedia)
 	{
-        combo_mat_media->setCommitCallback(LLPanelFace::onCommitMaterialsMedia,this);
-        combo_mat_media->selectNthItem(MATMEDIA_MATERIAL);
+        mComboMatMedia->setCommitCallback(LLPanelFace::onCommitMaterialsMedia,this);
+        mComboMatMedia->selectNthItem(MATMEDIA_MATERIAL);
 	}
 
 	LLRadioGroup* radio_mat_type = findChild<LLRadioGroup>("radio_material_type");
@@ -350,6 +355,9 @@ BOOL	LLPanelFace::postBuild()
 
     mMenuClipboardColor = getChild<LLMenuButton>("clipboard_color_params_btn");
     mMenuClipboardTexture = getChild<LLMenuButton>("clipboard_texture_params_btn");
+    
+    mTitleMedia = getChild<LLMediaCtrl>("title_media");
+    mTitleMediaText = getChild<LLTextBox>("media_info");
 
 	clearCtrls();
 
@@ -358,24 +366,31 @@ BOOL	LLPanelFace::postBuild()
 
 LLPanelFace::LLPanelFace()
 :	LLPanel(),
-	mIsAlpha(false)
+    mIsAlpha(false),
+    mComboMatMedia(NULL),
+    mTitleMedia(NULL),
+    mTitleMediaText(NULL),
+    mNeedMediaTitle(true)
 {
     USE_TEXTURE = LLTrans::getString("use_texture");
     mCommitCallbackRegistrar.add("PanelFace.menuDoToSelected", boost::bind(&LLPanelFace::menuDoToSelected, this, _2));
     mEnableCallbackRegistrar.add("PanelFace.menuEnable", boost::bind(&LLPanelFace::menuEnableItem, this, _2));
 }
 
-
 LLPanelFace::~LLPanelFace()
 {
-	// Children all cleaned up by default view destructor.
+    unloadMedia();
 }
 
-
 void LLPanelFace::draw()
 {
     updateCopyTexButton();
 
+    // grab media name/title and update the UI widget
+    // Todo: move it, it's preferable not to update
+    // labels inside draw
+    updateMediaTitle();
+
     LLPanel::draw();
 }
 
@@ -866,14 +881,13 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 		BOOL editable = objectp->permModify() && !objectp->isPermanentEnforced();
 
 		// only turn on auto-adjust button if there is a media renderer and the media is loaded
-		getChildView("button align")->setEnabled(editable);
+        childSetEnabled("button align", editable);
 		
-		LLComboBox* combobox_matmedia = getChild<LLComboBox>("combobox matmedia");
-        if (combobox_matmedia->getCurrentIndex() < MATMEDIA_MATERIAL)
+        if (mComboMatMedia->getCurrentIndex() < MATMEDIA_MATERIAL)
         {
-            combobox_matmedia->selectNthItem(MATMEDIA_MATERIAL);
+            mComboMatMedia->selectNthItem(MATMEDIA_MATERIAL);
         }
-        combobox_matmedia->setEnabled(editable);
+        mComboMatMedia->setEnabled(editable);
 
 		LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
         if (radio_mat_type->getSelectedIndex() < MATTYPE_DIFFUSE)
@@ -926,22 +940,22 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 		{
 			getChildView("color label")->setEnabled(editable && !has_pbr_material);
 		}
-		LLColorSwatchCtrl*	mColorSwatch = findChild<LLColorSwatchCtrl>("colorswatch");
+		LLColorSwatchCtrl*	color_swatch = findChild<LLColorSwatchCtrl>("colorswatch");
 
 		LLColor4 color					= LLColor4::white;
 		bool		identical_color	= false;
 
-		if(mColorSwatch)
+		if(color_swatch)
 		{
 			LLSelectedTE::getColor(color, identical_color);
-			LLColor4 prev_color = mColorSwatch->get();
+			LLColor4 prev_color = color_swatch->get();
 
-			mColorSwatch->setOriginal(color);
-			mColorSwatch->set(color, force_set_values || (prev_color != color) || !editable);
+            color_swatch->setOriginal(color);
+            color_swatch->set(color, force_set_values || (prev_color != color) || !editable);
 
-			mColorSwatch->setValid(editable && !has_pbr_material);
-			mColorSwatch->setEnabled(editable && !has_pbr_material);
-			mColorSwatch->setCanApplyImmediately( editable );
+            color_swatch->setValid(editable);
+            color_swatch->setEnabled( editable );
+            color_swatch->setCanApplyImmediately( editable );
 		}
 
 		// Color transparency
@@ -1208,7 +1222,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 			getChild<LLUICtrl>("shinyScaleU")->setValue(spec_scale_s);
 			getChild<LLUICtrl>("bumpyScaleU")->setValue(norm_scale_s);
 
-            if (combobox_matmedia->getCurrentIndex() == MATMEDIA_PBR)
+            if (mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR)
             {
                 getChildView("TexScaleU")->setEnabled(editable && has_pbr_material);
                 getChildView("shinyScaleU")->setEnabled(editable && has_pbr_material);
@@ -1256,7 +1270,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 			BOOL norm_scale_tentative = !identical_norm_scale_t;
 			BOOL spec_scale_tentative = !identical_spec_scale_t;
 
-            if (combobox_matmedia->getCurrentIndex() == MATMEDIA_PBR)
+            if (mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR)
             {
                 getChildView("TexScaleV")->setEnabled(editable && has_pbr_material);
                 getChildView("shinyScaleV")->setEnabled(editable && has_pbr_material);
@@ -1311,7 +1325,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 			getChild<LLUICtrl>("shinyOffsetU")->setTentative(LLSD(norm_offset_u_tentative));
 			getChild<LLUICtrl>("bumpyOffsetU")->setTentative(LLSD(spec_offset_u_tentative));
 
-            if (combobox_matmedia->getCurrentIndex() == MATMEDIA_PBR)
+            if (mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR)
             {
                 getChildView("TexOffsetU")->setEnabled(editable && has_pbr_material);
                 getChildView("shinyOffsetU")->setEnabled(editable && has_pbr_material);
@@ -1350,7 +1364,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 			getChild<LLUICtrl>("shinyOffsetV")->setTentative(LLSD(norm_offset_v_tentative));
 			getChild<LLUICtrl>("bumpyOffsetV")->setTentative(LLSD(spec_offset_v_tentative));
 
-            if (combobox_matmedia->getCurrentIndex() == MATMEDIA_PBR)
+            if (mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR)
             {
                 getChildView("TexOffsetV")->setEnabled(editable && has_pbr_material);
                 getChildView("shinyOffsetV")->setEnabled(editable && has_pbr_material);
@@ -1386,7 +1400,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 			F32 norm_rot_deg = norm_rotation * RAD_TO_DEG;
 			F32 spec_rot_deg = spec_rotation * RAD_TO_DEG;
 
-            if (combobox_matmedia->getCurrentIndex() == MATMEDIA_PBR)
+            if (mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR)
             {
                 getChildView("TexRot")->setEnabled(editable && has_pbr_material);
                 getChildView("shinyRot")->setEnabled(editable && has_pbr_material);
@@ -1467,7 +1481,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 				S32 index = mComboTexGen ? mComboTexGen->getCurrentIndex() : 0;
                 bool enabled = editable && (index != 1);
                 bool identical_repeats = true;
-                S32 material_selection = combobox_matmedia->getCurrentIndex();
+                S32 material_selection = mComboMatMedia->getCurrentIndex();
 				F32  repeats = 1.0f;
 
                 U32 material_type = MATTYPE_DIFFUSE;
@@ -1726,6 +1740,755 @@ void LLPanelFace::refresh()
 	getState();
 }
 
+void LLPanelFace::refreshMedia()
+{
+    LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection();
+    LLViewerObject* first_object = selected_objects->getFirstObject();
+
+    if (!(first_object
+        && first_object->getPCode() == LL_PCODE_VOLUME
+        && first_object->permModify()
+        ))
+    {
+        getChildView("add_media")->setEnabled(FALSE);
+        mTitleMediaText->clear();
+        clearMediaSettings();
+        return;
+    }
+
+    std::string url = first_object->getRegion()->getCapability("ObjectMedia");
+    bool has_media_capability = (!url.empty());
+
+    if (!has_media_capability)
+    {
+        getChildView("add_media")->setEnabled(FALSE);
+        LL_WARNS("LLFloaterToolsMedia") << "Media not enabled (no capability) in this region!" << LL_ENDL;
+        clearMediaSettings();
+        return;
+    }
+
+    BOOL is_nonpermanent_enforced = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
+        && LLSelectMgr::getInstance()->selectGetRootsNonPermanentEnforced())
+        || LLSelectMgr::getInstance()->selectGetNonPermanentEnforced();
+    bool editable = is_nonpermanent_enforced && (first_object->permModify() || selectedMediaEditable());
+
+    // Check modify permissions and whether any selected objects are in
+    // the process of being fetched.  If they are, then we're not editable
+    if (editable)
+    {
+        LLObjectSelection::iterator iter = selected_objects->begin();
+        LLObjectSelection::iterator end = selected_objects->end();
+        for (; iter != end; ++iter)
+        {
+            LLSelectNode* node = *iter;
+            LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject());
+            if (NULL != object)
+            {
+                if (!object->permModify())
+                {
+                    LL_INFOS("LLFloaterToolsMedia")
+                        << "Selection not editable due to lack of modify permissions on object id "
+                        << object->getID() << LL_ENDL;
+
+                    editable = false;
+                    break;
+                }
+            }
+        }
+    }
+
+    // Media settings
+    bool bool_has_media = false;
+    struct media_functor : public LLSelectedTEGetFunctor<bool>
+    {
+        bool get(LLViewerObject* object, S32 face)
+        {
+            LLTextureEntry *te = object->getTE(face);
+            if (te)
+            {
+                return te->hasMedia();
+            }
+            return false;
+        }
+    } func;
+
+
+    // check if all faces have media(or, all dont have media)
+    LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue(&func, bool_has_media);
+
+    const LLMediaEntry default_media_data;
+
+    struct functor_getter_media_data : public LLSelectedTEGetFunctor< LLMediaEntry>
+    {
+        functor_getter_media_data(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        LLMediaEntry get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return *(object->getTE(face)->getMediaData());
+            return mMediaEntry;
+        };
+
+        const LLMediaEntry& mMediaEntry;
+
+    } func_media_data(default_media_data);
+
+    LLMediaEntry media_data_get;
+    LLFloaterMediaSettings::getInstance()->mMultipleMedia = !(selected_objects->getSelectedTEValue(&func_media_data, media_data_get));
+
+    std::string multi_media_info_str = LLTrans::getString("Multiple Media");
+    std::string media_title = "";
+    // update UI depending on whether "object" (prim or face) has media
+    // and whether or not you are allowed to edit it.
+
+    getChildView("add_media")->setEnabled(editable);
+    // IF all the faces have media (or all dont have media)
+    if (LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo)
+    {
+        // TODO: get media title and set it.
+        mTitleMediaText->clear();
+        // if identical is set, all faces are same (whether all empty or has the same media)
+        if (!(LLFloaterMediaSettings::getInstance()->mMultipleMedia))
+        {
+            // Media data is valid
+            if (media_data_get != default_media_data)
+            {
+                // initial media title is the media URL (until we get the name)
+                media_title = media_data_get.getHomeURL();
+            }
+            // else all faces might be empty. 
+        }
+        else // there' re Different Medias' been set on on the faces.
+        {
+            media_title = multi_media_info_str;
+        }
+
+        getChildView("delete_media")->setEnabled(bool_has_media && editable);
+        // TODO: display a list of all media on the face - use 'identical' flag
+    }
+    else // not all face has media but at least one does.
+    {
+        // seleted faces have not identical value
+        LLFloaterMediaSettings::getInstance()->mMultipleValidMedia = selected_objects->isMultipleTEValue(&func_media_data, default_media_data);
+
+        if (LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
+        {
+            media_title = multi_media_info_str;
+        }
+        else
+        {
+            // Media data is valid
+            if (media_data_get != default_media_data)
+            {
+                // initial media title is the media URL (until we get the name)
+                media_title = media_data_get.getHomeURL();
+            }
+        }
+
+        getChildView("delete_media")->setEnabled(TRUE);
+    }
+
+    U32 materials_media = mComboMatMedia->getCurrentIndex();
+    if (materials_media == MATMEDIA_MEDIA)
+    {
+        // currently displaying media info, navigateTo and update title
+        navigateToTitleMedia(media_title);
+    }
+    else
+    {
+        // Media can be heavy, don't keep it around
+        // MAC specific: MAC doesn't support setVolume(0) so if  not
+        // unloaded, it might keep playing audio until user closes editor
+        unloadMedia();
+        mNeedMediaTitle = false;
+    }
+
+    mTitleMediaText->setText(media_title);
+
+    // load values for media settings
+    updateMediaSettings();
+
+    LLFloaterMediaSettings::initValues(mMediaSettings, editable);
+}
+
+void LLPanelFace::unloadMedia()
+{
+    // destroy media source used to grab media title
+    if (mTitleMedia)
+        mTitleMedia->unloadMediaSource();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelFace::navigateToTitleMedia( const std::string url )
+{
+	std::string multi_media_info_str = LLTrans::getString("Multiple Media");
+	if (url.empty() || multi_media_info_str == url)
+	{
+		// nothing to show
+		mNeedMediaTitle = false;
+	}
+	else if (mTitleMedia)
+	{
+		LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin();
+		// check if url changed or if we need a new media source
+		if (mTitleMedia->getCurrentNavUrl() != url || media_plugin == NULL)
+		{
+			mTitleMedia->navigateTo( url );
+
+            LLViewerMediaImpl* impl = LLViewerMedia::getInstance()->getMediaImplFromTextureID(mTitleMedia->getTextureID());
+            if (impl)
+            {
+                // if it's a page with a movie, we don't want to hear it
+                impl->setVolume(0);
+            };
+		}
+
+		// flag that we need to update the title (even if no request were made)
+		mNeedMediaTitle = true;
+	}
+}
+
+bool LLPanelFace::selectedMediaEditable()
+{
+    U32 owner_mask_on;
+    U32 owner_mask_off;
+    U32 valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER,
+        &owner_mask_on, &owner_mask_off);
+    U32 group_mask_on;
+    U32 group_mask_off;
+    U32 valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_GROUP,
+        &group_mask_on, &group_mask_off);
+    U32 everyone_mask_on;
+    U32 everyone_mask_off;
+    S32 valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_EVERYONE,
+        &everyone_mask_on, &everyone_mask_off);
+
+    bool selected_Media_editable = false;
+
+    // if perms we got back are valid
+    if (valid_owner_perms &&
+        valid_group_perms &&
+        valid_everyone_perms)
+    {
+
+        if ((owner_mask_on & PERM_MODIFY) ||
+            (group_mask_on & PERM_MODIFY) ||
+            (everyone_mask_on & PERM_MODIFY))
+        {
+            selected_Media_editable = true;
+        }
+        else
+            // user is NOT allowed to press the RESET button
+        {
+            selected_Media_editable = false;
+        };
+    };
+
+    return selected_Media_editable;
+}
+
+void LLPanelFace::clearMediaSettings()
+{
+    LLFloaterMediaSettings::clearValues(false);
+}
+
+void LLPanelFace::updateMediaSettings()
+{
+    bool identical(false);
+    std::string base_key("");
+    std::string value_str("");
+    int value_int = 0;
+    bool value_bool = false;
+    LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection();
+    // TODO: (CP) refactor this using something clever or boost or both !!
+
+    const LLMediaEntry default_media_data;
+
+    // controls 
+    U8 value_u8 = default_media_data.getControls();
+    struct functor_getter_controls : public LLSelectedTEGetFunctor< U8 >
+    {
+        functor_getter_controls(const LLMediaEntry &entry) : mMediaEntry(entry) {}
+
+        U8 get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return object->getTE(face)->getMediaData()->getControls();
+            return mMediaEntry.getControls();
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_controls(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_controls, value_u8);
+    base_key = std::string(LLMediaEntry::CONTROLS_KEY);
+    mMediaSettings[base_key] = value_u8;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // First click (formerly left click)
+    value_bool = default_media_data.getFirstClickInteract();
+    struct functor_getter_first_click : public LLSelectedTEGetFunctor< bool >
+    {
+        functor_getter_first_click(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        bool get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return object->getTE(face)->getMediaData()->getFirstClickInteract();
+            return mMediaEntry.getFirstClickInteract();
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_first_click(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_first_click, value_bool);
+    base_key = std::string(LLMediaEntry::FIRST_CLICK_INTERACT_KEY);
+    mMediaSettings[base_key] = value_bool;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // Home URL
+    value_str = default_media_data.getHomeURL();
+    struct functor_getter_home_url : public LLSelectedTEGetFunctor< std::string >
+    {
+        functor_getter_home_url(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        std::string get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return object->getTE(face)->getMediaData()->getHomeURL();
+            return mMediaEntry.getHomeURL();
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_home_url(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_home_url, value_str);
+    base_key = std::string(LLMediaEntry::HOME_URL_KEY);
+    mMediaSettings[base_key] = value_str;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // Current URL
+    value_str = default_media_data.getCurrentURL();
+    struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string >
+    {
+        functor_getter_current_url(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        std::string get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return object->getTE(face)->getMediaData()->getCurrentURL();
+            return mMediaEntry.getCurrentURL();
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_current_url(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_current_url, value_str);
+    base_key = std::string(LLMediaEntry::CURRENT_URL_KEY);
+    mMediaSettings[base_key] = value_str;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // Auto zoom
+    value_bool = default_media_data.getAutoZoom();
+    struct functor_getter_auto_zoom : public LLSelectedTEGetFunctor< bool >
+    {
+
+        functor_getter_auto_zoom(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        bool get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return object->getTE(face)->getMediaData()->getAutoZoom();
+            return mMediaEntry.getAutoZoom();
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_auto_zoom(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_auto_zoom, value_bool);
+    base_key = std::string(LLMediaEntry::AUTO_ZOOM_KEY);
+    mMediaSettings[base_key] = value_bool;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // Auto play
+    //value_bool = default_media_data.getAutoPlay();
+    // set default to auto play TRUE -- angela  EXT-5172
+    value_bool = true;
+    struct functor_getter_auto_play : public LLSelectedTEGetFunctor< bool >
+    {
+        functor_getter_auto_play(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        bool get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return object->getTE(face)->getMediaData()->getAutoPlay();
+            //return mMediaEntry.getAutoPlay(); set default to auto play TRUE -- angela  EXT-5172
+            return true;
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_auto_play(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_auto_play, value_bool);
+    base_key = std::string(LLMediaEntry::AUTO_PLAY_KEY);
+    mMediaSettings[base_key] = value_bool;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+
+    // Auto scale
+    // set default to auto scale TRUE -- angela  EXT-5172
+    //value_bool = default_media_data.getAutoScale();
+    value_bool = true;
+    struct functor_getter_auto_scale : public LLSelectedTEGetFunctor< bool >
+    {
+        functor_getter_auto_scale(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        bool get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return object->getTE(face)->getMediaData()->getAutoScale();
+            // return mMediaEntry.getAutoScale();  set default to auto scale TRUE -- angela  EXT-5172
+            return true;
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_auto_scale(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_auto_scale, value_bool);
+    base_key = std::string(LLMediaEntry::AUTO_SCALE_KEY);
+    mMediaSettings[base_key] = value_bool;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // Auto loop
+    value_bool = default_media_data.getAutoLoop();
+    struct functor_getter_auto_loop : public LLSelectedTEGetFunctor< bool >
+    {
+        functor_getter_auto_loop(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        bool get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return object->getTE(face)->getMediaData()->getAutoLoop();
+            return mMediaEntry.getAutoLoop();
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_auto_loop(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_auto_loop, value_bool);
+    base_key = std::string(LLMediaEntry::AUTO_LOOP_KEY);
+    mMediaSettings[base_key] = value_bool;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // width pixels (if not auto scaled)
+    value_int = default_media_data.getWidthPixels();
+    struct functor_getter_width_pixels : public LLSelectedTEGetFunctor< int >
+    {
+        functor_getter_width_pixels(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        int get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return object->getTE(face)->getMediaData()->getWidthPixels();
+            return mMediaEntry.getWidthPixels();
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_width_pixels(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_width_pixels, value_int);
+    base_key = std::string(LLMediaEntry::WIDTH_PIXELS_KEY);
+    mMediaSettings[base_key] = value_int;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // height pixels (if not auto scaled)
+    value_int = default_media_data.getHeightPixels();
+    struct functor_getter_height_pixels : public LLSelectedTEGetFunctor< int >
+    {
+        functor_getter_height_pixels(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        int get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return object->getTE(face)->getMediaData()->getHeightPixels();
+            return mMediaEntry.getHeightPixels();
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_height_pixels(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_height_pixels, value_int);
+    base_key = std::string(LLMediaEntry::HEIGHT_PIXELS_KEY);
+    mMediaSettings[base_key] = value_int;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // Enable Alt image
+    value_bool = default_media_data.getAltImageEnable();
+    struct functor_getter_enable_alt_image : public LLSelectedTEGetFunctor< bool >
+    {
+        functor_getter_enable_alt_image(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        bool get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return object->getTE(face)->getMediaData()->getAltImageEnable();
+            return mMediaEntry.getAltImageEnable();
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_enable_alt_image(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_enable_alt_image, value_bool);
+    base_key = std::string(LLMediaEntry::ALT_IMAGE_ENABLE_KEY);
+    mMediaSettings[base_key] = value_bool;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // Perms - owner interact
+    value_bool = 0 != (default_media_data.getPermsInteract() & LLMediaEntry::PERM_OWNER);
+    struct functor_getter_perms_owner_interact : public LLSelectedTEGetFunctor< bool >
+    {
+        functor_getter_perms_owner_interact(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        bool get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_OWNER));
+            return 0 != (mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_OWNER);
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_perms_owner_interact(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_perms_owner_interact, value_bool);
+    base_key = std::string(LLPanelContents::PERMS_OWNER_INTERACT_KEY);
+    mMediaSettings[base_key] = value_bool;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // Perms - owner control
+    value_bool = 0 != (default_media_data.getPermsControl() & LLMediaEntry::PERM_OWNER);
+    struct functor_getter_perms_owner_control : public LLSelectedTEGetFunctor< bool >
+    {
+        functor_getter_perms_owner_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        bool get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_OWNER));
+            return 0 != (mMediaEntry.getPermsControl() & LLMediaEntry::PERM_OWNER);
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_perms_owner_control(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_perms_owner_control, value_bool);
+    base_key = std::string(LLPanelContents::PERMS_OWNER_CONTROL_KEY);
+    mMediaSettings[base_key] = value_bool;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // Perms - group interact
+    value_bool = 0 != (default_media_data.getPermsInteract() & LLMediaEntry::PERM_GROUP);
+    struct functor_getter_perms_group_interact : public LLSelectedTEGetFunctor< bool >
+    {
+        functor_getter_perms_group_interact(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        bool get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_GROUP));
+            return 0 != (mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_GROUP);
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_perms_group_interact(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_perms_group_interact, value_bool);
+    base_key = std::string(LLPanelContents::PERMS_GROUP_INTERACT_KEY);
+    mMediaSettings[base_key] = value_bool;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // Perms - group control
+    value_bool = 0 != (default_media_data.getPermsControl() & LLMediaEntry::PERM_GROUP);
+    struct functor_getter_perms_group_control : public LLSelectedTEGetFunctor< bool >
+    {
+        functor_getter_perms_group_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        bool get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_GROUP));
+            return 0 != (mMediaEntry.getPermsControl() & LLMediaEntry::PERM_GROUP);
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_perms_group_control(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_perms_group_control, value_bool);
+    base_key = std::string(LLPanelContents::PERMS_GROUP_CONTROL_KEY);
+    mMediaSettings[base_key] = value_bool;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // Perms - anyone interact
+    value_bool = 0 != (default_media_data.getPermsInteract() & LLMediaEntry::PERM_ANYONE);
+    struct functor_getter_perms_anyone_interact : public LLSelectedTEGetFunctor< bool >
+    {
+        functor_getter_perms_anyone_interact(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        bool get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_ANYONE));
+            return 0 != (mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_ANYONE);
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_perms_anyone_interact(default_media_data);
+    identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&func_perms_anyone_interact, value_bool);
+    base_key = std::string(LLPanelContents::PERMS_ANYONE_INTERACT_KEY);
+    mMediaSettings[base_key] = value_bool;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // Perms - anyone control
+    value_bool = 0 != (default_media_data.getPermsControl() & LLMediaEntry::PERM_ANYONE);
+    struct functor_getter_perms_anyone_control : public LLSelectedTEGetFunctor< bool >
+    {
+        functor_getter_perms_anyone_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        bool get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_ANYONE));
+            return 0 != (mMediaEntry.getPermsControl() & LLMediaEntry::PERM_ANYONE);
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_perms_anyone_control(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_perms_anyone_control, value_bool);
+    base_key = std::string(LLPanelContents::PERMS_ANYONE_CONTROL_KEY);
+    mMediaSettings[base_key] = value_bool;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // security - whitelist enable
+    value_bool = default_media_data.getWhiteListEnable();
+    struct functor_getter_whitelist_enable : public LLSelectedTEGetFunctor< bool >
+    {
+        functor_getter_whitelist_enable(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        bool get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return object->getTE(face)->getMediaData()->getWhiteListEnable();
+            return mMediaEntry.getWhiteListEnable();
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_whitelist_enable(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_whitelist_enable, value_bool);
+    base_key = std::string(LLMediaEntry::WHITELIST_ENABLE_KEY);
+    mMediaSettings[base_key] = value_bool;
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+
+    // security - whitelist URLs
+    std::vector<std::string> value_vector_str = default_media_data.getWhiteList();
+    struct functor_getter_whitelist_urls : public LLSelectedTEGetFunctor< std::vector<std::string> >
+    {
+        functor_getter_whitelist_urls(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+        std::vector<std::string> get(LLViewerObject* object, S32 face)
+        {
+            if (object)
+                if (object->getTE(face))
+                    if (object->getTE(face)->getMediaData())
+                        return object->getTE(face)->getMediaData()->getWhiteList();
+            return mMediaEntry.getWhiteList();
+        };
+
+        const LLMediaEntry &mMediaEntry;
+
+    } func_whitelist_urls(default_media_data);
+    identical = selected_objects->getSelectedTEValue(&func_whitelist_urls, value_vector_str);
+    base_key = std::string(LLMediaEntry::WHITELIST_KEY);
+    mMediaSettings[base_key].clear();
+    std::vector< std::string >::iterator iter = value_vector_str.begin();
+    while (iter != value_vector_str.end())
+    {
+        std::string white_list_url = *iter;
+        mMediaSettings[base_key].append(white_list_url);
+        ++iter;
+    };
+
+    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical;
+}
+
+void LLPanelFace::updateMediaTitle()
+{
+    // only get the media name if we need it
+    if (!mNeedMediaTitle)
+        return;
+
+    // get plugin impl
+    LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin();
+    if (media_plugin && mTitleMedia->getCurrentNavUrl() == media_plugin->getNavigateURI())
+    {
+        // get the media name (asynchronous - must call repeatedly)
+        std::string media_title = media_plugin->getMediaName();
+
+        // only replace the title if what we get contains something
+        if (!media_title.empty())
+        {
+            // update the UI widget
+            if (mTitleMediaText)
+            {
+                mTitleMediaText->setText(media_title);
+
+                // stop looking for a title when we get one
+                mNeedMediaTitle = false;
+            };
+        };
+    };
+}
+
 //
 // Static functions
 //
@@ -1784,39 +2547,38 @@ void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)
 	self->updateShinyControls(false,true);
 	self->updateBumpyControls(false,true);
 	self->updateUI();
+	self->refreshMedia();
 }
 
-// static
 void LLPanelFace::updateVisibility()
 {
-    LLComboBox* combo_matmedia = findChild<LLComboBox>("combobox matmedia");
     LLRadioGroup* radio_mat_type = findChild<LLRadioGroup>("radio_material_type");
     LLRadioGroup* radio_pbr_type = findChild<LLRadioGroup>("radio_pbr_type");
     LLComboBox* combo_shininess = findChild<LLComboBox>("combobox shininess");
     LLComboBox* combo_bumpiness = findChild<LLComboBox>("combobox bumpiness");
-	if (!radio_mat_type || !radio_pbr_type || !combo_matmedia || !combo_shininess || !combo_bumpiness)
+	if (!radio_mat_type || !radio_pbr_type || !mComboMatMedia || !combo_shininess || !combo_bumpiness)
 	{
 		LL_WARNS("Materials") << "Combo box not found...exiting." << LL_ENDL;
 		return;
 	}
-	U32 materials_media = combo_matmedia->getCurrentIndex();
+	U32 materials_media = mComboMatMedia->getCurrentIndex();
 	U32 material_type = radio_mat_type->getSelectedIndex();
     U32 pbr_type = radio_pbr_type->getSelectedIndex();
-	bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled();
+	bool show_media = (materials_media == MATMEDIA_MEDIA) && mComboMatMedia->getEnabled();
     bool show_material = materials_media == MATMEDIA_MATERIAL;
     bool show_pbr = materials_media == MATMEDIA_PBR;
-	bool show_texture = (show_media || (show_material && (material_type == MATTYPE_DIFFUSE) && combo_matmedia->getEnabled()));
-	bool show_bumpiness = show_material && (material_type == MATTYPE_NORMAL) && combo_matmedia->getEnabled();
-	bool show_shininess = show_material && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled();
-    bool show_pbr_albedo = show_pbr && (pbr_type == PBRTYPE_ALBEDO) && combo_matmedia->getEnabled();
-    bool show_pbr_normal = show_pbr && (pbr_type == PBRTYPE_NORMAL) && combo_matmedia->getEnabled();
-    bool show_pbr_metallic = show_pbr && (pbr_type == PBRTYPE_METALLIC) && combo_matmedia->getEnabled();
+	bool show_texture = (show_media || (show_material && (material_type == MATTYPE_DIFFUSE) && mComboMatMedia->getEnabled()));
+	bool show_bumpiness = show_material && (material_type == MATTYPE_NORMAL) && mComboMatMedia->getEnabled();
+	bool show_shininess = show_material && (material_type == MATTYPE_SPECULAR) && mComboMatMedia->getEnabled();
+    bool show_pbr_albedo = show_pbr && (pbr_type == PBRTYPE_ALBEDO) && mComboMatMedia->getEnabled();
+    bool show_pbr_normal = show_pbr && (pbr_type == PBRTYPE_NORMAL) && mComboMatMedia->getEnabled();
+    bool show_pbr_metallic = show_pbr && (pbr_type == PBRTYPE_METALLIC) && mComboMatMedia->getEnabled();
 
     radio_mat_type->setVisible(show_material);
     radio_pbr_type->setVisible(show_pbr);
 
 	// Media controls
-	getChildView("media_info")->setVisible(show_media);
+    mTitleMediaText->setVisible(show_media);
 	getChildView("add_media")->setVisible(show_media);
 	getChildView("delete_media")->setVisible(show_media);
 	getChildView("button align")->setVisible(show_media);
@@ -1960,12 +2722,11 @@ void LLPanelFace::updateShinyControls(bool is_setting_texture, bool mess_with_sh
 	}
 
 
-	LLComboBox* combo_matmedia = getChild<LLComboBox>("combobox matmedia");
 	LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
-	U32 materials_media = combo_matmedia->getCurrentIndex();
+	U32 materials_media = mComboMatMedia->getCurrentIndex();
 	U32 material_type = radio_mat_type->getSelectedIndex();
 	bool show_material = (materials_media == MATMEDIA_MATERIAL);
-	bool show_shininess = show_material && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled();
+	bool show_shininess = show_material && (material_type == MATTYPE_SPECULAR) && mComboMatMedia->getEnabled();
 	U32 shiny_value = comboShiny->getCurrentIndex();
 	bool show_shinyctrls = (shiny_value == SHINY_TEXTURE) && show_shininess; // Use texture
 	getChildView("label glossiness")->setVisible(show_shinyctrls);
@@ -2039,11 +2800,10 @@ void LLPanelFace::updateAlphaControls()
 	U32 alpha_value = comboAlphaMode->getCurrentIndex();
 	bool show_alphactrls = (alpha_value == ALPHAMODE_MASK); // Alpha masking
     
-    LLComboBox* combobox_matmedia = getChild<LLComboBox>("combobox matmedia");
     U32 mat_media = MATMEDIA_MATERIAL;
-    if (combobox_matmedia)
+    if (mComboMatMedia)
     {
-        mat_media = combobox_matmedia->getCurrentIndex();
+        mat_media = mComboMatMedia->getCurrentIndex();
     }
     
     U32 mat_type = MATTYPE_DIFFUSE;
@@ -2260,6 +3020,77 @@ void LLPanelFace::onSelectNormalTexture(const LLSD& data)
 	sendBump(nmap_id.isNull() ? 0 : BUMPY_TEXTURE);
 }
 
+//////////////////////////////////////////////////////////////////////////////
+// called when a user wants to edit existing media settings on a prim or prim face
+// TODO: test if there is media on the item and only allow editing if present
+void LLPanelFace::onClickBtnEditMedia(LLUICtrl* ctrl, void* userdata)
+{
+    LLPanelFace* self = (LLPanelFace*)userdata;
+    self->refreshMedia();
+    LLFloaterReg::showInstance("media_settings");
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// called when a user wants to delete media from a prim or prim face
+void LLPanelFace::onClickBtnDeleteMedia(LLUICtrl* ctrl, void* userdata)
+{
+    LLNotificationsUtil::add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// called when a user wants to add media to a prim or prim face
+void LLPanelFace::onClickBtnAddMedia(LLUICtrl* ctrl, void* userdata)
+{
+    // check if multiple faces are selected
+    if (LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected())
+    {
+        LLPanelFace* self = (LLPanelFace*)userdata;
+        self->refreshMedia();
+        LLNotificationsUtil::add("MultipleFacesSelected", LLSD(), LLSD(), multipleFacesSelectedConfirm);
+    }
+    else
+    {
+        onClickBtnEditMedia(ctrl, userdata);
+    }
+}
+
+// static
+bool LLPanelFace::deleteMediaConfirm(const LLSD& notification, const LLSD& response)
+{
+    S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+    switch (option)
+    {
+    case 0:  // "Yes"
+        LLSelectMgr::getInstance()->selectionSetMedia(0, LLSD());
+        if (LLFloaterReg::instanceVisible("media_settings"))
+        {
+            LLFloaterReg::hideInstance("media_settings");
+        }
+        break;
+
+    case 1:  // "No"
+    default:
+        break;
+    }
+    return false;
+}
+
+// static
+bool LLPanelFace::multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response)
+{
+    S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+    switch (option)
+    {
+    case 0:  // "Yes"
+        LLFloaterReg::showInstance("media_settings");
+        break;
+    case 1:  // "No"
+    default:
+        break;
+    }
+    return false;
+}
+
 //static
 void LLPanelFace::syncOffsetX(LLPanelFace* self, F32 offsetU)
 {
@@ -2637,10 +3468,9 @@ void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata)
 	LLPanelFace* self = (LLPanelFace*) userdata;
 	
 	LLUICtrl*	repeats_ctrl	= self->getChild<LLUICtrl>("rptctrl");
-	LLComboBox* combo_matmedia = self->getChild<LLComboBox>("combobox matmedia");
 	LLRadioGroup* radio_mat_type = self->getChild<LLRadioGroup>("radio_material_type");
 	
-	U32 materials_media = combo_matmedia->getCurrentIndex();
+	U32 materials_media = self->mComboMatMedia->getCurrentIndex();
 
 	U32 material_type           = (materials_media == MATMEDIA_MATERIAL) ? radio_mat_type->getSelectedIndex() : 0;
 	F32 repeats_per_meter	= repeats_ctrl->getValue().asReal();
@@ -3576,14 +4406,6 @@ bool LLPanelFace::menuEnableItem(const LLSD& userdata)
 }
 
 
-// TODO: I don't know who put these in or what these are for???
-void LLPanelFace::setMediaURL(const std::string& url)
-{
-}
-void LLPanelFace::setMediaType(const std::string& mime_type)
-{
-}
-
 // static
 void LLPanelFace::onCommitPlanarAlign(LLUICtrl* ctrl, void* userdata)
 {
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index 6746d67ce36c4dce2ce8381964dc130540b0ea13..725cfb0f5f59ae8cfa5cce258e755a6fe88484a7 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -47,6 +47,7 @@ class LLUICtrl;
 class LLViewerObject;
 class LLFloater;
 class LLMaterialID;
+class LLMediaCtrl;
 class LLMenuButton;
 
 // Represents an edit for use in replicating the op across one or more materials in the selection set.
@@ -97,11 +98,11 @@ class LLPanelFace : public LLPanel
 	LLPanelFace();
 	virtual ~LLPanelFace();
 
-    void draw();
-
 	void			refresh();
-	void			setMediaURL(const std::string& url);
-	void			setMediaType(const std::string& mime_type);
+    void			refreshMedia();
+    void			unloadMedia();
+
+    /*virtual*/ void draw();
 
 	LLMaterialPtr createDefaultMaterial(LLMaterialPtr current_material)
 	{
@@ -117,6 +118,12 @@ class LLPanelFace : public LLPanel
 	LLRender::eTexIndex getTextureChannelToEdit();
 
 protected:
+    void			navigateToTitleMedia(const std::string url);
+    bool			selectedMediaEditable();
+    void			clearMediaSettings();
+    void			updateMediaSettings();
+    void			updateMediaTitle();
+
 	void			getState();
 
 	void			sendTexture();			// applies and sends texture
@@ -159,6 +166,9 @@ class LLPanelFace : public LLPanel
 
 	void 	onCloseTexturePicker(const LLSD& data);
 
+    static bool deleteMediaConfirm(const LLSD& notification, const LLSD& response);
+    static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);
+
 	// Make UI reflect state of currently selected material (refresh)
 	// and UI mode (e.g. editing normal map v diffuse map)
 	//
@@ -205,6 +215,9 @@ class LLPanelFace : public LLPanel
 	static void		onCommitMaterialsMedia(	LLUICtrl* ctrl, void* userdata);
 	static void		onCommitMaterialType(	LLUICtrl* ctrl, void* userdata);
     static void		onCommitPbrType(LLUICtrl* ctrl, void* userdata);
+	static void 	onClickBtnEditMedia(LLUICtrl* ctrl, void* userdata);
+	static void 	onClickBtnDeleteMedia(LLUICtrl* ctrl, void* userdata);
+	static void 	onClickBtnAddMedia(LLUICtrl* ctrl, void* userdata);
 	static void		onCommitBump(				LLUICtrl* ctrl, void* userdata);
 	static void		onCommitTexGen(			LLUICtrl* ctrl, void* userdata);
 	static void		onCommitShiny(				LLUICtrl* ctrl, void* userdata);
@@ -257,6 +270,10 @@ class LLPanelFace : public LLPanel
 	F32		getCurrentShinyOffsetU();
 	F32		getCurrentShinyOffsetV();
 
+    LLComboBox *mComboMatMedia;
+    LLMediaCtrl *mTitleMedia;
+    LLTextBox *mTitleMediaText;
+
 	// Update visibility of controls to match current UI mode
 	// (e.g. materials vs media editing)
 	//
@@ -264,10 +281,6 @@ class LLPanelFace : public LLPanel
 	//
 	void updateVisibility();
 
-	// Make material(s) reflect current state of UI (apply edit)
-	//
-	void updateMaterial();
-
 	// Hey look everyone, a type-safe alternative to copy and paste! :)
 	//
 
@@ -446,6 +459,9 @@ class LLPanelFace : public LLPanel
 
     LLSD            mClipboardParams;
 
+    LLSD mMediaSettings;
+    bool mNeedMediaTitle;
+
 public:
 	#if defined(DEF_GET_MAT_STATE)
 		#undef DEF_GET_MAT_STATE
diff --git a/indra/newview/llpanellandaudio.cpp b/indra/newview/llpanellandaudio.cpp
index e7bdc51b4a56597068511cd89d1b66c4b93ed4a0..9e3fc544773ab2c27285b870b4f18072c8b14318 100644
--- a/indra/newview/llpanellandaudio.cpp
+++ b/indra/newview/llpanellandaudio.cpp
@@ -97,6 +97,9 @@ BOOL LLPanelLandAudio::postBuild()
 	mCheckAVSoundGroup = getChild<LLCheckBoxCtrl>("group av sound check");
 	childSetCommitCallback("group av sound check", onCommitAny, this);
 
+    mCheckObscureMOAP = getChild<LLCheckBoxCtrl>("obscure_moap");
+    childSetCommitCallback("obscure_moap", onCommitAny, this);
+
 	return TRUE;
 }
 
@@ -157,6 +160,9 @@ void LLPanelLandAudio::refresh()
 
 		mCheckAVSoundGroup->set(parcel->getAllowGroupAVSounds() || parcel->getAllowAnyAVSounds());	// On if "Everyone" is on
 		mCheckAVSoundGroup->setEnabled(can_change_av_sounds && !parcel->getAllowAnyAVSounds());		// Enabled if "Everyone" is off
+
+        mCheckObscureMOAP->set(parcel->getObscureMOAP());
+        mCheckObscureMOAP->setEnabled(can_change_media);
 	}
 }
 // static
@@ -184,6 +190,8 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
 		group_av_sound = self->mCheckAVSoundGroup->get();
 	}
 
+    bool obscure_moap = self->mCheckObscureMOAP->get();
+
 	// Remove leading/trailing whitespace (common when copying/pasting)
 	LLStringUtil::trim(music_url);
 
@@ -194,6 +202,7 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
 	parcel->setMusicURL(music_url);
 	parcel->setAllowAnyAVSounds(any_av_sound);
 	parcel->setAllowGroupAVSounds(group_av_sound);
+    parcel->setObscureMOAP(obscure_moap);
 
 	// Send current parcel data upstream to server
 	LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
diff --git a/indra/newview/llpanellandaudio.h b/indra/newview/llpanellandaudio.h
index 7e4fce80e412e38a86585abad2513e44742dde25..b54fe62179a9f294af384e0daa3c5a02e9926f07 100644
--- a/indra/newview/llpanellandaudio.h
+++ b/indra/newview/llpanellandaudio.h
@@ -53,6 +53,7 @@ class LLPanelLandAudio
 	LLLineEditor*	mMusicURLEdit;
 	LLCheckBoxCtrl* mCheckAVSoundAny;
 	LLCheckBoxCtrl* mCheckAVSoundGroup;
+    LLCheckBoxCtrl* mCheckObscureMOAP;
 
 	LLSafeHandle<LLParcelSelection>&	mParcel;
 };
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index 9730f0f16d9df5f95b5a4815eb8ee42efaf28a5a..e1818cc68b3933c3d775e694690c958f6e6e823f 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -98,9 +98,6 @@ BOOL LLPanelMediaSettingsGeneral::postBuild()
 	childSetCommitCallback( LLMediaEntry::HOME_URL_KEY, onCommitHomeURL, this);
 	childSetCommitCallback( "current_url_reset_btn",onBtnResetCurrentUrl, this);
 
-	// interrogates controls and updates widgets as required
-	updateMediaPreview();
-
 	return true;
 }
 
@@ -313,9 +310,6 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& _media
 			data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
 		};
 	};
-
-	// interrogates controls and updates widgets as required
-	self->updateMediaPreview();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 09e568e9ac773db2f56ea6d025a899fc94ecd6c3..f4eaa78f11367404b4a06e5dccaf5adfea8b3816 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -61,6 +61,7 @@
 #include "llcommandhandler.h"
 #include "llfloaterprofiletexture.h"
 #include "llfloaterreg.h"
+#include "llfloaterreporter.h"
 #include "llfilepicker.h"
 #include "llfirstuse.h"
 #include "llgroupactions.h"
@@ -582,6 +583,22 @@ class LLAgentHandler : public LLCommandHandler
 			}
 			return true;
 		}
+
+        // reportAbuse is here due to convoluted avatar handling
+        // in LLScrollListCtrl and LLTextBase
+        if (verb == "reportAbuse" && web == NULL) 
+        {
+            LLAvatarName av_name;
+            if (LLAvatarNameCache::get(avatar_id, &av_name))
+            {
+                LLFloaterReporter::showFromAvatar(avatar_id, av_name.getCompleteName());
+            }
+            else
+            {
+                LLFloaterReporter::showFromAvatar(avatar_id, "not avaliable");
+            }
+            return true;
+        }
 		return false;
 	}
 };
@@ -1936,23 +1953,6 @@ void LLPanelProfileSecondLife::onCommitProfileImage(const LLUUID& id)
     }
 }
 
-void LLPanelProfileSecondLife::onOpenNotes()
-{
-    LLFloater* parent_floater = gFloaterView->getParentFloater(this);
-    if (!parent_floater)
-    {
-        return;
-    }
-
-    LLTabContainer* tab_container = parent_floater->findChild<LLTabContainer>("panel_profile_tabs", TRUE);
-    if (!tab_container)
-    {
-        return;
-    }
-
-    tab_container->selectTabByName(PANEL_NOTES);
-}
-
 //////////////////////////////////////////////////////////////////////////
 // LLPanelProfileWeb
 
diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h
index ca6ef3f79459f375dd04f96286fad815d1120c31..d32bb943bd4cd01965f023d11904f8bc9b1dc2ff 100644
--- a/indra/newview/llpanelprofile.h
+++ b/indra/newview/llpanelprofile.h
@@ -184,7 +184,6 @@ class LLPanelProfileSecondLife
     void onShowAgentProfileTexture();
     void onShowTexturePicker();
     void onCommitProfileImage(const LLUUID& id);
-    void onOpenNotes();
 
 private:
 	typedef std::map<std::string, LLUUID> group_map_t;
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index 5c932714467da8f297c83bfb4db14a5e3aa433cb..b50b652966e1f922c0a7d5145e2cda901adc50f3 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -641,13 +641,6 @@ void LLPanelVolume::refresh()
 		mRootObject = NULL;
 	}
 
-	BOOL visible = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 0 ? TRUE : FALSE;
-
-	getChildView("Light FOV")->setVisible( visible);
-	getChildView("Light Focus")->setVisible( visible);
-	getChildView("Light Ambiance")->setVisible( visible);
-	getChildView("light texture control")->setVisible( visible);
-
 	bool enable_mesh = false;
 
 	LLSD sim_features;
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 94d20828eccfc48143fc00ea85ddf2b46dda3e40..9b60d1ae2f8936acfeb55c050f60600b27214c09 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -38,154 +38,11 @@
 #pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
 #endif
 
-// See EXT-4301.
-/**
- * class LLAvalineUpdater - observe the list of voice participants in session and check
- *  presence of Avaline Callers among them.
- *
- * LLAvalineUpdater is a LLVoiceClientParticipantObserver. It provides two kinds of validation:
- *	- whether Avaline caller presence among participants;
- *	- whether watched Avaline caller still exists in voice channel.
- * Both validations have callbacks which will notify subscriber if any of event occur.
- *
- * @see findAvalineCaller()
- * @see checkIfAvalineCallersExist()
- */
-class LLAvalineUpdater : public LLVoiceClientParticipantObserver
-{
-public:
-	typedef boost::function<void(const LLUUID& speaker_id)> process_avaline_callback_t;
-
-	LLAvalineUpdater(process_avaline_callback_t found_cb, process_avaline_callback_t removed_cb)
-		: mAvalineFoundCallback(found_cb)
-		, mAvalineRemovedCallback(removed_cb)
-	{
-		LLVoiceClient::getInstance()->addObserver(this);
-	}
-	~LLAvalineUpdater()
-	{
-		if (LLVoiceClient::instanceExists())
-		{
-			LLVoiceClient::getInstance()->removeObserver(this);
-		}
-	}
-
-	/**
-	 * Adds UUID of Avaline caller to watch.
-	 *
-	 * @see checkIfAvalineCallersExist().
-	 */
-	void watchAvalineCaller(const LLUUID& avaline_caller_id)
-	{
-		mAvalineCallers.insert(avaline_caller_id);
-	}
-
-	void onParticipantsChanged()
-	{
-		uuid_set_t participant_uuids;
-		LLVoiceClient::getInstance()->getParticipantList(participant_uuids);
-
-
-		// check whether Avaline caller exists among voice participants
-		// and notify Participant List
-		findAvalineCaller(participant_uuids);
-
-		// check whether watched Avaline callers still present among voice participant
-		// and remove if absents.
-		checkIfAvalineCallersExist(participant_uuids);
-	}
-
-private:
-	typedef std::set<LLUUID> uuid_set_t;
-
-	/**
-	 * Finds Avaline callers among voice participants and calls mAvalineFoundCallback.
-	 *
-	 * When Avatar is in group call with Avaline caller and then ends call Avaline caller stays
-	 * in Group Chat floater (exists in LLSpeakerMgr). If Avatar starts call with that group again
-	 * Avaline caller is added to voice channel AFTER Avatar is connected to group call.
-	 * But Voice Control Panel (VCP) is filled from session LLSpeakerMgr and there is no information
-	 * if a speaker is Avaline caller.
-	 *
-	 * In this case this speaker is created as avatar and will be recreated when it appears in
-	 * Avatar's Voice session.
-	 *
-	 * @see LLParticipantList::onAvalineCallerFound()
-	 */
-	void findAvalineCaller(const uuid_set_t& participant_uuids)
-	{
-		uuid_set_t::const_iterator it = participant_uuids.begin(), it_end = participant_uuids.end();
-
-		for(; it != it_end; ++it)
-		{
-			const LLUUID& participant_id = *it;
-			if (!LLVoiceClient::getInstance()->isParticipantAvatar(participant_id))
-			{
-				LL_DEBUGS("Avaline") << "Avaline caller found among voice participants: " << participant_id << LL_ENDL;
-
-				if (mAvalineFoundCallback)
-				{
-					mAvalineFoundCallback(participant_id);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Finds Avaline callers which are not anymore among voice participants and calls mAvalineRemovedCallback.
-	 *
-	 * The problem is when Avaline caller ends a call it is removed from Voice Client session but
-	 * still exists in LLSpeakerMgr. Server does not send such information.
-	 * This method implements a HUCK to notify subscribers that watched Avaline callers by class
-	 * are not anymore in the call.
-	 *
-	 * @see LLParticipantList::onAvalineCallerRemoved()
-	 */
-	void checkIfAvalineCallersExist(const uuid_set_t& participant_uuids)
-	{
-		uuid_set_t::iterator it = mAvalineCallers.begin();
-		uuid_set_t::const_iterator participants_it_end = participant_uuids.end();
-
-		while (it != mAvalineCallers.end())
-		{
-			const LLUUID participant_id = *it;
-			LL_DEBUGS("Avaline") << "Check avaline caller: " << participant_id << LL_ENDL;
-			bool not_found = participant_uuids.find(participant_id) == participants_it_end;
-			if (not_found)
-			{
-				LL_DEBUGS("Avaline") << "Watched Avaline caller is not found among voice participants: " << participant_id << LL_ENDL;
-
-				// notify Participant List
-				if (mAvalineRemovedCallback)
-				{
-					mAvalineRemovedCallback(participant_id);
-				}
-
-				// remove from the watch list
-				mAvalineCallers.erase(it++);
-			}
-			else
-			{
-				++it;
-			}
-		}
-	}
-
-	process_avaline_callback_t mAvalineFoundCallback;
-	process_avaline_callback_t mAvalineRemovedCallback;
-
-	uuid_set_t mAvalineCallers;
-};
-
 LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLFolderViewModelInterface& root_view_model) :
 	LLConversationItemSession(data_source->getSessionID(), root_view_model),
 	mSpeakerMgr(data_source),
 	mValidateSpeakerCallback(NULL)
 {
-
-	mAvalineUpdater = new LLAvalineUpdater(boost::bind(&LLParticipantList::onAvalineCallerFound, this, _1),
-										   boost::bind(&LLParticipantList::onAvalineCallerRemoved, this, _1));
-
 	mSpeakerAddListener = new SpeakerAddListener(*this);
 	mSpeakerRemoveListener = new SpeakerRemoveListener(*this);
 	mSpeakerClearListener = new SpeakerClearListener(*this);
@@ -243,32 +100,6 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLFolderViewMode
 
 LLParticipantList::~LLParticipantList()
 {
-	delete mAvalineUpdater;
-}
-
-/*
-  Seems this method is not necessary after onAvalineCallerRemoved was implemented;
-
-  It does nothing because list item is always created with correct class type for Avaline caller.
-  For now Avaline Caller is removed from the LLSpeakerMgr List when it is removed from the Voice Client
-  session.
-  This happens in two cases: if Avaline Caller ends call itself or if Resident ends group call.
-
-  Probably Avaline caller should be removed from the LLSpeakerMgr list ONLY if it ends call itself.
-  Asked in EXT-4301.
-*/
-void LLParticipantList::onAvalineCallerFound(const LLUUID& participant_id)
-{
-	removeParticipant(participant_id);
-	// re-add avaline caller with a correct class instance.
-	addAvatarIDExceptAgent(participant_id);
-}
-
-void LLParticipantList::onAvalineCallerRemoved(const LLUUID& participant_id)
-{
-	LL_DEBUGS("Avaline") << "Removing avaline caller from the list: " << participant_id << LL_ENDL;
-
-	mSpeakerMgr->removeAvalineSpeaker(participant_id);
 }
 
 void LLParticipantList::setValidateSpeakerCallback(validate_speaker_callback_t cb)
@@ -386,7 +217,6 @@ void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)
 		std::string display_name = LLVoiceClient::getInstance()->getDisplayName(avatar_id);
 		// Create a participant view model instance
 		participant = new LLConversationItemParticipant(display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name, avatar_id, mRootViewModel);
-		mAvalineUpdater->watchAvalineCaller(avatar_id);
 	}
 
 	// *TODO : Need to update the online/offline status of the participant
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index 3a3ae76604a9c17bc8d0df5629b082bf66f686e9..14c0a636926125c860d390f7a854498e1c4eb6e3 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -32,7 +32,6 @@
 
 class LLSpeakerMgr;
 class LLUICtrl;
-class LLAvalineUpdater;
 
 class LLParticipantList : public LLConversationItemSession
 {
@@ -133,8 +132,6 @@ class LLParticipantList : public LLConversationItemSession
 	};
 
 private:
-	void onAvalineCallerFound(const LLUUID& participant_id);
-	void onAvalineCallerRemoved(const LLUUID& participant_id);
 
 	/**
 	 * Adjusts passed participant to work properly.
@@ -156,7 +153,6 @@ class LLParticipantList : public LLConversationItemSession
 	LLPointer<SpeakerMuteListener>				mSpeakerMuteListener;
 
 	validate_speaker_callback_t mValidateSpeakerCallback;
-	LLAvalineUpdater* mAvalineUpdater;
 };
 
 #endif // LL_PARTICIPANTLIST_H
diff --git a/indra/newview/llpersistentnotificationstorage.cpp b/indra/newview/llpersistentnotificationstorage.cpp
index 9bc77393dc5e0c85494d0f4f0e155165743e775c..9bf771db8a702473c56d53aa0cd04a84cdbbf5c7 100644
--- a/indra/newview/llpersistentnotificationstorage.cpp
+++ b/indra/newview/llpersistentnotificationstorage.cpp
@@ -163,12 +163,16 @@ void LLPersistentNotificationStorage::loadNotifications()
 	LL_INFOS("LLPersistentNotificationStorage") << "finished loading notifications" << LL_ENDL;
 }
 
-void LLPersistentNotificationStorage::initialize()
+void LLPersistentNotificationStorage::reset()
 {
-	std::string file_name = "open_notifications_" + LLGridManager::getInstance()->getGrid() + ".xml";
-	setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, file_name));
-	setOldFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml"));
+    std::string file_name = "open_notifications_" + LLGridManager::getInstance()->getGrid() + ".xml";
+    setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, file_name));
+    setOldFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml"));
+}
 
+void LLPersistentNotificationStorage::initialize()
+{
+    reset();
 	LLNotifications::instance().getChannel("Persistent")->
 		connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1));
 }
diff --git a/indra/newview/llpersistentnotificationstorage.h b/indra/newview/llpersistentnotificationstorage.h
index 1fb44872867d9c0b4e1c4801766297c1b463782d..335d85aaf66f44184a75bf67ca2b78075d20bb66 100644
--- a/indra/newview/llpersistentnotificationstorage.h
+++ b/indra/newview/llpersistentnotificationstorage.h
@@ -52,6 +52,7 @@ class LLPersistentNotificationStorage : public LLParamSingleton<LLPersistentNoti
 
 	void saveNotifications();
 	void loadNotifications();
+    void reset();
 
 protected:
 
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index 230def53626c6a50e9d62f1dbd6211560ae028c2..3fd4f51559e023af6be25256548f039e97e8b031 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -866,7 +866,10 @@ bool LLPreviewNotecard::loadNotecardText(const std::string& filename)
     buffer[nread] = '\0';
     fclose(file);
 
-    mEditor->setText(LLStringExplicit(buffer));
+    std::string text = std::string(buffer);
+    LLStringUtil::replaceTabsWithSpaces(text, LLTextEditor::spacesPerTab());
+
+    mEditor->setText(text);
     delete[] buffer;
 
     return true;
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index e4b4b597ca33b52e10e4a8ec41c660b8c84f85ef..5043250e0844ad71884e94091387081517aeaa8f 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -601,7 +601,10 @@ bool LLScriptEdCore::loadScriptText(const std::string& filename)
 	buffer[nread] = '\0';
 	fclose(file);
 
-	mEditor->setText(LLStringExplicit(buffer));
+    std::string text = std::string(buffer);
+    LLStringUtil::replaceTabsWithSpaces(text, LLTextEditor::spacesPerTab());
+
+    mEditor->setText(text);
 	delete[] buffer;
 
 	return true;
diff --git a/indra/newview/llrecentpeople.cpp b/indra/newview/llrecentpeople.cpp
index 83b0c4f1bf29b81484484906418170209341d30b..0faf6bf88960de264a45737869b528672d629c64 100644
--- a/indra/newview/llrecentpeople.cpp
+++ b/indra/newview/llrecentpeople.cpp
@@ -42,14 +42,6 @@ bool LLRecentPeople::add(const LLUUID& id, const LLSD& userdata)
 
 	if (is_not_group_id)
 	{
-		// For each avaline call the id of caller is different even if
-		// the phone number is the same.
-		// To avoid duplication of avaline list items in the recent list
-		// of panel People, deleting id's with similar phone number.
-		const LLUUID& caller_id = getIDByPhoneNumber(userdata);
-		if (caller_id.notNull())
-			mPeople.erase(caller_id);
-
 		//[] instead of insert to replace existing id->llsd["date"] with new date value
 		mPeople[id] = userdata;
 		mChangedSignal();
@@ -90,35 +82,6 @@ const LLSD& LLRecentPeople::getData(const LLUUID& id) const
 	return no_data;
 }
 
-bool LLRecentPeople::isAvalineCaller(const LLUUID& id) const
-{
-	recent_people_t::const_iterator it = mPeople.find(id);
-
-	if (it != mPeople.end())
-	{
-		const LLSD& user = it->second;		
-		return user["avaline_call"].asBoolean();
-	}
-
-	return false;
-}
-
-const LLUUID& LLRecentPeople::getIDByPhoneNumber(const LLSD& userdata)
-{
-	if (!userdata["avaline_call"].asBoolean())
-		return LLUUID::null;
-
-	for (recent_people_t::const_iterator it = mPeople.begin(); it != mPeople.end(); ++it)
-	{
-		const LLSD& user_info = it->second;
-		
-		if (user_info["call_number"].asString() == userdata["call_number"].asString())
-			return it->first;
-	}
-	
-	return LLUUID::null;
-}
-
 // virtual
 bool LLRecentPeople::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
 {
diff --git a/indra/newview/llrecentpeople.h b/indra/newview/llrecentpeople.h
index 18b669ff4fc81be07d5f47d1a1c78dee5aeae1e5..1b322f2c0a98b3a68d70ad59815b6987db474e4e 100644
--- a/indra/newview/llrecentpeople.h
+++ b/indra/newview/llrecentpeople.h
@@ -62,9 +62,7 @@ class LLRecentPeople: public LLSingleton<LLRecentPeople>, public LLOldEvents::LL
 	 * @param id avatar to add.
 	 *
 	 * @param userdata additional information about last interaction party.
-	 *				   For example when last interaction party is not an avatar
-	 *				   but an avaline caller, additional info (such as phone
-	 *				   number, session id and etc.) should be added.
+	 *				   For example session id can be added.
 	 *
 	 * @return false if the avatar is in the list already, true otherwise
 	 */
@@ -96,13 +94,6 @@ class LLRecentPeople: public LLSingleton<LLRecentPeople>, public LLOldEvents::LL
 	 */
 	const LLSD& getData(const LLUUID& id) const;
 
-	/**
-	 * Checks whether specific participant is an avaline caller
-	 *
-	 * @param id identifier of specific participant
-	 */
-	bool isAvalineCaller(const LLUUID& id) const;
-
 	/**
 	 * Set callback to be called when the list changed.
 	 * 
@@ -122,8 +113,6 @@ class LLRecentPeople: public LLSingleton<LLRecentPeople>, public LLOldEvents::LL
 
 private:
 
-	const LLUUID& getIDByPhoneNumber(const LLSD& userdata);
-
 	typedef std::map<LLUUID, LLSD> recent_people_t;
 	recent_people_t		mPeople;
 	signal_t			mChangedSignal;
diff --git a/indra/newview/llsearchableui.h b/indra/newview/llsearchableui.h
index e033cae3abe2597e910dbce7ad567daf6bbd6aab..31f11eb8ef037ea16e269ba335dd142d806b0280 100644
--- a/indra/newview/llsearchableui.h
+++ b/indra/newview/llsearchableui.h
@@ -41,9 +41,9 @@ namespace ll
 		struct PanelData;
 		struct TabContainerData;
 
-		typedef boost::shared_ptr< SearchableItem > SearchableItemPtr;
-		typedef boost::shared_ptr< PanelData > PanelDataPtr;
-		typedef boost::shared_ptr< TabContainerData > TabContainerDataPtr;
+		typedef std::shared_ptr< SearchableItem > SearchableItemPtr;
+		typedef std::shared_ptr< PanelData > PanelDataPtr;
+		typedef std::shared_ptr< TabContainerData > TabContainerDataPtr;
 
 		typedef std::vector< TabContainerData > tTabContainerDataList;
 		typedef std::vector< SearchableItemPtr > tSearchableItemList;
@@ -55,7 +55,7 @@ namespace ll
 			LLView const *mView;
 			ll::ui::SearchableControl const *mCtrl;
 
-			std::vector< boost::shared_ptr< SearchableItem >  > mChildren;
+			std::vector< std::shared_ptr< SearchableItem >  > mChildren;
 
 			virtual ~SearchableItem();
 
@@ -68,8 +68,8 @@ namespace ll
 			LLPanel const *mPanel;
 			std::string mLabel;
 
-			std::vector< boost::shared_ptr< SearchableItem > > mChildren;
-			std::vector< boost::shared_ptr< PanelData > > mChildPanel;
+			std::vector< std::shared_ptr< SearchableItem > > mChildren;
+			std::vector< std::shared_ptr< PanelData > > mChildPanel;
 
 			virtual ~PanelData();
 
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 7d994f1d0568ecfbb9087a5e7bbda3260911c226..99835d4e5a9e045b115f72a5dc58eabf3275437c 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -311,14 +311,29 @@ void LLSelectMgr::resetObjectOverrides(LLObjectSelectionHandle selected_handle)
 {
     struct f : public LLSelectedNodeFunctor
     {
+        f(bool a, LLSelectMgr* p) : mAvatarOverridesPersist(a), mManager(p) {}
+        bool mAvatarOverridesPersist;
+        LLSelectMgr* mManager;
         virtual bool apply(LLSelectNode* node)
         {
+            if (mAvatarOverridesPersist)
+            {
+                LLViewerObject* object = node->getObject();
+                if (object && !object->getParent())
+                {
+                    LLVOAvatar* avatar = object->asAvatar();
+                    if (avatar)
+                    {
+                        mManager->mAvatarOverridesMap.emplace(avatar->getID(), AvatarPositionOverride(node->mLastPositionLocal, node->mLastRotation, object));
+                    }
+                }
+            }
             node->mLastPositionLocal.setVec(0, 0, 0);
             node->mLastRotation = LLQuaternion();
             node->mLastScale.setVec(0, 0, 0);
             return true;
         }
-    } func;
+    } func(mAllowSelectAvatar, this);
 
     selected_handle->applyToNodes(&func);
 }
@@ -352,6 +367,93 @@ void LLSelectMgr::overrideObjectUpdates()
 	getSelection()->applyToNodes(&func);
 }
 
+void LLSelectMgr::resetAvatarOverrides()
+{
+    mAvatarOverridesMap.clear();
+}
+
+void LLSelectMgr::overrideAvatarUpdates()
+{
+    if (mAvatarOverridesMap.size() == 0)
+    {
+        return;
+    }
+
+    if (!mAllowSelectAvatar || !gFloaterTools)
+    {
+        resetAvatarOverrides();
+        return;
+    }
+
+    if (!gFloaterTools->getVisible() && getSelection()->isEmpty())
+    {
+        // when user switches selection, floater is invisible and selection is empty
+        LLToolset *toolset = LLToolMgr::getInstance()->getCurrentToolset();
+        if (toolset->isShowFloaterTools()
+            && toolset->isToolSelected(0)) // Pie tool
+        {
+            resetAvatarOverrides();
+            return;
+        }
+    }
+
+    // remove selected avatars from this list,
+    // but set object overrides to make sure avatar won't snap back 
+    struct f : public LLSelectedNodeFunctor
+    {
+        f(LLSelectMgr* p) : mManager(p) {}
+        LLSelectMgr* mManager;
+        virtual bool apply(LLSelectNode* selectNode)
+        {
+            LLViewerObject* object = selectNode->getObject();
+            if (object && !object->getParent())
+            {
+                LLVOAvatar* avatar = object->asAvatar();
+                if (avatar)
+                {
+                    uuid_av_override_map_t::iterator iter = mManager->mAvatarOverridesMap.find(avatar->getID());
+                    if (iter != mManager->mAvatarOverridesMap.end())
+                    {
+                        if (selectNode->mLastPositionLocal.isExactlyZero())
+                        {
+                            selectNode->mLastPositionLocal = iter->second.mLastPositionLocal;
+                        }
+                        if (selectNode->mLastRotation == LLQuaternion())
+                        {
+                            selectNode->mLastRotation = iter->second.mLastRotation;
+                        }
+                        mManager->mAvatarOverridesMap.erase(iter);
+                    }
+                }
+            }
+            return true;
+        }
+    } func(this);
+    getSelection()->applyToNodes(&func);
+
+    // Override avatar positions
+    uuid_av_override_map_t::iterator it = mAvatarOverridesMap.begin();
+    while (it != mAvatarOverridesMap.end())
+    {
+        if (it->second.mObject->isDead())
+        {
+            it = mAvatarOverridesMap.erase(it);
+        }
+        else
+        {
+            if (!it->second.mLastPositionLocal.isExactlyZero())
+            {
+                it->second.mObject->setPosition(it->second.mLastPositionLocal);
+            }
+            if (it->second.mLastRotation != LLQuaternion())
+            {
+                it->second.mObject->setRotation(it->second.mLastRotation);
+            }
+            it++;
+        }
+    }
+}
+
 //-----------------------------------------------------------------------------
 // Select just the object, not any other group members.
 //-----------------------------------------------------------------------------
@@ -887,7 +989,7 @@ void LLSelectMgr::addAsFamily(std::vector<LLViewerObject*>& objects, BOOL add_to
 		
 		// Can't select yourself
 		if (objectp->mID == gAgentID
-			&& !LLSelectMgr::getInstance()->mAllowSelectAvatar)
+			&& !mAllowSelectAvatar)
 		{
 			continue;
 		}
@@ -6512,6 +6614,24 @@ LLSelectNode::LLSelectNode(const LLSelectNode& nodep)
 
 LLSelectNode::~LLSelectNode()
 {
+    LLSelectMgr *manager = LLSelectMgr::getInstance();
+    if (manager->mAllowSelectAvatar
+        && (!mLastPositionLocal.isExactlyZero()
+            || mLastRotation != LLQuaternion()))
+    {
+        LLViewerObject* object = getObject(); //isDead() check
+        if (object && !object->getParent())
+        {
+            LLVOAvatar* avatar = object->asAvatar();
+            if (avatar)
+            {
+                // Avatar was moved and needs to stay that way
+                manager->mAvatarOverridesMap.emplace(avatar->getID(), LLSelectMgr::AvatarPositionOverride(mLastPositionLocal, mLastRotation, object));
+            }
+        }
+    }
+
+
 	delete mPermissions;
 	mPermissions = NULL;
 }
@@ -7033,6 +7153,10 @@ void LLSelectMgr::updateSelectionCenter()
 	const F32 MOVE_SELECTION_THRESHOLD = 1.f;		//  Movement threshold in meters for updating selection
 													//  center (tractor beam)
 
+    // override any avatar updates received
+    // Works only if avatar was repositioned
+    // and edit floater is visible
+    overrideAvatarUpdates();
 	//override any object updates received
 	//for selected objects
 	overrideObjectUpdates();
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 3b76f87c44008f02d0726485a5fd320069ab2581..cc6815296e1367e46b4b051883b432dd8970fa71 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -469,6 +469,30 @@ class LLSelectMgr : public LLEditMenuHandler, public LLSimpleton<LLSelectMgr>
 	void resetObjectOverrides(LLObjectSelectionHandle selected_handle);
 	void overrideObjectUpdates();
 
+    void resetAvatarOverrides();
+    void overrideAvatarUpdates();
+
+    struct AvatarPositionOverride
+    {
+        AvatarPositionOverride();
+        AvatarPositionOverride(LLVector3 &vec, LLQuaternion &quat, LLViewerObject *obj) :
+            mLastPositionLocal(vec),
+            mLastRotation(quat),
+            mObject(obj)
+        {
+        }
+        LLVector3 mLastPositionLocal;
+        LLQuaternion mLastRotation;
+        LLPointer<LLViewerObject> mObject;
+    };
+
+    // Avatar overrides should persist even after selection
+    // was removed as long as edit floater is up
+    typedef std::map<LLUUID, AvatarPositionOverride> uuid_av_override_map_t;
+    uuid_av_override_map_t mAvatarOverridesMap;
+public:
+
+
 	// Returns the previous value of mForceSelection
 	BOOL setForceSelection(BOOL force);
 
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index abb936c3e5bea91f7440d61964483a3cd4ed55ea..ea671a130e1c41d6b3c2d2a6b31bc6cb12a25348 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -534,7 +534,7 @@ void LLSpeakerMgr::updateSpeakerList()
 			}
 			else if (mSpeakers.size() == 0)
 			{
-				// For all other session type (ad-hoc, P2P, avaline), we use the initial participants targets list
+				// For all other session type (ad-hoc, P2P), we use the initial participants targets list
 				for (uuid_vec_t::iterator it = session->mInitialTargetIDs.begin();it!=session->mInitialTargetIDs.end();++it)
 				{
 					// Add buddies if they are on line, add any other avatar.
diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h
index d1dbf72fe9e9c363fbfe79c595c3d0118446e7d9..ed795b515586ea1b41cc34d02afe412bcc61b3f0 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -244,14 +244,6 @@ class LLSpeakerMgr : public LLOldEvents::LLObservable
 	const LLUUID getSessionID();
 	bool isSpeakerToBeRemoved(const LLUUID& speaker_id);
 
-	/**
-	 * Removes avaline speaker.
-	 *
-	 * This is a HACK due to server does not send information that Avaline caller ends call.
-	 * It can be removed when server is updated. See EXT-4301 for details
-	 */
-	bool removeAvalineSpeaker(const LLUUID& speaker_id) { return removeSpeaker(speaker_id); }
-
 	/**
 	 * Initializes mVoiceModerated depend on LLSpeaker::mModeratorMutedVoice of agent's participant.
 	 *
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 142dc4c46eb8787ad0cf2ba3f98221cc4c705a00..43e808f8aa55e518666f311ac357c08247c03ce8 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -255,6 +255,7 @@ static bool mLoginStatePastUI = false;
 static bool mBenefitsSuccessfullyInit = false;
 
 const F32 STATE_AGENT_WAIT_TIMEOUT = 240; //seconds
+const S32 MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN = 3; // Give region 3 chances
 
 std::unique_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState"));
 std::unique_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener());
@@ -927,6 +928,12 @@ bool idle_startup()
 			LLPersistentNotificationStorage::initParamSingleton();
 			LLDoNotDisturbNotificationStorage::initParamSingleton();
 		}
+        else
+        {
+            // reinitialize paths in case user switched grids or accounts
+            LLPersistentNotificationStorage::getInstance()->reset();
+            LLDoNotDisturbNotificationStorage::getInstance()->reset();
+        }
 
 		// Set PerAccountSettingsFile to the default value.
 		std::string settings_per_account = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount"));
@@ -1388,10 +1395,21 @@ bool idle_startup()
 		{
 			LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
 		}
+        else if (regionp->capabilitiesError())
+        {
+            // Try to connect despite capabilities' error state
+            LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED);
+        }
 		else
 		{
 			U32 num_retries = regionp->getNumSeedCapRetries();
-			if (num_retries > 0)
+            if (num_retries > MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN)
+            {
+                // Region will keep trying to get capabilities,
+                // but for now continue as if caps were granted
+                LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED);
+            }
+			else if (num_retries > 0)
 			{
 				LLStringUtil::format_map_t args;
 				args["[NUMBER]"] = llformat("%d", num_retries + 1);
@@ -2385,6 +2403,11 @@ void login_callback(S32 option, void *userdata)
 void show_release_notes_if_required()
 {
     static bool release_notes_shown = false;
+    // We happen to know that instantiating LLVersionInfo implicitly
+    // instantiates the LLEventMailDrop named "relnotes", which we (might) use
+    // below. If viewer release notes stop working, might be because that
+    // LLEventMailDrop got moved out of LLVersionInfo and hasn't yet been
+    // instantiated.
     if (!release_notes_shown && (LLVersionInfo::instance().getChannelAndVersion() != gLastRunVersion)
         && LLVersionInfo::instance().getViewerMaturity() != LLVersionInfo::TEST_VIEWER // don't show Release Notes for the test builds
         && gSavedSettings.getBOOL("UpdaterShowReleaseNotes")
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 77b84c678903594a7f0ea35d1e19716b559c511d..7e1f8db9a882bceca579e4f6b643c7639e99cab8 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -748,7 +748,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 				glh::matrix4f proj = get_current_projection();
 				glh::matrix4f mod = get_current_modelview();
 				glViewport(0,0,512,512);
-				LLVOAvatar::updateFreezeCounter() ;
 
 				LLVOAvatar::updateImpostors();
 
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 661f70972dd1335ef47fec4e400de900b8593fea..636909e6f2c685deefca4b3c6ed7ff01f3cdf0a3 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -3194,7 +3194,7 @@ bool LLViewerMediaImpl::isForcedUnloaded() const
 	}
 
 	// If this media's class is not supposed to be shown, unload
-	if (!shouldShowBasedOnClass())
+	if (!shouldShowBasedOnClass() || isObscured())
 	{
 		return true;
 	}
@@ -3879,6 +3879,26 @@ bool LLViewerMediaImpl::shouldShowBasedOnClass() const
 	}
 }
 
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+bool LLViewerMediaImpl::isObscured() const
+{
+    if (getUsedInUI() || isParcelMedia()) return false;
+
+    LLParcel* agent_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+    if (!agent_parcel)
+    {
+        return false;
+    }
+    
+    if (agent_parcel->getObscureMOAP() && !isInAgentParcel())
+    {
+        return true;
+    }
+
+    return false;
+}
+
 //////////////////////////////////////////////////////////////////////////////////////////
 //
 bool LLViewerMediaImpl::isAttachedToAnotherAvatar() const
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 806692929a3ea55b471ff7f95981760bfe3b0c83..b95cfd4c68edde94d80152793991ae5648582dad 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -423,6 +423,7 @@ class LLViewerMediaImpl
 private:
 	bool isAutoPlayable() const;
 	bool shouldShowBasedOnClass() const;
+	bool isObscured() const;
 	static bool isObjectAttachedToAnotherAvatar(LLVOVolume *obj);
 	static bool isObjectInAgentParcel(LLVOVolume *obj);
 	
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index f10cb329a9c01d75859f1c8b1594a4a8f33a45eb..1842c434e75e40e512fafdc8fb1103233aa2ccbf 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -33,10 +33,11 @@
 #include "llviewermenu.h" 
 
 // linden library includes
-#include "llavatarnamecache.h"	// IDEVO
+#include "llavatarnamecache.h"  // IDEVO (I Are Not Men!)
+#include "llcombobox.h"
+#include "llcoros.h"
 #include "llfloaterreg.h"
 #include "llfloatersidepanelcontainer.h"
-#include "llcombobox.h"
 #include "llinventorypanel.h"
 #include "llnotifications.h"
 #include "llnotificationsutil.h"
@@ -93,6 +94,7 @@
 #include "llmarketplacefunctions.h"
 #include "llmenuoptionpathfindingrebakenavmesh.h"
 #include "llmoveview.h"
+#include "llnavigationbar.h"
 #include "llparcel.h"
 #include "llrootview.h"
 #include "llsceneview.h"
@@ -2353,6 +2355,7 @@ class LLAdvancedForceErrorLlerror : public view_listener_t
 		return true;
 	}
 };
+
 class LLAdvancedForceErrorBadMemoryAccess : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -2362,6 +2365,22 @@ class LLAdvancedForceErrorBadMemoryAccess : public view_listener_t
 	}
 };
 
+class LLAdvancedForceErrorBadMemoryAccessCoro : public view_listener_t
+{
+    bool handleEvent(const LLSD& userdata)
+    {
+        LLCoros::instance().launch(
+            "AdvancedForceErrorBadMemoryAccessCoro",
+            [](){
+                // Wait for one mainloop() iteration, letting the enclosing
+                // handleEvent() method return.
+                llcoro::suspend();
+                force_error_bad_memory_access(NULL);
+            });
+        return true;
+    }
+};
+
 class LLAdvancedForceErrorInfiniteLoop : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -2380,6 +2399,22 @@ class LLAdvancedForceErrorSoftwareException : public view_listener_t
 	}
 };
 
+class LLAdvancedForceErrorSoftwareExceptionCoro : public view_listener_t
+{
+    bool handleEvent(const LLSD& userdata)
+    {
+        LLCoros::instance().launch(
+            "AdvancedForceErrorSoftwareExceptionCoro",
+            [](){
+                // Wait for one mainloop() iteration, letting the enclosing
+                // handleEvent() method return.
+                llcoro::suspend();
+                force_error_software_exception(NULL);
+            });
+        return true;
+    }
+};
+
 class LLAdvancedForceErrorDriverCrash : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -5303,12 +5338,10 @@ class LLToolsEnablePathfindingRebakeRegion : public view_listener_t
 	{
 		bool returnValue = false;
 
-		if (LLPathfindingManager::getInstance() != NULL)
-		{
-			LLMenuOptionPathfindingRebakeNavmesh *rebakeInstance = LLMenuOptionPathfindingRebakeNavmesh::getInstance();
-			returnValue = (rebakeInstance->canRebakeRegion() &&
-				(rebakeInstance->getMode() == LLMenuOptionPathfindingRebakeNavmesh::kRebakeNavMesh_Available));
-		}
+        if (LLNavigationBar::instanceExists())
+        {
+            returnValue = LLNavigationBar::getInstance()->isRebakeNavMeshAvailable();
+        }
 		return returnValue;
 	}
 };
@@ -9435,8 +9468,10 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLAdvancedForceErrorBreakpoint(), "Advanced.ForceErrorBreakpoint");
 	view_listener_t::addMenu(new LLAdvancedForceErrorLlerror(), "Advanced.ForceErrorLlerror");
 	view_listener_t::addMenu(new LLAdvancedForceErrorBadMemoryAccess(), "Advanced.ForceErrorBadMemoryAccess");
+	view_listener_t::addMenu(new LLAdvancedForceErrorBadMemoryAccessCoro(), "Advanced.ForceErrorBadMemoryAccessCoro");
 	view_listener_t::addMenu(new LLAdvancedForceErrorInfiniteLoop(), "Advanced.ForceErrorInfiniteLoop");
 	view_listener_t::addMenu(new LLAdvancedForceErrorSoftwareException(), "Advanced.ForceErrorSoftwareException");
+	view_listener_t::addMenu(new LLAdvancedForceErrorSoftwareExceptionCoro(), "Advanced.ForceErrorSoftwareExceptionCoro");
 	view_listener_t::addMenu(new LLAdvancedForceErrorDriverCrash(), "Advanced.ForceErrorDriverCrash");
     view_listener_t::addMenu(new LLAdvancedForceErrorCoroutineCrash(), "Advanced.ForceErrorCoroutineCrash");
     view_listener_t::addMenu(new LLAdvancedForceErrorThreadCrash(), "Advanced.ForceErrorThreadCrash");
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index e959f24f1f1178cd453bbd6dec1f4a976b2d000a..49049a19d9b332bc4e6ddf0f2c8729e27d8b5988 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3338,13 +3338,6 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
 	// trigger a control event.
 	U32 control_flags = gAgent.getControlFlags();
 
-    // Rotation into both directions should cancel out
-    U32 mask = AGENT_CONTROL_YAW_POS | AGENT_CONTROL_YAW_NEG;
-    if ((control_flags & mask) == mask)
-    {
-        control_flags &= ~mask;
-    }
-
 	MASK	key_mask = gKeyboard->currentMask(TRUE);
 
 	if (key_mask & MASK_ALT || key_mask & MASK_CONTROL)
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index d0bd0f45a27782978ee7387404751ccf690013dd..e5a2385a2a6d16330cd503f411e435f20b46f385 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -363,6 +363,13 @@ LLViewerObject::~LLViewerObject()
 		mPartSourcep = NULL;
 	}
 
+    if (mText)
+    {
+        // something recovered LLHUDText when object was already dead
+        mText->markDead();
+        mText = NULL;
+    }
+
 	// Delete memory associated with extra parameters.
 	std::map<U16, ExtraParameter*>::iterator iter;
 	for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
@@ -2469,11 +2476,19 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
 		needs_refresh = needs_refresh || child->mUserSelected;
 	}
 
+    static LLCachedControl<bool> allow_select_avatar(gSavedSettings, "AllowSelectAvatar", FALSE);
 	if (needs_refresh)
 	{
 		LLSelectMgr::getInstance()->updateSelectionCenter();
 		dialog_refresh_all();
-	} 
+	}
+    else if (allow_select_avatar && asAvatar())
+    {
+        // Override any avatar position updates received
+        // Works only if avatar was repositioned using build
+        // tools and build floater is visible
+        LLSelectMgr::getInstance()->overrideAvatarUpdates();
+    }
 
 
 	// Mark update time as approx. now, with the ping delay.
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 389f5087e29d2ede21cf41f7c961f6b1de5d7243..768b4f425b4f80af49f469017fab88e6484bca34 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -571,7 +571,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
         
 		if(update_cache)
 		{
-			objectp = regionp->updateCacheEntry(local_id, objectp, update_type);
+            //update object cache if the object receives a full-update or terse update
+			objectp = regionp->updateCacheEntry(local_id, objectp);
 		}
 
 		// This looks like it will break if the local_id of the object doesn't change
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index e69b0347f8f9863e2e5a8cefc3c06f9fd5edf545..f58eac2ed917bafe1e73c2d416c2fa42d97f26e6 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1553,6 +1553,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
     BOOL    region_allow_environment_override = true;
     S32     parcel_environment_version = 0;
     BOOL	agent_parcel_update = false; // updating previous(existing) agent parcel
+    U32     extended_flags = 0; //obscure MOAP
 
     S32		other_clean_time = 0;
 
@@ -1642,6 +1643,11 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
         msg->getBOOLFast(_PREHASH_RegionAllowAccessBlock, _PREHASH_RegionAllowAccessOverride, region_allow_access_override);
     }
 
+    if (msg->getNumberOfBlocks(_PREHASH_ParcelExtendedFlags))
+    {
+        msg->getU32Fast(_PREHASH_ParcelExtendedFlags, _PREHASH_Flags, extended_flags);
+     }
+
     if (msg->getNumberOfBlocks(_PREHASH_ParcelEnvironmentBlock))
     {
         msg->getS32Fast(_PREHASH_ParcelEnvironmentBlock, _PREHASH_ParcelEnvironmentVersion, parcel_environment_version);
@@ -1698,6 +1704,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
         parcel->setParcelEnvironmentVersion(cur_parcel_environment_version);
         parcel->setRegionAllowEnvironmentOverride(region_allow_environment_override);
 
+        parcel->setObscureMOAP((bool)extended_flags);
+
 		parcel->unpackMessage(msg);
 
 		if (parcel == parcel_mgr.mAgentParcel)
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 4abf53d1c57f44fcb297d0e9b60c4650c53656c5..8f56f6110fe4e0decc9fb0526616bf52fcf859be 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -95,8 +95,6 @@
 
 // The server only keeps our pending agent info for 60 seconds.
 // We want to allow for seed cap retry, but its not useful after that 60 seconds.
-// Give it 3 chances, each at 18 seconds to give ourselves a few seconds to connect anyways if we give up.
-const S32 MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN = 3;
 // Even though we gave up on login, keep trying for caps after we are logged in:
 const S32 MAX_CAP_REQUEST_ATTEMPTS = 30;
 const U32 DEFAULT_MAX_REGION_WIDE_PRIM_COUNT = 15000;
@@ -178,7 +176,6 @@ class LLViewerRegionImpl
         mCompositionp(NULL),
         mEventPoll(NULL),
         mSeedCapMaxAttempts(MAX_CAP_REQUEST_ATTEMPTS),
-        mSeedCapMaxAttemptsBeforeLogin(MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN),
         mSeedCapAttempts(0),
         mHttpResponderID(0),
         mLastCameraUpdate(0),
@@ -231,7 +228,6 @@ class LLViewerRegionImpl
 	LLEventPoll* mEventPoll;
 
 	S32 mSeedCapMaxAttempts;
-	S32 mSeedCapMaxAttemptsBeforeLogin;
 	S32 mSeedCapAttempts;
 
 	S32 mHttpResponderID;
@@ -286,19 +282,13 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)
         if (url.empty())
         {
             LL_WARNS("AppInit", "Capabilities") << "Failed to get seed capabilities, and can not determine url!" << LL_ENDL;
+            regionp->setCapabilitiesError();
             return; // this error condition is not recoverable.
         }
 
         // record that we just entered a new region
         newRegionEntry(*regionp);
 
-        // After a few attempts, continue login.  But keep trying to get the caps:
-        if (impl->mSeedCapAttempts >= impl->mSeedCapMaxAttemptsBeforeLogin &&
-            STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
-        {
-            LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED);
-        }
-
         if (impl->mSeedCapAttempts > impl->mSeedCapMaxAttempts)
         {
             // *TODO: Give a user pop-up about this error?
@@ -394,11 +384,6 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)
 														 << " region name " << regionp->getName() << LL_ENDL;
         regionp->setCapabilitiesReceived(true);
 
-        if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
-        {
-            LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED);
-        }
-
         break;
     } 
     while (true);
@@ -442,6 +427,11 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro(U64 regionHandle)
         if (url.empty())
         {
             LL_WARNS("AppInit", "Capabilities") << "Failed to get seed capabilities, and can not determine url!" << LL_ENDL;
+            if (regionp->getCapability("Seed").empty())
+            {
+                // initial attempt failed to get this cap as well
+                regionp->setCapabilitiesError();
+            }
             break; // this error condition is not recoverable.
         }
 
@@ -643,7 +633,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
 	mCacheLoaded(FALSE),
 	mCacheDirty(FALSE),
 	mReleaseNotesRequested(FALSE),
-	mCapabilitiesReceived(false),
+	mCapabilitiesState(CAPABILITIES_STATE_INIT),
 	mSimulatorFeaturesReceived(false),
 	mBitsReceived(0.f),
 	mPacketsReceived(0.f),
@@ -1818,13 +1808,8 @@ LLViewerObject* LLViewerRegion::addNewObject(LLVOCacheEntry* entry)
 
 //update object cache if the object receives a full-update or terse update
 //update_type == EObjectUpdateType::OUT_TERSE_IMPROVED or EObjectUpdateType::OUT_FULL
-LLViewerObject* LLViewerRegion::updateCacheEntry(U32 local_id, LLViewerObject* objectp, U32 update_type)
+LLViewerObject* LLViewerRegion::updateCacheEntry(U32 local_id, LLViewerObject* objectp)
 {
-	if(objectp && update_type != (U32)OUT_TERSE_IMPROVED)
-	{
-		return objectp; //no need to access cache
-	}
-
 	LLVOCacheEntry* entry = getCacheEntry(local_id);
 	if (!entry)
 	{
@@ -1836,11 +1821,8 @@ LLViewerObject* LLViewerRegion::updateCacheEntry(U32 local_id, LLViewerObject* o
 		objectp = addNewObject(entry);
 	}
 
-	//remove from cache if terse update
-	if(update_type == (U32)OUT_TERSE_IMPROVED)
-	{
-		killCacheEntry(entry, true);
-	}
+    //remove from cache.
+    killCacheEntry(entry, true);
 
 	return objectp;
 }
@@ -2300,6 +2282,11 @@ void LLViewerRegion::requestSimulatorFeatures()
         std::string coroname =
             LLCoros::instance().launch("LLViewerRegionImpl::requestSimulatorFeatureCoro",
                                        boost::bind(&LLViewerRegionImpl::requestSimulatorFeatureCoro, url, getHandle()));
+
+        // requestSimulatorFeatures can be called from other coros,
+        // launch() acts like a suspend()
+        // Make sure we are still good to do
+        LLCoros::checkStop();
         
         LL_INFOS("AppInit", "SimulatorFeatures") << "Launching " << coroname << " requesting simulator features from " << url << " for region " << getRegionID() << LL_ENDL;
     }
@@ -3123,6 +3110,12 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
         std::string coroname =
             LLCoros::instance().launch("LLEnvironmentRequest::requestBaseCapabilitiesCompleteCoro",
             boost::bind(&LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro, getHandle()));
+
+        // setSeedCapability can be called from other coros,
+        // launch() acts like a suspend()
+        // Make sure we are still good to do
+        LLCoros::checkStop();
+
 		return;
     }
 	
@@ -3136,6 +3129,11 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
         LLCoros::instance().launch("LLViewerRegionImpl::requestBaseCapabilitiesCoro",
         boost::bind(&LLViewerRegionImpl::requestBaseCapabilitiesCoro, getHandle()));
 
+    // setSeedCapability can be called from other coros,
+    // launch() acts like a suspend()
+    // Make sure we are still good to do
+    LLCoros::checkStop();
+
     LL_INFOS("AppInit", "Capabilities") << "Launching " << coroname << " requesting seed capabilities from " << url << " for region " << getRegionID() << LL_ENDL;
 }
 
@@ -3257,12 +3255,17 @@ bool LLViewerRegion::isCapabilityAvailable(const std::string& name) const
 
 bool LLViewerRegion::capabilitiesReceived() const
 {
-	return mCapabilitiesReceived;
+	return mCapabilitiesState == CAPABILITIES_STATE_RECEIVED;
+}
+
+bool LLViewerRegion::capabilitiesError() const
+{
+    return mCapabilitiesState == CAPABILITIES_STATE_ERROR;
 }
 
 void LLViewerRegion::setCapabilitiesReceived(bool received)
 {
-	mCapabilitiesReceived = received;
+	mCapabilitiesState = received ? CAPABILITIES_STATE_RECEIVED : CAPABILITIES_STATE_INIT;
 
 	// Tell interested parties that we've received capabilities,
 	// so that they can safely use getCapability().
@@ -3277,6 +3280,11 @@ void LLViewerRegion::setCapabilitiesReceived(bool received)
 	}
 }
 
+void LLViewerRegion::setCapabilitiesError()
+{
+    mCapabilitiesState = CAPABILITIES_STATE_ERROR;
+}
+
 boost::signals2::connection LLViewerRegion::setCapabilitiesReceivedCallback(const caps_received_signal_t::slot_type& cb)
 {
 	return mCapabilitiesReceivedSignal.connect(cb);
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index fcbf56c81f13c2c6e7ab83fb3548d3e681ce1c1d..d0fa9fea01423eba16b9f819c67858ce01189f64 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -268,7 +268,9 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 
 	// has region received its final (not seed) capability list?
 	bool capabilitiesReceived() const;
+    bool capabilitiesError() const;
 	void setCapabilitiesReceived(bool received);
+	void setCapabilitiesError();
 	boost::signals2::connection setCapabilitiesReceivedCallback(const caps_received_signal_t::slot_type& cb);
 
 	static bool isSpecialCapabilityName(const std::string &name);
@@ -352,7 +354,7 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	void requestCacheMisses();
 	void addCacheMissFull(const U32 local_id);
 	//update object cache if the object receives a full-update or terse update
-	LLViewerObject* updateCacheEntry(U32 local_id, LLViewerObject* objectp, U32 update_type);
+	LLViewerObject* updateCacheEntry(U32 local_id, LLViewerObject* objectp);
 	void findOrphans(U32 parent_id);
 	void clearCachedVisibleObjects();
 	void dumpCache();
@@ -527,12 +529,20 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	BOOL									mCacheLoaded;
 	BOOL                                    mCacheDirty;
 	BOOL	mAlive;					// can become false if circuit disconnects
-	BOOL	mCapabilitiesReceived;
 	BOOL	mSimulatorFeaturesReceived;
 	BOOL    mReleaseNotesRequested;
 	BOOL    mDead;  //if true, this region is in the process of deleting.
 	BOOL    mPaused; //pause processing the objects in the region
 
+    typedef enum
+    {
+        CAPABILITIES_STATE_INIT = 0,
+        CAPABILITIES_STATE_ERROR,
+        CAPABILITIES_STATE_RECEIVED
+    } eCababilitiesState;
+
+    eCababilitiesState	mCapabilitiesState;
+
 	typedef std::map<U32, std::vector<U32> > orphan_list_t;
 	orphan_list_t mOrphanMap;
 
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 796ff04a41d6368022df92318f247662eaae36ae..5d936dfc90d7849be1d2e6e90bc744d134e7a921 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -488,6 +488,7 @@ void send_viewer_stats(bool include_preferences)
 	system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB().value();
 	system["os"] = LLOSInfo::instance().getOSStringSimple();
 	system["cpu"] = gSysCPU.getCPUString();
+    system["cpu_sse"] = gSysCPU.getSSEVersions();
 	system["address_size"] = ADDRESS_SIZE;
 	system["os_bitness"] = LLOSInfo::instance().getOSBitness();
 	unsigned char MACAddress[MAC_ADDRESS_BYTES];
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 5474098d168a9c0a7202f0011aa889a370e6f198..b2728b294e7405c5ad9abf70cceafcdce21f17fc 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -738,6 +738,12 @@ class LLDebugText
 				ypos += y_inc;
 
 				addText(xpos, ypos, llformat("%.3f/%.3f MB Mesh Cache Read/Write ", LLMeshRepository::sCacheBytesRead/(1024.f*1024.f), LLMeshRepository::sCacheBytesWritten/(1024.f*1024.f)));
+                ypos += y_inc;
+
+                addText(xpos, ypos, llformat("%.3f/%.3f MB Mesh Skins/Decompositions Memory", LLMeshRepository::sCacheBytesSkins / (1024.f*1024.f), LLMeshRepository::sCacheBytesDecomps / (1024.f*1024.f)));
+                ypos += y_inc;
+
+                addText(xpos, ypos, llformat("%.3f MB Mesh Headers Memory", LLMeshRepository::sCacheBytesHeaders / (1024.f*1024.f)));
 
 				ypos += y_inc;
 			}
@@ -1533,9 +1539,11 @@ void LLViewerWindow::handleFocusLost(LLWindow *window)
 	showCursor();
 	getWindow()->setMouseClipping(FALSE);
 
-	// If losing focus while keys are down, reset them.
+	// If losing focus while keys are down, handle them as
+    // an 'up' to correctly release states, then reset states
 	if (gKeyboard)
 	{
+        gKeyboard->resetKeyDownAndHandle();
 		gKeyboard->resetKeys();
 	}
 
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 30e3d77d29ac5be1f036b8d461b62ed97d186234..77b689751a1bce501cbd9156afeaa70e5052231a 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -1,4 +1,4 @@
-/** 
+/**
  * @File llvoavatar.cpp
  * @brief Implementation of LLVOAvatar class which is a derivation of LLViewerObject
  *
@@ -183,8 +183,6 @@ const F32 MAX_STANDOFF_DISTANCE_CHANGE = 32;
 // Should probably be 4 or 3, but didn't want to change it while change other logic - SJB
 const S32 SWITCH_TO_BAKED_DISCARD = 5;
 
-const F32 FOOT_COLLIDE_FUDGE = 0.04f;
-
 const F32 HOVER_EFFECT_MAX_SPEED = 3.f;
 const F32 HOVER_EFFECT_STRENGTH = 0.f;
 const F32 UNDERWATER_EFFECT_STRENGTH = 0.1f;
@@ -585,7 +583,6 @@ class LLPelvisFixMotion :
 //-----------------------------------------------------------------------------
 // Static Data
 //-----------------------------------------------------------------------------
-S32 LLVOAvatar::sFreezeCounter = 0;
 U32 LLVOAvatar::sMaxNonImpostors = 12; // Set from RenderAvatarMaxNonImpostors
 bool LLVOAvatar::sLimitNonImpostors = false; // True unless RenderAvatarMaxNonImpostors is 0 (unlimited)
 F32 LLVOAvatar::sRenderDistance = 256.f;
@@ -610,7 +607,6 @@ S32 LLVOAvatar::sNumVisibleChatBubbles = 0;
 BOOL LLVOAvatar::sDebugInvisible = FALSE;
 BOOL LLVOAvatar::sShowAttachmentPoints = FALSE;
 BOOL LLVOAvatar::sShowAnimationDebug = FALSE;
-BOOL LLVOAvatar::sShowFootPlane = FALSE;
 BOOL LLVOAvatar::sVisibleInFirstPerson = FALSE;
 F32 LLVOAvatar::sLODFactor = 1.f;
 F32 LLVOAvatar::sPhysicsLODFactor = 1.f;
@@ -779,6 +775,13 @@ std::string LLVOAvatar::avString() const
 
 void LLVOAvatar::debugAvatarRezTime(std::string notification_name, std::string comment)
 {
+    if (gDisconnected)
+    {
+        // If we disconected, these values are likely to be invalid and
+        // avString() might crash due to a dead sAvatarDictionary
+        return;
+    }
+
 	LL_INFOS("Avatar") << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32()
 					   << "sec ]"
 					   << avString() 
@@ -4107,8 +4110,7 @@ void LLVOAvatar::computeUpdatePeriod()
         && (!isSelf() || visually_muted)
         && !isUIAvatar()
         && (sLimitNonImpostors || visually_muted)
-        && !mNeedsAnimUpdate 
-        && !sFreezeCounter)
+        && !mNeedsAnimUpdate)
 	{
 		const LLVector4a* ext = mDrawable->getSpatialExtents();
 		LLVector4a size;
@@ -5081,42 +5083,6 @@ U32 LLVOAvatar::renderSkinned()
 		return num_indices;
 	}
 
-	// render collision normal
-	// *NOTE: this is disabled (there is no UI for enabling sShowFootPlane) due
-	// to DEV-14477.  the code is left here to aid in tracking down the cause
-	// of the crash in the future. -brad
-	if (sShowFootPlane && mDrawable.notNull())
-	{
-		LLVector3 slaved_pos = mDrawable->getPositionAgent();
-		LLVector3 foot_plane_normal(mFootPlane.mV[VX], mFootPlane.mV[VY], mFootPlane.mV[VZ]);
-		F32 dist_from_plane = (slaved_pos * foot_plane_normal) - mFootPlane.mV[VW];
-		LLVector3 collide_point = slaved_pos;
-		collide_point.mV[VZ] -= foot_plane_normal.mV[VZ] * (dist_from_plane + COLLISION_TOLERANCE - FOOT_COLLIDE_FUDGE);
-
-		gGL.begin(LLRender::LINES);
-		{
-			F32 SQUARE_SIZE = 0.2f;
-			gGL.color4f(1.f, 0.f, 0.f, 1.f);
-			
-			gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]);
-			gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]);
-
-			gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]);
-			gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]);
-			
-			gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]);
-			gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]);
-			
-			gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]);
-			gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]);
-			
-			gGL.vertex3f(collide_point.mV[VX], collide_point.mV[VY], collide_point.mV[VZ]);
-			gGL.vertex3f(collide_point.mV[VX] + mFootPlane.mV[VX], collide_point.mV[VY] + mFootPlane.mV[VY], collide_point.mV[VZ] + mFootPlane.mV[VZ]);
-
-		}
-		gGL.end();
-		gGL.flush();
-	}
 	//--------------------------------------------------------------------
 	// render all geometry attached to the skeleton
 	//--------------------------------------------------------------------
@@ -7232,6 +7198,14 @@ LLViewerJoint*	LLVOAvatar::getViewerJoint(S32 idx)
 	return dynamic_cast<LLViewerJoint*>(mMeshLOD[idx]);
 }
 
+//-----------------------------------------------------------------------------
+// hideHair()
+//-----------------------------------------------------------------------------
+void LLVOAvatar::hideHair()
+{
+    mMeshLOD[MESH_ID_HAIR]->setVisible(FALSE, TRUE);
+}
+
 //-----------------------------------------------------------------------------
 // hideSkirt()
 //-----------------------------------------------------------------------------
@@ -10237,23 +10211,6 @@ LLHost LLVOAvatar::getObjectHost() const
 	}
 }
 
-//static
-void LLVOAvatar::updateFreezeCounter(S32 counter)
-{
-	if(counter)
-	{
-		sFreezeCounter = counter;
-	}
-	else if(sFreezeCounter > 0)
-	{
-		sFreezeCounter--;
-	}
-	else
-	{
-		sFreezeCounter = 0;
-	}
-}
-
 BOOL LLVOAvatar::updateLOD()
 {
     if (mDrawable.isNull())
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index a085d773dcd94d422bd125a8f6c1e6fd69e3bc17..df3eebee2c311ba2fdb3e522c1b907849a8adef5 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -328,7 +328,6 @@ class LLVOAvatar :
 	static bool		sLimitNonImpostors; // use impostors for far away avatars
 	static F32		sRenderDistance; // distance at which avatars will render.
 	static BOOL		sShowAnimationDebug; // show animation debug info
-	static BOOL		sShowFootPlane;	// show foot collision plane reported by server
 	static BOOL		sShowCollisionVolumes;	// show skeletal collision volumes
 	static BOOL		sVisibleInFirstPerson;
 	static S32		sNumLODChangesThisFrame;
@@ -619,14 +618,6 @@ class LLVOAvatar :
 private:
 	BOOL		mCulled;
 
-	//--------------------------------------------------------------------
-	// Freeze counter
-	//--------------------------------------------------------------------
-public:
-	static void updateFreezeCounter(S32 counter = 0);
-private:
-	static S32  sFreezeCounter;
-
 	//--------------------------------------------------------------------
 	// Constants
 	//--------------------------------------------------------------------
@@ -810,6 +801,7 @@ class LLVOAvatar :
 	void 			parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMessageContents& msg);
 	void 			processAvatarAppearance(LLMessageSystem* mesgsys);
     void            applyParsedAppearanceMessage(LLAppearanceMessageContents& contents, bool slam_params);
+    void 			hideHair();
 	void 			hideSkirt();
 	void			startAppearanceAnimation();
 	
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index f971554c9dec325563225c1c4d109fb27769d245..b0eb8d962cf3f16c8da027908bc140dabfd82ee3 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -770,8 +770,6 @@ LLVoiceChannelP2P::LLVoiceChannelP2P(const LLUUID& session_id, const std::string
 		mReceivedCall(FALSE)
 {
 	// make sure URI reflects encoded version of other user's agent id
-	// *NOTE: in case of Avaline call generated SIP URL will be incorrect.
-	// But it will be overridden in LLVoiceChannelP2P::setSessionHandle() called when agent accepts call
 	setURI(LLVoiceClient::getInstance()->sipURIFromID(other_user_id));
 }
 
@@ -911,8 +909,6 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s
 	else
 	{
 		LL_WARNS("Voice") << "incoming SIP URL is not provided. Channel may not work properly." << LL_ENDL;
-		// In the case of an incoming AvaLine call, the generated URI will be different from the
-		// original one. This is because the P2P URI is based on avatar UUID but Avaline is not.
 		// See LLVoiceClient::sessionAddedEvent()
 		setURI(LLVoiceClient::getInstance()->sipURIFromID(mOtherUserID));
 	}
@@ -947,22 +943,5 @@ void LLVoiceChannelP2P::setState(EState state)
 
 void LLVoiceChannelP2P::addToTheRecentPeopleList()
 {
-	bool avaline_call = LLIMModel::getInstance()->findIMSession(mSessionID)->isAvalineSessionType();
-	
-	if (avaline_call)
-	{
-		LLSD call_data;
-		std::string call_number = LLVoiceChannel::getSessionName();
-		
-		call_data["avaline_call"]	= true;
-		call_data["session_id"]		= mSessionID;
-		call_data["call_number"]	= call_number;
-		call_data["date"]			= LLDate::now();
-		
-		LLRecentPeople::instance().add(mOtherUserID, call_data);
-	}
-	else
-	{
-		LLRecentPeople::instance().add(mOtherUserID);
-	}
+	LLRecentPeople::instance().add(mOtherUserID);
 }
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index e2bd1a39c7f1899d9f5ed5f695bc66db45e75a8f..d8b8b8749f005f3f06a6358541b8278b32117d72 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -200,6 +200,7 @@ const LLVoiceVersionInfo LLVoiceClient::getVersion()
 		LLVoiceVersionInfo result;
 		result.serverVersion = std::string();
 		result.serverType = std::string();
+		result.mBuildVersion = std::string();
 		return result;
 	}
 }
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index cf527a4464ffca1fd3978c5571dc81f3e6b60e05..246883b6110f5a9e945a1a7b72a68f59cf1f9b25 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -95,6 +95,7 @@ struct LLVoiceVersionInfo
 {
 	std::string serverType;
 	std::string serverVersion;
+	std::string mBuildVersion;
 };
 
 //////////////////////////////////
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 19036a3f77fd9fa62de018cce8a1387285e7b0e5..735bb4ad941449ade8d650d63c7db965c098a444 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -690,6 +690,10 @@ void LLVivoxVoiceClient::voiceControlCoro()
         // surviving longer than LLVivoxVoiceClient
         voiceControlStateMachine(state);
     }
+    catch (const LLCoros::Stop&)
+    {
+        LL_DEBUGS("LLVivoxVoiceClient") << "Received a shutdown exception" << LL_ENDL;
+    }
     catch (const LLContinueError&)
     {
         LOG_UNHANDLED_EXCEPTION("LLVivoxVoiceClient");
@@ -4572,6 +4576,23 @@ void LLVivoxVoiceClient::sessionNotificationEvent(std::string &sessionHandle, st
 	}
 }
 
+void LLVivoxVoiceClient::voiceServiceConnectionStateChangedEvent(int statusCode, std::string &statusString, std::string &build_id)
+{
+	// We don't generally need to process this. However, one occurence is when we first connect, and so it is the
+	// earliest opportunity to learn what we're connected to.
+	if (statusCode)
+	{
+		LL_WARNS("Voice") << "VoiceServiceConnectionStateChangedEvent statusCode: " << statusCode <<
+			"statusString: " << statusString << LL_ENDL;
+		return;
+	}
+	if (build_id.empty())
+	{
+		return;
+	}
+	mVoiceVersion.mBuildVersion = build_id;
+}
+
 void LLVivoxVoiceClient::auxAudioPropertiesEvent(F32 energy)
 {
 	LL_DEBUGS("VoiceEnergy") << "got energy " << energy << LL_ENDL;
@@ -4758,7 +4779,7 @@ void LLVivoxVoiceClient::sessionState::VerifySessions()
         if ((*it).expired())
         {
             LL_WARNS("Voice") << "Expired session found! removing" << LL_ENDL;
-            mSession.erase(it++);
+            it = mSession.erase(it);
         }
         else
             ++it;
@@ -6815,7 +6836,7 @@ void LLVivoxVoiceClient::deleteVoiceFont(const LLUUID& id)
 		if (list_iter->second == id)
 		{
 			LL_DEBUGS("VoiceFont") << "Removing " << id << " from the voice font list." << LL_ENDL;
-			mVoiceFontList.erase(list_iter++);
+            list_iter = mVoiceFontList.erase(list_iter);
 			mVoiceFontListDirty = true;
 		}
 		else
@@ -7554,6 +7575,8 @@ void LLVivoxProtocolParser::EndTag(const char *tag)
 			connectorHandle = string;
 		else if (!stricmp("VersionID", tag))
 			versionID = string;
+		else if (!stricmp("Version", tag))
+			mBuildID = string;
 		else if (!stricmp("AccountHandle", tag))
 			accountHandle = string;
 		else if (!stricmp("State", tag))
@@ -7856,7 +7879,8 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
 			// We don't need to process this, but we also shouldn't warn on it, since that confuses people.
 		}
 		else if (!stricmp(eventTypeCstr, "VoiceServiceConnectionStateChangedEvent"))
-		{	// Yet another ignored event
+		{
+			LLVivoxVoiceClient::getInstance()->voiceServiceConnectionStateChangedEvent(statusCode, statusString, mBuildID);
 		}
 		else if (!stricmp(eventTypeCstr, "AudioDeviceHotSwapEvent"))
 		{
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index cf30a4e86ac67a192df89da1e17bdb7a3cae81e0..ebc3a62c350428e666be6b25e01d82ba996cbea3 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -465,6 +465,7 @@ class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>,
 	void participantAddedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString, std::string &displayNameString, int participantType);
 	void participantRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString);
 	void participantUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, bool isModeratorMuted, bool isSpeaking, int volume, F32 energy);
+	void voiceServiceConnectionStateChangedEvent(int statusCode, std::string &statusString, std::string &build_id);
 	void auxAudioPropertiesEvent(F32 energy);
 	void messageEvent(std::string &sessionHandle, std::string &uriString, std::string &alias, std::string &messageHeader, std::string &messageBody, std::string &applicationString);
 	void sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string &notificationType);
@@ -969,6 +970,7 @@ class LLVivoxProtocolParser : public LLIOPipe
 	std::string		actionString;
 	std::string		connectorHandle;
 	std::string		versionID;
+	std::string		mBuildID;
 	std::string		accountHandle;
 	std::string		sessionHandle;
 	std::string		sessionGroupHandle;
diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index 2b400c558608e2558b7761e58e2c2a9144e312d3..80e94c37f297da7527669b8d48cf2ee52fcabd53 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -40,6 +40,7 @@
 #include "httpoptions.h"
 #include "httpheaders.h"
 #include "bufferarray.h"
+#include "llversioninfo.h"
 #include "llviewercontrol.h"
 
 // Have to include these last to avoid queue redefinition!
@@ -378,6 +379,15 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const
 
 	httpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_TEXT_XML);
 
+    std::string user_agent = llformat("%s %d.%d.%d (%d)",
+        LLVersionInfo::instance().getChannel().c_str(),
+        LLVersionInfo::instance().getMajor(),
+        LLVersionInfo::instance().getMinor(),
+        LLVersionInfo::instance().getPatch(),
+        LLVersionInfo::instance().getBuild());
+
+    httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
+
 	///* Setting the DNS cache timeout to -1 disables it completely.
 	//This might help with bug #503 */
 	//httpOpts->setDNSCacheTimeout(-1);
diff --git a/indra/newview/skins/default/textures/icons/avaline_default_icon.jpg b/indra/newview/skins/default/textures/icons/avaline_default_icon.jpg
deleted file mode 100644
index 3bb7f7183cd751eddcabd75da8b9f1dc9e86f0f3..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icons/avaline_default_icon.jpg and /dev/null differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 65faea48a0a5712991f05a6c717a36b02c691f19..5bf27bb64dc8a30be82e33e01d915726ffa19a35 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -67,8 +67,6 @@ with the same filename but different name
   <texture name="Audio_Off" file_name="icons/Audio_Off.png" preload="false" />
   <texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" />
 
-  <texture name="Avaline_Icon" file_name="icons/avaline_default_icon.jpg" preload="true" />
-
   <texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" />
 
   <texture name="BackButton_Off" file_name="icons/back_arrow_off.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
diff --git a/indra/newview/skins/default/xui/da/panel_region_texture.xml b/indra/newview/skins/default/xui/da/panel_region_texture.xml
index 45946fd222a2a8aed3ee4312c695814a27a534b4..c8a3ad328ec01438320912cd0679b6a08381ec5a 100644
--- a/indra/newview/skins/default/xui/da/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/da/panel_region_texture.xml
@@ -7,8 +7,8 @@
 		ukendt
 	</text>
 	<text name="detail_texture_text">
-		Terræn teksturer (kræver 512x512, 24 bit .tga filer)
-	</text>
+    Terræn teksturer (kræver 1024x1024, 24 bit .tga filer)
+  </text>
 	<text name="height_text_lbl">
 		1 (Lav)
 	</text>
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index 5f1bf73f261bfcd5cdef7511dbf01f5d194bfb74..e4f99d14e9b4b4182a171f1d6119e1e18545a3c2 100644
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -443,9 +443,6 @@ Prøv venligst om lidt igen.
 	<string name="GroupNameNone">
 		(ingen)
 	</string>
-	<string name="AvalineCaller">
-		Avaline opkalder [ORDER]
-	</string>
 	<string name="AssetErrorNone">
 		Ingen fejl
 	</string>
diff --git a/indra/newview/skins/default/xui/de/panel_region_terrain.xml b/indra/newview/skins/default/xui/de/panel_region_terrain.xml
index 7801be30e482860200f5b456a2bdedd9cb85e2f0..42ba5b5269b20232748dfaee0f551c5ace327a0c 100644
--- a/indra/newview/skins/default/xui/de/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_terrain.xml
@@ -10,8 +10,8 @@
 	<spinner label="Obere Terraingrenze" name="terrain_raise_spin"/>
 	<spinner label="Untere Terraingrenze" name="terrain_lower_spin"/>
 	<text name="detail_texture_text">
-		Terraintexturen (erfordert 24-Bit-.tga-Dateien mit einer Größe von 512x512)
-	</text>
+    Terraintexturen (erfordert 24-Bit-.tga-Dateien mit einer Größe von 1024x1024)
+  </text>
 	<text name="height_text_lbl">
 		1 (niedrig)
 	</text>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 4625c4871431a92e258262e47688b3bf15e734a9..0120f7e5bd4912ebc4477e8834d844cbdc435b48 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -691,9 +691,6 @@ nächsten Eigentümer angehängt werden.
 	<string name="GroupNameNone">
 		(keiner)
 	</string>
-	<string name="AvalineCaller">
-		Avaline-Anfrufer [ORDER]
-	</string>
 	<string name="AssetErrorNone">
 		Kein Fehler
 	</string>
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 dee5e29a3c1ddda5426d4c1eb3348e801a334f94..4678d65b85691db0426b52c0a1537e53f878dab6 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1893,7 +1893,29 @@ Only large parcels can be listed in search.
              left="110"
              name="parcel_enable_voice_channel_local"
              width="300" />
-        </panel>
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="16"
+             layout="topleft"
+             left="10"
+             mouse_opaque="false"
+             name="media"
+             top_pad="10"
+             width="100">
+                Media:
+            </text>
+            <check_box
+             height="16"
+             label="Obscure MOAP"
+             layout="topleft"
+             left="110"
+             left_pad="0"
+             name="obscure_moap"
+             tool_tip="Media on a prim located outside the parcel should not play automatically for an agent within this parcel and vice versa."
+             width="300" />
+            </panel>
         <panel
          border="true"
          follows="all"
diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
index d07e3cb31b20a5f03571220e85c5418dfb8b4bc5..343e72f057fc0a65a3922fcdfaeadfc660e067e4 100644
--- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
@@ -11,6 +11,11 @@
      name="Screenshot">
         Screenshot
     </floater.string>
+    <floater.string
+     name="chat_report_format">
+Time: [MSG_TIME]
+Text: [MSG_DESCRIPTION]
+    </floater.string>
     <texture_picker
      allow_no_texture="true"
      default_image_name="None"
@@ -19,7 +24,7 @@
      layout="topleft"
      left="60"
      name="screenshot"
-     top="15"
+     top="20"
      width="220" />
     <text
      type="string"
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml
index 05ab4d35a0de1db0a1558565da38473b3c3f9ca3..9f394a4c74ddcaa0cd86bb77451e5c3d83cb4dd9 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml
@@ -96,6 +96,13 @@
      name="Pay">
        <on_click function="AvatarIcon.Action" parameter="pay" />
     </menu_item_call>
+    <menu_item_call
+     label="Report Abuse"
+     layout="topleft"
+     name="Report Abuse">
+       <on_click function="AvatarIcon.Action" parameter="report_abuse" />
+       <on_enable function="AvatarIcon.Enable" parameter="report_abuse" />
+    </menu_item_call>
     <menu_item_check
      label="Block Voice"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml
index ed362b36e54ec2310581d0e90e9ef81e4d1fac36..59e6106a28a1120f085f542e2f7d0750ac9ace3c 100644
--- a/indra/newview/skins/default/xui/en/menu_conversation.xml
+++ b/indra/newview/skins/default/xui/en/menu_conversation.xml
@@ -132,6 +132,13 @@
         <on_click function="Avatar.DoToSelected" parameter="pay" />
         <on_enable function="Avatar.EnableItem" parameter="can_pay" />
     </menu_item_call>
+    <menu_item_call
+     label="Report Abuse"
+     layout="topleft"
+     name="report_abuse">
+       <on_click function="Avatar.DoToSelected" parameter="report_abuse" />
+       <on_enable function="Avatar.EnableItem" parameter="report_abuse" />
+    </menu_item_call>
     <menu_item_check
      label="Block Voice"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_im_conversation.xml b/indra/newview/skins/default/xui/en/menu_im_conversation.xml
index 43287c6ec36e8fe6313c0f5c493d29a976232748..b38fae440412df33b961e7c7a3cf76bfbfac6a17 100644
--- a/indra/newview/skins/default/xui/en/menu_im_conversation.xml
+++ b/indra/newview/skins/default/xui/en/menu_im_conversation.xml
@@ -79,6 +79,13 @@
     </menu_item_call>
     <menu_item_separator
      layout="topleft"/>
+    <menu_item_call
+     label="Report Abuse"
+     layout="topleft"
+     name="Report Abuse">
+       <on_click function="Avatar.GearDoToSelected" parameter="report_abuse" />
+       <on_enable function="Avatar.EnableGearItem" parameter="report_abuse" />
+    </menu_item_call>
     <menu_item_check
      label="Block Voice"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_url_agent.xml b/indra/newview/skins/default/xui/en/menu_url_agent.xml
index e8b6116026a90669a877477e5486ef19503f0963..5ca8be212306c345e2bb55a712db966810e0eca3 100644
--- a/indra/newview/skins/default/xui/en/menu_url_agent.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_agent.xml
@@ -29,7 +29,14 @@
      name="remove_friend">
         <menu_item_call.on_click
          function="Url.RemoveFriend" />
-        </menu_item_call>
+    </menu_item_call>
+    <menu_item_call
+     label="Report Abuse"
+     layout="topleft"
+     name="report_abuse">
+        <menu_item_call.on_click
+         function="Url.ReportAbuse" />
+    </menu_item_call>
     <menu_item_separator
      layout="topleft" />
     <menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 825d1202a62384979e71494502c7206ffaff142c..eef81955808f74a0116aa3cac28ad57f94288b6b 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -422,7 +422,9 @@
         </menu_item_call>       
         <menu_item_call
          label="Stop animations"
-         name="Stop Animating My Avatar">
+         name="Stop Animating My Avatar"
+         allow_key_repeat="true"
+         shortcut="alt|shift|A">
           <menu_item_call.on_click
            function="Tools.StopAllAnimations" />
         </menu_item_call>
@@ -2658,6 +2660,12 @@ function="World.EnvPreset"
                 <menu_item_call.on_click
                  function="Advanced.ForceErrorBadMemoryAccess" />
             </menu_item_call>
+            <menu_item_call
+             label="Force Bad Memory Access in Coroutine"
+             name="Force Bad Memory Access in Coroutine">
+                <menu_item_call.on_click
+                 function="Advanced.ForceErrorBadMemoryAccessCoro" />
+            </menu_item_call>
             <menu_item_call
              label="Force Infinite Loop"
              name="Force Infinite Loop">
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index d2a35241ba6bb24c6788feebe128e39d20769fb2..07ad2838b0f11a8c14332eae019c7ef502ee85e8 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1521,7 +1521,7 @@ Delete pick &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
   <notification
    icon="alert.tga"
    name="ProfileUnpublishedClassified"
-   type="alert">
+   type="alertmodal">
     You have unpublished classifieds. They will be lost if you close the window.
     <tag>confirm</tag>
     <usetemplate
@@ -1533,7 +1533,7 @@ Delete pick &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
   <notification
    icon="alert.tga"
    name="ProfileUnsavedChanges"
-   type="alert">
+   type="alertmodal">
     You have usaved changes.
     <tag>confirm</tag>
     <tag>save</tag>
@@ -3945,7 +3945,7 @@ Are you sure you want to return objects owned by [USER_NAME]?
 Couldn&apos;t set region textures:
 Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH].
 
-Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click &quot;Apply&quot; again.
+Replace texture [TEXTURE_NUM] with a 24-bit [MAX_SIZE]x[MAX_SIZE] or smaller image then click &quot;Apply&quot; again.
   <tag>fail</tag>
   </notification>
 
@@ -3956,7 +3956,7 @@ Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click
 Couldn&apos;t set region textures:
 Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
 
-Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click &quot;Apply&quot; again.
+Replace texture [TEXTURE_NUM] with a 24-bit [MAX_SIZE]x[MAX_SIZE] or smaller image then click &quot;Apply&quot; again.
   </notification>
 
   <notification
diff --git a/indra/newview/skins/default/xui/en/panel_region_terrain.xml b/indra/newview/skins/default/xui/en/panel_region_terrain.xml
index 8243c2715df910b8ff89730a8bccd242c9eb07be..2aaea04a6d306f6058c580f2d44d52c7a07e2272 100644
--- a/indra/newview/skins/default/xui/en/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_terrain.xml
@@ -86,7 +86,7 @@
      name="detail_texture_text"
      top="110"
      width="300">
-        Terrain Textures (requires 512x512, 24 bit .tga files)
+        Terrain Textures (requires 1024x1024, 24 bit .tga files)
     </text>
     <texture_picker
      follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
index 9bdfff41d8cb594bb42033c01754e47d209add8d..30774ab18e940f312f2b81992175ead214a975e2 100644
--- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml
+++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
@@ -594,10 +594,7 @@
 			 top_pad="4"
 			 tool_tip="Add Media"
 			 label="Choose..."
-			 width="85">
-				<button.commit_callback
-				function="BuildTool.AddMedia"/>
-			</button>
+			 width="85"/>
 			<button
 			 follows="top|left"
 			 height="18"
@@ -607,10 +604,7 @@
 			 tool_tip="Delete this media texture"
 			 top_delta="0"
 			 label="Remove"
-			 width="85">
-				<button.commit_callback
-				function="BuildTool.DeleteMedia"/>
-			</button>
+			 width="85"/>
             <button
 			 follows="left|top"
 			 height="18"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 646f4af5d13abae5517dae8ee60b740e0e87e966..9f183d137d75e1b8d01e34ca403c156d13898a26 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -348,8 +348,6 @@ can be attached to notecards.
 	<!-- Group name: text shown for LLUUID::null -->
 	<string name="GroupNameNone">(none)</string>
 
-	<string name="AvalineCaller">Avaline Caller [ORDER]</string>
-
 	<!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. -->
 	<string name="AssetErrorNone">No error</string>
 	<string name="AssetErrorRequestFailed">Asset request: failed</string>
@@ -2341,6 +2339,14 @@ The [[MARKETPLACE_CREATE_STORE_URL] Marketplace store] is returning errors.
 	</string>
 	<string name="InventoryMarketplaceError">
 An error occurred while opening Marketplace Listings.
+If you continue to receive this message, please contact Second Life support for assistance at http://support.secondlife.com
+	</string>
+	<string name="InventoryMarketplaceConnectionError">
+Marketplace Listings failed to connect.
+If you continue to receive this message, please contact Second Life support for assistance at http://support.secondlife.com
+	</string>
+	<string name="InventoryMarketplaceConnectionErrorReason">
+Marketplace Listings failed to connect. Reason: [REASON]
 If you continue to receive this message, please contact Second Life support for assistance at http://support.secondlife.com
 	</string>
 	<string name="InventoryMarketplaceListingsNoItemsTitle">Your Marketplace Listings folder is empty.</string>
diff --git a/indra/newview/skins/default/xui/es/panel_region_terrain.xml b/indra/newview/skins/default/xui/es/panel_region_terrain.xml
index cb6c03dbb5fa2f6d67c2fbabf4838d0883115844..9aba5299cbf1d15fdd170c781676b17cdd4fcfef 100644
--- a/indra/newview/skins/default/xui/es/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_terrain.xml
@@ -12,8 +12,8 @@ del terreno" name="terrain_raise_spin"/>
 	<spinner bottom_delta="-34" label="Límite de bajada del 
 terreno" name="terrain_lower_spin"/>
 	<text name="detail_texture_text">
-		Texturas del terreno (requiere archivos .tga de 512x512, 24 bits)
-	</text>
+    Texturas del terreno (requiere archivos .tga de 1024x1024, 24 bits)
+  </text>
 	<text name="height_text_lbl">
 		1 (bajo)
 	</text>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 20f7f81962da9acecff65a0f66aeb76b110e6a4b..5a03e65b4997fae295f3050126e36e4187292d57 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -680,9 +680,6 @@ pueden adjuntarse a las notas.
 	<string name="GroupNameNone">
 		(ninguno)
 	</string>
-	<string name="AvalineCaller">
-		Avaline: [ORDER]
-	</string>
 	<string name="AssetErrorNone">
 		No hay ningún error
 	</string>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
index 97f486d3a3dd0969abe776f12a0c67d7d9c80b0e..bbab00ca24643f3a8f462f8e9fdcd8987796cbaa 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
@@ -12,8 +12,8 @@ terrain" name="terrain_raise_spin"/>
 	<spinner bottom_delta="-34" label="Limite d&apos;abaissement 
 du terrain" name="terrain_lower_spin"/>
 	<text name="detail_texture_text">
-		Textures du terrain (fichiers .tga 512 x 512, 24 bit requis)
-	</text>
+    Textures du terrain (fichiers .tga 1024 x 1024, 24 bit requis)
+  </text>
 	<text name="height_text_lbl">
 		1 (Bas)
 	</text>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 943d1635cdda4b2d095920d9f09881e40d873f9f..21825c6b2fd4910f5d9f0e271d89401f7d397acd 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -692,9 +692,6 @@ peuvent être joints aux notes.
 	<string name="GroupNameNone">
 		(aucun)
 	</string>
-	<string name="AvalineCaller">
-		Appelant Avaline [ORDER]
-	</string>
 	<string name="AssetErrorNone">
 		Aucune erreur
 	</string>
diff --git a/indra/newview/skins/default/xui/it/panel_region_terrain.xml b/indra/newview/skins/default/xui/it/panel_region_terrain.xml
index c61ac3eccecac77b4a9433210d33498e9293c366..e08c55f63bb767bf59afe07759902b8e7a5cbd41 100644
--- a/indra/newview/skins/default/xui/it/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_terrain.xml
@@ -12,8 +12,8 @@ terreno" name="terrain_raise_spin"/>
 	<spinner bottom_delta="-34" label="Limite di abbassamento 
 del terreno" name="terrain_lower_spin"/>
 	<text name="detail_texture_text">
-		Texture terreno (richiede file 512x512, 24 bit .tga)
-	</text>
+    Texture terreno (richiede file 1024x1024, 24 bit .tga)
+  </text>
 	<text name="height_text_lbl">
 		1 (basso)
 	</text>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 52f5f7af1838b134c895024a160bdc6d0fd1dc11..1ebdadb930554c76f1607fe0ebfdd9d088a19584 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -685,9 +685,6 @@ possono essere allegati ai biglietti.
 	<string name="GroupNameNone">
 		(nessuno)
 	</string>
-	<string name="AvalineCaller">
-		Chiamante Avaline [ORDER]
-	</string>
 	<string name="AssetErrorNone">
 		Nessun errore
 	</string>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
index fb853c1925cd73f043dc941339b29ab5a96fb4cf..c1080a7d7b6d6cb931df67bbd1af952e18b635f6 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
@@ -10,8 +10,8 @@
 	<spinner label="地形の上昇限度" name="terrain_raise_spin"/>
 	<spinner label="地形の下降限度" name="terrain_lower_spin"/>
 	<text name="detail_texture_text">
-		地形テクスチャ(512x512 の 24 bit .tga ファイル)
-	</text>
+    地形テクスチャ(1024x1024 の 24 bit .tga ファイル)
+  </text>
 	<text name="height_text_lbl">
 		1(低)
 	</text>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index c5bba021ac37109c68dee38a674c98b83dc42734..d90772ab0a2b5be4dabfaf675811a38875c22a0e 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -691,9 +691,6 @@ support@secondlife.com にお問い合わせください。
 	<string name="GroupNameNone">
 		(なし)
 	</string>
-	<string name="AvalineCaller">
-		Avaline コール [ORDER]
-	</string>
 	<string name="AssetErrorNone">
 		エラーなし
 	</string>
diff --git a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml
index f086a52dcd49f5f3c7495e061c33ff8389f1750f..2d4286334f3c51c6d360048e73fa3343820532ba 100644
--- a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml
@@ -7,7 +7,7 @@
 	<spinner label="Górny limit terenu" name="terrain_raise_spin" />
 	<spinner label="Dolny limit terenu" name="terrain_lower_spin" />
 	<text name="detail_texture_text">
-		Tekstury terenu (512x512 / 1024x1024, 24 bitowy plik .tga)
+		Tekstury terenu (1024x1024, 24 bitowy plik .tga)
 	</text>
 	<text name="height_text_lbl">
 		1 (Nisko)
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 2b182dc3cc73d4dae73699b5ea32295115da8f8d..90d2d86c025f4519dfa8dbeec38fab9732a497d0 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -596,9 +596,6 @@ Spróbuj zalogować się ponownie za minutę.
 	<string name="GroupNameNone">
 		(brak danych)
 	</string>
-	<string name="AvalineCaller">
-		Avaline [ORDER]
-	</string>
 	<string name="AssetErrorNone">
 		Brak błędu
 	</string>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_terrain.xml b/indra/newview/skins/default/xui/pt/panel_region_terrain.xml
index 74330a8946ee626584c145054261954f84acb626..1d312aeed94624045c39a3b86bb728362fbb1ad9 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_terrain.xml
@@ -12,8 +12,8 @@ terreno" name="terrain_raise_spin"/>
 	<spinner bottom_delta="-34" label="Limite mais baixo do 
 terreno" name="terrain_lower_spin"/>
 	<text name="detail_texture_text">
-		Texturas de terreno (exige arquivos .tga 512x512, 24 bit)
-	</text>
+    Texturas de terreno (exige arquivos .tga 1024x1024, 24 bit)
+  </text>
 	<text name="height_text_lbl">
 		1 (Baixo)
 	</text>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 7a425a26227a68a1e40a23ac2f5ac5926682c020..ae452d6a4d5e47c4c23e082ee5ae408927fbc23d 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -47,7 +47,7 @@ Placa de vídeo: [GRAPHICS_CARD_VENDOR]
 Placa gráfica: [GRAPHICS_CARD]
 	</string>
 	<string name="AboutDriver">
-		Versão do driver de vídeo Windows: [GRAPHICS_CARD_VENDOR]
+		Versão do driver de vídeo Windows: [GRAPHICS_DRIVER_VERSION]
 	</string>
 	<string name="AboutOGL">
 		Versão do OpenGL: [OPENGL_VERSION]
@@ -645,9 +645,6 @@ ser anexado às anotações.
 	<string name="GroupNameNone">
 		(nenhum)
 	</string>
-	<string name="AvalineCaller">
-		Interlocutor Avaline [ORDER]
-	</string>
 	<string name="AssetErrorNone">
 		Nenhum erro
 	</string>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_terrain.xml b/indra/newview/skins/default/xui/ru/panel_region_terrain.xml
index af255652263855b21d710d6a215912e0b1a5cdf1..76b4f513a85a394d1dc66f15a66735c0e467430b 100644
--- a/indra/newview/skins/default/xui/ru/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/ru/panel_region_terrain.xml
@@ -10,8 +10,8 @@
 	<spinner label="Верх. точка ландшафта" name="terrain_raise_spin"/>
 	<spinner label="Ниж. точка ландшафта" name="terrain_lower_spin"/>
 	<text name="detail_texture_text">
-		Текстуры ландшафта (требования: 512x512, 24-битные, TGA)
-	</text>
+    Текстуры ландшафта (требования: 1024x1024, 24-битные, TGA)
+  </text>
 	<text name="height_text_lbl">
 		1 (Низ)
 	</text>
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index c0dc32340aef612715b1add3b56fc29d28e8e9bf..61d836a2d13e17f683c912cfd29d7318da182ba9 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -689,9 +689,6 @@ support@secondlife.com.
 	<string name="GroupNameNone">
 		(нет)
 	</string>
-	<string name="AvalineCaller">
-		[ORDER] абонента Avaline
-	</string>
 	<string name="AssetErrorNone">
 		Ошибок нет
 	</string>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_terrain.xml b/indra/newview/skins/default/xui/tr/panel_region_terrain.xml
index 3226ee008e70635ca0ab4072b4c9c91d7cac040e..e25047301d729417306db8eb162732bca0078bea 100644
--- a/indra/newview/skins/default/xui/tr/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/tr/panel_region_terrain.xml
@@ -10,8 +10,8 @@
 	<spinner label="Yüzey Yükslt. Limiti" name="terrain_raise_spin"/>
 	<spinner label="Yüzey Alçatma Limiti" name="terrain_lower_spin"/>
 	<text name="detail_texture_text">
-		Yüzey Dokuları (512x512, 24 bit .tga dosyalar gerektirir)
-	</text>
+    Yüzey Dokuları (1024x1024, 24 bit .tga dosyalar gerektirir)
+  </text>
 	<text name="height_text_lbl">
 		1 (Düşük)
 	</text>
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index d1076b8b79d92bf01939ab164be461b41bbe12e4..e709a4c5d65d337b8e3c1f1933133576edcfeb88 100644
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -689,9 +689,6 @@ kartlarına eklenebilir.
 	<string name="GroupNameNone">
 		(hiçbiri)
 	</string>
-	<string name="AvalineCaller">
-		Avaline Arayanı [ORDER]
-	</string>
 	<string name="AssetErrorNone">
 		Hata yok
 	</string>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_terrain.xml b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
index 85e759e445f99d947c93cbc5772589712e8b55b0..81bce4687681eb9cb757cd962497e84e77168580 100644
--- a/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
@@ -10,7 +10,7 @@
 	<spinner label="地形提升限制" name="terrain_raise_spin"/>
 	<spinner label="地形降低限制" name="terrain_lower_spin"/>
 	<text name="detail_texture_text">
-		地形材質(須 512x512,24 位元 .tga 檔格式)
+		地形材質(須 1024x1024,24 位元 .tga 檔格式)
 	</text>
 	<text name="height_text_lbl">
 		1(低)
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index a4e1b21ce6e921ff9e9e60ceac79ef1dd14e2d0a..bdb16c9bf111e5afeecf864ff0e51aa5622d2645 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -685,9 +685,6 @@ http://secondlife.com/viewer-access-faq
 	<string name="GroupNameNone">
 		(無)
 	</string>
-	<string name="AvalineCaller">
-		Avaline 通話者 [ORDER]
-	</string>
 	<string name="AssetErrorNone">
 		無錯誤
 	</string>
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index 8a7e6407ed10dda0542a25e0082686f96efeabed..5d50d1e182c789ad1d634804bacf22c542e7506d 100644
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -257,21 +257,25 @@ void LLLogin::Impl::loginCoro(std::string uri, LLSD login_params)
                 if (printable_params["wait_for_updater"].asBoolean())
                 {
                     std::string reason_response = responses["data"]["reason"].asString();
-                    if (reason_response == "update") // No point waiting if not an update
+                    // Timeout should produce the isUndefined() object passed here.
+                    if (reason_response == "update")
                     {
-                        // Timeout should produce the isUndefined() object passed here.
                         LL_INFOS("LLLogin") << "Login failure, waiting for sync from updater" << LL_ENDL;
                         updater = llcoro::suspendUntilEventOnWithTimeout(sSyncPoint, 10, LLSD());
-
-                        if (updater.isUndefined())
-                        {
-                            LL_WARNS("LLLogin") << "Failed to hear from updater, proceeding with fail.login"
-                                << LL_ENDL;
-                        }
-                        else
-                        {
-                            LL_DEBUGS("LLLogin") << "Got responses from updater and login.cgi" << LL_ENDL;
-                        }
+                    }
+                    else
+                    {
+                        LL_DEBUGS("LLLogin") << "Login failure, waiting for sync from updater" << LL_ENDL;
+                        updater = llcoro::suspendUntilEventOnWithTimeout(sSyncPoint, 3, LLSD());
+                    }
+                    if (updater.isUndefined())
+                    {
+                        LL_WARNS("LLLogin") << "Failed to hear from updater, proceeding with fail.login"
+                                            << LL_ENDL;
+                    }
+                    else
+                    {
+                        LL_DEBUGS("LLLogin") << "Got responses from updater and login.cgi" << LL_ENDL;
                     }
                 }