diff --git a/.hgtags b/.hgtags
index 90a21a647f41df70b02fb313365b3c80481e0de8..9cbb192d43100434efe1f18f0b686c116260e26c 100755
--- a/.hgtags
+++ b/.hgtags
@@ -528,3 +528,4 @@ cea1632c002c065985ebea15eeeb4aac90f50545 5.0.2-release
 022709ef76a331cac1ba6ef1a6da8a5e9ef63f5a 5.0.4-release
 b4d76b5590fdf8bab72c64442353753a527cbc44 5.0.5-release
 3e5035dfd8af49bd4c0009f0a76ef46a15991a45 5.0.6-release
+abcab37e1b29414ab8c03af9ca2ab489d809788a 5.0.7-release
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 79ff7161f64dc02918d70647ed74c53d384ec5e1..064639fe72ea90123f98b5accadcb8e13c7b72b2 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -362,6 +362,7 @@ Cinder Roxley
     STORM-2053
     STORM-2113
     STORM-2127
+    STORM-2144
 Clara Young
 Coaldust Numbers
     VWR-1095
@@ -821,6 +822,8 @@ Kitty Barnett
 	MAINT-6153
 	MAINT-6154
 	MAINT-6568
+	STORM-2149
+	MAINT-7581
 Kolor Fall
 Komiko Okamoto
 Korvel Noh
@@ -1302,6 +1305,7 @@ Sovereign Engineer
     MAINT-6218
     MAINT-6913
     STORM-2143
+    STORM-2148
     MAINT-7343
 SpacedOut Frye
 	VWR-34
diff --git a/indra/llcharacter/llmotioncontroller.h b/indra/llcharacter/llmotioncontroller.h
index 72de3316947f1ce13fcca68848e087bf30e95e2d..22357a2c6bbf1168c3b9b9c8a76bffc04bc438c1 100644
--- a/indra/llcharacter/llmotioncontroller.h
+++ b/indra/llcharacter/llmotioncontroller.h
@@ -150,10 +150,13 @@ class LLMotionController
 	BOOL isPaused() const { return mPaused; }
 
 	void setTimeStep(F32 step);
+    F32 getTimeStep() const { return mTimeStep; }
 
 	void setTimeFactor(F32 time_factor);
 	F32 getTimeFactor() const { return mTimeFactor; }
 
+    F32 getAnimTime() const { return mAnimTime; }
+    
 	motion_list_t& getActiveMotions() { return mActiveMotions; }
 
 	void incMotionCounts(S32& num_motions, S32& num_loading_motions, S32& num_loaded_motions, S32& num_active_motions, S32& num_deprecated_motions);
diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp
index 81ba8631c64737cab887411b2a9a7965b7b26cef..3a219eb998c66ca938c9a7b4aa33acba2d66961c 100644
--- a/indra/llcommon/llsdserialize.cpp
+++ b/indra/llcommon/llsdserialize.cpp
@@ -2091,7 +2091,18 @@ std::string zip_llsd(LLSD& data)
 			}
 
 			have = CHUNK-strm.avail_out;
-			output = (U8*) realloc(output, cur_size+have);
+			U8* new_output = (U8*) realloc(output, cur_size+have);
+			if (new_output == NULL)
+			{
+				LL_WARNS() << "Failed to compress LLSD block: can't reallocate memory, current size: " << cur_size << " bytes; requested " << cur_size + have << " bytes." << LL_ENDL;
+				deflateEnd(&strm);
+				if (output)
+				{
+					free(output);
+				}
+				return std::string();
+			}
+			output = new_output;
 			memcpy(output+cur_size, out, have);
 			cur_size += have;
 		}
@@ -2174,7 +2185,19 @@ bool unzip_llsd(LLSD& data, std::istream& is, S32 size)
 
 		U32 have = CHUNK-strm.avail_out;
 
-		result = (U8*) realloc(result, cur_size + have);
+		U8* new_result = (U8*)realloc(result, cur_size + have);
+		if (new_result == NULL)
+		{
+			LL_WARNS() << "Failed to unzip LLSD block: can't reallocate memory, current size: " << cur_size << " bytes; requested " << cur_size + have << " bytes." << LL_ENDL;
+			inflateEnd(&strm);
+			if (result)
+			{
+				free(result);
+			}
+			delete[] in;
+			return false;
+		}
+		result = new_result;
 		memcpy(result+cur_size, out, have);
 		cur_size += have;
 
@@ -2266,7 +2289,20 @@ U8* unzip_llsdNavMesh( bool& valid, unsigned int& outsize, std::istream& is, S32
 
 		U32 have = CHUNK-strm.avail_out;
 
-		result = (U8*) realloc(result, cur_size + have);
+		U8* new_result = (U8*) realloc(result, cur_size + have);
+		if (new_result == NULL)
+		{
+			LL_WARNS() << "Failed to unzip LLSD NavMesh block: can't reallocate memory, current size: " << cur_size << " bytes; requested " << cur_size + have << " bytes." << LL_ENDL;
+			inflateEnd(&strm);
+			if (result)
+			{
+				free(result);
+			}
+			delete[] in;
+			valid = false;
+			return NULL;
+		}
+		result = new_result;
 		memcpy(result+cur_size, out, have);
 		cur_size += have;
 
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 2255e638c29a79baa61008299f0b3234745001c9..abe5fda603ff8244f25403438d5d4c43b0a77bfe 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -1325,6 +1325,10 @@ void LLStringUtilBase<T>::removeCRLF(string_type& string)
 template<class T> 
 void LLStringUtilBase<T>::removeWindowsCR(string_type& string)
 {
+    if (string.empty())
+    {
+        return;
+    }
     const T LF = 10;
     const T CR = 13;
 
diff --git a/indra/llimage/llimagepng.cpp b/indra/llimage/llimagepng.cpp
index a299602d790ddf9fab46d366187bfd92bddfd145..a4823ed859d7a1e4fced1f677bece0cf9b379697 100644
--- a/indra/llimage/llimagepng.cpp
+++ b/indra/llimage/llimagepng.cpp
@@ -124,12 +124,12 @@ bool LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time)
 
 	// Temporary buffer to hold the encoded image. Note: the final image
 	// size should be much smaller due to compression.
-	U32 bufferSize = getWidth() * getHeight() * getComponents() + 1024;
+	U32 bufferSize = getWidth() * getHeight() * getComponents() + 8192;
     U8* tmpWriteBuffer = new U8[ bufferSize ];
 
 	// Delegate actual encoding work to wrapper
 	LLPngWrapper pngWrapper;
-	if (! pngWrapper.writePng(raw_image, tmpWriteBuffer))
+	if (!pngWrapper.writePng(raw_image, tmpWriteBuffer, bufferSize))
 	{
 		setLastError(pngWrapper.getErrorMessage());
 		delete[] tmpWriteBuffer;
diff --git a/indra/llimage/llpngwrapper.cpp b/indra/llimage/llpngwrapper.cpp
index da289ea889f796f15a3ba5dcd082b1f0dd33acdb..eb70b78a362ff104e4e4e78e88bfafa2dfd2703a 100644
--- a/indra/llimage/llpngwrapper.cpp
+++ b/indra/llimage/llpngwrapper.cpp
@@ -112,6 +112,11 @@ void LLPngWrapper::readDataCallback(png_structp png_ptr, png_bytep dest, png_siz
 void LLPngWrapper::writeDataCallback(png_structp png_ptr, png_bytep src, png_size_t length)
 {
 	PngDataInfo *dataInfo = (PngDataInfo *) png_get_io_ptr(png_ptr);
+	if (dataInfo->mOffset + length > dataInfo->mDataSize)
+	{
+		png_error(png_ptr, "Data write error. Requested data size exceeds available data size.");
+		return;
+	}
 	U8 *dest = &dataInfo->mData[dataInfo->mOffset];
 	memcpy(dest, src, length);
 	dataInfo->mOffset += static_cast<U32>(length);
@@ -272,7 +277,7 @@ void LLPngWrapper::updateMetaData()
 
 // Method to write raw image into PNG at dest. The raw scanline begins
 // at the bottom of the image per SecondLife conventions.
-BOOL LLPngWrapper::writePng(const LLImageRaw* rawImage, U8* dest)
+BOOL LLPngWrapper::writePng(const LLImageRaw* rawImage, U8* dest, size_t destSize)
 {
 	try
 	{
@@ -313,6 +318,7 @@ BOOL LLPngWrapper::writePng(const LLImageRaw* rawImage, U8* dest)
 		PngDataInfo dataPtr;
 		dataPtr.mData = dest;
 		dataPtr.mOffset = 0;
+		dataPtr.mDataSize = destSize;
 		png_set_write_fn(mWritePngPtr, &dataPtr, &writeDataCallback, &writeFlush);
 
 		// Setup image params
diff --git a/indra/llimage/llpngwrapper.h b/indra/llimage/llpngwrapper.h
index 27d7df3bef9a9af161542a7b2d4077908cbfcd50..8d42317b0f05469d8a3939d35f8c7515b6775f27 100644
--- a/indra/llimage/llpngwrapper.h
+++ b/indra/llimage/llpngwrapper.h
@@ -45,7 +45,7 @@ class LLPngWrapper
 
 	BOOL isValidPng(U8* src);
 	BOOL readPng(U8* src, S32 dataSize, LLImageRaw* rawImage, ImageInfo *infop = NULL);
-	BOOL writePng(const LLImageRaw* rawImage, U8* dst);
+	BOOL writePng(const LLImageRaw* rawImage, U8* dst, size_t destSize);
 	U32  getFinalSize();
 	const std::string& getErrorMessage();
 
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 7a54d83b3fdd9e57d0e0d67d7b7f6e033075a7d1..8c27ef99610de647f35518fb4d96f59a85adc668 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -1,5 +1,4 @@
 /** 
-
  * @file llvolume.cpp
  *
  * $LicenseInfo:firstyear=2002&license=viewerlgpl$
diff --git a/indra/llmessage/lltemplatemessagereader.cpp b/indra/llmessage/lltemplatemessagereader.cpp
index 406afadd2f87532e7f110b2de8c36187ee349713..4e0c53c37e3b23ca3a1fe607feb33e02caf44e21 100644
--- a/indra/llmessage/lltemplatemessagereader.cpp
+++ b/indra/llmessage/lltemplatemessagereader.cpp
@@ -499,9 +499,10 @@ BOOL LLTemplateMessageReader::decodeTemplate(
 	}
 	else
 	{
-		LL_WARNS() << "Message #" << std::hex << num << std::dec
-			<< " received but not registered!" << LL_ENDL;
-		gMessageSystem->callExceptionFunc(MX_UNREGISTERED_MESSAGE);
+        // MAINT-7482 - make viewer more tolerant of unknown messages.
+		LL_WARNS_ONCE() << "Message #" << std::hex << num << std::dec
+                        << " received but not registered!" << LL_ENDL;
+		//gMessageSystem->callExceptionFunc(MX_UNREGISTERED_MESSAGE);
 		return(FALSE);
 	}
 
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index f1b6fe0a1246048da6e5035d81200f5f4d212c02..680017204c0639954f02f74a14d2b684a48b6c36 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -224,7 +224,14 @@ void LLPluginClassMedia::idle(void)
 				void *addr = mPlugin->getSharedMemoryAddress(mTextureSharedMemoryName);
 
 				// clear texture memory to avoid random screen visual fuzz from uninitialized texture data
-				memset( addr, 0x00, newsize );
+				if (addr)
+				{
+					memset( addr, 0x00, newsize );
+				}
+				else
+				{
+					LL_WARNS("Plugin") << "Failed to get previously created shared memory address: " << mTextureSharedMemoryName << " size: " << mTextureSharedMemorySize << LL_ENDL;
+				}
 
 				// We could do this to force an update, but textureValid() will still be returning false until the first roundtrip to the plugin,
 				// so it may not be worthwhile.
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 31dffdd545300abf55686fd74883d1938d55ebbe..607bbf3b3b3eac16495c61567a879ebffce5b3d4 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -1234,7 +1234,7 @@ void LLVertexBuffer::createGLIndices(U32 size)
 
 void LLVertexBuffer::destroyGLBuffer()
 {
-	if (mGLBuffer)
+	if (mGLBuffer || mMappedData)
 	{
 		if (mMappedDataUsingVBOs)
 		{
@@ -1254,7 +1254,7 @@ void LLVertexBuffer::destroyGLBuffer()
 
 void LLVertexBuffer::destroyGLIndices()
 {
-	if (mGLIndices)
+	if (mGLIndices || mMappedIndexData)
 	{
 		if (mMappedIndexDataUsingVBOs)
 		{
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index f8ef5289db03eb558c6603a860cd222779695a60..eaf128423731da22add5a012daaaea3dd4acfe71 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -823,6 +823,11 @@ BOOL LLAccordionCtrlTab::handleKey(KEY key, MASK mask, BOOL called_from_parent)
 
 void LLAccordionCtrlTab::showAndFocusHeader()
 {
+	if (!mHeader)
+	{
+		return;
+	}
+
 	mHeader->setFocus(true);
 	mHeader->setSelected(mSelectionEnabled);
 
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index f9664e0658549d35e4ec4c04b292c3b92b8c19f1..895753aeae6394edc6e1383db58065a2ae593873 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -102,6 +102,18 @@ void LLCloseAllFoldersFunctor::doFolder(LLFolderViewFolder* folder)
 void LLCloseAllFoldersFunctor::doItem(LLFolderViewItem* item)
 { }
 
+//---------------------------------------------------------------------------
+
+void LLAllDescendentsPassedFilter::doFolder(LLFolderViewFolder* folder)
+{
+	mAllDescendentsPassedFilter &= (folder) && (folder->passedFilter()) && (folder->descendantsPassedFilter());
+}
+
+void LLAllDescendentsPassedFilter::doItem(LLFolderViewItem* item)
+{
+	mAllDescendentsPassedFilter &= (item) && (item->passedFilter());
+}
+
 ///----------------------------------------------------------------------------
 /// Class LLFolderViewScrollContainer
 ///----------------------------------------------------------------------------
diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h
index b5deefd6537d3e7c70171974ed3e301df291c5f2..2926e160d02d595d63cd3c78db8d601279196fe7 100644
--- a/indra/llui/llfolderview.h
+++ b/indra/llui/llfolderview.h
@@ -400,6 +400,18 @@ class LLOpenFoldersWithSelection : public LLFolderViewFunctor
 	virtual void doItem(LLFolderViewItem* item);
 };
 
+class LLAllDescendentsPassedFilter : public LLFolderViewFunctor
+{
+public:
+	LLAllDescendentsPassedFilter() : mAllDescendentsPassedFilter(true) {}
+	/*virtual*/ ~LLAllDescendentsPassedFilter() {}
+	/*virtual*/ void doFolder(LLFolderViewFolder* folder);
+	/*virtual*/ void doItem(LLFolderViewItem* item);
+	bool allDescendentsPassedFilter() const { return mAllDescendentsPassedFilter; }
+protected:
+	bool mAllDescendentsPassedFilter;
+};
+
 // Flags for buildContextMenu()
 const U32 SUPPRESS_OPEN_ITEM = 0x1;
 const U32 FIRST_SELECTED_ITEM = 0x2;
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index 3d618548c4ffc1a8f5366f4ecfd1ac81a8ce84b7..0510e472c53da52dc8101da82ce3ecea17e01618 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -1176,6 +1176,11 @@ BOOL LLFolderViewFolder::needsArrange()
 	return mLastArrangeGeneration < getRoot()->getArrangeGeneration();
 }
 
+bool LLFolderViewFolder::descendantsPassedFilter(S32 filter_generation)
+{
+	return getViewModelItem()->descendantsPassedFilter(filter_generation);
+}
+
 // Passes selection information on to children and record selection
 // information if necessary.
 BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem,
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 022f814bbc8fde66ff07e3ae2dda26ed33643cd1..0d42f726fab238ee68867b3c747d4c762a9396ae 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -3331,6 +3331,7 @@ BOOL LLMenuBarGL::handleAcceleratorKey(KEY key, MASK mask)
 		if (getHighlightedItem())
 		{
 			clearHoverItem();
+			LLMenuGL::setKeyboardMode(FALSE);
 		}
 		else
 		{
@@ -3777,10 +3778,10 @@ BOOL LLMenuHolderGL::hideMenus()
 	{
 		return FALSE;
 	}
+	LLMenuGL::setKeyboardMode(FALSE);
 	BOOL menu_visible = hasVisibleMenu();
 	if (menu_visible)
 	{
-		LLMenuGL::setKeyboardMode(FALSE);
 		// clicked off of menu, hide them all
 		for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
 		{
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index 604092d5368b771f92c5b4a9929a07fe6c6b9a5c..7bafd711cb0223849f1936e823f092275c4ab2ec 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -67,7 +67,8 @@ LLNotificationForm::FormIgnore::FormIgnore()
 :	text("text"),
 	control("control"),
 	invert_control("invert_control", false),
-	save_option("save_option", false)
+	save_option("save_option", false),
+	session_only("session_only", false)
 {}
 
 LLNotificationForm::FormButton::FormButton()
@@ -125,6 +126,7 @@ bool handleIgnoredNotification(const LLSD& payload)
 		switch(form->getIgnoreType())
 		{
 		case LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE:
+		case LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE_SESSION_ONLY:
 			response = pNotif->getResponseTemplate(LLNotification::WITH_DEFAULT_BUTTON);
 			break;
 		case LLNotificationForm::IGNORE_WITH_LAST_RESPONSE:
@@ -197,7 +199,7 @@ LLNotificationForm::LLNotificationForm(const std::string& name, const LLNotifica
 
 		if (!p.ignore.save_option)
 		{
-			mIgnore = IGNORE_WITH_DEFAULT_RESPONSE;
+			mIgnore = p.ignore.session_only ? IGNORE_WITH_DEFAULT_RESPONSE_SESSION_ONLY : IGNORE_WITH_DEFAULT_RESPONSE;
 		}
 		else
 		{
@@ -426,6 +428,7 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par
 	mLogToChat(p.log_to_chat),
 	mLogToIM(p.log_to_im),
 	mShowToast(p.show_toast),
+	mFadeToast(p.fade_toast),
     mSoundName("")
 {
 	if (p.sound.isProvided()
@@ -942,6 +945,11 @@ bool LLNotification::canShowToast() const
 	return mTemplatep->mShowToast;
 }
 
+bool LLNotification::canFadeToast() const
+{
+	return mTemplatep->mFadeToast;
+}
+
 bool LLNotification::hasFormElements() const
 {
 	return mTemplatep->mForm->getNumElements() != 0;
@@ -1792,6 +1800,18 @@ bool LLNotifications::getIgnoreAllNotifications()
 {
 	return mIgnoreAllNotifications; 
 }
+
+void LLNotifications::setIgnored(const std::string& name, bool ignored)
+{
+	LLNotificationTemplatePtr templatep = getTemplate(name);
+	templatep->mForm->setIgnored(ignored);
+}
+
+bool LLNotifications::getIgnored(const std::string& name)
+{
+	LLNotificationTemplatePtr templatep = getTemplate(name);
+	return (mIgnoreAllNotifications) || ( (templatep->mForm->getIgnoreType() != LLNotificationForm::IGNORE_NO) && (templatep->mForm->getIgnored()) );
+}
 													
 bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
 {
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 024332ee65c66fd624aa439ebdd4b68e6bd38c81..ccdfb90054938f91da1138ed0dd3d4661ab6f5f4 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -179,6 +179,7 @@ class LLNotificationForm
 		Optional<bool>			save_option;
 		Optional<std::string>	control;
 		Optional<bool>			invert_control;
+		Optional<bool>			session_only;
 
 		FormIgnore();
 	};
@@ -232,7 +233,8 @@ class LLNotificationForm
 	typedef enum e_ignore_type
 	{ 
 		IGNORE_NO,
-		IGNORE_WITH_DEFAULT_RESPONSE, 
+		IGNORE_WITH_DEFAULT_RESPONSE,
+		IGNORE_WITH_DEFAULT_RESPONSE_SESSION_ONLY,
 		IGNORE_WITH_LAST_RESPONSE, 
 		IGNORE_SHOW_AGAIN 
 	} EIgnoreType;
@@ -558,6 +560,7 @@ friend class LLNotifications;
 	bool canLogToChat() const;
 	bool canLogToIM() const;
 	bool canShowToast() const;
+	bool canFadeToast() const;
 	bool hasFormElements() const;
     void playSound();
 
@@ -963,6 +966,9 @@ class LLNotifications :
 	void setIgnoreAllNotifications(bool ignore);
 	bool getIgnoreAllNotifications();
 
+	void setIgnored(const std::string& name, bool ignored);
+	bool getIgnored(const std::string& name);
+
 	bool isVisibleByRules(LLNotificationPtr pNotification);
 	
 private:
diff --git a/indra/llui/llnotificationtemplate.h b/indra/llui/llnotificationtemplate.h
index bed29254d8fa532416a4878b21361e295a16a3d0..20cbc89ede6f5916f06297b32552f3749a5bb800 100644
--- a/indra/llui/llnotificationtemplate.h
+++ b/indra/llui/llnotificationtemplate.h
@@ -177,6 +177,7 @@ struct LLNotificationTemplate
 		Optional<bool>					persist,
 										log_to_im,
 										show_toast,
+										fade_toast,
 										log_to_chat,
 										force_urls_external;
 		Optional<std::string>			functor,
@@ -199,6 +200,7 @@ struct LLNotificationTemplate
 		Params()
 		:	name("name"),
 			persist("persist", false),
+			fade_toast("fade_toast", true),
 			log_to_im("log_to_im", false),
 			show_toast("show_toast", true),
 			log_to_chat("log_to_chat", true),
@@ -316,6 +318,7 @@ struct LLNotificationTemplate
 	bool mLogToChat;
 	bool mLogToIM;
 	bool mShowToast;
+	bool mFadeToast;
 };
 
 #endif //LL_LLNOTIFICATION_TEMPLATE_H
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 0afa8d43f1c891149856e530ac6ee3f6c932c45e..7c1f4a4dca1bc4e7aaff5d4d7b0cbf345580cd15 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -345,6 +345,21 @@ S32 LLScrollListCtrl::getItemCount() const
 	return mItemList.size();
 }
 
+BOOL LLScrollListCtrl::hasSelectedItem() const
+{
+	item_list::iterator iter;
+	for (iter = mItemList.begin(); iter < mItemList.end(); )
+	{
+		LLScrollListItem* itemp = *iter;
+		if (itemp && itemp->getSelected())
+		{
+			return TRUE;
+		}
+		iter++;
+	}
+	return FALSE;
+}
+
 // virtual LLScrolListInterface function (was deleteAllItems)
 void LLScrollListCtrl::clearRows()
 {
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 8343750a540b43e0523f97a610a944f2291a9bf3..699a8744e194cf5f9de143004c1696d43ef8c228 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -201,6 +201,8 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
 
 	virtual BOOL	isSelected(const LLSD& value) const;
 
+	BOOL 			hasSelectedItem() const;
+
 	BOOL			handleClick(S32 x, S32 y, MASK mask);
 	BOOL			selectFirstItem();
 	BOOL			selectNthItem( S32 index );
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index d49e21689883a8bb6d6086e14be80fbe4c6d8407..f6831c6d5ec52624829e23fd47223354bb958158 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -130,6 +130,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
 	params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
 	mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
 	mEditor->setFocusReceivedCallback( boost::bind(&LLSpinCtrl::onEditorGainFocus, _1, this ));
+	mEditor->setFocusLostCallback( boost::bind(&LLSpinCtrl::onEditorLostFocus, _1, this ));
 	if (p.allow_digits_only)
 	{
 		mEditor->setPrevalidateInput(LLTextValidate::validateNonNegativeS32NoSpace);
@@ -239,6 +240,31 @@ void LLSpinCtrl::onEditorGainFocus( LLFocusableElement* caller, void *userdata )
 	self->onFocusReceived();
 }
 
+// static
+void LLSpinCtrl::onEditorLostFocus( LLFocusableElement* caller, void *userdata )
+{
+	LLSpinCtrl* self = (LLSpinCtrl*) userdata;
+	llassert( caller == self->mEditor );
+
+	self->onFocusLost();
+
+	std::string text = self->mEditor->getText();
+
+	LLLocale locale(LLLocale::USER_LOCALE);
+	F32 val = (F32)atof(text.c_str());
+
+	F32 saved_val = self->getValueF32();
+	if (saved_val != val && !self->mEditor->isDirty())
+	{
+		// Editor was focused when value update arrived, string
+		// in editor is different from one in spin control.
+		// Since editor is not dirty, it won't commit, so either
+		// attempt to commit value from editor or revert to a more
+		// recent value from spin control
+		self->updateEditor();
+	}
+}
+
 void LLSpinCtrl::setValue(const LLSD& value )
 {
 	F32 v = (F32)value.asReal();
diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h
index e34add879d5155ad039b2d118a01546f1787798b..cab99c35bd8ff5f779632488ad116bec9c1d8f8e 100644
--- a/indra/llui/llspinctrl.h
+++ b/indra/llui/llspinctrl.h
@@ -93,6 +93,7 @@ class LLSpinCtrl
 
 	void			onEditorCommit(const LLSD& data);
 	static void		onEditorGainFocus(LLFocusableElement* caller, void *userdata);
+	static void		onEditorLostFocus(LLFocusableElement* caller, void *userdata);
 	static void		onEditorChangeFocus(LLUICtrl* caller, S32 direction, void *userdata);
 
 	void			onUpBtn(const LLSD& data);
diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp
index 76296ff877d4fa7e462cac628376211902d5f73c..3eb64e69d9ab23df63242cbd236d15bd6eed6ddd 100644
--- a/indra/llvfs/lldiriterator.cpp
+++ b/indra/llvfs/lldiriterator.cpp
@@ -51,7 +51,11 @@ class LLDirIterator::Impl
 LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask)
 	: mIsValid(false)
 {
+#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
+	fs::path dir_path(utf8str_to_utf16str(dirname));
+#else
 	fs::path dir_path(dirname);
+#endif
 
 	bool is_dir = false;
 
diff --git a/indra/llwindow/lldxhardware.cpp b/indra/llwindow/lldxhardware.cpp
index e7afef63f854cbf4019431faec9f8554737cfb4e..d4790f9f294bca55a2112b6dd50511acf6fcca4c 100644
--- a/indra/llwindow/lldxhardware.cpp
+++ b/indra/llwindow/lldxhardware.cpp
@@ -35,6 +35,7 @@
 #undef INITGUID
 
 #include <wbemidl.h>
+#include <comdef.h>
 
 #include <boost/tokenizer.hpp>
 
@@ -206,6 +207,160 @@ HRESULT GetVideoMemoryViaWMI( WCHAR* strInputDeviceID, DWORD* pdwAdapterRam )
         return E_FAIL;
 }
 
+//Getting the version of graphics controller driver via WMI
+std::string LLDXHardware::getDriverVersionWMI()
+{
+	std::string mDriverVersion;
+	HRESULT hrCoInitialize = S_OK;
+	HRESULT hres;
+	hrCoInitialize = CoInitialize(0);
+	IWbemLocator *pLoc = NULL;
+
+	hres = CoCreateInstance(
+		CLSID_WbemLocator,
+		0,
+		CLSCTX_INPROC_SERVER,
+		IID_IWbemLocator, (LPVOID *)&pLoc);
+	
+	if (FAILED(hres))
+	{
+		LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << hres << LL_ENDL;
+		return std::string();                  // Program has failed.
+	}
+
+	IWbemServices *pSvc = NULL;
+
+	// Connect to the root\cimv2 namespace with
+	// the current user and obtain pointer pSvc
+	// to make IWbemServices calls.
+	hres = pLoc->ConnectServer(
+		_bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
+		NULL,                    // User name. NULL = current user
+		NULL,                    // User password. NULL = current
+		0,                       // Locale. NULL indicates current
+		NULL,                    // Security flags.
+		0,                       // Authority (e.g. Kerberos)
+		0,                       // Context object 
+		&pSvc                    // pointer to IWbemServices proxy
+		);
+
+	if (FAILED(hres))
+	{
+		LL_WARNS("AppInit") << "Could not connect. Error code = 0x" << hres << LL_ENDL;
+		pLoc->Release();
+		CoUninitialize();
+		return std::string();                // Program has failed.
+	}
+
+	LL_DEBUGS("AppInit") << "Connected to ROOT\\CIMV2 WMI namespace" << LL_ENDL;
+
+	// Set security levels on the proxy -------------------------
+	hres = CoSetProxyBlanket(
+		pSvc,                        // Indicates the proxy to set
+		RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
+		RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
+		NULL,                        // Server principal name 
+		RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
+		RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
+		NULL,                        // client identity
+		EOAC_NONE                    // proxy capabilities 
+		);
+
+	if (FAILED(hres))
+	{
+		LL_WARNS("AppInit") << "Could not set proxy blanket. Error code = 0x" << hres << LL_ENDL;
+		pSvc->Release();
+		pLoc->Release();
+		CoUninitialize();
+		return std::string();               // Program has failed.
+	}
+	IEnumWbemClassObject* pEnumerator = NULL;
+
+	// Get the data from the query
+	ULONG uReturn = 0;
+	hres = pSvc->ExecQuery( 
+		bstr_t("WQL"),
+		bstr_t("SELECT * FROM Win32_VideoController"), //Consider using Availability to filter out disabled controllers
+		WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
+		NULL,
+		&pEnumerator);
+
+	if (FAILED(hres))
+	{
+		LL_WARNS("AppInit") << "Query for operating system name failed." << " Error code = 0x" << hres << LL_ENDL;
+		pSvc->Release();
+		pLoc->Release();
+		CoUninitialize();
+		return std::string();               // Program has failed.
+	}
+
+	while (pEnumerator)
+	{
+		IWbemClassObject *pclsObj = NULL;
+		HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
+			&pclsObj, &uReturn);
+
+		if (0 == uReturn)
+		{
+			break;               // If quantity less then 1.
+		}
+
+		VARIANT vtProp;
+
+		// Get the value of the Name property
+		hr = pclsObj->Get(L"DriverVersion", 0, &vtProp, 0, 0);
+
+		if (FAILED(hr))
+		{
+			LL_WARNS("AppInit") << "Query for name property failed." << " Error code = 0x" << hr << LL_ENDL;
+			pSvc->Release();
+			pLoc->Release();
+			CoUninitialize();
+			return std::string();               // Program has failed.
+		}
+
+		// use characters in the returned driver version
+		BSTR driverVersion(vtProp.bstrVal);
+
+		//convert BSTR to std::string
+		std::wstring ws(driverVersion, SysStringLen(driverVersion));
+		std::string str(ws.begin(), ws.end());
+		LL_INFOS("AppInit") << " DriverVersion : " << str << LL_ENDL;
+
+		if (mDriverVersion.empty())
+		{
+			mDriverVersion = str;
+		}
+		else if (mDriverVersion != str)
+		{
+			LL_WARNS("DriverVersion") << "Different versions of drivers. Version of second driver : " << str << LL_ENDL;
+		}
+
+		VariantClear(&vtProp);
+		pclsObj->Release();
+	}
+
+	// Cleanup
+	// ========
+	if (pSvc)
+	{
+		pSvc->Release();
+	}
+	if (pLoc)
+	{
+		pLoc->Release();
+	}
+	if (pEnumerator)
+	{
+		pEnumerator->Release();
+	}
+	if (SUCCEEDED(hrCoInitialize))
+	{
+		CoUninitialize();
+	}
+	return mDriverVersion;
+}
+
 void get_wstring(IDxDiagContainer* containerp, WCHAR* wszPropName, WCHAR* wszPropValue, int outputSize)
 {
 	HRESULT hr;
diff --git a/indra/llwindow/lldxhardware.h b/indra/llwindow/lldxhardware.h
index 61a32bf0fb800d467c819512c9535eb0a3d6ce1d..cf33db8b3726231804b4a95faf33d726e7e0b167 100644
--- a/indra/llwindow/lldxhardware.h
+++ b/indra/llwindow/lldxhardware.h
@@ -88,6 +88,8 @@ class LLDXHardware
 	// vram_only TRUE does a "light" probe.
 	BOOL getInfo(BOOL vram_only);
 
+	std::string getDriverVersionWMI();
+
 	S32 getVRAM() const { return mVRAM; }
 
 	LLSD getDisplayInfo();
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 00433367c8897f3c3e3639002d04ef67a620f5aa..51e67ba4d030c9b7c6e94b506d3c2b12306de4d0 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-5.0.7
+5.0.8
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c8797f3f99590f3cfb59030c31c73c3e1b85692e..3e06e7094d662dcc825a121549395d8b5ccea01e 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -10393,6 +10393,17 @@
 		<key>Value</key>
 		<integer>0</integer>
 	</map>
+	<key>RenderForceVolumeLOD</key>
+    <map>
+      <key>Comment</key>
+      <string>Override for all volume LODs</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>S32</string>
+      <key>Value</key>
+      <integer>-1</integer>
+    </map>
 	<key>RenderVolumeLODFactor</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/installers/windows/lang_de.nsi b/indra/newview/installers/windows/lang_de.nsi
index 866accae99b5e59615fc5758d19617ad43fb6d69..2a868acc89cd7b516ff07df69df5b95630dc442f 100644
Binary files a/indra/newview/installers/windows/lang_de.nsi and b/indra/newview/installers/windows/lang_de.nsi differ
diff --git a/indra/newview/installers/windows/lang_es.nsi b/indra/newview/installers/windows/lang_es.nsi
index f4f07863320303096cfc7699f60d2b2c648454c5..1ecf254ffb484c59b8df0f2b50916a78045447e1 100644
Binary files a/indra/newview/installers/windows/lang_es.nsi and b/indra/newview/installers/windows/lang_es.nsi differ
diff --git a/indra/newview/installers/windows/lang_fr.nsi b/indra/newview/installers/windows/lang_fr.nsi
index 1b5dbfc975a95531ef1a5585b21e597b1a6528a2..bec5835bed9671c46d335cd618fb3629a7d10be9 100644
Binary files a/indra/newview/installers/windows/lang_fr.nsi and b/indra/newview/installers/windows/lang_fr.nsi differ
diff --git a/indra/newview/installers/windows/lang_it.nsi b/indra/newview/installers/windows/lang_it.nsi
index a456e6e417245359990b607df0bea13ccedf4455..1d2e150525176efdcc6528898e8e012a019bebd1 100644
Binary files a/indra/newview/installers/windows/lang_it.nsi and b/indra/newview/installers/windows/lang_it.nsi differ
diff --git a/indra/newview/installers/windows/lang_ja.nsi b/indra/newview/installers/windows/lang_ja.nsi
index 5b1c5f4ce9b11d0f42c89e6c4ace62ddd33d533c..1bd6526670c1ffacbecc3a3b7c789fb88ff92b15 100644
Binary files a/indra/newview/installers/windows/lang_ja.nsi and b/indra/newview/installers/windows/lang_ja.nsi differ
diff --git a/indra/newview/installers/windows/lang_pt-br.nsi b/indra/newview/installers/windows/lang_pt-br.nsi
index 9ef252d2324343f40939e33574b079afc3a45d66..87032fec181b3e23ab87cff5b12c5d8e600c5644 100644
Binary files a/indra/newview/installers/windows/lang_pt-br.nsi and b/indra/newview/installers/windows/lang_pt-br.nsi differ
diff --git a/indra/newview/installers/windows/lang_ru.nsi b/indra/newview/installers/windows/lang_ru.nsi
index d7c728d3e2240dbe2c9804460d813a699deb2246..019c66123c811926eca0373fe1ac37b8d507793d 100644
Binary files a/indra/newview/installers/windows/lang_ru.nsi and b/indra/newview/installers/windows/lang_ru.nsi differ
diff --git a/indra/newview/installers/windows/lang_tr.nsi b/indra/newview/installers/windows/lang_tr.nsi
index 97c602f4fca304170cb41c209e3583d9f290a323..1c4e2c2f4831ab29450a6b33ccd6eff064626724 100644
Binary files a/indra/newview/installers/windows/lang_tr.nsi and b/indra/newview/installers/windows/lang_tr.nsi differ
diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi
index 39c005a683ff6e99f85fead67ed79a4a30567f4c..355e01a333e168d4ae2cc335b4f141ddf39126ee 100644
Binary files a/indra/newview/installers/windows/lang_zh.nsi and b/indra/newview/installers/windows/lang_zh.nsi differ
diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp
index 648212177b761b1311711066e42da28f953eb4dd..ee49125711ab81e1483c32d8e15ab1bdce1df20a 100644
--- a/indra/newview/llaisapi.cpp
+++ b/indra/newview/llaisapi.cpp
@@ -394,6 +394,40 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht
         {
             status = LLCore::HttpStatus(HTTP_INTERNAL_ERROR, "Malformed response contents");
         }
+        else if (status.getType() == 410) //GONE
+        {
+            // Item does not exist or was already deleted from server.
+            // parent folder is out of sync
+            if (type == REMOVECATEGORY)
+            {
+                LLViewerInventoryCategory *cat = gInventory.getCategory(targetId);
+                if (cat)
+                {
+                    LL_WARNS("Inventory") << "Purge failed for '" << cat->getName()
+                        << "' local version:" << cat->getVersion()
+                        << " since folder no longer exists at server. Descendent count: server == " << cat->getDescendentCount()
+                        << ", viewer == " << cat->getViewerDescendentCount()
+                        << LL_ENDL;
+                    gInventory.fetchDescendentsOf(cat->getParentUUID());
+                    // Note: don't delete folder here - contained items will be deparented (or deleted)
+                    // and since we are clearly out of sync we can't be sure we won't get rid of something we need.
+                    // For example folder could have been moved or renamed with items intact, let it fetch first.
+                }
+            }
+            else if (type == REMOVEITEM)
+            {
+                LLViewerInventoryItem *item = gInventory.getItem(targetId);
+                if (item)
+                {
+                    LL_WARNS("Inventory") << "Purge failed for '" << item->getName()
+                        << "' since item no longer exists at server." << LL_ENDL;
+                    gInventory.fetchDescendentsOf(item->getParentUUID());
+                    // since item not on the server and exists at viewer, so it needs an update at the least,
+                    // so delete it, in worst case item will be refetched with new params.
+                    gInventory.onObjectDeletedFromServer(targetId);
+                }
+            }
+        }
         LL_WARNS("Inventory") << "Inventory error: " << status.toString() << LL_ENDL;
         LL_WARNS("Inventory") << ll_pretty_print_sd(result) << LL_ENDL;
     }
@@ -970,7 +1004,16 @@ void AISUpdate::doUpdate()
             // inventory COF is maintained on the viewer through calls to 
             // LLInventoryModel::accountForUpdate when a changing operation 
             // is performed.  This occasionally gets out of sync however.
-            cat->setVersion(version);
+            if (version != LLViewerInventoryCategory::VERSION_UNKNOWN)
+            {
+                cat->setVersion(version);
+            }
+            else
+            {
+                // We do not account for update if version is UNKNOWN, so we shouldn't rise version
+                // either or viewer will get stuck on descendants count -1, try to refetch folder instead
+                cat->fetch();
+            }
 		}
 	}
 
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index c928cf0601bfa60e82285bfb9766269878ffe2bf..d58d03d68da2025232493edaa72c15ac3e9df88d 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -880,7 +880,10 @@ void LLWearableHoldingPattern::onAllComplete()
 			 ++it)
 		{
 			LLViewerObject *objectp = *it;
-			gAgentAvatarp->addAttachmentOverridesForObject(objectp);
+            if (!objectp->isAnimatedObject())
+            {
+                gAgentAvatarp->addAttachmentOverridesForObject(objectp);
+            }
 		}
 		
 		// Add new attachments to match those requested.
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index cfdc752db41e7158f92383ff33888ef9c1009343..f43612d1c88c078e7bcbf192b003b8a5b413bbca 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -594,6 +594,7 @@ static void settings_to_globals()
 	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
 	LLImageGL::sGlobalUseAnisotropic	= gSavedSettings.getBOOL("RenderAnisotropic");
 	LLImageGL::sCompressTextures		= gSavedSettings.getBOOL("RenderCompressTextures");
+	LLVOVolume::sForceLOD				= gSavedSettings.getS32("RenderForceVolumeLOD");
 	LLVOVolume::sLODFactor				= gSavedSettings.getF32("RenderVolumeLODFactor");
 	LLVOVolume::sDistanceFactor			= 1.f-LLVOVolume::sLODFactor * 0.1f;
 	LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor");
@@ -734,7 +735,7 @@ LLAppViewer::LLAppViewer()
 	//
 	
 	LLLoginInstance::instance().setUpdaterService(mUpdater.get());
-	LLLoginInstance::instance().setPlatformInfo(gPlatform, getOSInfo().getOSVersionString());
+	LLLoginInstance::instance().setPlatformInfo(gPlatform, getOSInfo().getOSVersionString(), getOSInfo().getOSStringSimple());
 }
 
 LLAppViewer::~LLAppViewer()
@@ -3341,10 +3342,19 @@ LLSD LLAppViewer::getViewerInfo() const
 	info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER));
 
 #if LL_WINDOWS
-	LLSD driver_info = gDXHardware.getDisplayInfo();
-	if (driver_info.has("DriverVersion"))
+	std::string drvinfo = gDXHardware.getDriverVersionWMI();
+	if (!drvinfo.empty())
 	{
-		info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"];
+		info["GRAPHICS_DRIVER_VERSION"] = drvinfo;
+	}
+	else
+	{
+		LL_WARNS("Driver version")<< "Cannot get driver version from getDriverVersionWMI" << LL_ENDL;
+		LLSD driver_info = gDXHardware.getDisplayInfo();
+		if (driver_info.has("DriverVersion"))
+		{
+			info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"];
+		}
 	}
 #endif
 
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 219d9da01f3b74d5e5f507140e9d3eb910c5340e..8fe684ad7974db0d3ed65bb343e9cd6424a75e1b 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -1005,7 +1005,7 @@ void LLAvatarActions::toggleBlock(const LLUUID& id)
 }
 
 // static
-void LLAvatarActions::toggleMuteVoice(const LLUUID& id)
+void LLAvatarActions::toggleMute(const LLUUID& id, U32 flags)
 {
 	LLAvatarName av_name;
 	LLAvatarNameCache::get(id, &av_name);
@@ -1016,14 +1016,20 @@ void LLAvatarActions::toggleMuteVoice(const LLUUID& id)
 	LLMute mute(id, av_name.getUserName(), LLMute::AGENT);
 	if (!is_muted)
 	{
-		mute_list->add(mute, LLMute::flagVoiceChat);
+		mute_list->add(mute, flags);
 	}
 	else
 	{
-		mute_list->remove(mute, LLMute::flagVoiceChat);
+		mute_list->remove(mute, flags);
 	}
 }
 
+// static
+void LLAvatarActions::toggleMuteVoice(const LLUUID& id)
+{
+	toggleMute(id, LLMute::flagVoiceChat);
+}
+
 // static
 bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
 {
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 256d44d820ae643a0449f6bb37d50c759b6637fd..b56d5b0fb9ee2b7fa0d4dc655450941895e6146e 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -130,6 +130,11 @@ class LLAvatarActions
 	 */
 	static void toggleBlock(const LLUUID& id);
 
+	/**
+	 * Mute/unmute avatar.
+	 */
+	static void toggleMute(const LLUUID& id, U32 flags);
+
 	/**
 	 * Block/unblock the avatar voice.
 	 */
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 9798ef352940c3d4009f93bf9e6afdd81fe7f276..a9e8e77a0b12b6e25fea734dbd0c93bf363d0f88 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -38,10 +38,14 @@
 #include "llpanel.h"
 #include "lluictrlfactory.h"
 #include "llscrollcontainer.h"
-#include "llavatariconctrl.h"
-#include "llcallingcard.h" //for LLAvatarTracker
+#include "llagent.h"
 #include "llagentdata.h"
 #include "llavataractions.h"
+#include "llavatariconctrl.h"
+#include "llcallingcard.h" //for LLAvatarTracker
+#include "llgroupactions.h"
+#include "llgroupmgr.h"
+#include "llspeakers.h" //for LLIMSpeakerMgr
 #include "lltrans.h"
 #include "llfloaterreg.h"
 #include "llfloatersidepanelcontainer.h"
@@ -49,7 +53,6 @@
 #include "llstylemap.h"
 #include "llslurl.h"
 #include "lllayoutstack.h"
-#include "llagent.h"
 #include "llnotificationsutil.h"
 #include "lltoastnotifypanel.h"
 #include "lltooltip.h"
@@ -61,7 +64,6 @@
 #include "llurlaction.h"
 #include "llviewercontrol.h"
 #include "llviewerobjectlist.h"
-#include "llmutelist.h"
 
 static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
 
@@ -187,6 +189,161 @@ class LLChatHistoryHeader: public LLPanel
         return false;
     }
 
+	void banGroupMember(const LLUUID& participant_uuid)
+	{
+		LLUUID group_uuid = mSessionID;
+		LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_uuid);
+		if (!gdatap)
+		{
+			// Not a group
+			return;
+		}
+
+		gdatap->banMemberById(participant_uuid);
+	}
+
+	bool canBanInGroup()
+	{
+		LLUUID group_uuid = mSessionID;
+		LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_uuid);
+		if (!gdatap)
+		{
+			// Not a group
+			return false;
+		}
+
+		if (gAgent.hasPowerInGroup(group_uuid, GP_ROLE_REMOVE_MEMBER)
+			&& gAgent.hasPowerInGroup(group_uuid, GP_GROUP_BAN_ACCESS))
+		{
+			return true;
+		}
+
+		return false;
+	}
+
+	bool canBanGroupMember(const LLUUID& participant_uuid)
+	{
+		LLUUID group_uuid = mSessionID;
+		LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_uuid);
+		if (!gdatap)
+		{
+			// Not a group
+			return false;
+		}
+
+		if (gdatap->mPendingBanRequest)
+		{
+			return false;
+		}
+
+		if (gAgentID == getAvatarId())
+		{
+			//Don't ban self
+			return false;
+		}
+
+		if (gdatap->isRoleMemberDataComplete())
+		{
+			if (gdatap->mMembers.size())
+			{
+				LLGroupMgrGroupData::member_list_t::iterator mi = gdatap->mMembers.find(participant_uuid);
+				if (mi != gdatap->mMembers.end())
+				{
+					LLGroupMemberData* member_data = (*mi).second;
+					// Is the member an owner?
+					if (member_data && member_data->isInRole(gdatap->mOwnerRole))
+					{
+						return false;
+					}
+
+					if (gAgent.hasPowerInGroup(group_uuid, GP_ROLE_REMOVE_MEMBER)
+						&& gAgent.hasPowerInGroup(group_uuid, GP_GROUP_BAN_ACCESS))
+					{
+						return true;
+					}
+				}
+			}
+		}
+
+		LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+		if (speaker_mgr)
+		{
+			LLSpeaker * speakerp = speaker_mgr->findSpeaker(participant_uuid).get();
+
+			if (speakerp
+				&& gAgent.hasPowerInGroup(group_uuid, GP_ROLE_REMOVE_MEMBER)
+				&& gAgent.hasPowerInGroup(group_uuid, GP_GROUP_BAN_ACCESS))
+			{
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	bool isGroupModerator()
+	{
+		LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+		if (!speaker_mgr)
+		{
+			LL_WARNS() << "Speaker manager is missing" << LL_ENDL;
+			return false;
+		}
+
+		// Is session a group call/chat?
+		if(gAgent.isInGroup(mSessionID))
+		{
+			LLSpeaker * speakerp = speaker_mgr->findSpeaker(gAgentID).get();
+
+			// Is agent a moderator?
+			return speakerp && speakerp->mIsModerator;
+		}
+
+		return false;
+	}
+
+	bool canModerate(const std::string& userdata)
+	{
+		// only group moderators can perform actions related to this "enable callback"
+		if (!isGroupModerator() || gAgentID == getAvatarId())
+		{
+			return false;
+		}
+
+		LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+		if (!speaker_mgr)
+		{
+			return false;
+		}
+
+		LLSpeaker * speakerp = speaker_mgr->findSpeaker(getAvatarId()).get();
+		if (!speakerp)
+		{
+			return false;
+		}
+
+		bool voice_channel = speakerp->isInVoiceChannel();
+
+		if ("can_moderate_voice" == userdata)
+		{
+			return voice_channel;
+		}
+		else if ("can_mute" == userdata)
+		{
+			return voice_channel && (speakerp->mStatus != LLSpeaker::STATUS_MUTED);
+		}
+		else if ("can_unmute" == userdata)
+		{
+			return speakerp->mStatus == LLSpeaker::STATUS_MUTED;
+		}
+		else if ("can_allow_text_chat" == userdata)
+		{
+			return true;
+		}
+
+		return false;
+	}
+
 	void onAvatarIconContextMenuItemClicked(const LLSD& userdata)
 	{
 		std::string level = userdata.asString();
@@ -245,11 +402,36 @@ class LLChatHistoryHeader: public LLPanel
 		}
 		else if(level == "block_unblock")
 		{
-			mute(getAvatarId(), LLMute::flagVoiceChat);
+			LLAvatarActions::toggleMute(getAvatarId(), LLMute::flagVoiceChat);
 		}
 		else if(level == "mute_unmute")
 		{
-			mute(getAvatarId(), LLMute::flagTextChat);
+			LLAvatarActions::toggleMute(getAvatarId(), LLMute::flagTextChat);
+		}
+		else if(level == "toggle_allow_text_chat")
+		{
+			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+			speaker_mgr->toggleAllowTextChat(getAvatarId());
+		}
+		else if(level == "group_mute")
+		{
+			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+			if (speaker_mgr)
+			{
+				speaker_mgr->moderateVoiceParticipant(getAvatarId(), false);
+			}
+		}
+		else if(level == "group_unmute")
+		{
+			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+			if (speaker_mgr)
+			{
+				speaker_mgr->moderateVoiceParticipant(getAvatarId(), true);
+			}
+		}
+		else if(level == "ban_member")
+		{
+			banGroupMember(getAvatarId());
 		}
 	}
 
@@ -265,24 +447,71 @@ class LLChatHistoryHeader: public LLPanel
 		{
 			return LLMuteList::getInstance()->isMuted(getAvatarId(), LLMute::flagTextChat);
 		}
+		else if (level == "is_allowed_text_chat")
+		{
+			if (gAgent.isInGroup(mSessionID))
+			{
+				LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+				if(speaker_mgr)
+				{
+					const LLSpeaker * speakerp = speaker_mgr->findSpeaker(getAvatarId());
+					if (NULL != speakerp)
+					{
+						return !speakerp->mModeratorMutedText;
+					}
+				}
+			}
+			return false;
+		}
 		return false;
 	}
 
-	void mute(const LLUUID& participant_id, U32 flags)
+	bool onAvatarIconContextMenuItemEnabled(const LLSD& userdata)
 	{
-		BOOL is_muted = LLMuteList::getInstance()->isMuted(participant_id, flags);
-		LLAvatarName av_name;
-		LLAvatarNameCache::get(participant_id, &av_name);
-		LLMute mute(participant_id, av_name.getUserName(), LLMute::AGENT);
+		std::string level = userdata.asString();
 
-		if (!is_muted)
+		if (level == "can_allow_text_chat" || level == "can_mute" || level == "can_unmute")
 		{
-			LLMuteList::getInstance()->add(mute, flags);
+			return canModerate(userdata);
 		}
-		else
+		else if (level == "can_ban_member")
 		{
-			LLMuteList::getInstance()->remove(mute, flags);
+			return canBanGroupMember(getAvatarId());
 		}
+		return false;
+	}
+
+	bool onAvatarIconContextMenuItemVisible(const LLSD& userdata)
+	{
+		std::string level = userdata.asString();
+
+		if (level == "show_mute")
+		{
+			LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+			if (speaker_mgr)
+			{
+				LLSpeaker * speakerp = speaker_mgr->findSpeaker(getAvatarId()).get();
+				if (speakerp)
+				{
+					return speakerp->isInVoiceChannel() && speakerp->mStatus != LLSpeaker::STATUS_MUTED;
+				}
+			}
+			return false;
+		}
+		else if (level == "show_unmute")
+		{
+			LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+			if (speaker_mgr)
+			{
+				LLSpeaker * speakerp = speaker_mgr->findSpeaker(getAvatarId()).get();
+				if (speakerp)
+				{
+					return speakerp->mStatus == LLSpeaker::STATUS_MUTED;
+				}
+			}
+			return false;
+		}
+		return false;
 	}
 
 	BOOL postBuild()
@@ -292,6 +521,8 @@ class LLChatHistoryHeader: public LLPanel
 
 		registrar.add("AvatarIcon.Action", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemClicked, this, _2));
 		registrar_enable.add("AvatarIcon.Check", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemChecked, this, _2));
+		registrar_enable.add("AvatarIcon.Enable", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemEnabled, this, _2));
+		registrar_enable.add("AvatarIcon.Visible", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemVisible, this, _2));
 		registrar.add("ObjectIcon.Action", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemClicked, this, _2));
 		registrar_enable.add("ObjectIcon.Visible", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemVisible, this, _2));
 
@@ -567,9 +798,14 @@ class LLChatHistoryHeader: public LLPanel
 		if(menu)
 		{
 			bool is_friend = LLAvatarActions::isFriend(mAvatarID);
+			bool is_group_session = gAgent.isInGroup(mSessionID);
 			
 			menu->setItemEnabled("Add Friend", !is_friend);
 			menu->setItemEnabled("Remove Friend", is_friend);
+			menu->setItemVisible("Moderator Options Separator", is_group_session && isGroupModerator());
+			menu->setItemVisible("Moderator Options", is_group_session && isGroupModerator());
+			menu->setItemVisible("Group Ban Separator", is_group_session && canBanInGroup());
+			menu->setItemVisible("BanMember", is_group_session && canBanInGroup());
 
 			if(gAgentID == mAvatarID)
 			{
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index 8dfc2e81dce4f0f38bc60a3c1b68501f4ad19349..d458e2951b3c1fddf34c652b9f08ded1f4631433 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -212,11 +212,18 @@ void LLControlAvatar::updateDebugText()
         getAnimatedVolumes(volumes);
         S32 animated_volume_count = volumes.size();
         std::string active_string;
+        std::string lod_string;
+        S32 total_tris = 0;
+        S32 total_verts = 0;
         for (std::vector<LLVOVolume*>::iterator it = volumes.begin();
              it != volumes.end(); ++it)
         {
             LLVOVolume *volp = *it;
-            if (volp && volp->mDrawable)
+            S32 verts = 0;
+            total_tris += volp->getTriangleCount(&verts);
+            total_verts += verts;
+            lod_string += llformat("%d",volp->getLOD());
+                        if (volp && volp->mDrawable)
             {
                 if (volp->mDrawable->isActive())
                 {
@@ -248,6 +255,13 @@ void LLControlAvatar::updateDebugText()
         }
 #endif
 
+        addDebugText(llformat("lod %s",lod_string.c_str()));
+        addDebugText(llformat("tris %d verts %d", total_tris, total_verts));
+        //addDebugText(llformat("anim time %.1f (step %f factor %f)", 
+        //                      mMotionController.getAnimTime(),
+        //                      mMotionController.getTimeStep(), 
+        //                      mMotionController.getTimeFactor()));
+        
     }
 
     LLVOAvatar::updateDebugText();
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 711a87dc99d7fe59d28a46718463f1f1dea91bfa..d657f04457ab937c3070a1a41e703099d847af82 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -407,6 +407,7 @@ void LLExpandableTextBox::collapseTextBox()
 	setRect(mCollapsedRect);
 
 	updateTextBoxRect();
+	gViewerWindow->removePopup(this);
 }
 
 void LLExpandableTextBox::onFocusLost()
@@ -434,8 +435,6 @@ void LLExpandableTextBox::reshape(S32 width, S32 height, BOOL called_from_parent
     mExpanded = false;
     LLUICtrl::reshape(width, height, called_from_parent);
     updateTextBoxRect();
-
-    gViewerWindow->removePopup(this);
 }
 
 void LLExpandableTextBox::setValue(const LLSD& value)
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index a7236d1778f42b1a58d45bd9291a2b3c44784934..7e92643b933c5c630e650605b28c0cc20ce107bd 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -544,11 +544,18 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
 	send_agent_pause();
 	{
 		// NOTA BENE: hitting the file dialog triggers a window focus event, destroying the selection manager!!
-		success = GetSaveFileName(&mOFN);
-		if (success)
+		try
 		{
-			std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
-			mFiles.push_back(filename);
+			success = GetSaveFileName(&mOFN);
+			if (success)
+			{
+				std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
+				mFiles.push_back(filename);
+			}
+		}
+		catch (...)
+		{
+			LOG_UNHANDLED_EXCEPTION("");
 		}
 		gKeyboard->resetKeys();
 	}
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index 3522932d03df0c3a8faad669b46a5f9c9e0a930f..333765f99f28ba7c56a4f01c6ac6889e8722f280 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -1150,11 +1150,11 @@ void LLFloaterIMContainer::doToParticipants(const std::string& command, uuid_vec
 		}
 		else if ("block_unblock" == command)
 		{
-			toggleMute(userID, LLMute::flagVoiceChat);
+			LLAvatarActions::toggleMute(userID, LLMute::flagVoiceChat);
 		}
 		else if ("mute_unmute" == command)
 		{
-			toggleMute(userID, LLMute::flagTextChat);
+			LLAvatarActions::toggleMute(userID, LLMute::flagTextChat);
 		}
 		else if ("selected" == command || "mute_all" == command || "unmute_all" == command)
 		{
@@ -2096,24 +2096,6 @@ void LLFloaterIMContainer::toggleAllowTextChat(const LLUUID& participant_uuid)
 	}
 }
 
-void LLFloaterIMContainer::toggleMute(const LLUUID& participant_id, U32 flags)
-{
-        BOOL is_muted = LLMuteList::getInstance()->isMuted(participant_id, flags);
-
-        LLAvatarName av_name;
-        LLAvatarNameCache::get(participant_id, &av_name);
-        LLMute mute(participant_id, av_name.getUserName(), LLMute::AGENT);
-
-        if (!is_muted)
-        {
-                LLMuteList::getInstance()->add(mute, flags);
-        }
-        else
-        {
-                LLMuteList::getInstance()->remove(mute, flags);
-        }
-}
-
 void LLFloaterIMContainer::openNearbyChat()
 {
 	// If there's only one conversation in the container and that conversation is the nearby chat
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
index 60cef83d9aac305df8eb896c0c8add39880793f5..90fc0c2bdd54bab62c0b2a56d5d73d1bd64d55a3 100644
--- a/indra/newview/llfloaterimcontainer.h
+++ b/indra/newview/llfloaterimcontainer.h
@@ -176,7 +176,6 @@ class LLFloaterIMContainer
 	void moderateVoiceAllParticipants(bool unmute);
 	void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
 	void toggleAllowTextChat(const LLUUID& participant_uuid);
-	void toggleMute(const LLUUID& participant_id, U32 flags);
 	void banSelectedMember(const LLUUID& participant_uuid);
 	void openNearbyChat();
 	bool isParticipantListExpanded();
diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp
index 7895a5ff4827a1b7e55956501e7f3c5b879d9e5d..b2568abb834ec3eea7eb9b223f2eb0f4b0d1d3db 100644
--- a/indra/newview/llfloaterimnearbychat.cpp
+++ b/indra/newview/llfloaterimnearbychat.cpp
@@ -87,6 +87,10 @@ static LLChatTypeTrigger sChatTypeTriggers[] = {
 	{ "/shout"	, CHAT_TYPE_SHOUT}
 };
 
+bool cb_do_nothing()
+{
+	return false;
+}
 
 LLFloaterIMNearbyChat::LLFloaterIMNearbyChat(const LLSD& llsd)
 :	LLFloaterIMSessionTab(LLSD(LLUUID::null)),
@@ -97,6 +101,12 @@ LLFloaterIMNearbyChat::LLFloaterIMNearbyChat(const LLSD& llsd)
     mIsP2PChat = false;
 	mIsNearbyChat = true;
 	mSpeakerMgr = LLLocalSpeakerMgr::getInstance();
+
+	// Required by LLFloaterIMSessionTab::mGearBtn
+	// But nearby floater has no 'per agent' menu items, 
+	mEnableCallbackRegistrar.add("Avatar.EnableGearItem", boost::bind(&cb_do_nothing));
+	mCommitCallbackRegistrar.add("Avatar.GearDoToSelected", boost::bind(&cb_do_nothing));
+	mEnableCallbackRegistrar.add("Avatar.CheckGearItem", boost::bind(&cb_do_nothing));
 }
 
 //static
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index 2cd94c592a41128ea42ff14767c00bdfbd4c10dc..3aee08482b95cf82383d2b9e3145cd5fdfa1ec7b 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -46,6 +46,10 @@
 
 const F32 REFRESH_INTERVAL = 1.0f;
 
+void cb_group_do_nothing()
+{
+}
+
 LLFloaterIMSessionTab::LLFloaterIMSessionTab(const LLSD& session_id)
 :	LLTransientDockableFloater(NULL, false, session_id),
 	mIsP2PChat(false),
@@ -82,6 +86,7 @@ LLFloaterIMSessionTab::LLFloaterIMSessionTab(const LLSD& session_id)
     mEnableCallbackRegistrar.add("Avatar.CheckItem",  boost::bind(&LLFloaterIMSessionTab::checkContextMenuItem,	this, _2));
     mEnableCallbackRegistrar.add("Avatar.EnableItem", boost::bind(&LLFloaterIMSessionTab::enableContextMenuItem, this, _2));
     mCommitCallbackRegistrar.add("Avatar.DoToSelected", boost::bind(&LLFloaterIMSessionTab::doToSelected, this, _2));
+    mCommitCallbackRegistrar.add("Group.DoToSelected", boost::bind(&cb_group_do_nothing));
 }
 
 LLFloaterIMSessionTab::~LLFloaterIMSessionTab()
diff --git a/indra/newview/llfloaterlinkreplace.cpp b/indra/newview/llfloaterlinkreplace.cpp
index 3f80d6f1a4fbefdf7799353da7eb9b74ce55927f..10cce3bd22dcd5ff255bfe46405e7597916fc008 100644
--- a/indra/newview/llfloaterlinkreplace.cpp
+++ b/indra/newview/llfloaterlinkreplace.cpp
@@ -41,16 +41,13 @@ LLFloaterLinkReplace::LLFloaterLinkReplace(const LLSD& key)
 	mRemainingItems(0),
 	mSourceUUID(LLUUID::null),
 	mTargetUUID(LLUUID::null),
-	mInstance(NULL),
 	mBatchSize(gSavedSettings.getU32("LinkReplaceBatchSize"))
 {
 	mEventTimer.stop();
-	mInstance = this;
 }
 
 LLFloaterLinkReplace::~LLFloaterLinkReplace()
 {
-	mInstance = NULL;
 }
 
 BOOL LLFloaterLinkReplace::postBuild()
@@ -180,11 +177,9 @@ void LLFloaterLinkReplace::onStartClicked()
 	}
 }
 
-void LLFloaterLinkReplace::linkCreatedCallback(const LLUUID& old_item_id,
-												const LLUUID& target_item_id,
-												bool needs_wearable_ordering_update,
-												bool needs_description_update,
-												const LLUUID& outfit_folder_id)
+// static
+void LLFloaterLinkReplace::linkCreatedCallback(LLHandle<LLFloaterLinkReplace> floater_handle, const LLUUID& old_item_id, const LLUUID& target_item_id,
+												bool needs_wearable_ordering_update, bool needs_description_update, const LLUUID& outfit_folder_id)
 {
 	LL_DEBUGS() << "Inventory link replace:" << LL_NEWLINE
 		<< " - old_item_id = " << old_item_id.asString() << LL_NEWLINE
@@ -239,20 +234,21 @@ void LLFloaterLinkReplace::linkCreatedCallback(const LLUUID& old_item_id,
 		outfit_update_folder = outfit_folder_id;
 	}
 
-	LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(&LLFloaterLinkReplace::itemRemovedCallback, this, outfit_update_folder));
+	LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(&LLFloaterLinkReplace::itemRemovedCallback, floater_handle, outfit_update_folder));
 	remove_inventory_object(old_item_id, cb);
 }
 
-void LLFloaterLinkReplace::itemRemovedCallback(const LLUUID& outfit_folder_id)
+// static
+void LLFloaterLinkReplace::itemRemovedCallback(LLHandle<LLFloaterLinkReplace> floater_handle, const LLUUID& outfit_folder_id)
 {
 	if (outfit_folder_id.notNull())
 	{
 		LLAppearanceMgr::getInstance()->updateClothingOrderingInfo(outfit_folder_id);
 	}
 
-	if (mInstance)
+	if (!floater_handle.isDead())
 	{
-		decreaseOpenItemCount();
+		floater_handle.get()->decreaseOpenItemCount();
 	}
 }
 
@@ -324,7 +320,7 @@ void LLFloaterLinkReplace::processBatch(LLInventoryModel::item_array_t items)
 			LLInventoryObject::const_object_list_t obj_array;
 			obj_array.push_back(LLConstPointer<LLInventoryObject>(target_item));
 			LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(&LLFloaterLinkReplace::linkCreatedCallback,
-																											this,
+																											getDerivedHandle<LLFloaterLinkReplace>(),
 																											source_item->getUUID(),
 																											target_item->getUUID(),
 																											needs_wearable_ordering_update,
diff --git a/indra/newview/llfloaterlinkreplace.h b/indra/newview/llfloaterlinkreplace.h
index 377dd1d4505ffc73571aa0e1af04d0bd807f85ac..dd5c3012061fd89313b8b42afdf23182ff1b692e 100644
--- a/indra/newview/llfloaterlinkreplace.h
+++ b/indra/newview/llfloaterlinkreplace.h
@@ -98,12 +98,9 @@ class LLFloaterLinkReplace : public LLFloater, LLEventTimer
 	void updateFoundLinks();
 	void processBatch(LLInventoryModel::item_array_t items);
 
-	void linkCreatedCallback(const LLUUID& old_item_id,
-								const LLUUID& target_item_id,
-								bool needs_wearable_ordering_update,
-								bool needs_description_update,
-								const LLUUID& outfit_folder_id);
-	void itemRemovedCallback(const LLUUID& outfit_folder_id);
+	static void linkCreatedCallback(LLHandle<LLFloaterLinkReplace> floater_handle, const LLUUID& old_item_id, const LLUUID& target_item_id,
+	                                bool needs_wearable_ordering_update, bool needs_description_update, const LLUUID& outfit_folder_id);
+	static void itemRemovedCallback(LLHandle<LLFloaterLinkReplace> floater_handle, const LLUUID& outfit_folder_id);
 
 	void onSourceItemDrop(const LLUUID& source_item_id);
 	void onTargetItemDrop(const LLUUID& target_item_id);
@@ -120,8 +117,6 @@ class LLFloaterLinkReplace : public LLFloater, LLEventTimer
 	U32		mBatchSize;
 
 	LLInventoryModel::item_array_t	mRemainingInventoryItems;
-
-	LLFloaterLinkReplace* mInstance;
 };
 
 #endif // LL_FLOATERLINKREPLACE_H
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index c33dee5fb4cf84e1427c159c5bf538cf15fd0946..c330c2ae4783ce53788bbfa06412c1ef5e74b5ea 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -2290,13 +2290,15 @@ BOOL LLPanelEstateInfo::postBuild()
 
 	getChild<LLUICtrl>("parcel_access_override")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeAccessOverride, this));
 
+	getChild<LLUICtrl>("externally_visible_radio")->setFocus(TRUE);
+
 	return LLPanelRegionInfo::postBuild();
 }
 
 void LLPanelEstateInfo::refresh()
 {
 	// Disable access restriction controls if they make no sense.
-	bool public_access = getChild<LLRadioGroup>("externally_visible_radio")->getSelectedIndex();
+	bool public_access = ("estate_public_access" == getChild<LLUICtrl>("externally_visible_radio")->getValue().asString());
 
 	getChildView("Only Allow")->setEnabled(public_access);
 	getChildView("limit_payment")->setEnabled(public_access);
@@ -2317,7 +2319,7 @@ void LLPanelEstateInfo::refreshFromEstate()
 	getChild<LLUICtrl>("estate_name")->setValue(estate_info.getName());
 	setOwnerName(LLSLURL("agent", estate_info.getOwnerID(), "inspect").getSLURLString());
 
-	getChild<LLRadioGroup>("externally_visible_radio")->setSelectedIndex(estate_info.getIsExternallyVisible() ? 1 : 0);
+	getChild<LLUICtrl>("externally_visible_radio")->setValue(estate_info.getIsExternallyVisible() ? "estate_public_access" : "estate_restricted_access");
 	getChild<LLUICtrl>("voice_chat_check")->setValue(estate_info.getAllowVoiceChat());
 	getChild<LLUICtrl>("allow_direct_teleport")->setValue(estate_info.getAllowDirectTeleport());
 	getChild<LLUICtrl>("limit_payment")->setValue(estate_info.getDenyAnonymous());
@@ -2360,7 +2362,7 @@ bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, con
 
 			// update model
 			estate_info.setUseFixedSun(false); // we don't support fixed sun estates anymore
-			estate_info.setIsExternallyVisible(getChild<LLRadioGroup>("externally_visible_radio")->getSelectedIndex());
+			estate_info.setIsExternallyVisible("estate_public_access" == getChild<LLUICtrl>("externally_visible_radio")->getValue().asString());
 			estate_info.setAllowDirectTeleport(getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean());
 			estate_info.setDenyAnonymous(getChild<LLUICtrl>("limit_payment")->getValue().asBoolean());
 			estate_info.setDenyAgeUnverified(getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean());
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index b14b9b7578eaac034bee5ac0b6af0b43de2d347f..2869256d093d129b99dd0ee868c199af590d9e39 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -638,20 +638,20 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
 
 	// HACK - highlight buttons for next click
 	mRadioGroupMove->setVisible(move_visible);
-	if (!gGrabBtnSpin && 
-		!gGrabBtnVertical &&
-		!(mask == MASK_VERTICAL) && 
-		!(mask == MASK_SPIN) )
+	if (!(gGrabBtnSpin || 
+		gGrabBtnVertical || 
+		(mask == MASK_VERTICAL) || 
+		(mask == MASK_SPIN)))
 	{
 		mRadioGroupMove->setValue("radio move");
 	}
-	else if (gGrabBtnVertical || 
-			 (mask == MASK_VERTICAL) )
+	else if ((mask == MASK_VERTICAL) ||
+			 (gGrabBtnVertical && (mask != MASK_SPIN)))
 	{
 		mRadioGroupMove->setValue("radio lift");
 	}
-	else if (gGrabBtnSpin || 
-			 (mask == MASK_SPIN) )
+	else if ((mask == MASK_SPIN) || 
+			 (gGrabBtnSpin && (mask != MASK_VERTICAL)))
 	{
 		mRadioGroupMove->setValue("radio spin");
 	}
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 1b32fc9dfe133bd083e2ddadb1d1c46403451973..2751631a59b3919601d9a7816f5be9dddbca3674 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -3884,8 +3884,14 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items
 		LLInventoryModel::cat_array_t* cat_array;
 		LLInventoryModel::item_array_t* item_array;
 		gInventory.getDirectDescendentsOf(mUUID, cat_array, item_array);
+		LLViewerInventoryCategory *trash = getCategory();
 		// Enable Empty menu item only when there is something to act upon.
-		if ((0 == cat_array->size() && 0 == item_array->size()) || is_recent_panel)
+		// Also don't enable menu if folder isn't fully fetched
+		if ((0 == cat_array->size() && 0 == item_array->size())
+			|| is_recent_panel
+			|| !trash
+			|| trash->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN
+			|| trash->getDescendentCount() == LLViewerInventoryCategory::VERSION_UNKNOWN)
 		{
 			disabled_items.push_back(std::string("Empty Trash"));
 		}
@@ -4060,8 +4066,6 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags,   menuentry_vec_t&
 	LLFolderType::EType type = category->getPreferredType();
 	const bool is_system_folder = LLFolderType::lookupIsProtectedType(type);
 	// BAP change once we're no longer treating regular categories as ensembles.
-	const bool is_ensemble = (type == LLFolderType::FT_NONE ||
-		LLFolderType::lookupIsEnsembleType(type));
 	const bool is_agent_inventory = isAgentInventory();
 
 	// Only enable calling-card related options for non-system folders.
@@ -4104,30 +4108,26 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags,   menuentry_vec_t&
 			}
 
 			items.push_back(std::string("Replace Outfit"));
-
-			if (is_agent_inventory)
+		}
+		if (is_agent_inventory)
+		{
+			items.push_back(std::string("Folder Wearables Separator"));
+			items.push_back(std::string("Remove From Outfit"));
+			if (!LLAppearanceMgr::getCanRemoveFromCOF(mUUID))
 			{
-				items.push_back(std::string("Folder Wearables Separator"));
-				if (is_ensemble)
-				{
-					items.push_back(std::string("Wear As Ensemble"));
-				}
-				items.push_back(std::string("Remove From Outfit"));
-				if (!LLAppearanceMgr::getCanRemoveFromCOF(mUUID))
-				{
 					disabled_items.push_back(std::string("Remove From Outfit"));
-				}
-			}
-			if (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID))
-			{
-				disabled_items.push_back(std::string("Replace Outfit"));
-			}
-			if (!LLAppearanceMgr::instance().getCanAddToCOF(mUUID))
-			{
-				disabled_items.push_back(std::string("Add To Outfit"));
 			}
-			items.push_back(std::string("Outfit Separator"));
 		}
+		if (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID))
+		{
+			disabled_items.push_back(std::string("Replace Outfit"));
+		}
+		if (!LLAppearanceMgr::instance().getCanAddToCOF(mUUID))
+		{
+			disabled_items.push_back(std::string("Add To Outfit"));
+		}
+		items.push_back(std::string("Outfit Separator"));
+
 	}
 }
 
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index bccc654fbf2e2310f3ddc96ff0248ed041956952..d282240bfbbb5356a5865e5daa566cf7064adcf7 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -2295,9 +2295,33 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
     
 	if ("delete" == action)
 	{
-		LLSD args;
-		args["QUESTION"] = LLTrans::getString(root->getSelectedCount() > 1 ? "DeleteItems" :  "DeleteItem");
-		LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root->getHandle()));
+		static bool sDisplayedAtSession = false;
+		
+		LLAllDescendentsPassedFilter f;
+		for (std::set<LLFolderViewItem*>::iterator it = selected_items.begin(); (it != selected_items.end()) && (f.allDescendentsPassedFilter()); ++it)
+		{
+			if (LLFolderViewFolder* folder = dynamic_cast<LLFolderViewFolder*>(*it))
+			{
+				folder->applyFunctorRecursively(f);
+			}
+		}
+		// Fall through to the generic confirmation if the user choose to ignore the specialized one
+		if ( (!f.allDescendentsPassedFilter()) && (!LLNotifications::instance().getIgnored("DeleteFilteredItems")) )
+		{
+			LLNotificationsUtil::add("DeleteFilteredItems", LLSD(), LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root->getHandle()));
+		}
+		else
+		{
+			if (!sDisplayedAtSession) // ask for the confirmation at least once per session
+			{
+				LLNotifications::instance().setIgnored("DeleteItems", false);
+				sDisplayedAtSession = true;
+			}
+
+			LLSD args;
+			args["QUESTION"] = LLTrans::getString(root->getSelectedCount() > 1 ? "DeleteItems" :  "DeleteItem");
+			LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root->getHandle()));
+		}
         // Note: marketplace listings will be updated in the callback if delete confirmed
 		return;
 	}
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 649db4032d450b0ef294c6892f6ef800e7157bb7..d454d7e00be9f77bed25dec955d020e56bcbe14c 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -460,6 +460,8 @@ struct LLInventoryAction
 	static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root);
 	static void removeItemFromDND(LLFolderView* root);
 
+	static const int sConfirmOnDeleteItemsNumber;
+
 private:
 	static void buildMarketplaceFolders(LLFolderView* root);
 	static void updateMarketplaceFolders();
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index e5fd126d53c0a2a98e93222b57b37170c64e5125..dc75e09ad9c47e2bcca1d1e27f11ab5355279444 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -221,7 +221,11 @@ BOOL LLInventoryModel::isObjectDescendentOf(const LLUUID& obj_id,
 const LLViewerInventoryCategory *LLInventoryModel::getFirstNondefaultParent(const LLUUID& obj_id) const
 {
 	const LLInventoryObject* obj = getObject(obj_id);
-
+	if(!obj)
+	{
+		LL_WARNS(LOG_INV) << "Non-existent object [ id: " << obj_id << " ] " << LL_ENDL;
+		return NULL;
+	}
 	// Search up the parent chain until we get to root or an acceptable folder.
 	// This assumes there are no cycles in the tree else we'll get a hang.
 	LLUUID parent_id = obj->getParentUUID();
@@ -458,12 +462,8 @@ void LLInventoryModel::consolidateForType(const LLUUID& main_id, LLFolderType::E
         }
         
         // Purge the emptied folder
-        // Note: we'd like to use purgeObject() but it doesn't cleanly eliminate the folder
-        // which leads to issues further down the road when the folder is found again
-        //purgeObject(folder_id);
-        // We remove the folder and empty the trash instead which seems to work
-		removeCategory(folder_id);
-        gInventory.emptyFolderType("", LLFolderType::FT_TRASH);
+        removeCategory(folder_id);
+        remove_inventory_category(folder_id, NULL);
 	}
 }
 
@@ -799,22 +799,6 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
 	}
 }
 
-U32 LLInventoryModel::getDescendentsCountRecursive(const LLUUID& id, U32 max_item_limit)
-{
-	LLInventoryModel::cat_array_t cats;
-	LLInventoryModel::item_array_t items;
-	gInventory.collectDescendents(id, cats, items, LLInventoryModel::INCLUDE_TRASH);
-
-	U32 items_found = items.size() + cats.size();
-
-	for (U32 i = 0; i < cats.size() && items_found <= max_item_limit; ++i)
-	{
-		items_found += getDescendentsCountRecursive(cats[i]->getUUID(), max_item_limit - items_found);
-	}
-
-	return items_found;
-}
-
 void LLInventoryModel::addChangedMaskForLinks(const LLUUID& object_id, U32 mask)
 {
 	const LLInventoryObject *obj = getObject(object_id);
@@ -3321,9 +3305,12 @@ void LLInventoryModel::emptyFolderType(const std::string notification, LLFolderT
 		LLSD args;
 		if(LLFolderType::FT_TRASH == preferred_type)
 		{
-			static const U32 trash_max_capacity = gSavedSettings.getU32("InventoryTrashMaxCapacity");
+			LLInventoryModel::cat_array_t cats;
+			LLInventoryModel::item_array_t items;
 			const LLUUID trash_id = findCategoryUUIDForType(preferred_type);
-			args["COUNT"] = (S32)getDescendentsCountRecursive(trash_id, trash_max_capacity);
+			gInventory.collectDescendents(trash_id, cats, items, LLInventoryModel::INCLUDE_TRASH); //All descendants
+			S32 item_count = items.size() + cats.size();
+			args["COUNT"] = item_count;
 		}
 		LLNotificationsUtil::add(notification, args, LLSD(),
 										boost::bind(&LLInventoryModel::callbackEmptyFolderType, this, _1, _2, preferred_type));
@@ -3433,9 +3420,20 @@ bool callback_preview_trash_folder(const LLSD& notification, const LLSD& respons
 
 void  LLInventoryModel::checkTrashOverflow()
 {
-	static const U32 trash_max_capacity = gSavedSettings.getU32("InventoryTrashMaxCapacity");
+	static LLCachedControl<U32> trash_max_capacity(gSavedSettings, "InventoryTrashMaxCapacity");
+
+	// Collect all descendants including those in subfolders.
+	//
+	// Note: Do we really need content of subfolders?
+	// This was made to prevent download of trash folder timeouting
+	// viewer and sub-folders are supposed to download independently.
+	LLInventoryModel::cat_array_t cats;
+	LLInventoryModel::item_array_t items;
 	const LLUUID trash_id = findCategoryUUIDForType(LLFolderType::FT_TRASH);
-	if (getDescendentsCountRecursive(trash_id, trash_max_capacity) >= trash_max_capacity)
+	gInventory.collectDescendents(trash_id, cats, items, LLInventoryModel::INCLUDE_TRASH);
+	S32 item_count = items.size() + cats.size();
+
+	if (item_count >= trash_max_capacity)
 	{
 		if (LLFloaterPreviewTrash::isVisible())
 		{
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index c558c0803b50fba1504bb3f8e7de276cd27bd4a5..01e0ed7e9b36ad1334893b6ee55c7c0e7e2612d2 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -265,9 +265,6 @@ class LLInventoryModel
 	// Follow parent chain to the top.
 	bool getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const;
 
-private:
-	U32 getDescendentsCountRecursive(const LLUUID& id, U32 max_item_limit);
-	
 	//--------------------------------------------------------------------
 	// Find
 	//--------------------------------------------------------------------
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index 4427f32de99ad37c774ee5f7efce7e175486146e..26d7a7a28a80ec86be340d7d6489d581d2b6def0 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -350,6 +350,11 @@ void LLInventoryFetchDescendentsObserver::startFetch()
 		if (!cat) continue;
 		if (!isCategoryComplete(cat))
 		{
+			// CHECK IT: isCategoryComplete() checks both version and descendant count but
+			// fetch() only works for Unknown version and doesn't care about descentants,
+			// as result fetch won't start and folder will potentially get stuck as
+			// incomplete in observer.
+			// Likely either both should use only version or both should check descendants.
 			cat->fetch();		//blindly fetch it without seeing if anything else is fetching it.
 			mIncomplete.push_back(*it);	//Add to list of things being downloaded for this observer.
 		}
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 4b117941a0002df84cc440e25a8ffd44c2912504..f9c91312ee55cf92acbbae46d83aec0583ce70f9 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -1217,7 +1217,18 @@ void LLInventoryPanel::purgeSelectedItems()
     const std::set<LLFolderViewItem*> inventory_selected = mFolderRoot.get()->getSelectionList();
     if (inventory_selected.empty()) return;
     LLSD args;
-    args["COUNT"] = (S32)inventory_selected.size();
+    S32 count = inventory_selected.size();
+    for (std::set<LLFolderViewItem*>::const_iterator it = inventory_selected.begin(), end_it = inventory_selected.end();
+        it != end_it;
+        ++it)
+    {
+        LLUUID item_id = static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID();
+        LLInventoryModel::cat_array_t cats;
+        LLInventoryModel::item_array_t items;
+        gInventory.collectDescendents(item_id, cats, items, LLInventoryModel::INCLUDE_TRASH);
+        count += items.size() + cats.size();
+    }
+    args["COUNT"] = count;
     LLNotificationsUtil::add("PurgeSelectedItems", args, LLSD(), boost::bind(&LLInventoryPanel::callbackPurgeSelectedItems, this, _1, _2));
 }
 
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index b4d0bb6823f1492921169718393379043b230669..bacd88e0e0b5e1ad15014ade8710d9f4c9428fbc 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -59,10 +59,16 @@
 #include "llupdaterservice.h"
 #include "llevents.h"
 #include "llappviewer.h"
+#include "llsdserialize.h"
 
 #include <boost/scoped_ptr.hpp>
 #include <sstream>
 
+// this can be removed once it is defined by the build for all forks
+#ifndef ADDRESS_SIZE
+#  define ADDRESS_SIZE 32
+#endif
+
 class LLLoginInstance::Disposable {
 public:
 	virtual ~Disposable() {}
@@ -493,10 +499,12 @@ LLLoginInstance::LLLoginInstance() :
 }
 
 void LLLoginInstance::setPlatformInfo(const std::string platform,
-									  const std::string platform_version)
+									  const std::string platform_version,
+                                      const std::string platform_name)
 {
 	mPlatform = platform;
 	mPlatformVersion = platform_version;
+    mPlatformVersionName = platform_name;
 }
 
 LLLoginInstance::~LLLoginInstance()
@@ -565,7 +573,6 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
 	requested_options.append("event_notifications");
 	requested_options.append("classified_categories");
 	requested_options.append("adult_compliant"); 
-	//requested_options.append("inventory-targets");
 	requested_options.append("buddy-list");
 	requested_options.append("newuser-config");
 	requested_options.append("ui-config");
@@ -587,8 +594,7 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
 		requested_options.append("god-connect");
 	}
 	
-	// (re)initialize the request params with creds.
-	LLSD request_params = user_credential->getLoginParams();
+	LLSD request_params;
 
 	unsigned char hashed_unique_id_string[MD5HEX_STR_SIZE];
 	if ( ! llHashedUniqueID(hashed_unique_id_string) )
@@ -605,11 +611,26 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
 	request_params["version"] = LLVersionInfo::getVersion();
 	request_params["channel"] = LLVersionInfo::getChannel();
 	request_params["platform"] = mPlatform;
+	request_params["address_size"] = ADDRESS_SIZE;
 	request_params["platform_version"] = mPlatformVersion;
+	request_params["platform_string"] = mPlatformVersionName;
 	request_params["id0"] = mSerialNumber;
 	request_params["host_id"] = gSavedSettings.getString("HostID");
 	request_params["extended_errors"] = true; // request message_id and message_args
 
+    // log request_params _before_ adding the credentials   
+    LL_DEBUGS("LLLogin") << "Login parameters: " << LLSDOStreamer<LLSDNotationFormatter>(request_params) << LL_ENDL;
+
+    // Copy the credentials into the request after logging the rest
+    LLSD credentials(user_credential->getLoginParams());
+    for (LLSD::map_const_iterator it = credentials.beginMap();
+         it != credentials.endMap();
+         it++
+         )
+    {
+        request_params[it->first] = it->second;
+    }
+
 	mRequestData.clear();
 	mRequestData["method"] = "login_to_simulator";
 	mRequestData["params"] = request_params;
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index 282ddc1cea2d824f073b92f0701325009b73794a..1adea67189212a2a3dec253060e8cc0b0eb7726b 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -67,7 +67,7 @@ class LLLoginInstance : public LLSingleton<LLLoginInstance>
 	void setSerialNumber(const std::string& sn) { mSerialNumber = sn; }
 	void setLastExecEvent(int lee) { mLastExecEvent = lee; }
 	void setLastExecDuration(S32 duration) { mLastExecDuration = duration; }
-	void setPlatformInfo(const std::string platform, const std::string platform_version);
+	void setPlatformInfo(const std::string platform, const std::string platform_version, const std::string platform_name);
 
 	void setNotificationsInterface(LLNotificationsInterface* ni) { mNotifications = ni; }
 	LLNotificationsInterface& getNotificationsInterface() const { return *mNotifications; }
@@ -105,6 +105,7 @@ class LLLoginInstance : public LLSingleton<LLLoginInstance>
 	S32 mLastExecDuration;
 	std::string mPlatform;
 	std::string mPlatformVersion;
+	std::string mPlatformVersionName;
 	UpdaterLauncherCallback mUpdaterLauncher;
 	LLEventDispatcher mDispatcher;
 	LLUpdaterService * mUpdaterService;	
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index c4d1917567438d7d9497cf7692310daf3dbcb2c3..c2a0393170e02c9705bf17bf3bef45431c6ac3c5 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -1586,7 +1586,12 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
 				LLMeshRepository::sCacheBytesRead += size;
 				++LLMeshRepository::sCacheReads;
 				file.seek(offset);
-				U8* buffer = new U8[size];
+				U8* buffer = new(std::nothrow) U8[size];
+				if (!buffer)
+				{
+					LL_WARNS(LOG_MESH) << "Can't allocate memory for mesh LOD" << LL_ENDL;
+					return false;
+				}
 				file.read(buffer, size);
 
 				//make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index 5b53a05274233475c0e91e23b58bfbe35153da65..bf1716e18c701999e4f44b8f891d3cf14a787b6e 100644
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -48,6 +48,7 @@
 
 #include <boost/tokenizer.hpp>
 #include <boost/bind.hpp>
+#include <boost/algorithm/string/replace.hpp>
 
 #include "lldispatcher.h"
 #include "llxfermanager.h"
@@ -180,9 +181,10 @@ LLMuteList::~LLMuteList()
 
 BOOL LLMuteList::isLinden(const std::string& name) const
 {
+	std::string username = boost::replace_all_copy(name, ".", " ");
 	typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
 	boost::char_separator<char> sep(" ");
-	tokenizer tokens(name, sep);
+	tokenizer tokens(username, sep);
 	tokenizer::iterator token_iter = tokens.begin();
 	
 	if (token_iter == tokens.end()) return FALSE;
@@ -190,7 +192,8 @@ BOOL LLMuteList::isLinden(const std::string& name) const
 	if (token_iter == tokens.end()) return FALSE;
 	
 	std::string last_name = *token_iter;
-	return last_name == "Linden";
+	LLStringUtil::toLower(last_name);
+	return last_name == "linden";
 }
 
 static LLVOAvatar* find_avatar(const LLUUID& id)
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 7a183cb298e9449ba39e0014fafcbe1cb3ecb2b0..52c5234137f36f2eb2a4862178b5e61c6a027209 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -322,6 +322,8 @@ class LLHandlerUtil
 	 */
 	static std::string getSubstitutionName(const LLNotificationPtr& notification);
 
+	static std::string getSubstitutionOriginalName(const LLNotificationPtr& notification);
+
 	/**
 	 * Adds notification panel to the IM floater.
 	 */
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index 4a3923ef6eb1289a6e30571bec2a184a1646c573..6a5819676079934bd4afc6b76e410fb3cc83a9dd 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -241,6 +241,20 @@ std::string LLHandlerUtil::getSubstitutionName(const LLNotificationPtr& notifica
 	return res;
 }
 
+// static
+std::string LLHandlerUtil::getSubstitutionOriginalName(const LLNotificationPtr& notification)
+{
+	if(notification->getSubstitutions().has("ORIGINAL_NAME"))
+	{
+		std::string name = notification->getSubstitutions()["ORIGINAL_NAME"];
+		if(!name.empty())
+		{
+			return name;
+		}
+	}
+	return LLHandlerUtil::getSubstitutionName(notification);
+}
+
 // static
 void LLHandlerUtil::addNotifPanelToIM(const LLNotificationPtr& notification)
 {
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 63ab88da425fb60f729cd3886ba32cce945cce0f..14d25d81582685e199990be050608558645264c4 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -131,6 +131,7 @@ bool LLOfferHandler::processNotification(const LLNotificationPtr& notification)
 			// we not save offer notifications to the syswell floater that should be added to the IM floater
 			p.can_be_stored = !add_notif_to_im;
 			p.force_show = notification->getOfferFromAgent();
+			p.can_fade = notification->canFadeToast();
 
 			LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
 			if(channel)
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 7acb2f9e906e77b0b3bfe07f8e8254b2ff559680..fef0631fa6c3b8de4860be354b0a24dfb9cd645b 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -77,6 +77,7 @@ void LLScriptHandler::addToastWithNotification(const LLNotificationPtr& notifica
 	p.notification = notification;
 	p.panel = notify_box;
 	p.on_delete_toast = boost::bind(&LLScriptHandler::onDeleteToast, this, _1);
+	p.can_fade = notification->canFadeToast();
 	if(gAgent.isDoNotDisturb())
 	{ 
 		p.force_show = notification->getName() == "SystemMessage" 
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 596327e8f1a40e033c2ce2b11159703a006abe89..a6ef130cd006b61ad457a3921c284f538e5c79db 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -86,7 +86,7 @@ bool LLTipHandler::processNotification(const LLNotificationPtr& notification)
 	}
 
 	std::string session_name = notification->getPayload()["SESSION_NAME"];
-	const std::string name = notification->getSubstitutions()["NAME"];
+	const std::string name = LLHandlerUtil::getSubstitutionOriginalName(notification);
 	if (session_name.empty())
 	{
 		session_name = name;
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index 31e89c0ed020c223b11e31d9c46472d39daee3a2..5518656f3f802379cbc6c0b8ded0c151decedd4a 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -344,7 +344,7 @@ void LLOutfitGallery::removeFromLastRow(LLOutfitGalleryItem* item)
     mItemPanels.pop_back();
 }
 
-LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name)
+LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name, LLUUID outfit_id)
 {
     LLOutfitGalleryItem::Params giparams;
     LLOutfitGalleryItem* gitem = LLUICtrlFactory::create<LLOutfitGalleryItem>(giparams);
@@ -353,6 +353,7 @@ LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name)
     gitem->setFollowsLeft();
     gitem->setFollowsTop();
     gitem->setOutfitName(name);
+    gitem->setUUID(outfit_id);
     return gitem;
 }
 
@@ -511,7 +512,7 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id)
     if (!cat) return;
 
     std::string name = cat->getName();
-    LLOutfitGalleryItem* item = buildGalleryItem(name);
+    LLOutfitGalleryItem* item = buildGalleryItem(name, cat_id);
     mOutfitMap.insert(LLOutfitGallery::outfit_map_value_t(cat_id, item));
     item->setRightMouseDownCallback(boost::bind(&LLOutfitListBase::outfitRightClickCallBack, this,
         _1, _2, _3, cat_id));
@@ -661,7 +662,8 @@ LLOutfitGalleryItem::LLOutfitGalleryItem(const Params& p)
     mSelected(false),
     mWorn(false),
     mDefaultImage(true),
-    mOutfitName("")
+    mOutfitName(""),
+    mUUID(LLUUID())
 {
     buildFromFile("panel_outfit_gallery_item.xml");
 }
@@ -745,23 +747,20 @@ BOOL LLOutfitGalleryItem::handleRightMouseDown(S32 x, S32 y, MASK mask)
     return LLUICtrl::handleRightMouseDown(x, y, mask);
 }
 
-BOOL LLOutfitGallery::handleDoubleClick(S32 x, S32 y, MASK mask)
+BOOL LLOutfitGalleryItem::handleDoubleClick(S32 x, S32 y, MASK mask)
 {
     LLTabContainer* appearence_tabs = LLPanelOutfitsInventory::findInstance()->getChild<LLTabContainer>("appearance_tabs");
-    LLPanel* panel = NULL;
-    LLAccordionCtrl* accordion = NULL;
-    if (appearence_tabs != NULL)
+    if (appearence_tabs && (mUUID != LLUUID()))
     {
         appearence_tabs->selectTabByName("outfitslist_tab");
-        panel = appearence_tabs->getCurrentPanel();
-        if (panel != NULL)
+        LLPanel* panel = appearence_tabs->getCurrentPanel();
+        if (panel)
         {
-            accordion = panel->getChild<LLAccordionCtrl>("outfits_accordion");
+            LLAccordionCtrl* accordion = panel->getChild<LLAccordionCtrl>("outfits_accordion");
             LLOutfitsList* outfit_list = dynamic_cast<LLOutfitsList*>(panel);
             if (accordion != NULL && outfit_list != NULL)
             {
-                LLUUID item_id = getSelectedOutfitUUID();
-                outfit_list->setSelectedOutfitByUUID(item_id);
+                outfit_list->setSelectedOutfitByUUID(mUUID);
                 LLAccordionCtrlTab* tab = accordion->getSelectedTab();
                 tab->showAndFocusHeader();
                 return TRUE;
@@ -769,7 +768,7 @@ BOOL LLOutfitGallery::handleDoubleClick(S32 x, S32 y, MASK mask)
         }
     }
 
-	return LLUICtrl::handleDoubleClick(x, y, mask);
+    return LLPanel::handleDoubleClick(x, y, mask);
 }
 
 void LLOutfitGalleryItem::setImageAssetId(LLUUID image_asset_id)
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index 37e75f110950bb3250d1688f40f298bff48942db..25662470729ba766af150ce95d0d6560cea4373e 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -115,8 +115,6 @@ class LLOutfitGallery : public LLOutfitListBase
     void onBeforeOutfitSnapshotSave();
     void onAfterOutfitSnapshotSave();
 
-    /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
-
 protected:
     /*virtual*/ void onHighlightBaseOutfit(LLUUID base_id, LLUUID prev_id);
     /*virtual*/ void onSetSelectedOutfitByUUID(const LLUUID& outfit_uuid);
@@ -150,7 +148,7 @@ class LLOutfitGallery : public LLOutfitListBase
     void updateRowsIfNeeded();
     void updateGalleryWidth();
 
-    LLOutfitGalleryItem* buildGalleryItem(std::string name);
+    LLOutfitGalleryItem* buildGalleryItem(std::string name, LLUUID outfit_id);
 
     void onTextureSelectionChanged(LLInventoryItem* itemp);
 
@@ -258,6 +256,7 @@ class LLOutfitGalleryItem : public LLPanel
     /*virtual*/ void draw();
     /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
     /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+    /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
 
     void setDefaultImage();
     void setImageAssetId(LLUUID asset_id);
@@ -265,6 +264,7 @@ class LLOutfitGalleryItem : public LLPanel
     void setOutfitName(std::string name);
     void setOutfitWorn(bool value);
     void setSelected(bool value);
+    void setUUID(LLUUID outfit_id) {mUUID = outfit_id;}
     
     std::string getItemName() {return mOutfitName;}
     bool isDefaultImage() {return mDefaultImage;}
@@ -274,6 +274,7 @@ class LLOutfitGalleryItem : public LLPanel
     
 private:
     LLPointer<LLViewerFetchedTexture> mTexturep;
+    LLUUID mUUID;
     LLUUID mImageAssetId;
     LLTextBox* mOutfitNameText;
     LLTextBox* mOutfitWornText;
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 5d1ae4ff10c4b4e9928b58b4a5cc9a137c5eadf5..b9b97f4cce68d230fd8e27879649ab549508daed 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -208,19 +208,21 @@ void LLPanelClassifiedInfo::onOpen(const LLSD& key)
 	LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId());
 	gGenericDispatcher.addHandler("classifiedclickthrough", &sClassifiedClickThrough);
 
-	// While we're at it let's get the stats from the new table if that
-	// capability exists.
-	std::string url = gAgent.getRegion()->getCapability("SearchStatRequest");
-	if (!url.empty())
+	if (gAgent.getRegion())
 	{
-		LL_INFOS() << "Classified stat request via capability" << LL_ENDL;
-		LLSD body;
-        LLUUID classifiedId = getClassifiedId();
-		body["classified_id"] = classifiedId;
-        LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, body,
-            boost::bind(&LLPanelClassifiedInfo::handleSearchStatResponse, classifiedId, _1));
+		// While we're at it let's get the stats from the new table if that
+		// capability exists.
+		std::string url = gAgent.getRegion()->getCapability("SearchStatRequest");
+		if (!url.empty())
+		{
+			LL_INFOS() << "Classified stat request via capability" << LL_ENDL;
+			LLSD body;
+			LLUUID classifiedId = getClassifiedId();
+			body["classified_id"] = classifiedId;
+			LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, body,
+				boost::bind(&LLPanelClassifiedInfo::handleSearchStatResponse, classifiedId, _1));
+		}
 	}
-
 	// Update classified click stats.
 	// *TODO: Should we do this when opening not from search?
 	sendClickMessage("profile");
@@ -540,21 +542,24 @@ void LLPanelClassifiedInfo::sendClickMessage(
 		const LLVector3d& global_pos,
 		const std::string& sim_name)
 {
-	// You're allowed to click on your own ads to reassure yourself
-	// that the system is working.
-	LLSD body;
-	body["type"]			= type;
-	body["from_search"]		= from_search;
-	body["classified_id"]	= classified_id;
-	body["parcel_id"]		= parcel_id;
-	body["dest_pos_global"]	= global_pos.getValue();
-	body["region_name"]		= sim_name;
-
-	std::string url = gAgent.getRegion()->getCapability("SearchStatTracking");
-	LL_INFOS() << "Sending click msg via capability (url=" << url << ")" << LL_ENDL;
-	LL_INFOS() << "body: [" << body << "]" << LL_ENDL;
-    LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(url, body,
-        "SearchStatTracking Click report sent.", "SearchStatTracking Click report NOT sent.");
+	if (gAgent.getRegion())
+	{
+		// You're allowed to click on your own ads to reassure yourself
+		// that the system is working.
+		LLSD body;
+		body["type"]			= type;
+		body["from_search"]		= from_search;
+		body["classified_id"]	= classified_id;
+		body["parcel_id"]		= parcel_id;
+		body["dest_pos_global"]	= global_pos.getValue();
+		body["region_name"]		= sim_name;
+
+		std::string url = gAgent.getRegion()->getCapability("SearchStatTracking");
+		LL_INFOS() << "Sending click msg via capability (url=" << url << ")" << LL_ENDL;
+		LL_INFOS() << "body: [" << body << "]" << LL_ENDL;
+        LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(url, body,
+            "SearchStatTracking Click report sent.", "SearchStatTracking Click report NOT sent.");
+	}
 }
 
 void LLPanelClassifiedInfo::sendClickMessage(const std::string& type)
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index 0e6f5b89247d1c4f9fa9385bc2de2b5ab98f553a..05be4b5aeef7b8119b4a1eb03c7cc59008c99375 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -164,6 +164,8 @@ class LLPanelGroupTab : public LLPanel
 
 	virtual void setupCtrls	(LLPanel* parent) {};
 
+	virtual void onFilterChanged() { }
+
 protected:
 	LLUUID	mGroupID;
 	BOOL mAllowEdit;
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index 8440e9ee500dc380c73cd2895296cdeec0eaf61b..66a0a1d4aded1fb0647b5cf6acae47df4754f27f 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -494,6 +494,7 @@ void LLPanelGroupSubTab::setSearchFilter(const std::string& filter)
 	mSearchFilter = filter;
 	LLStringUtil::toLower(mSearchFilter);
 	update(GC_ALL);
+	onFilterChanged();
 }
 
 void LLPanelGroupSubTab::activate()
@@ -2471,12 +2472,7 @@ void LLPanelGroupRolesSubTab::handleActionCheck(LLUICtrl* ctrl, bool force)
 		
 		//////////////////////////////////////////////////////////////////////////
 
-		LLGroupMgrGroupData::role_list_t::iterator rit = gdatap->mRoles.find(role_id);
-		U64 current_role_powers = GP_NO_POWERS;
-		if (rit != gdatap->mRoles.end())
-		{
-			current_role_powers = ((*rit).second->getRoleData().mRolePowers);
-		}
+		U64 current_role_powers = gdatap->getRolePowers(role_id);
 
 		if(isEnablingAbility)
 		{
@@ -2775,6 +2771,16 @@ void LLPanelGroupActionsSubTab::activate()
 	LLPanelGroupSubTab::activate();
 
 	update(GC_ALL);
+	mActionDescription->clear();
+	mActionList->deselectAllItems();
+	mActionList->deleteAllItems();
+	buildActionsList(mActionList,
+					 GP_ALL_POWERS,
+					 GP_ALL_POWERS,
+					 NULL,
+					 FALSE,
+					 TRUE,
+					 FALSE);
 }
 
 void LLPanelGroupActionsSubTab::deactivate()
@@ -2803,19 +2809,31 @@ void LLPanelGroupActionsSubTab::update(LLGroupChange gc)
 
 	if (mGroupID.isNull()) return;
 
-	mActionList->deselectAllItems();
 	mActionMembers->deleteAllItems();
 	mActionRoles->deleteAllItems();
-	mActionDescription->clear();
 
+	if(mActionList->hasSelectedItem())
+	{
+		LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
+		if (gdatap && gdatap->isMemberDataComplete() && gdatap->isRoleDataComplete())
+		{
+			handleActionSelect();
+		}
+	}
+}
+
+void LLPanelGroupActionsSubTab::onFilterChanged()
+{
+	mActionDescription->clear();
+	mActionList->deselectAllItems();
 	mActionList->deleteAllItems();
 	buildActionsList(mActionList,
-					 GP_ALL_POWERS,
-					 GP_ALL_POWERS,
-					 NULL,
-					 FALSE,
-					 TRUE,
-					 FALSE);
+		GP_ALL_POWERS,
+		GP_ALL_POWERS,
+		NULL,
+		FALSE,
+		TRUE,
+		FALSE);
 }
 
 void LLPanelGroupActionsSubTab::handleActionSelect()
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index 9a696124a8cbb4a130ba92e20197f952fd68358a..1d1d69e0ae3501a382d99257a63eb387b711c86e 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -311,6 +311,7 @@ class LLPanelGroupActionsSubTab : public LLPanelGroupSubTab
 	virtual bool needsApply(std::string& mesg);
 	virtual bool apply(std::string& mesg);
 	virtual void update(LLGroupChange gc);
+	virtual void onFilterChanged();
 
 	void handleActionSelect();
 
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 3db9500de0a6bd265e63c0e95a1277b85885f79c..dd75ae9c06873f93913e05a89902d39aa86f9ccd 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -1287,13 +1287,13 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
 	{
 		const LLUUID &trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 		LLInventoryModel::EHasChildren children = gInventory.categoryHasChildren(trash_id);
-		return children != LLInventoryModel::CHILDREN_NO;
+		return children != LLInventoryModel::CHILDREN_NO && gInventory.isCategoryComplete(trash_id);
 	}
 	if (command_name == "empty_lostnfound")
 	{
 		const LLUUID &trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
 		LLInventoryModel::EHasChildren children = gInventory.categoryHasChildren(trash_id);
-		return children != LLInventoryModel::CHILDREN_NO;
+		return children != LLInventoryModel::CHILDREN_NO && gInventory.isCategoryComplete(trash_id);
 	}
 
 	return TRUE;
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 3f6bdde127683ce7a521aefbffb43f81e3d0addb..5973b08183dc355e95641de592b8c3b73ce05b53 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -1285,7 +1285,7 @@ void LLPanelOutfitEdit::showFilteredWearablesListView(LLWearableType::EType type
 	showWearablesListView();
 
 	//e_list_view_item_type implicitly contains LLWearableType::EType starting from LVIT_SHAPE
-	applyListViewFilter((EListViewItemType) (LVIT_SHAPE + type));
+	applyListViewFilter(static_cast<EListViewItemType>(LVIT_SHAPE + type));
 }
 
 static void update_status_widget_rect(LLView * widget, S32 right_border)
@@ -1305,8 +1305,10 @@ void LLPanelOutfitEdit::onOutfitChanging(bool started)
 	S32 delta = started ? indicator_delta : 0;
 	S32 right_border = status_panel->getRect().getWidth() - delta;
 
-	update_status_widget_rect(mCurrentOutfitName, right_border);
-	update_status_widget_rect(mStatus, right_border);
+	if (mCurrentOutfitName)
+		update_status_widget_rect(mCurrentOutfitName, right_border);
+	if (mStatus)
+		update_status_widget_rect(mStatus, right_border);
 
 	indicator->setVisible(started);
 }
diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp
index 51ec964ace38e88b406e5dd438f66b7c4d327011..77378f8092b8ddbd3510a76232ae4d0733bb31dd 100644
--- a/indra/newview/llpanelsnapshotlocal.cpp
+++ b/indra/newview/llpanelsnapshotlocal.cpp
@@ -172,6 +172,7 @@ void LLPanelSnapshotLocal::onSaveFlyoutCommit(LLUICtrl* ctrl)
 	}
 	else
 	{
+		cancel();
 		floater->notify(LLSD().with("set-finished", LLSD().with("ok", false).with("msg", "local")));
 	}
 }
diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp
index 55cb7d616bce1f8e2ea3306016bf2a3ea1cd4c4b..471e1c24f33d444b0f29c073dad7e6f8e78a9299 100644
--- a/indra/newview/llplacesinventorybridge.cpp
+++ b/indra/newview/llplacesinventorybridge.cpp
@@ -62,7 +62,7 @@ void LLPlacesLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 	if(isItemInTrash())
 	{
 		items.push_back(std::string("Purge Item"));
-		if (!isItemRemovable())
+		if (!isItemRemovable() || (gInventory.getCategory(mUUID) && !gInventory.isCategoryComplete(mUUID)))
 		{
 			disabled_items.push_back(std::string("Purge Item"));
 		}
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 5cdc5dfd38a0639fee2cf58e5b64a71606b2637f..b7fea4e9825460c90d0224aae42d5810a6940f88 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -1683,6 +1683,7 @@ void LLPreviewLSL::saveIfNeeded(bool sync /*= true*/)
         mScriptEd->sync();
     }
 
+    if (!gAgent.getRegion()) return;
     const LLInventoryItem *inv_item = getItem();
     // save it out to asset server
     std::string url = gAgent.getRegion()->getCapability("UpdateScriptAgent");
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 645a77e42aa1a7f9252b4a688eae80e12681ff3e..12bcd89cb082b6ead520b4d100c54c6d36a70d95 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -52,6 +52,8 @@
 #include "llviewerwindow.h"
 #include "lllineeditor.h"
 
+#include <boost/lexical_cast.hpp>
+
 const S32 CLIENT_RECT_VPAD = 4;
 
 const F32 SECONDS_TO_SHOW_FILE_SAVED_MSG = 8.f;
@@ -98,6 +100,29 @@ LLPreviewTexture::~LLPreviewTexture()
 	}
 }
 
+void LLPreviewTexture::populateRatioList()
+{
+	// Fill in ratios list with common aspect ratio values
+	mRatiosList.clear();
+	mRatiosList.push_back(LLTrans::getString("Unconstrained"));
+	mRatiosList.push_back("1:1");
+	mRatiosList.push_back("4:3");
+	mRatiosList.push_back("10:7");
+	mRatiosList.push_back("3:2");
+	mRatiosList.push_back("16:10");
+	mRatiosList.push_back("16:9");
+	mRatiosList.push_back("2:1");
+	
+	// Now fill combo box with provided list
+	LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
+	combo->removeall();
+
+	for (std::vector<std::string>::const_iterator it = mRatiosList.begin(); it != mRatiosList.end(); ++it)
+	{
+		combo->add(*it);
+	}
+}
+
 // virtual
 BOOL LLPreviewTexture::postBuild()
 {
@@ -138,27 +163,12 @@ BOOL LLPreviewTexture::postBuild()
         }
     }
 
-	// Fill in ratios list with common aspect ratio values
-	mRatiosList.clear();
-	mRatiosList.push_back(LLTrans::getString("Unconstrained"));
-	mRatiosList.push_back("1:1");
-	mRatiosList.push_back("4:3");
-	mRatiosList.push_back("10:7");
-	mRatiosList.push_back("3:2");
-	mRatiosList.push_back("16:10");
-	mRatiosList.push_back("16:9");
-	mRatiosList.push_back("2:1");
-	
-	// Now fill combo box with provided list
-	LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
-	combo->removeall();
-
-	for (std::vector<std::string>::const_iterator it = mRatiosList.begin(); it != mRatiosList.end(); ++it)
-	{
-		combo->add(*it);
-	}
+	// Fill in ratios list and combo box with common aspect ratio values
+	populateRatioList();
 
 	childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this);
+
+	LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
 	combo->setCurrentByIndex(0);
 	
 	return LLPreview::postBuild();
@@ -444,16 +454,25 @@ void LLPreviewTexture::updateDimensions()
 		return;
 	}
 
-	if (mAssetStatus != PREVIEW_ASSET_LOADED)
+	S32 img_width = mImage->getFullWidth();
+	S32 img_height = mImage->getFullHeight();
+
+	if (mAssetStatus != PREVIEW_ASSET_LOADED
+		|| mLastWidth != img_width
+		|| mLastHeight != img_height)
 	{
 		mAssetStatus = PREVIEW_ASSET_LOADED;
 		// Asset has been fully loaded, adjust aspect ratio
 		adjustAspectRatio();
 	}
-	
+
+
 	// Update the width/height display every time
-	getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]",  llformat("%d", mImage->getFullWidth()));
-	getChild<LLUICtrl>("dimensions")->setTextArg("[HEIGHT]", llformat("%d", mImage->getFullHeight()));
+	getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]",  llformat("%d", img_width));
+	getChild<LLUICtrl>("dimensions")->setTextArg("[HEIGHT]", llformat("%d", img_height));
+
+	mLastHeight = img_height;
+	mLastWidth = img_width;
 
 	// Reshape the floater only when required
 	if (mUpdateDimensions)
@@ -579,7 +598,12 @@ void LLPreviewTexture::adjustAspectRatio()
 			std::vector<std::string>::const_iterator found = std::find(mRatiosList.begin(), mRatiosList.end(), ratio.str());
 			if (found == mRatiosList.end())
 			{
-				combo->setCurrentByIndex(0);
+				// No existing ratio found, create an element that will show image at original ratio
+				populateRatioList(); // makes sure previous custom ratio is cleared
+				std::string ratio = boost::lexical_cast<std::string>(num)+":" + boost::lexical_cast<std::string>(denom);
+				mRatiosList.push_back(ratio);
+				combo->add(ratio);
+				combo->setCurrentByIndex(mRatiosList.size()- 1);
 			}
 			else
 			{
@@ -587,6 +611,15 @@ void LLPreviewTexture::adjustAspectRatio()
 			}
 		}
 	}
+	else
+	{
+		// Aspect ratio was set to unconstrained or was clamped
+		LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
+		if (combo)
+		{
+			combo->setCurrentByIndex(0); //unconstrained
+		}
+	}
 
 	mUpdateDimensions = TRUE;
 }
diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h
index b104a91c756de0b2ae2cd07b5bd0fff076070043..c156c48d0cdb9a885c78caf865ff04c9e008f218 100644
--- a/indra/newview/llpreviewtexture.h
+++ b/indra/newview/llpreviewtexture.h
@@ -67,6 +67,7 @@ class LLPreviewTexture : public LLPreview
 	/*virtual*/ void setObjectID(const LLUUID& object_id);
 protected:
 	void				init();
+	void				populateRatioList();
 	/* virtual */ BOOL	postBuild();
 	bool				setAspectRatio(const F32 width, const F32 height);
 	static void			onAspectRatioCommit(LLUICtrl*,void* userdata);
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index b6b7d5265b2b70c4fc63e8b414da1ea72b7c1073..3e8d8883e03a623e816e94b0c9fe7a5ce9963f23 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -6760,12 +6760,27 @@ void LLSelectMgr::pauseAssociatedAvatars()
         if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && 
             isAgentAvatarValid() && object->getParent() != NULL)
         {
-            mPauseRequests.push_back(gAgentAvatarp->requestPause());
+            if (object->isAnimatedObject())
+            {
+                // Is an animated object attachment.
+                // Pause both the control avatar and the avatar it's attached to.
+                if (object->getControlAvatar())
+                {
+                    mPauseRequests.push_back(object->getControlAvatar()->requestPause());
+                }
+                mPauseRequests.push_back(gAgentAvatarp->requestPause());
+            }
+            else
+            {
+                // Is a regular attachment. Pause the avatar it's attached to.
+                mPauseRequests.push_back(gAgentAvatarp->requestPause());
+            }
         }
         else
         {
             if (object && object->isAnimatedObject() && object->getControlAvatar())
             {
+                // Is a non-attached animated object. Pause the control avatar.
                 mPauseRequests.push_back(object->getControlAvatar()->requestPause());
             }
         }
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index 58e48480c1ea9c252b8af93af8d92570efad0b15..ee8b2d79c0f6f536648c2727f1e5b93abcf2177f 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -45,6 +45,7 @@
 #include "llimagepng.h"
 #include "lllandmarkactions.h"
 #include "lllocalcliprect.h"
+#include "llresmgr.h"
 #include "llnotificationsutil.h"
 #include "llslurl.h"
 #include "llsnapshotlivepreview.h"
@@ -56,6 +57,7 @@
 #include "llvfs.h"
 #include "llwindow.h"
 #include "llworld.h"
+#include <boost/filesystem.hpp>
 
 const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f;
 
@@ -1069,7 +1071,7 @@ BOOL LLSnapshotLivePreview::saveLocal()
     getFormattedImage();
     
     // Save the formatted image
-	BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage);
+	BOOL success = saveLocal(mFormattedImage);
 
 	if(success)
 	{
@@ -1078,3 +1080,38 @@ BOOL LLSnapshotLivePreview::saveLocal()
 	return success;
 }
 
+//Check if failed due to insufficient memory
+BOOL LLSnapshotLivePreview::saveLocal(LLPointer<LLImageFormatted> mFormattedImage)
+{
+	BOOL insufficient_memory;
+	BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage, FALSE, insufficient_memory);
+
+	if (insufficient_memory)
+	{
+		std::string lastSnapshotDir = LLViewerWindow::getLastSnapshotDir();
+
+#ifdef LL_WINDOWS
+		boost::filesystem::path b_path(utf8str_to_utf16str(lastSnapshotDir));
+#else
+		boost::filesystem::path b_path(lastSnapshotDir);
+#endif
+		boost::filesystem::space_info b_space = boost::filesystem::space(b_path);
+		if (b_space.free < mFormattedImage->getDataSize())
+		{
+			LLSD args;
+			args["PATH"] = lastSnapshotDir;
+
+			std::string needM_bytes_string;
+			LLResMgr::getInstance()->getIntegerString(needM_bytes_string, (mFormattedImage->getDataSize()) >> 10);
+			args["NEED_MEMORY"] = needM_bytes_string;
+
+			std::string freeM_bytes_string;
+			LLResMgr::getInstance()->getIntegerString(freeM_bytes_string, (b_space.free) >> 10);
+			args["FREE_MEMORY"] = freeM_bytes_string;
+
+			LLNotificationsUtil::add("SnapshotToComputerFailed", args);
+			return false;
+		}
+	}
+	return success;
+}
diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h
index b689c503205ca2d2b4528e91ff1f55a3b7ba1c65..4ea8d25a5ad0196edc5cb7c6df1dfd211c2fe86a 100644
--- a/indra/newview/llsnapshotlivepreview.h
+++ b/indra/newview/llsnapshotlivepreview.h
@@ -41,6 +41,7 @@ class LLSnapshotLivePreview : public LLView
 	LOG_CLASS(LLSnapshotLivePreview);
 public:
 
+	static BOOL saveLocal(LLPointer<LLImageFormatted>);
 	struct Params : public LLInitParam::Block<Params, LLView::Params>
 	{
 		Params()
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 0c2fcdaf1086f534350b954ee91412729a0148b4..dc184e25380beb9056357397b36107c1c07206e8 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2268,13 +2268,15 @@ void login_callback(S32 option, void *userdata)
 */
 void show_release_notes_if_required()
 {
-    if (LLVersionInfo::getChannelAndVersion() != gLastRunVersion
+    static bool release_notes_shown = false;
+    if (!release_notes_shown && (LLVersionInfo::getChannelAndVersion() != gLastRunVersion)
         && LLVersionInfo::getViewerMaturity() != LLVersionInfo::TEST_VIEWER // don't show Release Notes for the test builds
         && gSavedSettings.getBOOL("UpdaterShowReleaseNotes")
         && !gSavedSettings.getBOOL("FirstLoginThisInstall"))
     {
         LLSD info(LLAppViewer::instance()->getViewerInfo());
         LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]);
+        release_notes_shown = true;
     }
 }
 
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index bbce717c20c9a602002d30270b9b846f9f98c28f..495c9c1f449e052056780369a4ce54670fb5ac17 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -46,6 +46,8 @@
 #include "lltransientfloatermgr.h"
 #include "llviewercontrol.h" // for gSavedSettings
 
+#include <boost/algorithm/string.hpp>
+
 const S32 MAX_ALLOWED_MSG_WIDTH = 400;
 const F32 DEFAULT_BUTTON_DELAY = 0.5f;
 
@@ -351,6 +353,10 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
 	{
 		setCheckBox(LLNotifications::instance().getGlobalString("skipnexttime"), ignore_label);
 	}
+	if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE_SESSION_ONLY)
+	{
+		setCheckBox(LLNotifications::instance().getGlobalString("skipnexttimesessiononly"), ignore_label);
+	}
 	else if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE)
 	{
 		setCheckBox(LLNotifications::instance().getGlobalString("alwayschoose"), ignore_label);
@@ -385,15 +391,18 @@ bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::
 
 	const LLFontGL* font =  mCheck->getFont();
 	const S32 LINE_HEIGHT = font->getLineHeight();
+
+	std::vector<std::string> lines;
+	boost::split(lines, check_title, boost::is_any_of("\n"));
 	
 	// Extend dialog for "check next time"
 	S32 max_msg_width = LLToastPanel::getRect().getWidth() - 2 * HPAD;
-	S32 check_width = S32(font->getWidth(check_title) + 0.99f) + 16;
+	S32 check_width = S32(font->getWidth(lines[0]) + 0.99f) + 16; // use width of the first line
 	max_msg_width = llmax(max_msg_width, check_width);
 	S32 dialog_width = max_msg_width + 2 * HPAD;
 
 	S32 dialog_height = LLToastPanel::getRect().getHeight();
-	dialog_height += LINE_HEIGHT;
+	dialog_height += LINE_HEIGHT * lines.size();
 	dialog_height += LINE_HEIGHT / 2;
 
 	LLToastPanel::reshape( dialog_width, dialog_height, FALSE );
@@ -402,7 +411,7 @@ bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::
 
 	// set check_box's attributes
 	LLRect check_rect;
-	mCheck->setRect(check_rect.setOriginAndSize(msg_x, VPAD+BTN_HEIGHT+LINE_HEIGHT/2, max_msg_width, LINE_HEIGHT));
+	mCheck->setRect(check_rect.setOriginAndSize(msg_x, VPAD+BTN_HEIGHT+LINE_HEIGHT/2, max_msg_width, LINE_HEIGHT*lines.size()));
 	mCheck->setLabel(check_title);
 	mCheck->setCommitCallback(boost::bind(&LLToastAlertPanel::onClickIgnore, this, _1));
 	
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 49436ee4066a6f78f753896ba24e42cfaa4261b9..bd68d8c999ab0951e71601fb211e0efb128517d4 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -1450,13 +1450,20 @@ void LLToolDragAndDrop::dropInventory(LLViewerObject* hit_obj,
 
 // accessor that looks at permissions, copyability, and names of
 // inventory items to determine if a drop would be ok.
-EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item)
+EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item, EDragAndDropType type)
 {
 	// check the basics
 	if (!item || !obj) return ACCEPT_NO;
 	// HACK: downcast
 	LLViewerInventoryItem* vitem = (LLViewerInventoryItem*)item;
-	if (!vitem->isFinished()) return ACCEPT_NO;
+	if (!vitem->isFinished() && (type != DAD_CATEGORY))
+	{
+		// Note: for DAD_CATEGORY we assume that folder version check passed and folder 
+		// is complete, meaning that items inside are up to date. 
+		// (isFinished() == false) at the moment shows that item was loaded from cache.
+		// Library or agent inventory only.
+		return ACCEPT_NO;
+	}
 	if (vitem->getIsLinkType()) return ACCEPT_NO; // No giving away links
 
 	// deny attempts to drop from an object onto itself. This is to
@@ -2296,7 +2303,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
 				(*item_iter) = item;
 			}
 			*/
-			rv = willObjectAcceptInventory(root_object, item);
+			rv = willObjectAcceptInventory(root_object, item, DAD_CATEGORY);
 			if (rv < ACCEPT_YES_COPY_SINGLE)
 			{
 				LL_DEBUGS() << "Object will not accept " << item->getUUID() << LL_ENDL;
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index 766046785b6cd13ac7e0ddc0d45a4528faeb6f7a..2d99de224429c06ebc5ffdc33c5ba5fffa973eba 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -224,7 +224,7 @@ class LLToolDragAndDrop : public LLTool, public LLSingleton<LLToolDragAndDrop>
 	
 	// accessor that looks at permissions, copyability, and names of
 	// inventory items to determine if a drop would be ok.
-	static EAcceptance willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item);
+	static EAcceptance willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item, EDragAndDropType type = DAD_NONE);
 
 public:
 	// helper functions
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index 5623036b91c95dcf9028f2c9b59aa3ffaeec8456..f3e661e71a3007f574e4cd8ed463ee073d91bca2 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -477,39 +477,53 @@ void LLToolGrabBase::handleHoverActive(S32 x, S32 y, MASK mask)
 		return;
 	}
 
+	//--------------------------------------------------
+	// Determine target mode
+	//--------------------------------------------------
+	bool vertical_dragging = false;
+	bool spin_grabbing = false;
+	if ((mask == MASK_VERTICAL)
+		|| (gGrabBtnVertical && (mask != MASK_SPIN)))
+	{
+		vertical_dragging = TRUE;
+	}
+	else if ((mask == MASK_SPIN)
+			|| (gGrabBtnSpin && (mask != MASK_VERTICAL)))
+	{
+		spin_grabbing = TRUE;
+	}
+
 	//--------------------------------------------------
 	// Toggle spinning
 	//--------------------------------------------------
-	if (mSpinGrabbing && !(mask == MASK_SPIN) && !gGrabBtnSpin)
+	if (mSpinGrabbing && !spin_grabbing)
 	{
-		// user released ALT key, stop spinning
+		// user released or switched mask key(s), stop spinning
 		stopSpin();
 	}
-	else if (!mSpinGrabbing && (mask == MASK_SPIN) )
+	else if (!mSpinGrabbing && spin_grabbing)
 	{
-		// user pressed ALT key, start spinning
+		// user pressed mask key(s), start spinning
 		startSpin();
 	}
+	mSpinGrabbing = spin_grabbing;
 
 	//--------------------------------------------------
 	// Toggle vertical dragging
 	//--------------------------------------------------
-	if (mVerticalDragging && !(mask == MASK_VERTICAL) && !gGrabBtnVertical)
+	if (mVerticalDragging && !vertical_dragging)
 	{
 		// ...switch to horizontal dragging
-		mVerticalDragging = FALSE;
-
 		mDragStartPointGlobal = gViewerWindow->clickPointInWorldGlobal(x, y, objectp);
 		mDragStartFromCamera = mDragStartPointGlobal - gAgentCamera.getCameraPositionGlobal();
 	}
-	else if (!mVerticalDragging && (mask == MASK_VERTICAL) )
+	else if (!mVerticalDragging && vertical_dragging)
 	{
 		// ...switch to vertical dragging
-		mVerticalDragging = TRUE;
-
 		mDragStartPointGlobal = gViewerWindow->clickPointInWorldGlobal(x, y, objectp);
 		mDragStartFromCamera = mDragStartPointGlobal - gAgentCamera.getCameraPositionGlobal();
 	}
+	mVerticalDragging = vertical_dragging;
 
 	const F32 RADIANS_PER_PIXEL_X = 0.01f;
 	const F32 RADIANS_PER_PIXEL_Y = 0.01f;
@@ -755,12 +769,13 @@ void LLToolGrabBase::handleHoverNonPhysical(S32 x, S32 y, MASK mask)
 		//--------------------------------------------------
 		// Toggle vertical dragging
 		//--------------------------------------------------
-		if (mVerticalDragging && !(mask == MASK_VERTICAL) && !gGrabBtnVertical)
+		if (!(mask == MASK_VERTICAL) && !gGrabBtnVertical)
 		{
 			mVerticalDragging = FALSE;
 		}
 	
-		else if (!mVerticalDragging && (mask == MASK_VERTICAL) )
+		else if ((gGrabBtnVertical && (mask != MASK_SPIN)) 
+				|| (mask == MASK_VERTICAL))
 		{
 			mVerticalDragging = TRUE;
 		}
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 7c1921b14367ff919d4497752d676ae7a58e8881..66f5bf3c379da6ba20162ad0c00268a9e5f75a5f 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -208,6 +208,12 @@ static bool handleAnisotropicChanged(const LLSD& newvalue)
 	return true;
 }
 
+static bool handleForceLODChanged(const LLSD& newvalue)
+{
+	LLVOVolume::sForceLOD = (F32) newvalue.asReal();
+	return true;
+}
+
 static bool handleVolumeLODChanged(const LLSD& newvalue)
 {
 	LLVOVolume::sLODFactor = (F32) newvalue.asReal();
@@ -626,6 +632,7 @@ void settings_setup_listeners()
 	gSavedSettings.getControl("RenderAvatarCloth")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
 	gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
 	gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
+	gSavedSettings.getControl("RenderForceVolumeLOD")->getSignal()->connect(boost::bind(&handleForceLODChanged, _2));
 	gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2));
 	gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));
 	gSavedSettings.getControl("RenderAvatarPhysicsLODFactor")->getSignal()->connect(boost::bind(&handleAvatarPhysicsLODChanged, _2));
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index bf79a0595ce31e5862777bbf525137370919b9f8..da6b18bb7797a917f67c611e8a96c41505028f18 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -1463,6 +1463,10 @@ void remove_inventory_category(
 	LLPointer<LLViewerInventoryCategory> obj = gInventory.getCategory(cat_id);
 	if(obj)
 	{
+		if (!gInventory.isCategoryComplete(cat_id))
+		{
+			LL_WARNS() << "Removing (purging) incomplete category " << obj->getName() << LL_ENDL;
+		}
 		if(LLFolderType::lookupIsProtectedType(obj->getPreferredType()))
 		{
 			LLNotificationsUtil::add("CannotRemoveProtectedCategories");
@@ -1540,6 +1544,10 @@ void purge_descendents_of(const LLUUID& id, LLPointer<LLInventoryCallback> cb)
 		{
             if (AISAPI::isAvailable())
 			{
+				if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
+				{
+					LL_WARNS() << "Purging not fetched folder: " << cat->getName() << LL_ENDL;
+				}
                 AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t();
                 AISAPI::PurgeDescendents(id, cr);
 			}
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 9f05ee61bde4c3ddd0f52586842890ef8efc7be2..01b0dd0077b434cde7a9dc3b4c31dea42f51bc1f 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -3052,20 +3052,23 @@ void LLViewerMediaImpl::update()
 					data = mMediaSource->getBitsData();
 				}
 
-				// Offset the pixels pointer to match x_pos and y_pos
-				data += ( x_pos * mMediaSource->getTextureDepth() * mMediaSource->getBitsWidth() );
-				data += ( y_pos * mMediaSource->getTextureDepth() );
-
+				if(data != NULL)
 				{
-					LL_RECORD_BLOCK_TIME(FTM_MEDIA_SET_SUBIMAGE);
-					placeholder_image->setSubImage(
-							data,
-							mMediaSource->getBitsWidth(),
-							mMediaSource->getBitsHeight(),
-							x_pos,
-							y_pos,
-							width,
-							height);
+					// Offset the pixels pointer to match x_pos and y_pos
+					data += ( x_pos * mMediaSource->getTextureDepth() * mMediaSource->getBitsWidth() );
+					data += ( y_pos * mMediaSource->getTextureDepth() );
+
+					{
+						LL_RECORD_BLOCK_TIME(FTM_MEDIA_SET_SUBIMAGE);
+									placeholder_image->setSubImage(
+									data,
+									mMediaSource->getBitsWidth(),
+									mMediaSource->getBitsHeight(),
+									x_pos,
+									y_pos,
+									width,
+									height);
+					}
 				}
 
 			}
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index eddbe16482276d7ce5137270ad4848fd74ba2b13..f01c67e4992a930cb398bc2c9e50a9d20f478e19 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -1076,6 +1076,10 @@ U32 info_display_from_string(std::string info_display)
 	{
 		return LLPipeline::RENDER_DEBUG_TEXEL_DENSITY;
 	}
+	else if ("triangle count" == info_display)
+	{
+		return LLPipeline::RENDER_DEBUG_TRIANGLE_COUNT;
+	}
 	else
 	{
 		LL_WARNS() << "unrecognized feature name '" << info_display << "'" << LL_ENDL;
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index d46bb0199bf051945a0b7775f85b75a8cffaefa2..8d0c5af314f9c5eee7d7ba94fabad01fa1d7ab97 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -583,7 +583,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
 			formatted->enableOverSize() ;
 			formatted->encode(raw, 0);
 			formatted->disableOverSize() ;
-			gViewerWindow->saveImageNumbered(formatted);
+			LLSnapshotLivePreview::saveLocal(formatted);
 		}
 		return true;
 	}
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index ba4c63258668932054f032c35b014d119d7cb0f4..14846d898f8646feeb23901a7d9c3d42d7672f62 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1224,6 +1224,11 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
 		const LLUUID& obj_id = (*obj_iter);
 		if(!highlight_offered_object(obj_id))
 		{
+			const LLViewerInventoryCategory *parent = gInventory.getFirstNondefaultParent(obj_id);
+			if (parent && (parent->getPreferredType() == LLFolderType::FT_TRASH))
+			{
+				gInventory.checkTrashOverflow();
+			}
 			continue;
 		}
 
@@ -2838,6 +2843,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 	case IM_INVENTORY_ACCEPTED:
 	{
 		args["NAME"] = LLSLURL("agent", from_id, "completename").getSLURLString();;
+		args["ORIGINAL_NAME"] = original_name;
 		LLSD payload;
 		payload["from_id"] = from_id;
 		// Passing the "SESSION_NAME" to use it for IM notification logging
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 6abd6f7b643d63747c17c215e9b5903fb9617524..cd8dd54fa63128e2cfa79bfbf862e0bd6271a7de 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1462,9 +1462,17 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)
 	}
 
 	bool size_okay = true;
-	
-	U32 raw_width = mRawImage->getWidth() << mRawDiscardLevel;
-	U32 raw_height = mRawImage->getHeight() << mRawDiscardLevel;
+
+	S32 discard_level = mRawDiscardLevel;
+	if (mRawDiscardLevel < 0)
+	{
+		LL_DEBUGS() << "Negative raw discard level when creating image: " << mRawDiscardLevel << LL_ENDL;
+		discard_level = 0;
+	}
+
+	U32 raw_width = mRawImage->getWidth() << discard_level;
+	U32 raw_height = mRawImage->getHeight() << discard_level;
+
 	if( raw_width > MAX_IMAGE_SIZE || raw_height > MAX_IMAGE_SIZE )
 	{
 		LL_INFOS() << "Width or height is greater than " << MAX_IMAGE_SIZE << ": (" << raw_width << "," << raw_height << ")" << LL_ENDL;
@@ -2081,7 +2089,9 @@ bool LLViewerFetchedTexture::updateFetch()
 	{
 		make_request = false;
 	}
-	else if(mCachedRawImage.notNull() && (current_discard < 0 || current_discard > mCachedRawDiscardLevel))
+	else if(mCachedRawImage.notNull() // can be empty
+			&& mCachedRawImageReady
+			&& (current_discard < 0 || current_discard > mCachedRawDiscardLevel))
 	{
 		make_request = false;
 		switchToCachedImage(); //use the cached raw data first
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 2d3b48bab3206d6c9418fc1e197d81970c6ae51f..a2c5fa2630bd9f1b95f50681ccea755b5f2f1937 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -33,6 +33,7 @@
 #include <iostream>
 #include <fstream>
 #include <algorithm>
+#include <boost/filesystem.hpp>
 #include <boost/lambda/core.hpp>
 #include <boost/regex.hpp>
 
@@ -4353,8 +4354,10 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d
 }
 
 // Saves an image to the harddrive as "SnapshotX" where X >= 1.
-BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picker)
+BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, BOOL force_picker, BOOL& insufficient_memory)
 {
+	insufficient_memory = FALSE;
+
 	if (!image)
 	{
 		LL_WARNS() << "No image to save" << LL_ENDL;
@@ -4398,6 +4401,17 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picke
 		LLViewerWindow::sSnapshotDir = gDirUtilp->getDirName(filepath);
 	}
 
+// Check if there is enough free space to save snapshot
+#ifdef LL_WINDOWS
+	boost::filesystem::space_info b_space = boost::filesystem::space(utf8str_to_utf16str(sSnapshotDir));
+#else
+	boost::filesystem::space_info b_space = boost::filesystem::space(sSnapshotDir);
+#endif
+	if (b_space.free < image->getDataSize())
+	{
+		insufficient_memory = TRUE;
+		return FALSE;
+	}
 	// Look for an unused file name
 	std::string filepath;
 	S32 i = 1;
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index a134dfaaa98342aaacfc52009e10bc90a33fbd9b..38178fa910014d5ef92bd1affb73dcd2d329dc64 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -352,7 +352,7 @@ class LLViewerWindow : public LLWindowCallbacks
 	BOOL			thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, LLSnapshotModel::ESnapshotLayerType type);
 	BOOL			isSnapshotLocSet() const { return ! sSnapshotDir.empty(); }
 	void			resetSnapshotLoc() const { sSnapshotDir.clear(); }
-	BOOL		    saveImageNumbered(LLImageFormatted *image, bool force_picker = false);
+	BOOL			saveImageNumbered(LLImageFormatted *image, BOOL force_picker, BOOL& insufficient_memory);
 
 	// Reset the directory where snapshots are saved.
 	// Client will open directory picker on next snapshot save.
@@ -419,6 +419,7 @@ class LLViewerWindow : public LLWindowCallbacks
 
 	bool getSystemUIScaleFactorChanged() { return mSystemUIScaleFactorChanged; }
 	static void showSystemUIScaleFactorChanged();
+	static std::string getLastSnapshotDir() { return sSnapshotDir; }
 
 private:
 	bool                    shouldShowToolTipFor(LLMouseHandler *mh);
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 2137bf4eb3dfbb6b7d020996a83656f58b58abce..658000987b08ae78c98567cadea99beed858321d 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -2246,7 +2246,9 @@ bool LLVOAvatarSelf::updateAvatarRezMetrics(bool force_send)
 {
 	const F32 AV_METRICS_INTERVAL_QA = 30.0;
 	F32 send_period = 300.0;
-	if (gSavedSettings.getBOOL("QAModeMetrics"))
+
+	static LLCachedControl<bool> qa_mode_metrics(gSavedSettings,"QAModeMetrics");
+	if (qa_mode_metrics)
 	{
 		send_period = AV_METRICS_INTERVAL_QA;
 	}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index bdd0cb0984849ddc67db911fcf967fd0635a2176..403bff5a9e0a7a9544bbf412f28c1d6effa7b782 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -91,6 +91,8 @@ U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG = 1;
 BOOL gAnimateTextures = TRUE;
 //extern BOOL gHideSelectedObjects;
 
+// AXON TEMP
+S32 LLVOVolume::sForceLOD = -1;
 F32 LLVOVolume::sLODFactor = 1.f;
 F32	LLVOVolume::sLODSlopDistanceFactor = 0.5f; //Changing this to zero, effectively disables the LOD transition slop 
 F32 LLVOVolume::sDistanceFactor = 1.0f;
@@ -1222,16 +1224,24 @@ void LLVOVolume::sculpt()
 S32	LLVOVolume::computeLODDetail(F32 distance, F32 radius)
 {
 	S32	cur_detail;
-	if (LLPipeline::sDynamicLOD)
-	{
-		// We've got LOD in the profile, and in the twist.  Use radius.
-		F32 tan_angle = (LLVOVolume::sLODFactor*radius)/distance;
-		cur_detail = LLVolumeLODGroup::getDetailFromTan(ll_round(tan_angle, 0.01f));
-	}
-	else
-	{
-		cur_detail = llclamp((S32) (sqrtf(radius)*LLVOVolume::sLODFactor*4.f), 0, 3);		
-	}
+    // AXON TEMP
+    if (LLVOVolume::sForceLOD>=0 && LLVOVolume::sForceLOD<=3)
+    {
+        cur_detail = LLVOVolume::sForceLOD;
+    }
+    else
+    {
+        if (LLPipeline::sDynamicLOD)
+        {
+            // We've got LOD in the profile, and in the twist.  Use radius.
+            F32 tan_angle = (LLVOVolume::sLODFactor*radius)/distance;
+            cur_detail = LLVolumeLODGroup::getDetailFromTan(ll_round(tan_angle, 0.01f));
+        }
+        else
+        {
+            cur_detail = llclamp((S32) (sqrtf(radius)*LLVOVolume::sLODFactor*4.f), 0, 3);		
+        }
+    }
 	return cur_detail;
 }
 
@@ -1285,15 +1295,38 @@ BOOL LLVOVolume::calcLOD()
 	distance *= F_PI/3.f;
 
 	cur_detail = computeLODDetail(ll_round(distance, 0.01f), 
-									ll_round(radius, 0.01f));
+                                  ll_round(radius, 0.01f));
 
 
+    if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TRIANGLE_COUNT) && mDrawable->getFace(0))
+    {
+        if (isRootEdit() && getChildren().size()>0)
+        {
+            S32 total_tris = getTriangleCount();
+            LLViewerObject::const_child_list_t& child_list = getChildren();
+            for (LLViewerObject::const_child_list_t::const_iterator iter = child_list.begin();
+                 iter != child_list.end(); ++iter)
+            {
+                LLViewerObject* childp = *iter;
+                LLVOVolume *child_volp = dynamic_cast<LLVOVolume*>(childp);
+                if (child_volp)
+                {
+                    total_tris += child_volp->getTriangleCount();
+                }
+            }
+            setDebugText(llformat("TRIS %d TOTAL %d", getTriangleCount(), total_tris));
+        }
+        else
+        {
+            setDebugText(llformat("TRIS %d", getTriangleCount()));
+        }
+	
+    }
 	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO) &&
 		mDrawable->getFace(0))
 	{
-		//setDebugText(llformat("%.2f:%.2f, %d", mDrawable->mDistanceWRTCamera, radius, cur_detail));
-
-		setDebugText(llformat("%d", mDrawable->getFace(0)->getTextureIndex()));
+        // This is a debug display for LODs. Please don't put the texture index here.
+        setDebugText(llformat("%d", cur_detail));
 	}
 
 	if (cur_detail != mLOD)
@@ -4993,7 +5026,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 			bool is_rigged = false;
 
             // AXON handle NPC case
-            if (rigged && pAvatarVO)
+            if (rigged && pAvatarVO && !vobj->isAnimatedObject())
             {
                 pAvatarVO->addAttachmentOverridesForObject(vobj);
 				if (!LLApp::isExiting() && pAvatarVO->isSelf() && debugLoggingEnabled("AvatarAttachments"))
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 44d9c65b4bf3763bef6df79f5ff767cdbd1b418d..c972d7770e172b92554f43487d648409a14212b6 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -395,6 +395,7 @@ class LLVOVolume : public LLViewerObject
 public:
 	static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop
 	static F32 sLODFactor;				// LOD scale factor
+	static S32 sForceLOD;				// LOD override
 	static F32 sDistanceFactor;			// LOD distance factor
 
 	static LLPointer<LLObjectMediaDataClient> sObjectMediaClient;
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index bba36351d9f374e9d18fd4f82a0fcd2f78493ac5..4cc4b821bfb85ab60215f0a244ef72f1cb05be63 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -513,11 +513,11 @@ class LLPipeline
 		RENDER_DEBUG_TEXTURE_AREA		= 0x00000100,
 		RENDER_DEBUG_FACE_AREA			= 0x00000200,
 		RENDER_DEBUG_PARTICLES			= 0x00000400,
-		RENDER_DEBUG_GLOW				= 0x00000800,
+		RENDER_DEBUG_GLOW				= 0x00000800, // not used
 		RENDER_DEBUG_TEXTURE_ANIM		= 0x00001000,
 		RENDER_DEBUG_LIGHTS				= 0x00002000,
 		RENDER_DEBUG_BATCH_SIZE			= 0x00004000,
-		RENDER_DEBUG_ALPHA_BINS			= 0x00008000,
+		RENDER_DEBUG_ALPHA_BINS			= 0x00008000, // not used
 		RENDER_DEBUG_RAYCAST            = 0x00010000,
 		RENDER_DEBUG_AVATAR_DRAW_INFO	= 0x00020000,
 		RENDER_DEBUG_SHADOW_FRUSTA		= 0x00040000,
@@ -531,8 +531,9 @@ class LLPipeline
 		RENDER_DEBUG_NORMALS	        = 0x04000000,
 		RENDER_DEBUG_LOD_INFO	        = 0x08000000,
 		RENDER_DEBUG_RENDER_COMPLEXITY  = 0x10000000,
-		RENDER_DEBUG_ATTACHMENT_BYTES	= 0x20000000,
-		RENDER_DEBUG_TEXEL_DENSITY		= 0x40000000
+		RENDER_DEBUG_ATTACHMENT_BYTES	= 0x20000000, // not used
+		RENDER_DEBUG_TEXEL_DENSITY		= 0x40000000,
+		RENDER_DEBUG_TRIANGLE_COUNT		= 0x80000000 
 	};
 
 public:
diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml
index 612c894b590c67f91676036b8497ad22d424d532..e3b49bf9179cacc1715174ab68d555e82272caed 100644
--- a/indra/newview/skins/default/xui/en/floater_tos.xml
+++ b/indra/newview/skins/default/xui/en/floater_tos.xml
@@ -15,59 +15,31 @@
      name="loading_url">
         data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
     </floater.string>
-    <button
-     enabled="false"
-     height="20"
-     label="Continue"
-     label_selected="Continue"
-     layout="topleft"
-     left="484"
-     name="Continue"
-     top="464"
-     width="100" />
-    <button
-     height="20"
-     label="Cancel"
-     label_selected="Cancel"
-     layout="topleft"
-     left_delta="-468"
-     name="Cancel"
-     top_delta="0"
-     width="100" />
-    <check_box
-     follows="top|right"
-     height="16"
-     label="I Agree to the Terms of Service and Privacy Policy"
-     layout="topleft"
-     left_delta="0"
-     name="agree_chk"
-     top_delta="-45"
-     width="55" />
     <text
      type="string"
      length="1"
      follows="left|top"
      font="SansSerif"
-     height="30"
+     height="45"
      layout="topleft"
-     left_delta="0"
+     left="20"
      name="tos_heading"
-     top_delta="-399"
+     top="20"
      word_wrap="true"
      width="552">
-        Please read the following Terms of Service and Privacy Policy carefully. To continue logging in to [SECOND_LIFE], you must accept the agreement.
+        Please read the following Second Life Terms and Conditions, Privacy Policy, and Terms of Service, including the requirements for the use of arbitration and the waiver of any class or group claim to resolve disputes. To continue logging in to [SECOND_LIFE], you must accept these agreements.
     </text>
-     <text
+    <text
      type="string"
      length="1"
      follows="left|top"
      font="SansSerif"
      height="30"
      layout="topleft"
-     left="16"
+     left="20"
      name="external_tos_required"
      visible="false"
-     top="32"
+     top="20"
      word_wrap="true"
      width="552">
        You will need to go to https://my.secondlife.com and log in to accept the Terms of Service before you can proceed. Thank you!
@@ -75,10 +47,52 @@
     <web_browser
       trusted_content="true" 
      follows="left|top"
-     height="340"
+     height="305"
      layout="topleft"
      left_delta="0"
      name="tos_html"
-     top_delta="40"
+     top_delta="70"
      width="568" />
+    <check_box
+     follows="top|left"
+     font="SansSerif"
+     height="16"
+     label="I have read and agree to"
+     layout="topleft"
+     left_delta="0"
+     name="agree_chk"
+     top_delta="320"
+     width="55" />
+    <text
+     type="string"
+     length="1"
+     follows="left|top"
+     font="SansSerif"
+     height="30"
+     layout="topleft"
+     left_delta="20"
+     name="agree_list"
+     top_delta="15"
+     word_wrap="true"
+     width="552">the Second Life Terms and Conditions, Privacy Policy, and Terms of Service, including the dispute resolution requirements. 
+    </text>
+    <button
+     enabled="false"
+     height="20"
+     label="Continue"
+     label_selected="Continue"
+     layout="topleft"
+     left="484"
+     name="Continue"
+     top_delta="35"
+     width="100" />
+    <button
+     height="20"
+     label="Cancel"
+     label_selected="Cancel"
+     layout="topleft"
+     left_delta="-468"
+     name="Cancel"
+     top_delta="0"
+     width="100" />
 </floater>
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 410caa72908b2d8225f23a11300c259f9ff962a6..05ab4d35a0de1db0a1558565da38473b3c3f9ca3 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu
+<toggleable_menu
  height="101"
  layout="topleft"
  left="100"
@@ -109,5 +109,43 @@
      name="Mute Text">
        <on_click function="AvatarIcon.Action" parameter="mute_unmute" />
        <on_check function="AvatarIcon.Check" parameter="is_muted" />   
-  </menu_item_check>
-</menu>
+    </menu_item_check>
+    <menu_item_separator layout="topleft" name="Moderator Options Separator"/>
+    <context_menu
+     label="Moderator Options"
+     layout="topleft"
+     name="Moderator Options">
+      <menu_item_check
+       label="Allow text chat"
+       layout="topleft"
+       name="AllowTextChat">
+        <on_check function="AvatarIcon.Check" parameter="is_allowed_text_chat" />
+        <on_click function="AvatarIcon.Action" parameter="toggle_allow_text_chat" />
+        <on_enable function="AvatarIcon.Enable" parameter="can_allow_text_chat" />
+      </menu_item_check>
+      <menu_item_call
+       label="Mute this participant"
+       layout="topleft"
+       name="ModerateVoiceMuteSelected">
+        <on_click function="AvatarIcon.Action" parameter="group_mute" />
+        <on_enable function="AvatarIcon.Enable" parameter="can_mute" />
+        <on_visible function="AvatarIcon.Visible" parameter="show_mute" />
+      </menu_item_call>
+      <menu_item_call
+       label="Unmute this participant"
+       layout="topleft"
+       name="ModerateVoiceUnMuteSelected">
+        <on_click function="AvatarIcon.Action" parameter="group_unmute" />
+        <on_enable function="AvatarIcon.Enable" parameter="can_unmute" />
+        <on_visible function="AvatarIcon.Visible" parameter="show_unmute" />
+      </menu_item_call>
+    </context_menu>
+    <menu_item_separator layout="topleft" name="Group Ban Separator"/>
+    <menu_item_call
+     label="Ban member"
+     layout="topleft"
+     name="BanMember">
+      <on_click function="AvatarIcon.Action" parameter="ban_member" />
+      <on_enable function="AvatarIcon.Enable" parameter="can_ban_member" />
+    </menu_item_call>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 697d27907da6a8e03e020876bed8b4954a8b02ef..f8b494869761b024f1425f9d4372508ee08efa2d 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2653,6 +2653,16 @@
            function="Advanced.ToggleInfoDisplay"
            parameter="lod info" />
         </menu_item_check>
+        <menu_item_check
+         label="Triangle Count"
+         name="Triangle Count">
+          <menu_item_check.on_check
+           function="Advanced.CheckInfoDisplay"
+           parameter="triangle count" />
+          <menu_item_check.on_click
+           function="Advanced.ToggleInfoDisplay"
+           parameter="triangle count" />
+        </menu_item_check>
         <menu_item_check
          label="Build Queue"
          name="Build Queue">
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 8620c09f9a3be14467bfd484c8930649226b42d4..e21674a085e0daca02f84ee63733d63ab26f871f 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4,6 +4,11 @@
 		Don&apos;t show me this again
   </global>
 
+  <global name="skipnexttimesessiononly">
+Don&apos;t show me this again
+(for current session)
+  </global>
+
   <global name="alwayschoose">
 
 		Always choose this option
@@ -869,7 +874,7 @@ Do you wish to proceed?
    icon="alertmodal.tga"
    name="JoinGroupNoCost"
    type="alertmodal">
-You are joining group [NAME].
+You are joining group &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
 Do you wish to proceed?
     <tag>group</tag>
     <tag>confirm</tag>
@@ -960,7 +965,7 @@ Sorry, trial users can't join groups.
    icon="alertmodal.tga"
    name="JoinGroupMaxGroups"
    type="alertmodal">
-You cannot join '[group_name]':
+You cannot join &apos;&lt;nolink&gt;[group_name]&lt;/nolink&gt;&apos;:
 You are already a member of [group_count] groups, the maximum number allowed is [max_groups]
     <tag>success</tag>
     <tag>group_id</tag>
@@ -976,7 +981,7 @@ You are already a member of [group_count] groups, the maximum number allowed is
    icon="alertmodal.tga"
    name="JoinGroupClosedEnrollment"
    type="alertmodal">
-You cannot join '[group_name]':
+You cannot join &apos;&lt;nolink&gt;[group_name]&lt;/nolink&gt;&apos;:
 The group no longer has open enrollment.
     <tag>group_id</tag>
     <tag>success</tag>
@@ -1065,7 +1070,7 @@ Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NA
    icon="alertmodal.tga"
    name="ReturnObjectsDeededToGroup"
    type="alertmodal">
-Are you sure you want to return all objects shared with the group &apos;[NAME]&apos; on this parcel of land back to their previous owner&apos;s inventory?
+Are you sure you want to return all objects shared with the group &apos;&lt;nolink&gt;[NAME]&lt;/nolink&gt;&apos; on this parcel of land back to their previous owner&apos;s inventory?
 
 *WARNING* This will delete the non-transferable objects deeded to the group!
 
@@ -1168,7 +1173,7 @@ Are you sure you want to disable all objects in this region?
    icon="alertmodal.tga"
    name="ReturnObjectsNotOwnedByGroup"
    type="alertmodal">
-Return the objects on this parcel of land that are NOT shared with the group [NAME] back to their owners?
+Return the objects on this parcel of land that are NOT shared with the group &lt;nolink&gt;[NAME]&lt;/nolink&gt; back to their owners?
 
 Objects: [N]
     <tag>confirm</tag>
@@ -1293,7 +1298,7 @@ There was a problem uploading a report screenshot due to the following reason: [
    name="MustAgreeToLogIn"
    type="alertmodal">
    <tag>fail</tag>
-You must agree to the Terms of Service to continue logging into [SECOND_LIFE].
+You must agree to the Second Life Terms and Conditions, Privacy Policy, and Terms of Service to continue logging into [SECOND_LIFE].
   </notification>
 
   <notification
@@ -1956,7 +1961,7 @@ Eject [AVATAR_NAME] from your land?
    name="EjectAvatarFromGroup"
    persist="true"
    type="notify">
-You ejected [AVATAR_NAME] from group [GROUP_NAME]
+You ejected [AVATAR_NAME] from group &lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;
     <tag>group</tag>
   </notification>
 
@@ -3331,7 +3336,7 @@ Please select a smaller area and try again.
 By deeding this parcel, the group will be required to have and maintain sufficient land use credits.
 The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
 
-Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
+Deed this [AREA] m² of land to the group &apos;&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;&apos;?
     <tag>group</tag>
     <tag>confirm</tag>
     <usetemplate
@@ -3348,7 +3353,7 @@ By deeding this parcel, the group will be required to have and maintain sufficie
 The deed will include a simultaneous land contribution to the group from &apos;[NAME]&apos;.
 The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
 
-Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
+Deed this [AREA] m² of land to the group &apos;&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;&apos;?
     <tag>group</tag>
     <tag>confirm</tag>
     <usetemplate
@@ -4324,7 +4329,7 @@ Leave Group?
    icon="notify.tga"
    name="GroupDepart"
    type="notify">
-You have left the group &apos;[group_name]&apos;.
+You have left the group &apos;&lt;nolink&gt;[group_name]&lt;/nolink&gt;&apos;.
     <tag>group</tag>
   </notification>
 
@@ -6003,9 +6008,34 @@ You cannot undo this action.
    type="alertmodal">
     <unique/>
     [QUESTION]
+    <tag>confirm</tag>
+    <form name="form">
+     <ignore name="ignore"
+      session_only="true"
+      text="Confirm before deleting items"/>
+      <button
+       default="true"
+       index="0"
+       name="Yes"
+       text="OK"/>
+      <button
+       index="1"
+       name="No"
+       text="Cancel"/>
+    </form>
+  </notification>
+
+  <notification
+   icon="alertmodal.tga"
+   name="DeleteFilteredItems"
+   type="alertmodal">
+    <unique/>
+    Your inventory is currently filtered and not all of the items you're about to delete are currently visible.
+
+Are you sure you want to delete them?
     <tag>confirm</tag>
     <usetemplate
-     ignoretext="Confirm before deleting items"
+     ignoretext="Confirm before deleting filtered items"
      name="okcancelignore"
      notext="Cancel"
      yestext="OK"/>
@@ -7039,7 +7069,7 @@ The objects on the selected parcel of land owned by the Resident &apos;[NAME]&ap
    name="GroupObjectsReturned"
    persist="true"
    type="notify">
-The objects on the selected parcel of land shared with the group [GROUPNAME] have been returned back to their owner&apos;s inventory.
+The objects on the selected parcel of land shared with the group &lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt; have been returned back to their owner&apos;s inventory.
 Transferable deeded objects have been returned to their previous owners.
 Non-transferable objects that are deeded to the group have been deleted.
     <tag>group</tag>
@@ -7527,6 +7557,7 @@ Your object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; has given you th
    name="TeleportOffered"
    log_to_im="true"
    log_to_chat="false"
+   fade_toast="false"
    type="offer"
    sound="UISndNewIncomingIMSession">
 [NAME_SLURL] has offered to teleport you to their location:
@@ -7602,6 +7633,7 @@ However, this region contains content accessible to adults only.
    icon="notify.tga"
    name="TeleportRequest"
    log_to_im="true"
+   fade_toast="false"
    type="offer">
 [NAME_SLURL] is requesting to be teleported to your location.
 [MESSAGE]
@@ -7958,6 +7990,7 @@ Other Key Experiences may be available.
    icon="notify.tga"
    name="ScriptQuestionExperience"
    persist="false"
+   fade_toast="false"
    type="notify">
 &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, an object owned by &apos;[NAME]&apos;, requests your participation in the [GRID_WIDE] experience:
 
@@ -8067,7 +8100,7 @@ To grant this permission please update your viewer to the latest version from [D
    show_toast="false"
    type="notify">
     <tag>group</tag>
-[GROUPNAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+&lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt;&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
 [MESSAGE]
     <form name="form">
       <button
@@ -8198,7 +8231,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
    icon="notify.tga"
    name="VoiceInviteGroup"
    type="notify">
-[NAME] has joined a Voice Chat call with the group [GROUP].
+[NAME] has joined a Voice Chat call with the group &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
 Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
     <tag>group</tag>
     <tag>confirm</tag>
@@ -8530,6 +8563,11 @@ Appearance has been saved to XML to [PATH]
 Failed to save appearance to XML.
   </notification>
 
+  <notification icon="notifytip.tga"
+    name="SnapshotToComputerFailed" type="notifytip">
+Failed to save snapshot to [PATH]: Disk is full. [NEED_MEMORY]KB is required but only [FREE_MEMORY]KB is free.
+  </notification>
+
   <notification
     icon="notifytip.tga"
     name="PresetNotSaved"
diff --git a/indra/newview/skins/default/xui/en/role_actions.xml b/indra/newview/skins/default/xui/en/role_actions.xml
index 4d20ecb9b6b2e9ce0808c29ff075649c6687b06b..8d058b0b539c5fd5c25d0ab2f9724c97c99a63e8 100644
--- a/indra/newview/skins/default/xui/en/role_actions.xml
+++ b/indra/newview/skins/default/xui/en/role_actions.xml
@@ -105,6 +105,9 @@
 		<action description="Always allow &apos;Create Objects&apos;"
 		     longdescription="Members in a Role with this Ability can create objects on a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab."
 		     name="land allow create" value="25" />
+		<action description="Ignore landing point"
+		     longdescription="Members in a Role with this Ability can direct teleport to a group-owned parcel, even if a landing point is set in About Land &gt; Options tab."
+		     name="land allow direct teleport" value="26" />
 		<action description="Allow &apos;Set Home to Here&apos; on group land"
 		     longdescription="Members in a Role with this Ability can use World menu &gt; Landmarks &gt; Set Home to Here on a parcel deeded to this group."
 		     name="land allow set home" value="28" />
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index c9be141427990d67aa5625174fb614511193dac6..439560031e69bd71967d54a4e9dec8dd37316717 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -150,8 +150,7 @@ support@secondlife.com.</string>
 	<string name="LoginFailedAcountSuspended">Your account is not accessible until
 [TIME] Pacific Time.</string>
 	<string name="LoginFailedAccountDisabled">We are unable to complete your request at this time.
-Please contact Second Life support for assistance at http://secondlife.com/support.
-If you are unable to change your password, please call (866) 476-9763.</string>
+Please contact Second Life support for assistance at http://support.secondlife.com.</string>
 	<string name="LoginFailedTransformError">Data inconsistency found during login.
 Please contact support@secondlife.com.</string>
 	<string name="LoginFailedAccountMaintenance">Your account is undergoing minor maintenance.
diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp
index b603157ca75d67ba27f17d6bc9c3304a08a759dc..978678a09cf539b8c73d4f2d88892ac7ec89a6a9 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -362,7 +362,7 @@ namespace tut
 			accountCredential->setCredentialData(identifier, authenticator);			
 
 			logininstance->setNotificationsInterface(&notifications);
-			logininstance->setPlatformInfo("win", "1.3.5");
+			logininstance->setPlatformInfo("win", "1.3.5", "Windows Bogus Version 100.6.6.6");
 		}
 
 		LLLoginInstance* logininstance;
@@ -478,109 +478,4 @@ namespace tut
 		ensure_equals("Default for agree to tos", gLoginCreds["params"]["read_critical"].asBoolean(), false);
 	}
 
-    template<> template<>
-    void lllogininstance_object::test<3>()
-    {
-		set_test_name("Test Mandatory Update User Accepts");
-
-		// Part 1 - Mandatory Update, with User accepts response.
-		// Test connect with update needed.
-		logininstance->connect(agentCredential);
-
-		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
-
-		// Update needed failure response.
-		LLSD response;
-		response["state"] = "offline";
-		response["change"] = "fail.login";
-		response["progress"] = 0.0;
-		response["transfer_rate"] = 7;
-		response["data"]["reason"] = "update";
-		gTestPump.post(response);
-
-		ensure_equals("Notification added", notifications.addedCount(), 1);
-
-		notifications.sendYesResponse();
-
-		ensure("Disconnected", !(logininstance->authSuccess()));
-	}
-
-	template<> template<>
-    void lllogininstance_object::test<4>()
-    {
-		set_test_name("Test Mandatory Update User Decline");
-
-		// Test connect with update needed.
-		logininstance->connect(agentCredential);
-
-		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
-
-		// Update needed failure response.
-		LLSD response;
-		response["state"] = "offline";
-		response["change"] = "fail.login";
-		response["progress"] = 0.0;
-		response["transfer_rate"] = 7;
-		response["data"]["reason"] = "update";
-		gTestPump.post(response);
-
-		ensure_equals("Notification added", notifications.addedCount(), 1);
-		notifications.sendNoResponse();
-
-		ensure("Disconnected", !(logininstance->authSuccess()));
-	}
-
-	template<> template<>
-    void lllogininstance_object::test<6>()
-    {
-		set_test_name("Test Optional Update User Accept");
-
-		// Part 3 - Mandatory Update, with bogus response.
-		// Test connect with update needed.
-		logininstance->connect(agentCredential);
-
-		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
-
-		// Update needed failure response.
-		LLSD response;
-		response["state"] = "offline";
-		response["change"] = "fail.login";
-		response["progress"] = 0.0;
-		response["transfer_rate"] = 7;
-		response["data"]["reason"] = "optional";
-		gTestPump.post(response);
-
-		ensure_equals("Notification added", notifications.addedCount(), 1);
-		notifications.sendYesResponse();
-
-		ensure("Disconnected", !(logininstance->authSuccess()));
-	}
-
-	template<> template<>
-    void lllogininstance_object::test<7>()
-    {
-		set_test_name("Test Optional Update User Denies");
-
-		// Part 3 - Mandatory Update, with bogus response.
-		// Test connect with update needed.
-		logininstance->connect(agentCredential);
-
-		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
-
-		// Update needed failure response.
-		LLSD response;
-		response["state"] = "offline";
-		response["change"] = "fail.login";
-		response["progress"] = 0.0;
-		response["transfer_rate"] = 7;
-		response["data"]["reason"] = "optional";
-		gTestPump.post(response);
-
-		ensure_equals("Notification added", notifications.addedCount(), 1);
-		notifications.sendNoResponse();
-
-		// User skips, should be reconnecting.
-		ensure_equals("reconnect uri", gLoginURI, VIEWERLOGIN_URI); 
-		ensure_equals("skipping optional update", gLoginCreds["params"]["skipoptional"].asBoolean(), true); 
-	}
 }