diff --git a/indra/cmake/TemplateCheck.cmake b/indra/cmake/TemplateCheck.cmake
index 3b73dc82dfcf3fe538d4e6ae230c2b199278f77c..fa4e387dd5c60aac177fb36fa3bfc1ddc0ed2b75 100644
--- a/indra/cmake/TemplateCheck.cmake
+++ b/indra/cmake/TemplateCheck.cmake
@@ -5,7 +5,7 @@ include(Python)
 macro (check_message_template _target)
   add_custom_command(
       TARGET ${_target}
-      PRE_LINK
+      POST_BUILD
       COMMAND ${PYTHON_EXECUTABLE}
       ARGS ${SCRIPTS_DIR}/template_verifier.py
            --mode=development --cache_master
diff --git a/indra/llcharacter/llkeyframemotion.h b/indra/llcharacter/llkeyframemotion.h
index 7e8c84488c087017697bd640f07be3827c503204..50d9d0504616ed9ab5237f7f89d0fd761525cf5d 100644
--- a/indra/llcharacter/llkeyframemotion.h
+++ b/indra/llcharacter/llkeyframemotion.h
@@ -47,7 +47,6 @@
 #include "llquaternion.h"
 #include "v3dmath.h"
 #include "v3math.h"
-#include "llapr.h"
 #include "llbvhconsts.h"
 
 class LLKeyframeDataCache;
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index 1a052ce62d6c316722e6fbda471f7c03aa2427de..27a52cdd9972a7fb60ce4049fae66b2ab20bb839 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -34,14 +34,18 @@
 #define LL_LLAPP_H
 
 #include <map>
-#include "llapr.h"
 #include "llrun.h"
 #include "llsd.h"
 #include "lloptioninterface.h"
 
 // Forward declarations
+template <typename Type> class LLAtomic32;
+typedef LLAtomic32<U32> LLAtomicU32;
 class LLErrorThread;
 class LLLiveFile;
+#if LL_LINUX
+typedef struct siginfo siginfo_t;
+#endif
 
 typedef void (*LLAppErrorHandler)();
 typedef void (*LLAppChildCallback)(int pid, bool exited, int status);
@@ -202,8 +206,6 @@ public:
 #if !LL_WINDOWS
 	static U32  getSigChildCount();
 	static void incSigChildCount();
-#else
-#define getpid GetCurrentProcessId
 #endif
 	static int getPid();
 
diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h
index b08bb617c5778bffe706e8a54b0bfcdb5e10bab4..b05a222b33380e83a8e2452824fe6ddb7afcf106 100644
--- a/indra/llcommon/llapr.h
+++ b/indra/llcommon/llapr.h
@@ -38,6 +38,14 @@
 #if LL_LINUX || LL_SOLARIS
 #include <sys/param.h>  // Need PATH_MAX in APR headers...
 #endif
+#if LL_WINDOWS
+	// Limit Windows API to small and manageable set.
+	// If you get undefined symbols, find the appropriate
+	// Windows header file and include that in your .cpp file.
+	#define WIN32_LEAN_AND_MEAN
+	#include <winsock2.h>
+	#include <windows.h>
+#endif
 
 #include <boost/noncopyable.hpp>
 
diff --git a/indra/llcommon/llcommon.h b/indra/llcommon/llcommon.h
index b36471f9f81cac843b35140ab7df4d1c0dd1c0f5..05eef25b21657a5eaf0f29bae4f6b5c5e56b4fb5 100644
--- a/indra/llcommon/llcommon.h
+++ b/indra/llcommon/llcommon.h
@@ -33,7 +33,6 @@
 #define LL_COMMON_H
 
 // *TODO: remove these?
-#include "llapr.h"
 #include "lltimer.h"
 #include "llfile.h"
 
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index 77c0c2294a46f4e673981815bdcdb4bd54e56b85..bd334a66548ab379a22e86c73843ca1be9069d89 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -45,9 +45,6 @@
 # include <syslog.h>
 # include <unistd.h>
 #endif // !LL_WINDOWS
-#if LL_WINDOWS
-# include <windows.h>
-#endif // LL_WINDOWS
 #include <vector>
 
 #include "llapp.h"
diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp
index eacbbb3ee0bd793b5ee6ae993ad13cc02f194e9c..06ceeb2bc3cb6ef230f73f44d6c716d8e380804e 100644
--- a/indra/llcommon/llqueuedthread.cpp
+++ b/indra/llcommon/llqueuedthread.cpp
@@ -437,6 +437,7 @@ S32 LLQueuedThread::processNextRequest()
 	if (req)
 	{
 		// process request
+		U32 start_priority = req->getPriority();
 		bool complete = req->processRequest();
 
 		if (complete)
@@ -457,9 +458,8 @@ S32 LLQueuedThread::processNextRequest()
 			lockData();
 			req->setStatus(STATUS_QUEUED);
 			mRequestQueue.insert(req);
-			U32 priority = req->getPriority();
 			unlockData();
-			if (priority < PRIORITY_NORMAL)
+			if (mThreaded && start_priority <= PRIORITY_LOW)
 			{
 				ms_sleep(1); // sleep the thread a little
 			}
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index 72c39f2e93c1123c26fc8795f40a754d1bdc3c96..f8c7efa7cc8a622e412f65fb4d52696324757f16 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -34,6 +34,7 @@
 #define LL_LLTHREAD_H
 
 #include "llapp.h"
+#include "llapr.h"
 #include "apr_thread_cond.h"
 
 class LLThread;
diff --git a/indra/llmessage/lliohttpserver.h b/indra/llmessage/lliohttpserver.h
index d1c9bdde856756238f5863b6eaa251485ba4783e..e8e390f296ec83a190e5642b980ab600b10ab44e 100644
--- a/indra/llmessage/lliohttpserver.h
+++ b/indra/llmessage/lliohttpserver.h
@@ -34,7 +34,6 @@
 #ifndef LL_LLIOHTTPSERVER_H
 #define LL_LLIOHTTPSERVER_H
 
-#include "llapr.h"
 #include "llchainio.h"
 #include "llhttpnode.h"
 
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index f60838b1e733c83d6637f288a0f80c2195649da7..49f97838241ec23fdad7ffed413919371d04388d 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -39,12 +39,6 @@
 
 #include "llapr.h"
 
-// If we don't receive a heartbeat in this many seconds, we declare the plugin locked up.
-static const F32 PLUGIN_LOCKED_UP_SECONDS = 15.0f;
-
-// Somewhat longer timeout for initial launch.
-static const F32 PLUGIN_LAUNCH_SECONDS = 20.0f;
-
 //virtual 
 LLPluginProcessParentOwner::~LLPluginProcessParentOwner()
 {
@@ -59,10 +53,11 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner)
 	mDisableTimeout = false;
 	mDebug = false;
 
-	// initialize timer - heartbeat test (mHeartbeat.hasExpired()) 
-	// can sometimes return true immediately otherwise and plugins 
-	// fail immediately because it looks like 
-	mHeartbeat.setTimerExpirySec(PLUGIN_LOCKED_UP_SECONDS);
+	mPluginLaunchTimeout = 60.0f;
+	mPluginLockupTimeout = 15.0f;
+	
+	// Don't start the timer here -- start it when we actually launch the plugin process.
+	mHeartbeat.stop();
 }
 
 LLPluginProcessParent::~LLPluginProcessParent()
@@ -79,8 +74,10 @@ LLPluginProcessParent::~LLPluginProcessParent()
 		// and remove it from our map
 		mSharedMemoryRegions.erase(iter);
 	}
-
-	mProcess.kill();
+	
+	// orphaning the process means it won't be killed when the LLProcessLauncher is destructed.
+	// This is what we want -- it should exit cleanly once it notices the sockets have been closed.
+	mProcess.orphan();
 	killSockets();
 }
 
@@ -323,7 +320,7 @@ void LLPluginProcessParent::idle(void)
 					
 					// This will allow us to time out if the process never starts.
 					mHeartbeat.start();
-					mHeartbeat.setTimerExpirySec(PLUGIN_LAUNCH_SECONDS);
+					mHeartbeat.setTimerExpirySec(mPluginLaunchTimeout);
 					setState(STATE_LAUNCHED);
 				}
 			}
@@ -414,7 +411,8 @@ void LLPluginProcessParent::idle(void)
 			break;
 			
 			case STATE_CLEANUP:
-				mProcess.kill();
+				// Don't do a kill here anymore -- closing the sockets is the new 'kill'.
+				mProcess.orphan();
 				killSockets();
 				setState(STATE_DONE);
 			break;
@@ -556,7 +554,7 @@ void LLPluginProcessParent::receiveMessage(const LLPluginMessage &message)
 		else if(message_name == "heartbeat")
 		{
 			// this resets our timer.
-			mHeartbeat.setTimerExpirySec(PLUGIN_LOCKED_UP_SECONDS);
+			mHeartbeat.setTimerExpirySec(mPluginLockupTimeout);
 
 			mCPUUsage = message.getValueReal("cpu_usage");
 
@@ -711,7 +709,7 @@ bool LLPluginProcessParent::pluginLockedUpOrQuit()
 
 bool LLPluginProcessParent::pluginLockedUp()
 {
-	// If the timer has expired, the plugin has locked up.
-	return mHeartbeat.hasExpired();
+	// If the timer is running and has expired, the plugin has locked up.
+	return (mHeartbeat.getStarted() && mHeartbeat.hasExpired());
 }
 
diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h
index 6d661a69601b852fe27293d58c59f7bebb5dabdc..524cd9923fb5e7e80f89d042d45695c5f70311f9 100644
--- a/indra/llplugin/llpluginprocessparent.h
+++ b/indra/llplugin/llpluginprocessparent.h
@@ -34,6 +34,7 @@
 #ifndef LL_LLPLUGINPROCESSPARENT_H
 #define LL_LLPLUGINPROCESSPARENT_H
 
+#include "llapr.h"
 #include "llprocesslauncher.h"
 #include "llpluginmessage.h"
 #include "llpluginmessagepipe.h"
@@ -101,6 +102,9 @@ public:
 	
 	bool getDisableTimeout() { return mDisableTimeout; };
 	void setDisableTimeout(bool disable) { mDisableTimeout = disable; };
+	
+	void setLaunchTimeout(F32 timeout) { mPluginLaunchTimeout = timeout; };
+	void setLockupTimeout(F32 timeout) { mPluginLockupTimeout = timeout; };
 
 	F64 getCPUUsage() { return mCPUUsage; };
 
@@ -157,6 +161,10 @@ private:
 	bool mDebug;
 
 	LLProcessLauncher mDebugger;
+	
+	F32 mPluginLaunchTimeout;		// Somewhat longer timeout for initial launch.
+	F32 mPluginLockupTimeout;		// If we don't receive a heartbeat in this many seconds, we declare the plugin locked up.
+
 };
 
 #endif // LL_LLPLUGINPROCESSPARENT_H
diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h
index 1325b4995b89c6356c1f1113797865f88c349d5c..7a5d029038e60908843f93074f36353d971a7ffc 100644
--- a/indra/llrender/llfontfreetype.h
+++ b/indra/llrender/llfontfreetype.h
@@ -58,9 +58,8 @@ private:
 	~LLFontManager();
 };
 
-class LLFontGlyphInfo
+struct LLFontGlyphInfo
 {
-public:
 	LLFontGlyphInfo(U32 index);
 
 	U32 mGlyphIndex;
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index a28ffbfdc0d3816085326acc697a007d4891bd1f..db1f019a81850fa2eef2ef613db14b5b28d02a30 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -195,7 +195,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
 		cur_y += mFontFreetype->getDescenderHeight();
 		break;
 	case VCENTER:
-		cur_y -= ((mFontFreetype->getAscenderHeight() - mFontFreetype->getDescenderHeight())/2.f);
+		cur_y -= (mFontFreetype->getAscenderHeight() - mFontFreetype->getDescenderHeight()) / 2.f;
 		break;
 	case BASELINE:
 		// Baseline, do nothing.
@@ -221,7 +221,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
 	cur_render_y = cur_y;
 	cur_render_x = cur_x;
 
-	F32 start_x = cur_x;
+	F32 start_x = llround(cur_x);
 
 	const LLFontBitmapCache* font_bitmap_cache = mFontFreetype->getFontBitmapCache();
 
@@ -235,7 +235,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
 	if (use_ellipses)
 	{
 		// check for too long of a string
-		if (getWidthF32(wstr.c_str(), begin_offset, max_chars) * sScaleX > scaled_max_pixels)
+		S32 string_width = llround(getWidthF32(wstr.c_str(), begin_offset, max_chars) * sScaleX);
+		if (string_width > scaled_max_pixels)
 		{
 			// use four dots for ellipsis width to generate padding
 			const LLWString dots(utf8str_to_wstring(std::string("....")));
@@ -301,8 +302,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
 		// Must do this to cur_x, not just to cur_render_x, otherwise you
 		// will squish sub-pixel kerned characters too close together.
 		// For example, "CCCCC" looks bad.
-		cur_x = (F32)llfloor(cur_x + 0.5f);
-		//cur_y = (F32)llfloor(cur_y + 0.5f);
+		cur_x = (F32)llround(cur_x);
+		//cur_y = (F32)llround(cur_y);
 
 		cur_render_x = cur_x;
 		cur_render_y = cur_y;
@@ -461,7 +462,7 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars
 			cur_x += mFontFreetype->getXKerning(wch, next_char);
 		}
 		// Round after kerning.
-		cur_x = (F32)llfloor(cur_x + 0.5f);
+		cur_x = (F32)llround(cur_x);
 	}
 
 	// add in extra pixels for last character's width past its xadvance
@@ -490,6 +491,7 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
 
 	// avoid S32 overflow when max_pixels == S32_MAX by staying in floating point
 	F32 scaled_max_pixels =	ceil(max_pixels * sScaleX);
+	F32 width_padding = 0.f;
 
 	S32 i;
 	for (i=0; (i < max_chars); i++)
@@ -533,9 +535,17 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
 			}
 		}
 
-		cur_x += mFontFreetype->getXAdvance(wch);
+		LLFontGlyphInfo* fgi = mFontFreetype->getGlyphInfo(wch);
+
+		// account for glyphs that run beyond the starting point for the next glyphs
+		width_padding = llmax(	0.f,													// always use positive padding amount
+								width_padding - fgi->mXAdvance,							// previous padding left over after advance of current character
+								(F32)(fgi->mWidth + fgi->mXBearing) - fgi->mXAdvance);	// difference between width of this character and advance to next character
+
+		cur_x += fgi->mXAdvance;
 		
-		if (scaled_max_pixels < cur_x)
+		// clip if current character runs past scaled_max_pixels (using width_padding)
+		if (scaled_max_pixels < cur_x + width_padding)
 		{
 			clip = TRUE;
 			break;
@@ -548,7 +558,7 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
 		}
 
 		// Round after kerning.
-		cur_x = (F32)llfloor(cur_x + 0.5f);
+		cur_x = llround(cur_x);
 		drawn_x = cur_x;
 	}
 
@@ -660,7 +670,7 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t
 		}
 
 		// Round after kerning.
-		cur_x = (F32)llfloor(cur_x + 0.5f);
+		cur_x = llround(cur_x);
 	}
 
 	return llmin(max_chars, pos - begin_offset);
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index 74b49b846eddac767b1cae5b9191e919fc1bb5d7..82ec02d2ebc66df50590332039ae8ef11a294cb2 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -26,7 +26,6 @@ include_directories(
     )
 
 set(llui_SOURCE_FILES
-    llalertdialog.cpp
     llbutton.cpp
     llcheckboxctrl.cpp
     llclipboard.cpp
@@ -112,7 +111,6 @@ set(llui_SOURCE_FILES
 set(llui_HEADER_FILES
     CMakeLists.txt
 
-    llalertdialog.h
     llbutton.h
     llcallbackmap.h
     llcheckboxctrl.h
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 7721137e291624a5628d10c15510d284614e9bda..e9f6288f44c94aa87469a1548885f3bbdb196a69 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -63,7 +63,6 @@ template class LLButton* LLView::getChild<class LLButton>(
 
 // globals loaded from settings.xml
 S32	LLBUTTON_H_PAD	= 0;
-S32	LLBUTTON_V_PAD	= 0;
 S32 BTN_HEIGHT_SMALL= 0;
 S32 BTN_HEIGHT		= 0;
 
@@ -93,6 +92,7 @@ LLButton::Params::Params()
 	flash_color("flash_color"),
 	pad_right("pad_right", LLUI::sSettingGroups["config"]->getS32("ButtonHPad")),
 	pad_left("pad_left", LLUI::sSettingGroups["config"]->getS32("ButtonHPad")),
+	pad_bottom("pad_bottom"),
 	click_callback("click_callback"),
 	mouse_down_callback("mouse_down_callback"),
 	mouse_up_callback("mouse_up_callback"),
@@ -148,6 +148,7 @@ LLButton::LLButton(const LLButton::Params& p)
 	mHAlign(p.font_halign),
 	mLeftHPad(p.pad_left),
 	mRightHPad(p.pad_right),
+	mBottomVPad(p.pad_bottom),
 	mHoverGlowStrength(p.hover_glow_amount),
 	mCommitOnReturn(p.commit_on_return),
 	mFadeWhenDisabled(FALSE),
@@ -839,7 +840,9 @@ void LLButton::draw()
 		// LLFontGL::render expects S32 max_chars variable but process in a separate way -1 value.
 		// Due to U32_MAX is equal to S32 -1 value I have rest this value for non-ellipses mode.
 		// Not sure if it is really needed. Probably S32_MAX should be always passed as max_chars.
-		mLastDrawCharsCount = mGLFont->render(label, 0, (F32)x, (F32)(LLBUTTON_V_PAD + y_offset),
+		mLastDrawCharsCount = mGLFont->render(label, 0,
+			(F32)x,
+			(F32)(mBottomVPad + y_offset),
 			label_color % alpha,
 			mHAlign, LLFontGL::BOTTOM,
 			LLFontGL::NORMAL,
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 4c7400220d1883eeda4cb52ab25571683ec85aba..5e28b8cdff5a14e8fd02951c27f4565af35f40d1 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -49,7 +49,6 @@
 // PLEASE please use these "constants" when building your own buttons.
 // They are loaded from settings.xml at run time.
 extern S32	LLBUTTON_H_PAD;
-extern S32	LLBUTTON_V_PAD;
 extern S32	BTN_HEIGHT_SMALL;
 extern S32	BTN_HEIGHT;
 
@@ -105,6 +104,7 @@ public:
 		// layout
 		Optional<S32>			pad_right;
 		Optional<S32>			pad_left;
+		Optional<S32>			pad_bottom; // under text label
 		
 		// callbacks
 		Optional<CommitCallbackParam>	click_callback, // alias -> commit_callback
@@ -310,6 +310,7 @@ private:
 	LLFontGL::HAlign			mHAlign;
 	S32							mLeftHPad;
 	S32							mRightHPad;
+	S32							mBottomVPad;	// under text label
 
 	F32							mHoverGlowStrength;
 	F32							mCurGlowStrength;
diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index 9c69e4f2b66fb75b0f849a27d162ddaf85724ec9..63faf44f9dc62fd5511436084e56add29f18280a 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -98,8 +98,15 @@ void LLDockableFloater::toggleInstance(const LLSD& sdname)
 	else if (instance != NULL)
 	{
 		instance->setMinimized(FALSE);
-		instance->setVisible(TRUE);
-		gFloaterView->bringToFront(instance);
+		if (instance->getVisible())
+		{
+			instance->setVisible(FALSE);
+		}
+		else
+		{
+			instance->setVisible(TRUE);
+			gFloaterView->bringToFront(instance);
+		}
 	}
 }
 
diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp
index d9b98b1c285f579d823acda7edaf697dd804f12c..a93c6666486d5c3b4168c2513109e7c932d25e68 100644
--- a/indra/llui/lldraghandle.cpp
+++ b/indra/llui/lldraghandle.cpp
@@ -112,6 +112,7 @@ void LLDragHandleTop::setTitle(const std::string& title)
 		params.font(font);
 		params.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT | FOLLOWS_RIGHT);
 		params.font_shadow(LLFontGL::DROP_SHADOW_SOFT);
+		params.use_ellipses = true;
 		mTitleBox = LLUICtrlFactory::create<LLTextBox> (params);
 		addChild( mTitleBox );
 	}
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index fd7b64af02bf0d54b7023ef2dec5af2ef59ffe72..5fd707fea3495fc2ed4fe2743db9b508d6f7867e 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -1649,6 +1649,7 @@ void LLFloater::draw()
 	}
 	else
 	{
+		//FIXME: get rid of this hack
 		// draw children
 		LLView* focused_child = dynamic_cast<LLView*>(gFocusMgr.getKeyboardFocus());
 		BOOL focused_child_visible = FALSE;
@@ -2703,6 +2704,18 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
 			output_node, output_params, &default_params);
 	}
 
+	// Default floater position to top-left corner of screen
+	// However, some legacy floaters have explicit top or bottom
+	// coordinates set, so respect their wishes.
+	if (!params.rect.top.isProvided() && !params.rect.bottom.isProvided())
+	{
+		params.rect.top.set(0);
+	}
+	if (!params.rect.left.isProvided() && !params.rect.right.isProvided())
+	{
+		params.rect.left.set(0);
+	}
+
 	setupParams(params, parent);
  	initFromParams(params);
 	
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 750b1909538055bcdca79e5799250fcd4ff3979b..de2b43bf135ccaf8f03a588f69bb0d37152dde48 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -37,7 +37,6 @@
 #define LLPANEL_CPP
 #include "llpanel.h"
 
-#include "llalertdialog.h"
 #include "llfocusmgr.h"
 #include "llfontgl.h"
 #include "llrect.h"
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index d7d61cf6cb1cc0c50f46b75c7a837d673ace3b76..2d9106923e35d476cb08d22d1acc88781abbc3bd 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -906,7 +906,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
 	
 	if (placeholder)
 	{
-		btn_rect.translate(0, -LLBUTTON_V_PAD-2);
+		btn_rect.translate(0, -3); // *TODO: make configurable
 		LLTextBox::Params params;
 		params.name(trimmed_label);
 		params.rect(btn_rect);
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index e0503a084470bf3c3597bcc49d08a26ddda2da12..1f120a1483438ceb58c313b2d5d385d6b2c809e9 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -312,7 +312,7 @@ void LLTextBase::drawSelectionBackground()
 
 		S32 selection_left		= llmin( mSelectionStart, mSelectionEnd );
 		S32 selection_right		= llmax( mSelectionStart, mSelectionEnd );
-		LLRect selection_rect = mTextRect;
+		LLRect selection_rect = mVisibleTextRect;
 
 		// Skip through the lines we aren't drawing.
 		LLRect content_display_rect = getVisibleDocumentRect();
@@ -391,7 +391,7 @@ void LLTextBase::drawSelectionBackground()
 			++rect_it)
 		{
 			LLRect selection_rect = *rect_it;
-			selection_rect.translate(mTextRect.mLeft - content_display_rect.mLeft, mTextRect.mBottom - content_display_rect.mBottom);
+			selection_rect.translate(mVisibleTextRect.mLeft - content_display_rect.mLeft, mVisibleTextRect.mBottom - content_display_rect.mBottom);
 			gl_rect_2d(selection_rect, selection_color);
 		}
 	}
@@ -538,10 +538,10 @@ void LLTextBase::drawText()
 			line_end = next_start;
 		}
 
-		LLRect text_rect(line.mRect.mLeft + mTextRect.mLeft - scrolled_view_rect.mLeft,
-						line.mRect.mTop - scrolled_view_rect.mBottom + mTextRect.mBottom,
+		LLRect text_rect(line.mRect.mLeft + mVisibleTextRect.mLeft - scrolled_view_rect.mLeft,
+						line.mRect.mTop - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom,
 						llmin(mDocumentView->getRect().getWidth(), line.mRect.mRight) - scrolled_view_rect.mLeft,
-						line.mRect.mBottom - scrolled_view_rect.mBottom + mTextRect.mBottom);
+						line.mRect.mBottom - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom);
 
 		// draw a single line of text
 		S32 seg_start = line_start;
@@ -561,14 +561,14 @@ void LLTextBase::drawText()
 			
 			S32 clipped_end	=	llmin( line_end, cur_segment->getEnd() )  - cur_segment->getStart();
 
-			if (mUseEllipses
-				&& clipped_end == line_end 
-				&& next_line == last_line 
-				&& last_line < (S32)mLineInfoList.size())
+			if (mUseEllipses								// using ellipses
+				&& clipped_end == line_end					// last segment on line
+				&& next_line == last_line					// this is the last visible line
+				&& last_line < (S32)mLineInfoList.size())	// and there is more text to display
 			{
-				// more text to go, but we can't fit it
-				// so attempt to draw one extra character to force ellipses
-				clipped_end++;
+				// more lines of text to go, but we can't fit them
+				// so shrink text rect to force ellipses
+				text_rect.mRight -= 2;
 			}
 
 			text_rect.mLeft = (S32)(cur_segment->draw(seg_start - cur_segment->getStart(), clipped_end, selection_left, selection_right, text_rect));
@@ -949,7 +949,7 @@ void LLTextBase::reshape(S32 width, S32 height, BOOL called_from_parent)
 		LLUICtrl::reshape( width, height, called_from_parent );
 
 		// do this first after reshape, because other things depend on
-		// up-to-date mTextRect
+		// up-to-date mVisibleTextRect
 		updateRects();
 		
 		needsReflow();
@@ -984,7 +984,7 @@ void LLTextBase::draw()
 							: hasFocus() 
 								? mFocusBgColor.get() 
 								: mWriteableBgColor.get();
-		gl_rect_2d(mTextRect, bg_color, TRUE);
+		gl_rect_2d(mVisibleTextRect, bg_color, TRUE);
 	}
 
 	// draw document view
@@ -1053,9 +1053,9 @@ S32 LLTextBase::getLeftOffset(S32 width)
 	case LLFontGL::LEFT:
 		return mHPad;
 	case LLFontGL::HCENTER:
-		return mHPad + (mTextRect.getWidth() - width - mHPad) / 2;
+		return mHPad + (mVisibleTextRect.getWidth() - width - mHPad) / 2;
 	case LLFontGL::RIGHT:
-		return mTextRect.getWidth() - width;
+		return mVisibleTextRect.getWidth() - width;
 	default:
 		return mHPad;
 	}
@@ -1071,17 +1071,17 @@ void LLTextBase::reflow(S32 start_index)
 
 	while(mReflowNeeded)
 	{
-		mReflowNeeded = FALSE;
+		mReflowNeeded = false;
 
 		// shrink document to minimum size (visible portion of text widget)
 		// to force inlined widgets with follows set to shrink
-		mDocumentView->setShape(mTextRect);
+		mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight());
 
 		bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false;
 
 		LLRect old_cursor_rect = getLocalRectFromDocIndex(mCursorPos);
-		bool follow_selection = mTextRect.overlaps(old_cursor_rect); // cursor is visible
-		old_cursor_rect.translate(-mTextRect.mLeft, -mTextRect.mBottom);
+		bool follow_selection = mVisibleTextRect.overlaps(old_cursor_rect); // cursor is visible
+		old_cursor_rect.translate(-mVisibleTextRect.mLeft, -mVisibleTextRect.mBottom);
 
 		S32 first_line = getFirstVisibleLine();
 
@@ -1094,15 +1094,15 @@ void LLTextBase::reflow(S32 start_index)
 		}
 		LLRect first_char_rect = getLocalRectFromDocIndex(mScrollIndex);
 		// subtract off effect of horizontal scrollbar from local position of first char
-		first_char_rect.translate(-mTextRect.mLeft, -mTextRect.mBottom);
+		first_char_rect.translate(-mVisibleTextRect.mLeft, -mVisibleTextRect.mBottom);
 
 		S32 cur_top = 0;
 
 		segment_set_t::iterator seg_iter = mSegments.begin();
 		S32 seg_offset = 0;
 		S32 line_start_index = 0;
-		const S32 text_width = mTextRect.getWidth() - mHPad;  // reserve room for margin
-		S32 remaining_pixels = text_width;
+		const S32 text_available_width = mVisibleTextRect.getWidth() - mHPad;  // reserve room for margin
+		S32 remaining_pixels = text_available_width;
 		LLWString text(getWText());
 		S32 line_count = 0;
 
@@ -1142,10 +1142,11 @@ void LLTextBase::reflow(S32 start_index)
 
 			S32 last_segment_char_on_line = segment->getStart() + seg_offset;
 
-			S32 text_left = getLeftOffset(text_width - remaining_pixels);
+			S32 text_actual_width = text_available_width - remaining_pixels;
+			S32 text_left = getLeftOffset(text_actual_width);
 			LLRect line_rect(text_left, 
 							cur_top, 
-							text_left + (text_width - remaining_pixels), 
+							text_left + text_actual_width, 
 							cur_top - line_height);
 
 			// if we didn't finish the current segment...
@@ -1160,7 +1161,7 @@ void LLTextBase::reflow(S32 start_index)
 
 				line_start_index = segment->getStart() + seg_offset;
 				cur_top -= llround((F32)line_height * mLineSpacingMult) + mLineSpacingPixels;
-				remaining_pixels = text_width;
+				remaining_pixels = text_available_width;
 				line_height = 0;
 			}
 			// ...just consumed last segment..
@@ -1188,7 +1189,7 @@ void LLTextBase::reflow(S32 start_index)
 					line_start_index = segment->getStart() + seg_offset;
 					cur_top -= llround((F32)line_height * mLineSpacingMult) + mLineSpacingPixels;
 					line_height = 0;
-					remaining_pixels = text_width;
+					remaining_pixels = text_available_width;
 				}
 				++seg_iter;
 				seg_offset = 0;
@@ -1238,10 +1239,10 @@ void LLTextBase::reflow(S32 start_index)
 	}
 }
 
-LLRect LLTextBase::getContentsRect()
+LLRect LLTextBase::getTextBoundingRect()
 {
 	reflow();
-	return mContentsRect;
+	return mTextBoundingRect;
 }
 
 
@@ -1760,7 +1761,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round
 	LLRect visible_region = getVisibleDocumentRect();
 
 	// binary search for line that starts before local_y
-	line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), local_y - mTextRect.mBottom + visible_region.mBottom, compare_bottom());
+	line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), local_y - mVisibleTextRect.mBottom + visible_region.mBottom, compare_bottom());
 
 	if (line_iter == mLineInfoList.end())
 	{
@@ -1768,7 +1769,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round
 	}
 	
 	S32 pos = getLength();
-	S32 start_x = mTextRect.mLeft + line_iter->mRect.mLeft;
+	S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft;
 
 	segment_set_t::iterator line_seg_iter;
 	S32 line_seg_offset;
@@ -1879,7 +1880,7 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const
 	if (mLineInfoList.empty()) 
 	{ 
 		// return default height rect in upper left
-		local_rect = mTextRect;
+		local_rect = mVisibleTextRect;
 		local_rect.mBottom = local_rect.mTop - (S32)(mDefaultFont->getLineHeight());
 		return local_rect;
 	}
@@ -1890,8 +1891,8 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const
 	// compensate for scrolled, inset view of doc
 	LLRect scrolled_view_rect = getVisibleDocumentRect();
 	local_rect = doc_rect;
-	local_rect.translate(mTextRect.mLeft - scrolled_view_rect.mLeft, 
-						mTextRect.mBottom - scrolled_view_rect.mBottom);
+	local_rect.translate(mVisibleTextRect.mLeft - scrolled_view_rect.mLeft, 
+						mVisibleTextRect.mBottom - scrolled_view_rect.mBottom);
 
 	return local_rect;
 }
@@ -1991,7 +1992,7 @@ void LLTextBase::changeLine( S32 delta )
 
 	LLRect visible_region = getVisibleDocumentRect();
 
-	S32 new_cursor_pos = getDocIndexFromLocalCoord(mDesiredXPixel, mLineInfoList[new_line].mRect.mBottom + mTextRect.mBottom - visible_region.mBottom, TRUE);
+	S32 new_cursor_pos = getDocIndexFromLocalCoord(mDesiredXPixel, mLineInfoList[new_line].mRect.mBottom + mVisibleTextRect.mBottom - visible_region.mBottom, TRUE);
 	setCursorPos(new_cursor_pos, true);
 }
 
@@ -2067,56 +2068,64 @@ void LLTextBase::updateRects()
 {
 	if (mLineInfoList.empty()) 
 	{
-		mContentsRect = LLRect(0, mVPad, mHPad, 0);
+		mTextBoundingRect = LLRect(0, mVPad, mHPad, 0);
 	}
 	else
 	{
-		mContentsRect = mLineInfoList.begin()->mRect;
+		mTextBoundingRect = mLineInfoList.begin()->mRect;
 		for (line_list_t::const_iterator line_iter = ++mLineInfoList.begin();
 			line_iter != mLineInfoList.end();
 			++line_iter)
 		{
-			mContentsRect.unionWith(line_iter->mRect);
+			mTextBoundingRect.unionWith(line_iter->mRect);
 		}
 
-		mContentsRect.mTop += mVPad;
+		mTextBoundingRect.mTop += mVPad;
 		// subtract a pixel off the bottom to deal with rounding errors in measuring font height
-		mContentsRect.mBottom -= 1;
+		mTextBoundingRect.mBottom -= 1;
 
-		S32 delta_pos = -mContentsRect.mBottom;
+		S32 delta_pos = -mTextBoundingRect.mBottom;
 		// move line segments to fit new document rect
 		for (line_list_t::iterator it = mLineInfoList.begin(); it != mLineInfoList.end(); ++it)
 		{
 			it->mRect.translate(0, delta_pos);
 		}
-		mContentsRect.translate(0, delta_pos);
+		mTextBoundingRect.translate(0, delta_pos);
 	}
 
 	// update document container dimensions according to text contents
-	LLRect doc_rect = mContentsRect;
-	// use old mTextRect constraint document to width of viewable region
+	LLRect doc_rect = mTextBoundingRect;
+	// use old mVisibleTextRect constraint document to width of viewable region
 	doc_rect.mLeft = 0;
-	doc_rect.mRight = llmax(mTextRect.getWidth(), mContentsRect.mRight);
+
+	// allow horizontal scrolling?
+	// if so, use entire width of text contents
+	// otherwise, stop at width of mVisibleTextRect
+	doc_rect.mRight = mScroller 
+		? llmax(mVisibleTextRect.getWidth(), mTextBoundingRect.mRight)
+		: mVisibleTextRect.getWidth();
 
 	mDocumentView->setShape(doc_rect);
 
-	//update mTextRect *after* mDocumentView has been resized
+	//update mVisibleTextRect *after* mDocumentView has been resized
 	// so that scrollbars are added if document needs to scroll
-	// since mTextRect does not include scrollbars
-	LLRect old_text_rect = mTextRect;
-	mTextRect = mScroller ? mScroller->getContentWindowRect() : getLocalRect();
+	// since mVisibleTextRect does not include scrollbars
+	LLRect old_text_rect = mVisibleTextRect;
+	mVisibleTextRect = mScroller ? mScroller->getContentWindowRect() : getLocalRect();
 	//FIXME: replace border with image?
 	if (mBorderVisible)
 	{
-		mTextRect.stretch(-1);
+		mVisibleTextRect.stretch(-1);
 	}
-	if (mTextRect != old_text_rect)
+	if (mVisibleTextRect != old_text_rect)
 	{
 		needsReflow();
 	}
 
-	// update document container again, using new mTextRect
-	doc_rect.mRight = llmax(mTextRect.getWidth(), mContentsRect.mRight);
+	// update document container again, using new mVisibleTextRect (that has scrollbars enabled as needed)
+	doc_rect.mRight = mScroller 
+		? llmax(mVisibleTextRect.getWidth(), mTextBoundingRect.mRight)
+		: mVisibleTextRect.getWidth();
 	mDocumentView->setShape(doc_rect);
 }
 
@@ -2154,7 +2163,7 @@ LLRect LLTextBase::getVisibleDocumentRect() const
 		LLRect doc_rect = mDocumentView->getLocalRect();
 		doc_rect.mLeft -= mDocumentView->getRect().mLeft;
 		// adjust for height of text above widget baseline
-		doc_rect.mBottom = doc_rect.getHeight() - mTextRect.getHeight();
+		doc_rect.mBottom = doc_rect.getHeight() - mVisibleTextRect.getHeight();
 		return doc_rect;
 	}
 }
@@ -2413,10 +2422,18 @@ bool LLNormalTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt
 	if (num_chars > 0)
 	{
 		LLWString text = mEditor.getWText();
-		width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars);
 		// if last character is a newline, then return true, forcing line break
 		llwchar last_char = text[mStart + first_char + num_chars - 1];
-		force_newline = (last_char == '\n');
+		if (last_char == '\n')
+		{
+			force_newline = true;
+			// don't count newline in font width
+			width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars - 1);
+		}
+		else
+		{
+			width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars);
+		}
 	}
 	else
 	{
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 0138ca370422a0ecbdc7088593551220bcee82c2..a1f8ba39ae7ea5bff7c2e66e8b3f375ef23b6a5f 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -156,8 +156,8 @@ public:
 	void					addDocumentChild(LLView* view);
 	void					removeDocumentChild(LLView* view);
 	const LLView*			getDocumentView() const { return mDocumentView; }
-	LLRect					getTextRect() { return mTextRect; }
-	LLRect					getContentsRect();
+	LLRect					getVisibleTextRect() { return mVisibleTextRect; }
+	LLRect					getTextBoundingRect();
 	LLRect					getVisibleDocumentRect() const;
 
 	S32						getVPad() { return mVPad; }
@@ -311,8 +311,8 @@ protected:
 	// text segmentation and flow
 	segment_set_t       		mSegments;
 	line_list_t					mLineInfoList;
-	LLRect						mTextRect;			// The rect in which text is drawn.  Excludes borders.
-	LLRect						mContentsRect;
+	LLRect						mVisibleTextRect;			// The rect in which text is drawn.  Excludes borders.
+	LLRect						mTextBoundingRect;
 
 	// colors
 	LLUIColor					mCursorColor;
diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp
index 0bd0ab59fb1851b734f9e0ca494648388e18394b..a1f5b5726bf8fb5c0e01d32e50d545eccdb3a9ff 100644
--- a/indra/llui/lltextbox.cpp
+++ b/indra/llui/lltextbox.cpp
@@ -134,12 +134,12 @@ void LLTextBox::setClickedCallback( boost::function<void (void*)> cb, void* user
 
 S32 LLTextBox::getTextPixelWidth()
 {
-	return getContentsRect().getWidth();
+	return getTextBoundingRect().getWidth();
 }
 
 S32 LLTextBox::getTextPixelHeight()
 {
-	return getContentsRect().getHeight();
+	return getTextBoundingRect().getHeight();
 }
 
 
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index faf9ccbeb86afd24f5b8fde26cc272d3fa64e79c..e8fc9475a542d55f42958964c6d6e692b9fbe5f5 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -758,8 +758,8 @@ BOOL LLTextEditor::handleHover(S32 x, S32 y, MASK mask)
 			{	
 				mScroller->autoScroll(x, y);
 			}
-			S32 clamped_x = llclamp(x, mTextRect.mLeft, mTextRect.mRight);
-			S32 clamped_y = llclamp(y, mTextRect.mBottom, mTextRect.mTop);
+			S32 clamped_x = llclamp(x, mVisibleTextRect.mLeft, mVisibleTextRect.mRight);
+			S32 clamped_y = llclamp(y, mVisibleTextRect.mBottom, mVisibleTextRect.mTop);
 			setCursorAtLocalPos( clamped_x, clamped_y, true );
 			mSelectionEnd = mCursorPos;
 		}
@@ -809,8 +809,8 @@ BOOL LLTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)
 			{
 				mScroller->autoScroll(x, y);
 			}
-			S32 clamped_x = llclamp(x, mTextRect.mLeft, mTextRect.mRight);
-			S32 clamped_y = llclamp(y, mTextRect.mBottom, mTextRect.mTop);
+			S32 clamped_x = llclamp(x, mVisibleTextRect.mLeft, mVisibleTextRect.mRight);
+			S32 clamped_y = llclamp(y, mVisibleTextRect.mBottom, mVisibleTextRect.mTop);
 			setCursorAtLocalPos( clamped_x, clamped_y, true );
 			endSelection();
 		}
@@ -2075,8 +2075,8 @@ void LLTextEditor::drawPreeditMarker()
 	const S32 line_height = llround( mDefaultFont->getLineHeight() );
 
 	S32 line_start = getLineStart(cur_line);
-	S32 line_y = mTextRect.mTop - line_height;
-	while((mTextRect.mBottom <= line_y) && (num_lines > cur_line))
+	S32 line_y = mVisibleTextRect.mTop - line_height;
+	while((mVisibleTextRect.mBottom <= line_y) && (num_lines > cur_line))
 	{
 		S32 next_start = -1;
 		S32 line_end = text_len;
@@ -2108,12 +2108,12 @@ void LLTextEditor::drawPreeditMarker()
 					continue;
 				}
 
-				S32 preedit_left = mTextRect.mLeft;
+				S32 preedit_left = mVisibleTextRect.mLeft;
 				if (left > line_start)
 				{
 					preedit_left += mDefaultFont->getWidth(text, line_start, left - line_start);
 				}
-				S32 preedit_right = mTextRect.mLeft;
+				S32 preedit_right = mVisibleTextRect.mLeft;
 				if (right < line_end)
 				{
 					preedit_right += mDefaultFont->getWidth(text, line_start, right - line_start);
@@ -2154,7 +2154,7 @@ void LLTextEditor::drawLineNumbers()
 {
 	LLGLSUIDefault gls_ui;
 	LLRect scrolled_view_rect = getVisibleDocumentRect();
-	LLRect content_rect = getTextRect();	
+	LLRect content_rect = getVisibleTextRect();	
 	LLLocalClipRect clip(content_rect);
 	S32 first_line = getFirstVisibleLine();
 	S32 num_lines = getLineCount();
@@ -2180,12 +2180,12 @@ void LLTextEditor::drawLineNumbers()
 		{
 			line_info& line = mLineInfoList[cur_line];
 
-			if ((line.mRect.mTop - scrolled_view_rect.mBottom) < mTextRect.mBottom) 
+			if ((line.mRect.mTop - scrolled_view_rect.mBottom) < mVisibleTextRect.mBottom) 
 			{
 				break;
 			}
 
-			S32 line_bottom = line.mRect.mBottom - scrolled_view_rect.mBottom + mTextRect.mBottom;
+			S32 line_bottom = line.mRect.mBottom - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom;
 			// draw the line numbers
 			if(line.mLineNum != last_line_num && line.mRect.mTop <= scrolled_view_rect.mTop) 
 			{
@@ -2216,8 +2216,8 @@ void LLTextEditor::draw()
 {
 	{
 		// pad clipping rectangle so that cursor can draw at full width
-		// when at left edge of mTextRect
-		LLRect clip_rect(mTextRect);
+		// when at left edge of mVisibleTextRect
+		LLRect clip_rect(mVisibleTextRect);
 		clip_rect.stretch(1);
 		LLLocalClipRect clip(clip_rect);
 		drawPreeditMarker();
@@ -2781,7 +2781,7 @@ BOOL LLTextEditor::getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect
 	if (control)
 	{
 		LLRect control_rect_screen;
-		localRectToScreen(mTextRect, &control_rect_screen);
+		localRectToScreen(mVisibleTextRect, &control_rect_screen);
 		LLUI::screenRectToGL(control_rect_screen, control);
 	}
 
@@ -2832,8 +2832,8 @@ BOOL LLTextEditor::getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect
 
 	if (coord)
 	{
-		const S32 query_x = mTextRect.mLeft + mDefaultFont->getWidth(text, current_line_start, query - current_line_start);
-		const S32 query_y = mTextRect.mTop - (current_line - first_visible_line) * line_height - line_height / 2;
+		const S32 query_x = mVisibleTextRect.mLeft + mDefaultFont->getWidth(text, current_line_start, query - current_line_start);
+		const S32 query_y = mVisibleTextRect.mTop - (current_line - first_visible_line) * line_height - line_height / 2;
 		S32 query_screen_x, query_screen_y;
 		localPointToScreen(query_x, query_y, &query_screen_x, &query_screen_y);
 		LLUI::screenPointToGL(query_screen_x, query_screen_y, &coord->mX, &coord->mY);
@@ -2841,13 +2841,13 @@ BOOL LLTextEditor::getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect
 
 	if (bounds)
 	{
-		S32 preedit_left = mTextRect.mLeft;
+		S32 preedit_left = mVisibleTextRect.mLeft;
 		if (preedit_left_position > current_line_start)
 		{
 			preedit_left += mDefaultFont->getWidth(text, current_line_start, preedit_left_position - current_line_start);
 		}
 
-		S32 preedit_right = mTextRect.mLeft;
+		S32 preedit_right = mVisibleTextRect.mLeft;
 		if (preedit_right_position < current_line_end)
 		{
 			preedit_right += mDefaultFont->getWidth(text, current_line_start, preedit_right_position - current_line_start);
@@ -2857,7 +2857,7 @@ BOOL LLTextEditor::getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect
 			preedit_right += mDefaultFont->getWidth(text, current_line_start, current_line_end - current_line_start);
 		}
 
-		const S32 preedit_top = mTextRect.mTop - (current_line - first_visible_line) * line_height;
+		const S32 preedit_top = mVisibleTextRect.mTop - (current_line - first_visible_line) * line_height;
 		const S32 preedit_bottom = preedit_top - line_height;
 
 		const LLRect preedit_rect_local(preedit_left, preedit_top, preedit_right, preedit_bottom);
diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp
index 3a1e656364389c800a32b965a3e29471adeb8c7e..f7a53e87def377a8f0757a5606a92b4606b8040d 100644
--- a/indra/llui/lluistring.cpp
+++ b/indra/llui/lluistring.cpp
@@ -39,22 +39,23 @@ LLFastTimer::DeclareTimer FTM_UI_STRING("UI String");
 
 
 LLUIString::LLUIString(const std::string& instring, const LLStringUtil::format_map_t& args)
-	: mOrig(instring),
-	  mArgs(args)
+:	mOrig(instring),
+	mArgs(args)
 {
-	format();
+	dirty();
 }
 
 void LLUIString::assign(const std::string& s)
 {
 	mOrig = s;
-	format();
+	dirty();
 }
 
 void LLUIString::setArgList(const LLStringUtil::format_map_t& args)
+
 {
 	mArgs = args;
-	format();
+	dirty();
 }
 
 void LLUIString::setArgs(const LLSD& sd)
@@ -68,40 +69,40 @@ void LLUIString::setArgs(const LLSD& sd)
 	{
 		setArg(sd_it->first, sd_it->second.asString());
 	}
-	format();
+	dirty();
 }
 
 void LLUIString::setArg(const std::string& key, const std::string& replacement)
 {
 	mArgs[key] = replacement;
-	format();
+	dirty();
 }
 
 void LLUIString::truncate(S32 maxchars)
 {
-	if (mWResult.size() > (size_t)maxchars)
+	if (getUpdatedWResult().size() > (size_t)maxchars)
 	{
-		LLWStringUtil::truncate(mWResult, maxchars);
-		mResult = wstring_to_utf8str(mWResult);
+		LLWStringUtil::truncate(getUpdatedWResult(), maxchars);
+		mResult = wstring_to_utf8str(getUpdatedWResult());
 	}
 }
 
 void LLUIString::erase(S32 charidx, S32 len)
 {
-	mWResult.erase(charidx, len);
-	mResult = wstring_to_utf8str(mWResult);
+	getUpdatedWResult().erase(charidx, len);
+	mResult = wstring_to_utf8str(getUpdatedWResult());
 }
 
 void LLUIString::insert(S32 charidx, const LLWString& wchars)
 {
-	mWResult.insert(charidx, wchars);
-	mResult = wstring_to_utf8str(mWResult);
+	getUpdatedWResult().insert(charidx, wchars);
+	mResult = wstring_to_utf8str(getUpdatedWResult());
 }
 
 void LLUIString::replace(S32 charidx, llwchar wc)
 {
-	mWResult[charidx] = wc;
-	mResult = wstring_to_utf8str(mWResult);
+	getUpdatedWResult()[charidx] = wc;
+	mResult = wstring_to_utf8str(getUpdatedWResult());
 }
 
 void LLUIString::clear()
@@ -112,8 +113,16 @@ void LLUIString::clear()
 	mWResult.clear();
 }
 
-void LLUIString::format()
+void LLUIString::dirty()
 {
+	mNeedsResult = true;
+	mNeedsWResult = true;
+}
+
+void LLUIString::updateResult() const
+{
+	mNeedsResult = false;
+
 	LLFastTimer timer(FTM_UI_STRING);
 	
 	// optimize for empty strings (don't attempt string replacement)
@@ -129,5 +138,11 @@ void LLUIString::format()
 	LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs();
 	combined_args.insert(mArgs.begin(), mArgs.end());
 	LLStringUtil::format(mResult, combined_args);
-	mWResult = utf8str_to_wstring(mResult);
+}
+
+void LLUIString::updateWResult() const
+{
+	mNeedsWResult = false;
+
+	mWResult = utf8str_to_wstring(getUpdatedResult());
 }
diff --git a/indra/llui/lluistring.h b/indra/llui/lluistring.h
index 763de4d6a3ca80588caf7ae8be7a7fa417727542..7ec0fd603a1fd9ccba2f70ee6b7900ecddd8f0bc 100644
--- a/indra/llui/lluistring.h
+++ b/indra/llui/lluistring.h
@@ -76,19 +76,19 @@ public:
 	void setArgs(const class LLSD& sd);
 	void setArg(const std::string& key, const std::string& replacement);
 
-	const std::string& getString() const { return mResult; }
-	operator std::string() const { return mResult; }
+	const std::string& getString() const { return getUpdatedResult(); }
+	operator std::string() const { return getUpdatedResult(); }
 
-	const LLWString& getWString() const { return mWResult; }
-	operator LLWString() const { return mWResult; }
+	const LLWString& getWString() const { return getUpdatedWResult(); }
+	operator LLWString() const { return getUpdatedWResult(); }
 
-	bool empty() const { return mWResult.empty(); }
-	S32 length() const { return mWResult.size(); }
+	bool empty() const { return getUpdatedResult().empty(); }
+	S32 length() const { return getUpdatedWResult().size(); }
 
 	void clear();
 	void clearArgs() { mArgs.clear(); }
 	
-	// These utuilty functions are included for text editing.
+	// These utility functions are included for text editing.
 	// They do not affect mOrig and do not perform argument substitution
 	void truncate(S32 maxchars);
 	void erase(S32 charidx, S32 len);
@@ -96,12 +96,24 @@ public:
 	void replace(S32 charidx, llwchar wc);
 	
 private:
-	void format();	
+	// something changed, requiring reformatting of strings
+	void dirty();
+
+	std::string& getUpdatedResult() const { if (mNeedsResult) { updateResult(); } return mResult; }
+	LLWString& getUpdatedWResult() const{ if (mNeedsWResult) { updateWResult(); } return mWResult; }
+
+	// do actual work of updating strings (non-inlined)
+	void updateResult() const;
+	void updateWResult() const;
 	
 	std::string mOrig;
-	std::string mResult;
-	LLWString mWResult; // for displaying
+	mutable std::string mResult;
+	mutable LLWString mWResult; // for displaying
 	LLStringUtil::format_map_t mArgs;
+
+	// controls lazy evaluation
+	mutable bool	mNeedsResult;
+	mutable bool	mNeedsWResult;
 };
 
 #endif // LL_LLUISTRING_H
diff --git a/indra/llvfs/llpidlock.cpp b/indra/llvfs/llpidlock.cpp
index 315baa001d2a6a0c01596ac6e7d1a8e1e062af90..95e3692e1074513f34515996ac10cc3f65eae087 100755
--- a/indra/llvfs/llpidlock.cpp
+++ b/indra/llvfs/llpidlock.cpp
@@ -41,6 +41,15 @@
 #include "llframetimer.h"
 
 #if LL_WINDOWS   //For windows platform.
+
+#include <windows.h>
+
+namespace {
+	inline DWORD getpid() {
+		return GetCurrentProcessId();
+	}
+}
+
 bool isProcessAlive(U32 pid)
 {
 	return (bool) GetProcessVersion((DWORD)pid);
diff --git a/indra/llvfs/llpidlock.h b/indra/llvfs/llpidlock.h
index 42aee4dc4fc4edcc092895f405ab0007b12f75a9..496e99cf5a5d3042b3b6051d651040b9878b88cc 100755
--- a/indra/llvfs/llpidlock.h
+++ b/indra/llvfs/llpidlock.h
@@ -37,17 +37,9 @@
 class LLSD;
 class LLFrameTimer;
 
-#if LL_WINDOWS	//For windows platform.
-
-#include <windows.h>
-
-#define getpid GetCurrentProcessId
-
-#else	//Everyone Else
-
+#if !LL_WINDOWS	//For non-windows platforms.
 #include <signal.h>
-
-#endif //Everyone else.
+#endif
 
 namespace LLPidLock
 {
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 276ad39dfbac89c19559192f98f520c360ab67d8..4b6da552cfe13a5dca1c8b294a4f8f8fa3aea8c8 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -98,6 +98,12 @@ private:
 	int mLastMouseY;
 	bool mFirstFocus;
 	
+	void setInitState(int state)
+	{
+//		std::cerr << "changing init state to " << state << std::endl;
+		mInitState = state;
+	}
+	
 	////////////////////////////////////////////////////////////////////////////////
 	//
 	void update(int milliseconds)
@@ -205,18 +211,19 @@ private:
 		{
 			// create single browser window
 			mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight );
-
 #if LL_WINDOWS
 			// Enable plugins
 			LLQtWebKit::getInstance()->enablePlugins(true);
 #elif LL_DARWIN
-			// Disable plugins
-			LLQtWebKit::getInstance()->enablePlugins(false);
+			// Enable plugins
+			LLQtWebKit::getInstance()->enablePlugins(true);
 #elif LL_LINUX
-			// Disable plugins
-			LLQtWebKit::getInstance()->enablePlugins(false);
+			// Enable plugins
+			LLQtWebKit::getInstance()->enablePlugins(true);
 #endif
-            
+			// Enable cookies
+			LLQtWebKit::getInstance()->enableCookies( true );
+
 			// tell LLQtWebKit about the size of the browser window
 			LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight );
 
@@ -233,7 +240,7 @@ private:
 			LLQtWebKit::getInstance()->setBackgroundColor( mBrowserWindowId, 0x00, 0x00, 0x00 );
 
 			// Set state _before_ starting the navigate, since onNavigateBegin might get called before this call returns.
-			mInitState = INIT_STATE_NAVIGATING;
+			setInitState(INIT_STATE_NAVIGATING);
 
 			// Don't do this here -- it causes the dreaded "white flash" when loading a browser instance.
 			// FIXME: Re-added this because navigating to a "page" initializes things correctly - especially
@@ -288,7 +295,7 @@ private:
 	{
 		if(mInitState == INIT_STATE_WAIT_REDRAW)
 		{
-			mInitState = INIT_STATE_RUNNING;
+			setInitState(INIT_STATE_RUNNING);
 		}
 		
 		// flag that an update is required
@@ -310,7 +317,7 @@ private:
 
 		if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
 		{
-			mInitState = INIT_STATE_WAIT_REDRAW;
+			setInitState(INIT_STATE_WAIT_REDRAW);
 		}
 		
 	}
@@ -333,7 +340,7 @@ private:
 		}
 		else if(mInitState == INIT_STATE_NAVIGATING)
 		{
-			mInitState = INIT_STATE_NAVIGATE_COMPLETE;
+			setInitState(INIT_STATE_NAVIGATE_COMPLETE);
 		}
 
 	}
@@ -626,7 +633,11 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
 			}
 			else if(message_name == "cleanup")
 			{
-				// TODO: clean up here
+				// DTOR most likely won't be called but the recent change to the way this process
+				// is (not) killed means we see this message and can do what we need to here.
+				// Note: this cleanup is ultimately what writes cookies to the disk
+				LLQtWebKit::getInstance()->remObserver( mBrowserWindowId, this );
+				LLQtWebKit::getInstance()->reset();
 			}
 			else if(message_name == "shm_added")
 			{
@@ -635,7 +646,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
 				info.mSize = (size_t)message_in.getValueS32("size");
 				std::string name = message_in.getValue("name");
 				
-				
 //				std::cerr << "MediaPluginWebKit::receiveMessage: shared memory added, name: " << name 
 //					<< ", size: " << info.mSize 
 //					<< ", address: " << info.mAddress 
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index fac1dedb02e506e17b3cdbedebd74e35d811391f..193109e9f4f590ffdb5e3c3ff704956705fb55cb 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -234,7 +234,6 @@ set(viewer_SOURCE_FILES
     llgroupactions.cpp
     llgrouplist.cpp
     llgroupmgr.cpp
-    llgroupnotify.cpp
     llhomelocationresponder.cpp
     llhudeffect.cpp
     llhudeffectbeam.cpp
@@ -306,7 +305,6 @@ set(viewer_SOURCE_FILES
     llnotificationofferhandler.cpp
     llnotificationscripthandler.cpp
     llnotificationtiphandler.cpp
-    llnotify.cpp
     lloutputmonitorctrl.cpp
     lloverlaybar.cpp
     llpanelavatar.cpp
@@ -747,7 +745,6 @@ set(viewer_HEADER_FILES
     llgroupactions.h
     llgrouplist.h
     llgroupmgr.h
-    llgroupnotify.h
     llhomelocationresponder.h
     llhudeffect.h
     llhudeffectbeam.h
@@ -814,7 +811,6 @@ set(viewer_HEADER_FILES
     llnetmap.h
     llnotificationhandler.h
     llnotificationmanager.h
-    llnotify.h
     lloutputmonitorctrl.h
     lloverlaybar.h
     llpanelavatar.h
@@ -1368,7 +1364,6 @@ add_executable(${VIEWER_BINARY_NAME}
     MACOSX_BUNDLE
     ${viewer_SOURCE_FILES}
     )
-check_message_template(${VIEWER_BINARY_NAME})
 
 if (LLKDU_LIBRARY)
   add_dependencies(${VIEWER_BINARY_NAME} ${LLKDU_LIBRARY})
@@ -1405,45 +1400,84 @@ if (WINDOWS)
             )
     endif(USE_PRECOMPILED_HEADERS)
 
-    # sets the 'working directory' for debugging from visual studio.
-    if (NOT UNATTENDED)
-        add_custom_command(
-            TARGET ${VIEWER_BINARY_NAME} POST_BUILD
-            COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
-            ARGS
-              --solution 
-              ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
-              --workingdir
-              ${VIEWER_BINARY_NAME}
-              "${CMAKE_CURRENT_SOURCE_DIR}"
-            COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
-            )
-    endif (NOT UNATTENDED)
-
-    add_custom_command(
-        TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
-        COMMAND ${CMAKE_COMMAND}
-        ARGS
-          -E
-          copy_if_different
-          ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/messages/message_template.msg
-          ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message_template.msg
-        COMMENT "Copying message_template.msg to the runtime folder."
-        )
-
-    add_custom_command(
-      TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
-      COMMAND ${CMAKE_COMMAND}
-      ARGS
-        -E
-        copy_if_different
-        ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml
-        ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml
-      COMMENT "Copying message.xml to the runtime folder."
+    # If adding a file to viewer_manifest.py in the WindowsManifest.construct() method, be sure to add the dependency
+    # here.
+    # *NOTE:Mani - This is a crappy hack to have important dependecies for the viewer_manifest copy action
+    # be met. I'm looking forward to a source-code split-up project next year that will address this kind of thing.
+    # In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py
+    # and have the build deps get tracked *please* tell me about it.
+    set(COPY_INPUT_DEPENDECIES
+      # The following commented dependencies are determined at variably at build time. Can't do this here.
+      #llkdu.dll => llkdu.dll
+      #${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll
+      ${CMAKE_SOURCE_DIR}/../etc/message.xml
+      ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
+      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/llcommon.dll
+      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapr-1.dll
+      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libaprutil-1.dll
+      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapriconv-1.dll
+      ${SHARED_LIB_STAGING_DIR}/Release/openjpeg.dll
+      ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/openjpeg.dll
+      ${SHARED_LIB_STAGING_DIR}/Debug/openjpegd.dll
+      ${SHARED_LIB_STAGING_DIR}/Release/msvcr80.dll
+      ${SHARED_LIB_STAGING_DIR}/Release/msvcp80.dll
+      ${SHARED_LIB_STAGING_DIR}/Release/Microsoft.VC80.CRT.manifest
+      ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcr80.dll
+      ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcp80.dll
+      ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/Microsoft.VC80.CRT.manifest
+      ${SHARED_LIB_STAGING_DIR}/Debug/msvcr80d.dll
+      ${SHARED_LIB_STAGING_DIR}/Debug/msvcp80d.dll
+      ${SHARED_LIB_STAGING_DIR}/Debug/Microsoft.VC80.DebugCRT.manifest
+      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/SLVoice.exe
+      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll
+      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll
+      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libsndfile-1.dll
+      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/zlib1.dll
+      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxplatform.dll
+      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxoal.dll
+      ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt
+      ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt
+      ${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll
+      ${CMAKE_CURRENT_SOURCE_DIR}/fmod.dll
+      ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_quicktime.dll
+      ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_webkit.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/qtnetwork4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/qtopengl4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/qtwebkit4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/qtxmlpatterns4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qgif4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qico4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qjpeg4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qmng4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qsvg4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qtiff4.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/qtcored4.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/qtguid4.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/qtnetworkd4.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/qtopengld4.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/qtwebkitd4.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/qtxmlpatternsd4.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qgifd4.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qicod4.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qjpegd4.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qmngd4.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qsvgd4.dll
+      ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qtiffd4.dll
+      SLPlugin
+      media_plugin_quicktime
+      media_plugin_webkit
+      windows-crash-logger
+      windows-updater
       )
-       
+
     add_custom_command(
-      TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+      OUTPUT  ${CMAKE_CFG_INTDIR}/copy_touched.bat
       COMMAND ${PYTHON_EXECUTABLE}
       ARGS
         ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
@@ -1454,11 +1488,17 @@ if (WINDOWS)
         --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
         --grid=${GRID}
         --source=${CMAKE_CURRENT_SOURCE_DIR}
-      DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+	--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat
+      DEPENDS 
+	${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+	stage_third_party_libs
+	${COPY_INPUT_DEPENDECIES}
       COMMENT "Performing viewer_manifest copy"
       )
+    
+    add_custom_target(copy_w_viewer_manifest ALL DEPENDS ${CMAKE_CFG_INTDIR}/copy_touched.bat) 
 
-    add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon)
+    add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon copy_w_viewer_manifest)
     
     if(LLKDU_LIBRARY)
       # kdu may not exist!
@@ -1477,6 +1517,21 @@ if (WINDOWS)
       windows-crash-logger
       )
 
+    # sets the 'working directory' for debugging from visual studio.
+    if (NOT UNATTENDED)
+        add_custom_command(
+            TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+            COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
+            ARGS
+              --solution 
+              ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
+              --workingdir
+              ${VIEWER_BINARY_NAME}
+              "${CMAKE_CURRENT_SOURCE_DIR}"
+            COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
+            )
+    endif (NOT UNATTENDED)
+
     if (PACKAGE)
       add_custom_command(
         OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2
@@ -1491,7 +1546,7 @@ if (WINDOWS)
           ${EVENT_HOST_SCRIPTS}
           ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py
         )
-
+    
       add_custom_command(
         OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat
         COMMAND ${PYTHON_EXECUTABLE}
@@ -1514,6 +1569,8 @@ if (WINDOWS)
         # sorted out on the parabuild cluster...
         #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2)
 
+      check_message_template(package)
+
     endif (PACKAGE)
 endif (WINDOWS)
 
@@ -1596,6 +1653,7 @@ if (LINUX)
     add_custom_target(package ALL DEPENDS ${product}.tar.bz2)
     add_dependencies(package linux-crash-logger-strip-target)
     add_dependencies(package linux-updater-strip-target)
+    check_message_template(package)
   endif (NOT INSTALL)
 endif (LINUX)
 
@@ -1634,6 +1692,7 @@ if (DARWIN)
 
   if (PACKAGE)
       add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME}) 
+      check_message_template(package)
       add_dependencies(package mac-updater mac-crash-logger)
 
       add_custom_command(
@@ -1737,119 +1796,3 @@ if (LL_TESTS)
 endif (LL_TESTS)
 
 
-# Don't do these for DARWIN or LINUX here -- they're taken care of by viewer_manifest.py
-if (WINDOWS)
-  add_custom_command(
-      TARGET ${VIEWER_BINARY_NAME} POST_BUILD
-      COMMAND ${CMAKE_COMMAND}
-      ARGS
-        -E
-        make_directory
-        ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
-      COMMENT "Creating llplugin dir."
-      )
-
-  get_target_property(BUILT_SLPLUGIN SLPlugin LOCATION)
-  add_custom_command(
-      TARGET ${VIEWER_BINARY_NAME} POST_BUILD
-      COMMAND ${CMAKE_COMMAND}
-      ARGS
-        -E
-        copy_if_different
-        ${BUILT_SLPLUGIN}
-        ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
-      COMMENT "Copying SLPlugin executable to the runtime folder."
-      )
-
-  get_target_property(BUILT_WEBKIT_PLUGIN media_plugin_webkit LOCATION)
-    add_custom_command(
-        TARGET ${VIEWER_BINARY_NAME} POST_BUILD
-        COMMAND ${CMAKE_COMMAND}
-        ARGS
-          -E
-          copy_if_different
-          ${BUILT_WEBKIT_PLUGIN}
-          ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
-        COMMENT "Copying WebKit Plugin to the runtime folder."
-        )
-
-  get_target_property(BUILT_QUICKTIME_PLUGIN media_plugin_quicktime LOCATION)
-    add_custom_command(
-        TARGET ${VIEWER_BINARY_NAME} POST_BUILD
-        COMMAND ${CMAKE_COMMAND}
-        ARGS
-          -E
-          copy_if_different
-          ${BUILT_QUICKTIME_PLUGIN}
-          ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
-        COMMENT "Copying Quicktime Plugin to the runtime folder."
-        )
-
-  #*******************************
-  # Copy media plugin support dlls
-  # Debug config runtime files required for the plugins
-  set(plugins_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
-  set(plugins_debug_files
-    libeay32.dll
-    qtcored4.dll
-    qtguid4.dll
-    qtnetworkd4.dll
-    qtopengld4.dll
-    qtwebkitd4.dll
-    ssleay32.dll
-    )
-  copy_if_different(
-    ${plugins_debug_src_dir}
-    "${CMAKE_CURRENT_BINARY_DIR}/Debug/llplugin"
-    out_targets
-    ${plugins_debug_files}
-    )
-  set(media_plugin_targets ${media_plugin_targets} ${out_targets})
-  
-  # Release & ReleaseDebInfo config runtime files required for the plugins
-  set(plugins_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
-  set(plugins_release_files
-    libeay32.dll
-    qtcore4.dll
-    qtgui4.dll
-    qtnetwork4.dll
-    qtopengl4.dll
-    qtwebkit4.dll
-    ssleay32.dll
-    )
-  copy_if_different(
-    ${plugins_release_src_dir}
-    "${CMAKE_CURRENT_BINARY_DIR}/Release/llplugin"
-    out_targets
-    ${plugins_release_files}
-    )
-  set(media_plugin_targets ${media_plugin_targets} ${out_targets})
-
-  copy_if_different(
-    ${plugins_release_src_dir}
-    "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llplugin"
-    out_targets
-    ${plugins_release_files}
-    )
-  set(media_plugin_targets ${media_plugin_targets} ${out_targets})
-  
-  add_custom_target(copy_media_plugin_libs ALL
-    DEPENDS 
-    ${media_plugin_targets}
-    )
-
-  add_custom_command(
-    TARGET ${VIEWER_BINARY_NAME} POST_BUILD
-    COMMAND ${CMAKE_COMMAND}
-    ARGS
-      -E
-      copy_directory
-      ${CMAKE_BINARY_DIR}/test_apps/llplugintest/${CMAKE_CFG_INTDIR}/imageformats
-      ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin/imageformats
-    COMMENT "Copying llpluging imageformat libs."
-    )
-
-  add_dependencies(${VIEWER_BINARY_NAME} llmediaplugintest copy_media_plugin_libs)
-
-endif (WINDOWS)
-
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index d1ec04842ec96a0650e89214bd6d1edf70e02c0d..4285781742a9cf8f866318460c7e4ef30abc6003 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1068,17 +1068,6 @@
       <key>Value</key>
       <integer>23</integer>
     </map>
-    <key>ButtonVPad</key>
-    <map>
-      <key>Comment</key>
-      <string>Default vertical spacing between buttons (pixels)</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>S32</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
     <key>CacheLocation</key>
     <map>
       <key>Comment</key>
@@ -3596,7 +3585,18 @@
       <key>Type</key>
       <string>String</string>
       <key>Value</key>
-      <string>http://www.secondlife.com/</string>
+      <string>http://lecs.viewer-sidebar.secondlife.com.s3.amazonaws.com/sidebar.html</string>
+    </map>
+    <key>SearchURL</key>
+    <map>
+      <key>Comment</key>
+      <string>URL for Search website, displayed in the Find floater</string>
+      <key>Persist</key>
+      <integer>0</integer>
+      <key>Type</key>
+      <string>String</string>
+      <key>Value</key>
+      <string>http://int.searchwww-phx0.damballah.lindenlab.com/viewer/[CATEGORY]?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]</string>
     </map>
     <key>HighResSnapshot</key>
     <map>
@@ -5470,6 +5470,17 @@
       <string>U32</string>
       <key>Value</key>
 	  <integer>13</integer>
+    </map>
+	<key>PrimMediaMasterEnabled</key>
+	<map>
+	  <key>Comment</key>
+      <string>Whether or not Media on a Prim is enabled.</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
     </map>
 	<key>PrimMediaControlsUseHoverControlSet</key>
 	<map>
@@ -5823,17 +5834,6 @@
       <key>Value</key>
       <integer>35</integer>
     </map>
-    <key>RenderAvatarInvisible</key>
-    <map>
-      <key>Comment</key>
-      <string>Set your avatar as Invisible</string>
-      <key>Persist</key>
-      <integer>0</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>0</integer>
-    </map>
     <key>RenderAvatarVP</key>
     <map>
       <key>Comment</key>
@@ -7573,45 +7573,6 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
-    <key>SearchURLDefault</key>
-    <map>
-      <key>Comment</key>
-      <string>URL to load for empty searches</string>
-      <key>Persist</key>
-      <integer>1</integer>
-	  <key>HideFromEditor</key>
-	  <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>http://search.secondlife.com/client_search.php?</string>
-    </map>
-    <key>SearchURLQuery</key>
-    <map>
-      <key>Comment</key>
-      <string>URL to use for searches</string>
-      <key>Persist</key>
-      <integer>1</integer>
-	  <key>HideFromEditor</key>
-	  <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>http://search.secondlife.com/client_search.php?q=[QUERY]&amp;s=[COLLECTION]&amp;</string>
-    </map>
-    <key>SearchURLSuffix2</key>
-    <map>
-      <key>Comment</key>
-      <string>Parameters added to end of search queries</string>
-      <key>Persist</key>
-      <integer>1</integer>
-	  <key>HideFromEditor</key>
-	  <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>lang=[LANG]&amp;mat=[MATURITY]&amp;t=[TEEN]&amp;region=[REGION]&amp;x=[X]&amp;y=[Y]&amp;z=[Z]&amp;session=[SESSION]</string>
-    </map>
     <key>SelectMovableOnly</key>
     <map>
       <key>Comment</key>
@@ -7843,6 +7804,17 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>ShowDebugAppearanceEditor</key>
+    <map>
+      <key>Comment</key>
+      <string>Show debugging appearance editor</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>ShowEmptyFoldersWhenSearching</key>
     <map>
       <key>Comment</key>
@@ -7941,7 +7913,18 @@
       <string>Boolean</string>
       <key>Value</key>
       <integer>1</integer>   
-    </map>    
+    </map>
+    <key>ShowObjectRenderingCost</key>                
+    <map>
+      <key>Comment</key>
+      <string>Show the object rendering cost  in  build tools</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>   
+    </map>        
     <key>ShowNavbarFavoritesPanel</key>    
     <map>
       <key>Comment</key>
diff --git a/indra/newview/linux_tools/client-readme-voice.txt b/indra/newview/linux_tools/client-readme-voice.txt
index 23a42f484b151db2cc6f8cd72c1ffb49fe5cd531..bfefdf3471bfa2e79f5c9a239f5779dab3bea962 100644
--- a/indra/newview/linux_tools/client-readme-voice.txt
+++ b/indra/newview/linux_tools/client-readme-voice.txt
@@ -4,36 +4,31 @@ Second Life - Linux Voice Support README
 WHAT IS IT?
 -=-=-=-=-=-
 
-Linux Voice Support is a new feature in testing which allows users
-of the Linux Second Life client to participate in voice-chat with other
-residents and groups inside Second Life, with an appropriate
-headset/microphone.
-
-Linux Voice Support is currently EXPERIMENTAL and is known to still
-have some compatibility issues.
+Linux Voice Support is a feature in testing which allows users of the Linux
+Second Life client to participate in voice-chat with other residents and
+groups inside Second Life, with an appropriate headset/microphone.
 
 REQUIREMENTS
 -=-=-=-=-=-=
 
 * A headset/microphone supported by your chosen version of Linux
-* The ALSA sound system (you probably already have this -
-  i.e. the alsa-base and alsa-utils packages on Ubuntu)
+* At this time, the PulseAudio audio system is recommended; this software
+  is already part of most modern (2009+) Linux desktop systems.  Alternatively,
+  the ALSA audio system may be used on systems installed from around
+  2007 onwards (again this is likely already installed on your system).
+
+TESTING YOUR SETTINGS
+-=-=-=-=-=-=-=-=-=-=-
 
-Success with Linux Voice support has been reported on the following
-systems:
-* Ubuntu 6.06 (Dapper) with Intel ICH5/CMI9761A+ audio chipset
-* Ubuntu 6.06 (Dapper) with SigmaTel STAC2997 audio chipset
-* Ubuntu 6.06 (Dapper) with Creative EMU10K1 audio chipset
-* Ubuntu 7.04 (Feisty) with USB Plantronics headset
-* Ubuntu 7.04 (Feisty) with Intel HDA audio chipset
-* Fedora Core 6 with (unknown) audio chipset
-* Ubuntu 8.04 (Hardy) with (unknown) audio chipset
+* The Second Life region 'Voice Echo Canyon' is a great place for testing
+your hardware settings and quality - it will 'echo' your voice back to you
+when you speak.
 
 KNOWN PROBLEMS
 -=-=-=-=-=-=-=
 
-* The 'Input Level' meter in the Voice Chat Device Settings dialog
-  does not respond to audio input.
+* Compatibility with old ALSA-based audio systems (such as Ubuntu Dapper
+  from 2006) is poor.
 
 TROUBLESHOOTING
 -=-=-=-=-=-=-=-
@@ -41,12 +36,11 @@ TROUBLESHOOTING
 PROBLEM 1: I don't see a white dot over the head of my avatar or other
   Voice-using avatars.
 SOLUTION:
-a. Ensure that 'Enable voice chat' is enabled in the Voice Chat
-  preferences window and that you are in a voice-enabled area (you
-  will see a blue headphone icon in the SL menu-bar).
+a. Ensure that 'Enable voice' is enabled in the 'Sound' section of the
+  Preferences window, and that you are in a voice-enabled area.
 b. If the above does not help, exit Second Life and ensure that any
   remaining 'SLVoice' processes (as reported by 'ps', 'top' or similar)
-  are killed.
+  are killed before restarting.
 
 PROBLEM 2: I have a white dot over my head but I never see (or hear!) anyone
   except myself listed in the Active Speakers dialog when I'm sure that other
@@ -65,12 +59,13 @@ c. Update to the latest version of ALSA manually.  For a guide, see the
 
 PROBLEM 3: I can hear other people, but they cannot hear me.
 SOLUTION:
-a. Ensure that you have the 'Talk' button activated while you are trying to
-  speak.
+a. Ensure that you have the 'Speak' button (at the bottom of the Second Life
+   window) activated while you are trying to speak.
 b. Ensure that your microphone jack is inserted into the correct socket of your
   sound card, where appropriate.
-c. Use your system mixer-setting program or the 'alsamixer' program to ensure
-  that microphone input is set as the active input source and is not muted.
+c. Use your system mixer-setting program (such as the PulseAudio 'volume
+  control' applet or the ALSA 'alsamixer' program) to ensure that microphone
+  input is set as the active input source and is not muted.
 d. Verify that audio input works in other applications, i.e. Audacity
 
 PROBLEM 4: Other people just hear bursts of loud noise when I speak.
diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt
index 07a8f951eeafe50767aebb5617c2043edf6a362d..92d321d8c0af7eda21ab320e83e0e0f30f8b5216 100644
--- a/indra/newview/linux_tools/client-readme.txt
+++ b/indra/newview/linux_tools/client-readme.txt
@@ -55,10 +55,13 @@ Minimum requirements:
           is required.  If you are running a 64-bit Linux distribution then
           you will need its 32-bit compatibility environment installed, but
           this configuration is not currently supported.
+    * PulseAudio or ALSA Linux system sound software.  A recent PulseAudio
+      is the recommended configuration; see README-linux-voice.txt for more
+      information.
     * Video/Graphics Card:
           o nVidia GeForce 2, GeForce 4mx, or better (recommend one of the
             following: 6700, 6800, 7600, 7800, 7900, 8400, 8500, 8600,
-            8800, Go 7400, Go 7600, Go 7800, Go 7900)
+            8800, Go 7400, Go 7600, Go 7800, Go 7900, +)
           o OR ATI Radeon 8500, 9250, or better
           (nVidia cards are recommended for the Linux client)
 
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 2b582c90f00d2edb59e4647aa702398f122d2cfd..628982973c2525e813f408a5313517b6d9f96057 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -38,7 +38,6 @@
 #include "llagentlistener.h"
 #include "llagentwearables.h"
 #include "llagentui.h"
-
 #include "llanimationstates.h"
 #include "llbottomtray.h"
 #include "llcallingcard.h"
@@ -65,6 +64,7 @@
 #include "llsky.h"
 #include "llsmoothstep.h"
 #include "llstatusbar.h"
+#include "llteleportflags.h"
 #include "lltool.h"
 #include "lltoolmgr.h"
 #include "lltrans.h"
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 3114a37adaf7bf866cabb8372b2adfa6bb8629c3..1e2eac39ebc69676b7d8db70bd3ebc24ed51605b 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -41,7 +41,6 @@
 #include "llinventoryobserver.h"
 #include "llinventorypanel.h"
 #include "llnotificationsutil.h"
-#include "llnotify.h"
 #include "llviewerregion.h"
 #include "llvoavatarself.h"
 #include "llwearable.h"
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index c06098689db5def39e6b985112f270c88d4f41bd..43b2f34ecd78ca3499df6c898b5a22310cd03871 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -455,7 +455,10 @@ void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit
 		LLViewerInventoryItem *item = items.get(i);
 		if (keep_outfit_links && (item->getActualType() == LLAssetType::AT_LINK_FOLDER))
 			continue;
-		gInventory.purgeObject(item->getUUID());
+		if (item->getIsLinkType())
+		{
+			gInventory.purgeObject(item->getUUID());
+		}
 	}
 }
 
@@ -871,10 +874,48 @@ bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventor
 			(a->getWearableType() == b->getWearableType()));
 }
 
+class LLDeferredCOFLinkObserver: public LLInventoryObserver
+{
+public:
+	LLDeferredCOFLinkObserver(const LLUUID& item_id, bool do_update):
+		mItemID(item_id),
+		mDoUpdate(do_update)
+	{
+	}
+
+	~LLDeferredCOFLinkObserver()
+	{
+	}
+	
+	/* virtual */ void changed(U32 mask)
+	{
+		const LLInventoryItem *item = gInventory.getItem(mItemID);
+		if (item)
+		{
+			gInventory.removeObserver(this);
+			LLAppearanceManager::instance().addCOFItemLink(item,mDoUpdate);
+			delete this;
+		}
+	}
+
+private:
+	const LLUUID mItemID;
+	bool mDoUpdate;
+};
+
+
 void LLAppearanceManager::addCOFItemLink(const LLUUID &item_id, bool do_update )
 {
 	const LLInventoryItem *item = gInventory.getItem(item_id);
-	addCOFItemLink(item, do_update);
+	if (!item)
+	{
+		LLDeferredCOFLinkObserver *observer = new LLDeferredCOFLinkObserver(item_id, do_update);
+		gInventory.addObserver(observer);
+	}
+	else
+	{
+		addCOFItemLink(item, do_update);
+	}
 }
 
 void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_update )
@@ -909,7 +950,10 @@ void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_up
 		else if (areMatchingWearables(vitem,inv_item))
 		{
 			gAgentWearables.removeWearable(inv_item->getWearableType(),true,0);
-			gInventory.purgeObject(inv_item->getUUID());
+			if (inv_item->getIsLinkType())
+			{
+				gInventory.purgeObject(inv_item->getUUID());
+			}
 		}
 	}
 	if (linked_already)
@@ -958,10 +1002,9 @@ void LLAppearanceManager::removeCOFItemLinks(const LLUUID& item_id, bool do_upda
 	for (S32 i=0; i<item_array.count(); i++)
 	{
 		const LLInventoryItem* item = item_array.get(i).get();
-		if (item->getLinkedUUID() == item_id)
+		if (item->getIsLinkType() && item->getLinkedUUID() == item_id)
 		{
-			const LLUUID& item_id = item_array.get(i)->getUUID();
-			gInventory.purgeObject(item_id);
+			gInventory.purgeObject(item->getUUID());
 		}
 	}
 	if (do_update)
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 7fb821c61d96a9e99be095031b28775c54b6e24f..753388427a337926717f549a002aa377fffa3bfe 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -39,7 +39,6 @@
 #include "llfeaturemanager.h"
 #include "lluictrlfactory.h"
 #include "lltexteditor.h"
-#include "llalertdialog.h"
 #include "llerrorcontrol.h"
 #include "llviewertexturelist.h"
 #include "llgroupmgr.h"
@@ -86,11 +85,14 @@
 #include "llsecondlifeurls.h"
 
 // Linden library includes
+#include "llimagej2c.h"
 #include "llmemory.h"
 #include "llprimitive.h"
 #include "llurlaction.h"
+#include "llvfile.h"
 #include "llvfsthread.h"
 #include "llvolumemgr.h"
+#include "llxfermanager.h"
 
 #include "llnotificationmanager.h"
 #include "llnotifications.h"
@@ -110,7 +112,6 @@
 #include "apr_dso.h"
 #include <boost/lexical_cast.hpp>
 
-#include "llnotify.h"
 #include "llviewerkeyboard.h"
 #include "lllfsthread.h"
 #include "llworkerthread.h"
@@ -392,7 +393,6 @@ bool handleCrashSubmitBehaviorChanged(const LLSD& newvalue)
 static void settings_to_globals()
 {
 	LLBUTTON_H_PAD		= gSavedSettings.getS32("ButtonHPad");
-	LLBUTTON_V_PAD		= gSavedSettings.getS32("ButtonVPad");
 	BTN_HEIGHT_SMALL	= gSavedSettings.getS32("ButtonHeightSmall");
 	BTN_HEIGHT			= gSavedSettings.getS32("ButtonHeight");
 
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index c1bfbca8686c2f778c08fc13ef64ed3eb1790966..40e74061b541386c4d35f20b693fc542d4f865a5 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -325,6 +325,7 @@ extern BOOL		gUseWireframe;
 // VFS globals - gVFS is for general use
 // gStaticVFS is read-only and is shipped w/ the viewer
 // it has pre-cache data like the UI .TGAs
+class LLVFS;
 extern LLVFS	*gStaticVFS;
 
 extern LLMemoryInfo gSysMemory;
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index f5d5559bda59a817248af03ed2ea8e9534a0b6c7..a0be6efdc253bc5459af3d0890d9aeca2dcc86aa 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -39,7 +39,6 @@
 #include "llcompilequeue.h"
 #include "llfloaterbuycurrency.h"
 #include "llfilepicker.h"
-#include "llnotify.h"
 #include "llinventoryobserver.h"
 #include "llinventorypanel.h"
 #include "llfloaterimportcollada.h"
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 5f90a7627f3727fef031b12fa58d868a4050dd96..c5a1ffdcb3931a0f5f83ee71b5e6722f853b2826 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -61,6 +61,7 @@
 #include "llviewerregion.h"
 #include "llimfloater.h"
 #include "lltrans.h"
+#include "llcallingcard.h"
 
 // static
 void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name)
@@ -210,11 +211,9 @@ void LLAvatarActions::startCall(const LLUUID& id)
 
 	std::string name;
 	gCacheName->getFullName(id, name);
-	LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id);
+	LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id, true);
 	if (session_id != LLUUID::null)
 	{
-		// always open IM window when connecting to voice
-		LLIMFloater::show(session_id);
 		gIMMgr->startCall(session_id);
 	}
 	make_ui_sound("UISndStartIM");
@@ -238,15 +237,12 @@ void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)
 	// create the new ad hoc voice session
 	const std::string title = LLTrans::getString("conference-title");
 	LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START,
-										   ids[0], id_array);
+										   ids[0], id_array, true);
 	if (session_id == LLUUID::null)
 	{
 		return;
 	}
 
-	// always open IM window when connecting to voice
-	LLIMFloater::show(session_id);
-
 	// start the call once the session has fully initialized
 	gIMMgr->autoStartCallOnStartup(session_id);
 
@@ -265,6 +261,21 @@ bool LLAvatarActions::isCalling(const LLUUID &id)
 	return (LLIMModel::getInstance()->findIMSession(session_id) != NULL);
 }
 
+//static
+bool LLAvatarActions::canCall(const LLUUID &id)
+{
+	// For now we do not need to check whether passed UUID is ID of agent's friend.
+	// Use common check of Voice Client state.
+	{
+		// don't need to check online/offline status because "usual resident" (resident that is not a friend)
+		// can be only ONLINE. There is no way to see "usual resident" in OFFLINE status. If we see "usual
+		// resident" it automatically means that the resident is ONLINE. So to make a call to the "usual resident"
+		// we need to check only that "our" voice is enabled.
+		return LLVoiceClient::voiceEnabled();
+	}
+
+}
+
 // static
 void LLAvatarActions::startConference(const std::vector<LLUUID>& ids)
 {
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 2dd2a4c4b12b3fcc0dba969cce1040e6d3d1ded6..01c18d42285e5b8b6decfea1b4d6b144cd13bc60 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -128,6 +128,11 @@ public:
 	 */
 	static bool isCalling(const LLUUID &id);
 
+	/**
+	 * @return true if call to the resident can be made (resident is online and voice is enabled)
+	 */
+
+	static bool canCall(const LLUUID &id);
 	/**
 	 * Invite avatar to a group.
 	 */	
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 8c793873f489b05d20a9cc4ea73e9b4e47f8d02c..6f2e666cc74ef729e60a8546d66073c4d8687702 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -78,6 +78,9 @@ LLBottomTray::LLBottomTray(const LLSD&)
 	LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraPresets, _2));
 	LLIMMgr::getInstance()->addSessionObserver(this);
 
+	//managing chiclets for voice calls
+	LLIMModel::getInstance()->addNewMsgCallback(boost::bind(&LLBottomTray::onNewIM, this, _1));
+
 	//this is to fix a crash that occurs because LLBottomTray is a singleton
 	//and thus is deleted at the end of the viewers lifetime, but to be cleanly
 	//destroyed LLBottomTray requires some subsystems that are long gone
@@ -143,25 +146,22 @@ LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id)
 //virtual
 void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
 {
-	if(getChicletPanel())
-	{
-		if(getChicletPanel()->findChiclet<LLChiclet>(session_id))
-		{
+	if (!getChicletPanel()) return;
 
-		}
-		else
-		{
-			LLIMChiclet* chiclet = createIMChiclet(session_id);
-			if(chiclet)
-			{
-				chiclet->setIMSessionName(name);
-				chiclet->setOtherParticipantId(other_participant_id);
-			}
-			else
-			{
-				llerrs << "Could not create chiclet" << llendl;
-			}
-		}
+	if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
+
+	// For im sessions started as voice call chiclet gets created on the first incoming message
+	if (gIMMgr->isVoiceCall(session_id)) return;
+
+	LLIMChiclet* chiclet = createIMChiclet(session_id);
+	if(chiclet)
+	{
+		chiclet->setIMSessionName(name);
+		chiclet->setOtherParticipantId(other_participant_id);
+	}
+	else
+	{
+		llerrs << "Could not create chiclet" << llendl;
 	}
 }
 
@@ -194,6 +194,32 @@ void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID&
 	}
 }
 
+void LLBottomTray::onNewIM(const LLSD& data)
+{
+	LLUUID from_id = data["from_id"];
+	if (from_id.isNull() || gAgentID == from_id) return;
+
+	LLUUID session_id = data["session_id"];
+	if (session_id.isNull()) return;
+
+	if (!gIMMgr->isVoiceCall(session_id)) return;
+
+	if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
+
+	//first real message, time to create chiclet
+	LLIMChiclet* chiclet = createIMChiclet(session_id);
+	if(chiclet)
+	{
+		chiclet->setIMSessionName(LLIMModel::getInstance()->getName(session_id));
+		chiclet->setOtherParticipantId(LLIMModel::getInstance()->getOtherParticipantID(session_id));
+	}
+}
+
+S32 LLBottomTray::getTotalUnreadIMCount()
+{
+	return getChicletPanel()->getTotalUnreadIMCount();
+}
+
 // virtual
 void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal)
 {
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index fa204ee9ea61ca2b14b788049523202fe0efcd6d..5cd3f157460b63182a83f706fb857c8576ba6cef 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -75,6 +75,10 @@ public:
 	virtual void sessionRemoved(const LLUUID& session_id);
 	void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
 
+	void onNewIM(const LLSD& data);
+
+	S32 getTotalUnreadIMCount();
+
 	virtual void reshape(S32 width, S32 height, BOOL called_from_parent);
 
 	virtual void onFocusLost();
@@ -90,6 +94,11 @@ public:
 	void showMoveButton(BOOL visible);
 	void showCameraButton(BOOL visible);
 	void showSnapshotButton(BOOL visible);
+	
+	/**
+	 * Creates IM Chiclet based on session type (IM chat or Group chat)
+	 */
+	LLIMChiclet* createIMChiclet(const LLUUID& session_id);
 
 private:
 	typedef enum e_resize_status_type
@@ -182,11 +191,6 @@ protected:
 	void onContextMenuItemClicked(const LLSD& userdata);
 	bool onContextMenuItemEnabled(const LLSD& userdata);
 
-	/**
-	 * Creates IM Chiclet based on session type (IM chat or Group chat)
-	 */
-	LLIMChiclet* createIMChiclet(const LLUUID& session_id);
-
 	LLChicletPanel* 	mChicletPanel;
 	LLPanel*			mSpeakPanel;
 	LLSpeakButton* 		mSpeakBtn;
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index 895b4ed80eb77c58cc8483745575d53a7f8f1ff4..1f238401090cef99a027d2607931faa2756aee29 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -33,13 +33,18 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llnotificationsutil.h"
+#include "lltrans.h"
+
 #include "llcallfloater.h"
 
+#include "llagent.h"
 #include "llagentdata.h" // for gAgentID
 #include "llavatarlist.h"
 #include "llbottomtray.h"
 #include "llparticipantlist.h"
 #include "llspeakers.h"
+#include "lltransientfloatermgr.h"
 
 
 class LLNonAvatarCaller : public LLAvatarListItem
@@ -73,14 +78,19 @@ static void* create_non_avatar_caller(void*)
 }
 
 LLCallFloater::LLCallFloater(const LLSD& key)
-: LLDockableFloater(NULL, key)
+: LLDockableFloater(NULL, false, key)
 , mSpeakerManager(NULL)
 , mPaticipants(NULL)
 , mAvatarList(NULL)
 , mNonAvatarCaller(NULL)
 , mVoiceType(VC_LOCAL_CHAT)
+, mAgentPanel(NULL)
+, mSpeakingIndicator(NULL)
+, mIsModeratorMutedVoice(false)
 {
 	mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL);
+	LLVoiceClient::getInstance()->addObserver(this);
+	LLTransientFloaterMgr::getInstance()->addControlView(this);
 }
 
 LLCallFloater::~LLCallFloater()
@@ -88,6 +98,14 @@ LLCallFloater::~LLCallFloater()
 	mChannelChangedConnection.disconnect();
 	delete mPaticipants;
 	mPaticipants = NULL;
+
+	// Don't use LLVoiceClient::getInstance() here 
+	// singleton MAY have already been destroyed.
+	if(gVoiceClient)
+	{
+		gVoiceClient->removeObserver(this);
+	}
+	LLTransientFloaterMgr::getInstance()->removeControlView(this);
 }
 
 // virtual
@@ -120,6 +138,34 @@ void LLCallFloater::onOpen(const LLSD& /*key*/)
 {
 }
 
+// virtual
+void LLCallFloater::draw()
+{
+	// we have to refresh participants to display ones not in voice as disabled.
+	// It should be done only when she joins or leaves voice chat.
+	// But seems that LLVoiceClientParticipantObserver is not enough to satisfy this requirement.
+	// *TODO: mantipov: remove from draw()
+	onChange();
+
+	bool is_moderator_muted = gVoiceClient->getIsModeratorMuted(gAgentID);
+
+	if (mIsModeratorMutedVoice != is_moderator_muted)
+	{
+		setModeratorMutedVoice(is_moderator_muted);
+	}
+
+	LLDockableFloater::draw();
+}
+
+// virtual
+void LLCallFloater::onChange()
+{
+	if (NULL == mPaticipants) return;
+
+	mPaticipants->refreshVoiceState();
+}
+
+
 //////////////////////////////////////////////////////////////////////////
 /// PRIVATE SECTION
 //////////////////////////////////////////////////////////////////////////
@@ -165,9 +211,19 @@ void LLCallFloater::updateSession()
 			mVoiceType = VC_PEER_TO_PEER;
 			break;
 		case IM_SESSION_CONFERENCE_START:
-			mVoiceType = VC_AD_HOC_CHAT;
+		case IM_SESSION_GROUP_START:
+		case IM_SESSION_INVITE:
+			if (gAgent.isInGroup(session_id))
+			{
+				mVoiceType = VC_GROUP_CHAT;
+			}
+			else
+			{
+				mVoiceType = VC_AD_HOC_CHAT;				
+			}
 			break;
 		default:
+			llwarning("Failed to determine voice call IM type", 0);
 			mVoiceType = VC_GROUP_CHAT;
 			break;
 		}
@@ -185,9 +241,10 @@ void LLCallFloater::updateSession()
 	
 	//hide "Leave Call" button for nearby chat
 	bool is_local_chat = mVoiceType == VC_LOCAL_CHAT;
-	childSetVisible("leave_btn_panel", !is_local_chat);
+	childSetVisible("leave_call_btn", !is_local_chat);
 	
 	refreshPartisipantList();
+	updateModeratorState();
 }
 
 void LLCallFloater::refreshPartisipantList()
@@ -220,11 +277,20 @@ void LLCallFloater::refreshPartisipantList()
 		{
 			mAvatarList->setNoItemsCommentText(getString("no_one_near"));
 		}
+		mPaticipants->refreshVoiceState();	
 	}
 }
 
 void LLCallFloater::onCurrentChannelChanged(const LLUUID& /*session_id*/)
 {
+	// Don't update participant list if no channel info is available.
+	// Fix for ticket EXT-3427
+	// @see LLParticipantList::~LLParticipantList()
+	if(LLVoiceChannel::getCurrentVoiceChannel() && 
+		LLVoiceChannel::STATE_NO_CHANNEL_INFO == LLVoiceChannel::getCurrentVoiceChannel()->getState())
+	{
+		return;
+	}
 	// Forget speaker manager from the previous session to avoid using it after session was destroyed.
 	mSpeakerManager = NULL;
 	updateSession();
@@ -263,13 +329,52 @@ void LLCallFloater::updateTitle()
 
 void LLCallFloater::initAgentData()
 {
-	childSetValue("user_icon", gAgentID);
+	mAgentPanel = getChild<LLPanel> ("my_panel");
+
+	if ( mAgentPanel )
+	{
+		mAgentPanel->childSetValue("user_icon", gAgentID);
+
+		std::string name;
+		gCacheName->getFullName(gAgentID, name);
+		mAgentPanel->childSetValue("user_text", name);
+
+		mSpeakingIndicator = mAgentPanel->getChild<LLOutputMonitorCtrl>("speaking_indicator");
+		mSpeakingIndicator->setSpeakerId(gAgentID);
+	}
+}
+
+void LLCallFloater::setModeratorMutedVoice(bool moderator_muted)
+{
+	mIsModeratorMutedVoice = moderator_muted;
 
+	if (moderator_muted)
+	{
+		LLNotificationsUtil::add("VoiceIsMutedByModerator");
+	}
+	mSpeakingIndicator->setIsMuted(moderator_muted);
+}
+
+void LLCallFloater::updateModeratorState()
+{
 	std::string name;
 	gCacheName->getFullName(gAgentID, name);
-	childSetValue("user_text", name);
 
-	LLOutputMonitorCtrl* speaking_indicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");
-	speaking_indicator->setSpeakerId(gAgentID);
+	if(gAgent.isInGroup(mSpeakerManager->getSessionID()))
+	{
+		// This method can be called when LLVoiceChannel.mState == STATE_NO_CHANNEL_INFO
+		// in this case there are no any speakers yet.
+		if (mSpeakerManager->findSpeaker(gAgentID))
+		{
+			// Agent is Moderator
+			if (mSpeakerManager->findSpeaker(gAgentID)->mIsModerator)
+
+			{
+				const std::string moderator_indicator(LLTrans::getString("IM_moderator_label")); 
+				name += " " + moderator_indicator;
+			}
+		}
+	}
+	mAgentPanel->childSetValue("user_text", name);
 }
 //EOF
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
index b615f57d5baae7c31fabf2ce0cbdd70829c4127e..b2288a42ff120124ec918efbafbb57e57046f695 100644
--- a/indra/newview/llcallfloater.h
+++ b/indra/newview/llcallfloater.h
@@ -35,12 +35,13 @@
 #define LL_LLCALLFLOATER_H
 
 #include "lldockablefloater.h"
+#include "llvoiceclient.h"
 
 class LLAvatarList;
 class LLNonAvatarCaller;
+class LLOutputMonitorCtrl;
 class LLParticipantList;
 class LLSpeakerMgr;
-
 /**
  * The Voice Control Panel is an ambient window summoned by clicking the flyout chevron on the Speak button.
  * It can be torn-off and freely positioned onscreen.
@@ -52,7 +53,7 @@ class LLSpeakerMgr;
  * When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel also provides an 
  * 'Leave Call' button to allow the Resident to leave that voice channel.
  */
-class LLCallFloater : public LLDockableFloater
+class LLCallFloater : public LLDockableFloater, LLVoiceClientParticipantObserver
 {
 public:
 	LLCallFloater(const LLSD& key);
@@ -60,6 +61,14 @@ public:
 
 	/*virtual*/ BOOL postBuild();
 	/*virtual*/ void onOpen(const LLSD& key);
+	/*virtual*/ void draw();
+
+	/**
+	 * Is called by LLVoiceClient::notifyParticipantObservers when voice participant list is changed.
+	 *
+	 * Refreshes list to display participants not in voice as disabled.
+	 */
+	/*virtual*/ void onChange();
 
 private:
 	typedef enum e_voice_controls_type
@@ -87,6 +96,8 @@ private:
 	void onCurrentChannelChanged(const LLUUID& session_id);
 	void updateTitle();
 	void initAgentData();
+	void setModeratorMutedVoice(bool moderator_muted);
+	void updateModeratorState();
 
 private:
 	LLSpeakerMgr* mSpeakerManager;
@@ -94,6 +105,9 @@ private:
 	LLAvatarList* mAvatarList;
 	LLNonAvatarCaller* mNonAvatarCaller;
 	EVoiceControls mVoiceType;
+	LLPanel* mAgentPanel;
+	LLOutputMonitorCtrl* mSpeakingIndicator;
+	bool mIsModeratorMutedVoice;
 
 	boost::signals2::connection mChannelChangedConnection;
 };
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index 714bd20ab888ab34f32119109590b5d874a3d4c6..82413878adb587611c96c0d48c8a959c57576073 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -55,7 +55,6 @@
 #include "llinventorymodel.h"
 #include "llnotifications.h"
 #include "llnotificationsutil.h"
-#include "llnotify.h"
 #include "llresmgr.h"
 #include "llimview.h"
 #include "llviewercontrol.h"
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 415c118ff1b5eaa8f936e867e487500db2d06c56..cbb566b3a71805ed91f1ea9c829fc5831c08d9f1 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -228,3 +228,14 @@ void LLChannelManager::muteAllChannels(bool mute)
 	}
 }
 
+void LLChannelManager::killToastsFromChannel(const LLUUID& channel_id, const LLScreenChannel::Matcher& matcher)
+{
+	LLScreenChannel
+			* screen_channel =
+					dynamic_cast<LLScreenChannel*> (findChannelByID(channel_id));
+	if (screen_channel != NULL)
+	{
+		screen_channel->killMatchedToasts(matcher);
+	}
+}
+
diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h
index 4b66a1ef8922bed27e92d18dd239d5c1b7b687cc..c2be39122f4d106937b718b0f1479d9440af0108 100644
--- a/indra/newview/llchannelmanager.h
+++ b/indra/newview/llchannelmanager.h
@@ -109,6 +109,11 @@ public:
 	 */
 	void muteAllChannels(bool mute);
 
+	/**
+	 * Kills matched toasts from specified  toast screen channel.
+	 */
+	void killToastsFromChannel(const LLUUID& channel_id, const LLScreenChannel::Matcher& matcher);
+
 private:
 
 	LLScreenChannel* createChannel(LLChannelManager::Params& p);
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index efe9ea4c350fade1153896f4844a92e144ea3dc2..ee60df1b4bea964ff8a9a7b06fa050469089b0f6 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -49,6 +49,8 @@
 
 static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
 
+const static std::string NEW_LINE(rawstr_to_utf8("\n"));
+
 class LLChatHistoryHeader: public LLPanel
 {
 public:
@@ -332,12 +334,12 @@ LLChatHistory::~LLChatHistory()
 {
 	static LLUICachedControl<S32> texteditor_border ("UITextEditorBorder", 0);
 
-	LLRect old_text_rect = mTextRect;
-	mTextRect = mScroller->getContentWindowRect();
-	mTextRect.stretch(-texteditor_border);
-	mTextRect.mLeft += mLeftTextPad;
-	mTextRect.mRight -= mRightTextPad;
-	if (mTextRect != old_text_rect)
+	LLRect old_text_rect = mVisibleTextRect;
+	mVisibleTextRect = mScroller->getContentWindowRect();
+	mVisibleTextRect.stretch(-texteditor_border);
+	mVisibleTextRect.mLeft += mLeftTextPad;
+	mVisibleTextRect.mRight -= mRightTextPad;
+	if (mVisibleTextRect != old_text_rect)
 	{
 		needsReflow();
 	}
@@ -454,10 +456,21 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
 
 		if (chat.mFromName.size() > 0)
 			appendText(chat.mFromName + " ", TRUE, style_params);
-		appendText(chat.mText.substr(4), FALSE, style_params);
+		// Ensure that message ends with NewLine, to avoid losing of new lines
+		// while copy/paste from text chat. See EXT-3263.
+		appendText(chat.mText.substr(4) + NEW_LINE, FALSE, style_params);
 	}
 	else
-		appendText(chat.mText, FALSE, style_params);
+	{
+		std::string message(chat.mText);
+		if ( message.size() > 0 && !LLStringOps::isSpace(message[message.size() - 1]) )
+		{
+			// Ensure that message ends with NewLine, to avoid losing of new lines
+			// while copy/paste from text chat. See EXT-3263.
+			message += NEW_LINE;
+		}
+		appendText(message, FALSE, style_params);
+	}
 	blockUndo();
 }
 
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 30967677e8630075509cf8de8b4ecf3d83d0c2ee..c6fe076911e92a9d07558190cc2cb61981a7b403 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -53,6 +53,7 @@
 #include "llgroupmgr.h"
 #include "llnotificationmanager.h"
 #include "lltransientfloatermgr.h"
+#include "llsyswellwindow.h"
 
 static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel");
 static LLDefaultChildRegistry::Register<LLIMWellChiclet> t2_0("chiclet_im_well");
@@ -88,6 +89,14 @@ class LLSysWellChiclet::FlashToLitTimer : public LLEventTimer
 {
 public:
 	typedef boost::function<void()> callback_t;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param count - how many times callback should be called (twice to not change original state)
+	 * @param period - how frequently callback should be called
+	 * @param cb - callback to be called each tick
+	 */
 	FlashToLitTimer(S32 count, F32 period, callback_t cb)
 		: LLEventTimer(period)
 		, mCallback(cb)
@@ -111,8 +120,17 @@ public:
 		mEventTimer.start();
 	}
 
+	void stopFlashing()
+	{
+		mEventTimer.stop();
+	}
+
 private:
 	callback_t		mCallback;
+
+	/**
+	 * How many times Well will blink.
+	 */
 	S32 mFlashCount;
 	S32 mCurrentFlashCount;
 };
@@ -134,6 +152,7 @@ LLSysWellChiclet::LLSysWellChiclet(const Params& p)
 , mButton(NULL)
 , mCounter(0)
 , mMaxDisplayedCount(p.max_displayed_count)
+, mIsNewMessagesState(false)
 , mFlashToLitTimer(NULL)
 {
 	LLButton::Params button_params = p.button;
@@ -163,20 +182,20 @@ void LLSysWellChiclet::setCounter(S32 counter)
 
 	mButton->setLabel(s_count);
 
-	/*
-	Emulate 4 states of button by background images, see detains in EXT-3147
-	xml attribute           Description
-	image_unselected        "Unlit" - there are no new messages
-	image_selected          "Unlit" + "Selected" - there are no new messages and the Well is open
-	image_pressed           "Lit" - there are new messages
-	image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well is open
-	*/
-	mButton->setForcePressedState(counter > 0);
+	setNewMessagesState(counter > 0);
 
-	if (mCounter == 0 && counter > 0)
+	// we have to flash to 'Lit' state each time new unread message is comming.
+	if (counter > mCounter)
 	{
 		mFlashToLitTimer->flash();
 	}
+	else if (counter == 0)
+	{
+		// if notification is resolved while well is flashing it can leave in the 'Lit' state
+		// when flashing finishes itself. Let break flashing here.
+		mFlashToLitTimer->stopFlashing();
+	}
+
 	mCounter = counter;
 }
 
@@ -192,11 +211,22 @@ void LLSysWellChiclet::setToggleState(BOOL toggled) {
 
 void LLSysWellChiclet::changeLitState()
 {
-	static bool set_lit = false;
+	setNewMessagesState(!mIsNewMessagesState);
+}
 
-	mButton->setForcePressedState(set_lit);
+void LLSysWellChiclet::setNewMessagesState(bool new_messages)
+{
+	/*
+	Emulate 4 states of button by background images, see detains in EXT-3147
+	xml attribute           Description
+	image_unselected        "Unlit" - there are no new messages
+	image_selected          "Unlit" + "Selected" - there are no new messages and the Well is open
+	image_pressed           "Lit" - there are new messages
+	image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well is open
+	*/
+	mButton->setForcePressedState(new_messages);
 
-	set_lit ^= true;
+	mIsNewMessagesState = new_messages;
 }
 
 /************************************************************************/
@@ -209,6 +239,8 @@ LLIMWellChiclet::LLIMWellChiclet(const Params& p)
 	LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(&LLIMWellChiclet::messageCountChanged, this, _1));
 
 	LLIMMgr::getInstance()->addSessionObserver(this);
+
+	LLIMWellWindow::getInstance()->setSysWellChiclet(this);
 }
 
 LLIMWellChiclet::~LLIMWellChiclet()
@@ -218,8 +250,7 @@ LLIMWellChiclet::~LLIMWellChiclet()
 
 void LLIMWellChiclet::messageCountChanged(const LLSD& session_data)
 {
-	S32 total_unread = LLIMMgr::instance().getNumberOfUnreadParticipantMessages();
-	setCounter(total_unread);
+	setCounter(LLBottomTray::getInstance()->getTotalUnreadIMCount());
 }
 
 /************************************************************************/
@@ -233,6 +264,10 @@ LLNotificationChiclet::LLNotificationChiclet(const Params& p)
 	connectCounterUpdatersToSignal("notify");
 	connectCounterUpdatersToSignal("groupnotify");
 	connectCounterUpdatersToSignal("offer");
+
+	// ensure that notification well window exists, to synchronously
+	// handle toast add/delete events.
+	LLNotificationWellWindow::getInstance()->setSysWellChiclet(this);
 }
 
 void LLNotificationChiclet::connectCounterUpdatersToSignal(const std::string& notification_type)
@@ -1493,6 +1528,21 @@ bool LLChicletPanel::isAnyIMFloaterDoked()
 	return res;
 }
 
+S32 LLChicletPanel::getTotalUnreadIMCount()
+{
+	S32 count = 0;
+	chiclet_list_t::const_iterator it = mChicletList.begin();
+	for( ; mChicletList.end() != it; ++it)
+	{
+		LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
+		if(chiclet)
+		{
+			count += chiclet->getCounter();
+		}
+	}
+	return count;
+}
+
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index 65abcd1f5fcd70d9203467877593b27d21ce8f7c..b3341f78a87f3ee3cf86150ce24aae5173d05770 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -791,6 +791,8 @@ public:
 
 	void setToggleState(BOOL toggled);
 
+	void setNewMessagesState(bool new_messages);
+
 protected:
 
 	LLSysWellChiclet(const Params& p);
@@ -809,11 +811,8 @@ protected:
 	LLButton* mButton;
 	S32 mCounter;
 	S32 mMaxDisplayedCount;
+	bool mIsNewMessagesState;
 
-	/**
-	 * How many times Well will blink.
-	 */
-	S32 mFlashToLitCount;
 	FlashToLitTimer* mFlashToLitTimer;
 
 };
@@ -964,6 +963,8 @@ public:
 
 	S32 getMinWidth() const { return mMinWidth; }
 
+	S32 getTotalUnreadIMCount();
+
 protected:
 	LLChicletPanel(const Params&p);
 	friend class LLUICtrlFactory;
diff --git a/indra/newview/lldelayedgestureerror.cpp b/indra/newview/lldelayedgestureerror.cpp
index 411cb331a899e76754e9259a05462cae2078fffb..ead377deb02ab727789d4fb1d2ea55ae7d5cb499 100644
--- a/indra/newview/lldelayedgestureerror.cpp
+++ b/indra/newview/lldelayedgestureerror.cpp
@@ -36,7 +36,6 @@
 
 #include <list>
 #include "llnotificationsutil.h"
-#include "llnotify.h"
 #include "llcallbacklist.h"
 #include "llinventory.h"
 #include "llviewerinventory.h"
diff --git a/indra/newview/lleventnotifier.cpp b/indra/newview/lleventnotifier.cpp
index b64799bd86569d239412902e715ed2099844dc21..edfb9dc864fb78f9e1ee81d40a82dcca42cad211 100644
--- a/indra/newview/lleventnotifier.cpp
+++ b/indra/newview/lleventnotifier.cpp
@@ -37,7 +37,6 @@
 #include "llnotificationsutil.h"
 #include "message.h"
 
-#include "llnotify.h"
 #include "lleventinfo.h"
 #include "llfloaterreg.h"
 #include "llfloaterworldmap.h"
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index bd6936f05c65542188716f5286f3b405fb3caed0..9f6412c0ab59f55d13e6ac13761fd631eaeec698 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -51,8 +51,16 @@ public:
 	/*virtual*/ bool	getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const 
 	{
 		// more label always spans width of text box
-		width = mEditor.getTextRect().getWidth() - mEditor.getHPad(); 
-		height = llceil(mStyle->getFont()->getLineHeight());
+		if (num_chars == 0)
+		{
+			width = 0; 
+			height = 0;
+		}
+		else
+		{
+			width = mEditor.getDocumentView()->getRect().getWidth() - mEditor.getHPad(); 
+			height = llceil(mStyle->getFont()->getLineHeight());
+		}
 		return true;
 	}
 	/*virtual*/ S32		getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const 
@@ -104,7 +112,8 @@ private:
 
 LLExpandableTextBox::LLTextBoxEx::Params::Params()
 :	more_label("more_label")
-{}
+{
+}
 
 LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p)
 :	LLTextBox(p),
@@ -117,16 +126,13 @@ LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p)
 
 void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
+	hideExpandText();
 	LLTextBox::reshape(width, height, called_from_parent);
 
 	if (getTextPixelHeight() > getRect().getHeight())
 	{
 		showExpandText();
 	}
-	else
-	{
-		hideExpandText();
-	}
 }
 
 void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params)
@@ -316,8 +322,16 @@ void LLExpandableTextBox::expandTextBox()
 	// hide "more" link, and show full text contents
 	mTextBox->hideExpandText();
 
+	// *HACK dz
+	// hideExpandText brakes text styles (replaces hyper-links with plain text), see ticket EXT-3290
+	// Set text again to make text box re-apply styles.
+	// *TODO Find proper solution to fix this issue.
+	// Maybe add removeSegment to LLTextBase
+	mTextBox->setTextBase(mText);
+
 	S32 text_delta = mTextBox->getVerticalTextDelta();
-	text_delta += mTextBox->getVPad() * 2 + mScroll->getBorderWidth() * 2;
+	text_delta += mTextBox->getVPad() * 2;
+	text_delta += mScroll->getBorderWidth() * 2;
 	// no need to expand
 	if(text_delta <= 0)
 	{
diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h
index 7c989cfa50ec4fa595fe4660045b2178a1bda398..2b4f9e527cdc84871fd67dfd48943d44d77c712d 100644
--- a/indra/newview/llexpandabletextbox.h
+++ b/indra/newview/llexpandabletextbox.h
@@ -61,6 +61,7 @@ protected:
 		// adds or removes "More" link as needed
 		/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
 		/*virtual*/ void setText(const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params());
+		void setTextBase(const std::string& text) { LLTextBase::setText(text); }
 
 		/**
 		 * Returns difference between text box height and text height.
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 17b071081308e05f61aa1b1301006887b49f5206..826cb0bb3bc6a0853f6be6c30c47d3607c4ed5fc 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -370,6 +370,7 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p)
 	mLandingTab(NULL),
 	mLastTab(NULL),
 	mTabsHighlightEnabled(TRUE)
+  , mUpdateDropDownItems(true)
 {
 	// Register callback for menus with current registrar (will be parent panel's registrar)
 	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Favorites.DoToSelected",
@@ -589,16 +590,15 @@ void LLFavoritesBarCtrl::changed(U32 mask)
 	}	
 	else
 	{
-		updateButtons(getRect().getWidth());
+		updateButtons();
 	}
 }
 
 //virtual
 void LLFavoritesBarCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
-	updateButtons(width);
-
 	LLUICtrl::reshape(width, height, called_from_parent);
+	updateButtons();
 }
 
 void LLFavoritesBarCtrl::draw()
@@ -637,7 +637,7 @@ LLXMLNodePtr LLFavoritesBarCtrl::getButtonXMLNode()
 	return buttonXMLNode;
 }
 
-void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
+void LLFavoritesBarCtrl::updateButtons()
 {
 	mItems.clear();
 
@@ -652,139 +652,146 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
 		return;
 	}
 
-	S32 buttonWidth = 120; //default value
-	buttonXMLNode->getAttributeS32("width", buttonWidth);
-	S32 buttonHGap = 2; // default value
-	buttonXMLNode->getAttributeS32("left", buttonHGap);
-	
-	S32 count = mItems.count();
-	S32 buttons_space = bar_width - buttonHGap;
-
-	S32 first_drop_down_item = count;
-
-	// Calculating, how much buttons can fit in the bar
-	S32 buttons_width = 0;
-	for (S32 i = 0; i < count; ++i)
+	const child_list_t* childs = getChildList();
+	child_list_const_iter_t child_it = childs->begin();
+	int first_changed_item_index = 0;
+	int rightest_point = getRect().mRight - mChevronButton->getRect().getWidth();
+	//lets find first changed button
+	while (child_it != childs->end())
 	{
-		buttons_width += buttonWidth + buttonHGap;
-		if (buttons_width > buttons_space)
+		LLFavoriteLandmarkButton* button = dynamic_cast<LLFavoriteLandmarkButton*> (*child_it);
+		if (button)
 		{
-			// There is no space for all buttons.
-			// Calculating the number of buttons, that are fit with chevron button
-			buttons_space -= mChevronButton->getRect().getWidth() + buttonHGap;
-			while (i >= 0 && buttons_width > buttons_space)
+			const LLViewerInventoryItem *item = mItems[first_changed_item_index].get();
+			if (item)
 			{
-				buttons_width -= buttonWidth + buttonHGap;
-				i--;
+				// an child's order  and mItems  should be same   
+				if (button->getLandmarkId() != item->getUUID() // sort order has been changed
+					|| button->getLabelSelected() != item->getDisplayName() // favorite's name has been changed
+					|| button->getRect().mRight < rightest_point) // favbar's width has been changed
+				{
+					break;
+				}
 			}
-			first_drop_down_item = i + 1; // First item behind visible items
-			
-			break;
+			first_changed_item_index++;
 		}
+		child_it++;
 	}
+	// now first_changed_item_index should contains a number of button that need to change
 
-	bool recreate_buttons = true;
-
-	// If inventory items are not changed up to mFirstDropDownItem, no need to recreate them
-	if (mFirstDropDownItem == first_drop_down_item && (mItemNamesCache.size() == count || mItemNamesCache.size() == mFirstDropDownItem))
+	if (first_changed_item_index < mItems.count())
 	{
-		S32 i;
-		for (i = 0; i < mFirstDropDownItem; ++i)
+		mUpdateDropDownItems = true;
+		// Rebuild the buttons only
+		// child_list_t is a linked list, so safe to erase from the middle if we pre-incrament the iterator
+
+		while (child_it != childs->end())
 		{
-			if (mItemNamesCache.get(i) != mItems.get(i)->getName())
+			//lets remove other landmarks button and rebuild it
+			child_list_const_iter_t cur_it = child_it++;
+			LLFavoriteLandmarkButton* button =
+					dynamic_cast<LLFavoriteLandmarkButton*> (*cur_it);
+			if (button)
 			{
-				break;
+				removeChild(button);
+				delete button;
 			}
 		}
-		if (i == mFirstDropDownItem)
+		// we have to remove ChevronButton to make sure that the last item will be LandmarkButton to get the right aligning
+		if (mChevronButton->getParent() == this)
 		{
-			recreate_buttons = false;
+			removeChild(mChevronButton);
 		}
-	}
-
-	if (recreate_buttons)
-	{
-		mFirstDropDownItem = first_drop_down_item;
-
-		mItemNamesCache.clear();
-		for (S32 i = 0; i < mFirstDropDownItem; i++)
+		int last_right_edge = 0;
+		if (getChildList()->size() > 0)
 		{
-			mItemNamesCache.put(mItems.get(i)->getName());
+			last_right_edge = getChildList()->back()->getRect().mRight;
 		}
-
-		// Rebuild the buttons only
-		// child_list_t is a linked list, so safe to erase from the middle if we pre-incrament the iterator
-		for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); )
+		//last_right_edge is saving coordinates
+		LLButton* last_new_button = NULL;
+		int j = first_changed_item_index;
+		for (; j < mItems.count(); j++)
 		{
-			child_list_const_iter_t cur_it = child_it++;
-			LLView* viewp = *cur_it;
-			LLButton* button = dynamic_cast<LLButton*>(viewp);
-			if (button && (button != mChevronButton))
+			last_new_button = createButton(mItems[j], buttonXMLNode, last_right_edge);
+			if (!last_new_button)
 			{
-				removeChild(button);
-				delete button;
+				break;
 			}
-		}
+			sendChildToBack(last_new_button);
+			last_right_edge = last_new_button->getRect().mRight;
 
-		createButtons(mItems, buttonXMLNode, buttonWidth, buttonHGap);
-	}
-
-	// Chevron button
-	if (mFirstDropDownItem != count)
-	{
-		// Chevron button should stay right aligned
-		LLRect rect;
-		rect.setOriginAndSize(bar_width - mChevronButton->getRect().getWidth() - buttonHGap, 0, mChevronButton->getRect().getWidth(), mChevronButton->getRect().getHeight());
-		mChevronButton->setRect(rect);
-		mChevronButton->setVisible(TRUE);
+			mLastTab = last_new_button;
+		}
+		mFirstDropDownItem = j;
+		// Chevron button
+		if (mFirstDropDownItem < mItems.count())
+		{
+			S32 buttonHGap = 2; // default value
+			buttonXMLNode->getAttributeS32("left", buttonHGap);
+			LLRect rect;
+			// Chevron button should stay right aligned
+			rect.setOriginAndSize(getRect().mRight - mChevronButton->getRect().getWidth() - buttonHGap, 0,
+					mChevronButton->getRect().getWidth(),
+					mChevronButton->getRect().getHeight());
+
+			addChild(mChevronButton);
+			mChevronButton->setRect(rect);
+			mChevronButton->setVisible(TRUE);
+		}
 	}
 	else
 	{
-		// Hide chevron button if all items are visible on bar
-		mChevronButton->setVisible(FALSE);
+		mUpdateDropDownItems = false;
 	}
 }
 
-
-void LLFavoritesBarCtrl::createButtons(const LLInventoryModel::item_array_t &items, const LLXMLNodePtr &buttonXMLNode, S32 buttonWidth, S32 buttonHGap)
+LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem> item, LLXMLNodePtr &buttonXMLNode, S32 x_offset)
 {
-	S32 curr_x = buttonHGap;
-	// Adding buttons
+	S32 def_button_width = 120;
+	buttonXMLNode->getAttributeS32("width", def_button_width);
+	S32 button_x_delta = 2; // default value
+	buttonXMLNode->getAttributeS32("left", button_x_delta);
+	S32 curr_x = x_offset;
 
+	/**
+	 * WORKAROUND:
+	 * there are some problem with displaying of fonts in buttons. 
+	 * Empty space (or ...) is displaying instead of last symbols, even though the width of the button is enough.
+	 * Problem will gone, if we  stretch out the button. For that reason I have to put additional  10 pixels. 
+	 */
+	int requred_width = mFont->getWidth(item->getDisplayName()) + 10; 
+	int width = requred_width > def_button_width? def_button_width : requred_width;
 	LLFavoriteLandmarkButton* fav_btn = NULL;
-	mLandingTab = mLastTab = NULL;
 
-	for(S32 i = mFirstDropDownItem -1, j = 0; i >= 0; i--)
+	// do we have a place for next button + double buttonHGap + mChevronButton ? 
+	if(curr_x + width + 2*button_x_delta +  mChevronButton->getRect().getWidth() > getRect().mRight )
 	{
-		LLViewerInventoryItem* item = items.get(j++);
-
-		fav_btn = LLUICtrlFactory::defaultBuilder<LLFavoriteLandmarkButton>(buttonXMLNode, this, NULL);
-		if (NULL == fav_btn)
-		{
-			llwarns << "Unable to create button for landmark: " << item->getName() << llendl;
-			continue;
-		}
-
-		fav_btn->setLandmarkID(item->getUUID());
-		
-		// change only left and save bottom
-		fav_btn->setOrigin(curr_x, fav_btn->getRect().mBottom);
-		fav_btn->setFont(mFont);
-		fav_btn->setName(item->getName());
-		fav_btn->setLabel(item->getName());
-		fav_btn->setToolTip(item->getName());
-		fav_btn->setCommitCallback(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID()));
-		fav_btn->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3,_4 ));
-
-		fav_btn->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
-		fav_btn->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
-
-		sendChildToBack(fav_btn);
-
-		curr_x += buttonWidth + buttonHGap;
+		return NULL;
 	}
-
-	mLastTab = fav_btn;
+	fav_btn = LLUICtrlFactory::defaultBuilder<LLFavoriteLandmarkButton>(buttonXMLNode, this, NULL);
+	if (NULL == fav_btn)
+	{
+		llwarns << "Unable to create LLFavoriteLandmarkButton widget: " << item->getName() << llendl;
+		return NULL;
+	}
+	
+	LLRect butt_rect (fav_btn->getRect());
+	fav_btn->setLandmarkID(item->getUUID());
+	butt_rect.setOriginAndSize(curr_x + button_x_delta, fav_btn->getRect().mBottom, width, fav_btn->getRect().getHeight());
+	
+	fav_btn->setRect(butt_rect);
+	// change only left and save bottom
+	fav_btn->setFont(mFont);
+	fav_btn->setName(item->getName());
+	fav_btn->setLabel(item->getName());
+	fav_btn->setToolTip(item->getName());
+	fav_btn->setCommitCallback(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID()));
+	fav_btn->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3,_4 ));
+
+	fav_btn->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
+	fav_btn->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
+
+	return fav_btn;
 }
 
 
@@ -844,99 +851,61 @@ void LLFavoritesBarCtrl::showDropDownMenu()
 
 	LLToggleableMenu* menu = (LLToggleableMenu*)mPopupMenuHandle.get();
 
-	if(menu)
+	if (menu)
 	{
 		if (!menu->toggleVisibility())
 			return;
 
-		mItems.clear();
-
-		if (!collectFavoriteItems(mItems))
-		{
-			return;
-		}
-
-		S32 count = mItems.count();
-
-		// Check it there are changed items, since last call
-		if (mItemNamesCache.size() == count)
-		{
-			S32 i;
-			for (i = mFirstDropDownItem; i < count; i++)
-			{
-				if (mItemNamesCache.get(i) != mItems.get(i)->getName())
-				{
-					break;
-				}
-			}
-
-			// Check passed, just show the menu
-			if (i == count)
-			{
-				menu->buildDrawLabels();
-				menu->updateParent(LLMenuGL::sMenuContainer);
-
-				if (menu->getButtonRect().isEmpty())
-				{
-					menu->setButtonRect(mChevronButton->getRect(), this);
-				}
-
-				LLMenuGL::showPopup(this, menu, getRect().getWidth() - menu->getRect().getWidth(), 0);
-				return;
-			}
-		}
-
-		// Add menu items to cache, if there is only names of buttons
-		if (mItemNamesCache.size() == mFirstDropDownItem)
+		U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth());
+		if (mUpdateDropDownItems)
 		{
-			for (S32 i = mFirstDropDownItem; i < count; i++)
-			{
-				mItemNamesCache.put(mItems.get(i)->getName());
-			}
-		}
-
-		menu->empty();
+			menu->empty();
 
-		U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth());
-		U32 widest_item = 0;
+			U32 widest_item = 0;
 
-		for(S32 i = mFirstDropDownItem; i < count; i++)
-		{
-			LLViewerInventoryItem* item = mItems.get(i);
-			const std::string& item_name = item->getName();
-
-			LLFavoriteLandmarkMenuItem::Params item_params;
-			item_params.name(item_name);
-			item_params.label(item_name);
-			
-			item_params.on_click.function(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID()));
-			LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params);
-			menu_item->initFavoritesBarPointer(this);
-			menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this,item->getUUID(),_1,_2,_3,_4));
-			menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
-			menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
-			menu_item->setLandmarkID(item->getUUID());
-
-			// Check whether item name wider than menu
-			if (menu_item->getNominalWidth() > max_width)
+			for (S32 i = mFirstDropDownItem; i < mItems.count(); i++)
 			{
-				S32 chars_total = item_name.length();
-				S32 chars_fitted = 1;
-				menu_item->setLabel(LLStringExplicit(""));
-				S32 label_space = max_width - menu_item->getFont()->getWidth("...") -
-					menu_item->getNominalWidth(); // This returns width of menu item with empty label (pad pixels)
-
-				while (chars_fitted < chars_total && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)
+				LLViewerInventoryItem* item = mItems.get(i);
+				const std::string& item_name = item->getName();
+
+				LLFavoriteLandmarkMenuItem::Params item_params;
+				item_params.name(item_name);
+				item_params.label(item_name);
+
+				item_params.on_click.function(boost::bind(
+						&LLFavoritesBarCtrl::onButtonClick, this,
+						item->getUUID()));
+				LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params);
+				menu_item->initFavoritesBarPointer(this);
+				menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3, _4));
+				menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
+				menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
+				menu_item->setLandmarkID(item->getUUID());
+
+				// Check whether item name wider than menu
+				if (menu_item->getNominalWidth() > max_width)
 				{
-					chars_fitted++;
+					S32 chars_total = item_name.length();
+					S32 chars_fitted = 1;
+					menu_item->setLabel(LLStringExplicit(""));
+					S32 label_space = max_width - menu_item->getFont()->getWidth("...") - 
+							menu_item->getNominalWidth();// This returns width of menu item with empty label (pad pixels) 
+
+					while (chars_fitted < chars_total
+							&& menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)
+					{
+						chars_fitted++;
+					}
+					chars_fitted--; // Rolling back one char, that doesn't fit
+
+					menu_item->setLabel(item_name.substr(0, chars_fitted)
+							+ "...");
 				}
-				chars_fitted--; // Rolling back one char, that doesn't fit
+				widest_item = llmax(widest_item, menu_item->getNominalWidth());
 
-				menu_item->setLabel(item_name.substr(0, chars_fitted) + "...");
+				menu->addChild(menu_item);
 			}
-			widest_item = llmax(widest_item, menu_item->getNominalWidth());
-
-			menu->addChild(menu_item);
+			mUpdateDropDownItems = false;
 		}
 
 		menu->buildDrawLabels();
@@ -945,7 +914,6 @@ void LLFavoritesBarCtrl::showDropDownMenu()
 		menu->setButtonRect(mChevronButton->getRect(), this);
 
 		LLMenuGL::showPopup(this, menu, getRect().getWidth() - max_width, 0);
-		
 	}
 }
 
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index b2fe3cc651057574fb1b7eed912506639f1353db..9ac734baffd70a49ea1e72d2106f515e29b7c928 100644
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -74,8 +74,8 @@ public:
 	void setLandingTab(LLUICtrl* tab) { mLandingTab = tab; }
 
 protected:
-	void updateButtons(U32 bar_width);
-	void createButtons(const LLInventoryModel::item_array_t &items, const LLXMLNodePtr &root, S32 buttonWidth, S32 buttonHGap);
+	void updateButtons();
+	LLButton* createButton(const LLPointer<LLViewerInventoryItem> item, LLXMLNodePtr &root, S32 x_offset );
 	LLXMLNodePtr getButtonXMLNode();
 	BOOL collectFavoriteItems(LLInventoryModel::item_array_t &items);
 
@@ -101,9 +101,7 @@ protected:
 	LLUUID mFavoriteFolderId;
 	const LLFontGL *mFont;
 	S32 mFirstDropDownItem;
-
-	typedef LLDynamicArray<std::string> item_names_array_t;
-	item_names_array_t mItemNamesCache;
+	bool mUpdateDropDownItems;
 
 	LLUUID mSelectedItemID;
 
diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h
index 10736c7dd06a1168c1c5674becfb128818d27a22..408d2f27026172506800981f6a4557d938f75406 100644
--- a/indra/newview/llfilepicker.h
+++ b/indra/newview/llfilepicker.h
@@ -64,11 +64,6 @@ extern "C" {
 #if LL_GTK
 # include "gtk/gtk.h"
 #endif // LL_GTK
-
-// also mostly for Linux, for some X11-specific filepicker usability tweaks
-#if LL_X11
-#include "SDL/SDL_syswm.h"
-#endif
 }
 
 class LLFilePicker
diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp
index 0bcdad5da1414baf6b9c344f79b8976228d39a82..7fd0e070bef767bc854361a2ad1f71bcb979000f 100644
--- a/indra/newview/llfirstuse.cpp
+++ b/indra/newview/llfirstuse.cpp
@@ -40,7 +40,6 @@
 
 // viewer includes
 #include "llagent.h"	// for gAgent.inPrelude()
-#include "llnotify.h"
 #include "llviewercontrol.h"
 #include "llui.h"
 #include "llappviewer.h"
diff --git a/indra/newview/llfloateranimpreview.h b/indra/newview/llfloateranimpreview.h
index 09b04f1f422443fc71f8ea730ede6d611f39c666..dd2c0b809ae2f1ef3fe22906d3cf7156658eb7f6 100644
--- a/indra/newview/llfloateranimpreview.h
+++ b/indra/newview/llfloateranimpreview.h
@@ -33,6 +33,7 @@
 #ifndef LL_LLFLOATERANIMPREVIEW_H
 #define LL_LLFLOATERANIMPREVIEW_H
 
+#include "llassettype.h"
 #include "llfloaternamedesc.h"
 #include "lldynamictexture.h"
 #include "llcharacter.h"
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
index b63bcccf6bf2ac07f7ad67b8c2a05ab8b5237617..698ccec9c184210b54d3b36c162d4b26dda1bdf2 100644
--- a/indra/newview/llfloaterauction.cpp
+++ b/indra/newview/llfloaterauction.cpp
@@ -35,7 +35,6 @@
 #include "llfloaterauction.h"
 #include "llfloaterregioninfo.h"
 
-#include "lldir.h"
 #include "llgl.h"
 #include "llimagej2c.h"
 #include "llimagetga.h"
@@ -43,12 +42,12 @@
 #include "llvfile.h"
 #include "llvfs.h"
 #include "llwindow.h"
+#include "message.h"
 
 #include "llagent.h"
 #include "llcombobox.h"
 #include "llnotifications.h"
 #include "llnotificationsutil.h"
-#include "llnotify.h"
 #include "llsavedsettingsglue.h"
 #include "llviewertexturelist.h"
 #include "llviewerparcelmgr.h"
diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp
index 68f06b1e5b591231bdb5b8392c7232b06e6eb714..e925796526e75ef38c7e52f8160aa25280620cb8 100644
--- a/indra/newview/llfloaterbump.cpp
+++ b/indra/newview/llfloaterbump.cpp
@@ -33,11 +33,11 @@
  
 #include "llviewerprecompiledheaders.h"
 
-#include "llfloaterbump.h"
+#include "llsd.h"
+#include "mean_collision_data.h"
 
+#include "llfloaterbump.h"
 #include "llscrolllistctrl.h"
-
-#include "llsd.h"
 #include "lluictrlfactory.h"
 #include "llviewermessage.h"
 
diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp
index 16a5bb63e700cb80924667a6f7a14bc5f977a465..fba557c65698b72e381f83e9cefe5cecb4463944 100644
--- a/indra/newview/llfloaterbuy.cpp
+++ b/indra/newview/llfloaterbuy.cpp
@@ -41,7 +41,6 @@
 #include "llfloaterbuy.h"
 
 #include "llagent.h"			// for agent id
-#include "llalertdialog.h"
 #include "llinventorymodel.h"	// for gInventory
 #include "llfloaterreg.h"
 #include "llfloaterinventory.h"	// for get_item_icon
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index 39c7bc02af432f5cdefd27624d5d62d46527e846..0daef27af297e4773006969a1b977aab06832437 100644
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -43,7 +43,6 @@
 #include "llcachename.h"
 
 #include "llagent.h"			// for agent id
-#include "llalertdialog.h"
 #include "llcheckboxctrl.h"
 #include "llinventoryfunctions.h"
 #include "llinventorymodel.h"	// for gInventory
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 3a8c3ab4d20ec0a4a42f9244de994bbf56f1febb..9b88923e7eae962009e83b85c0915b01564798af 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -49,7 +49,6 @@
 #include "lliconctrl.h"
 #include "lllineeditor.h"
 #include "llnotificationsutil.h"
-#include "llnotify.h"
 #include "llparcel.h"
 #include "llslurl.h"
 #include "llstatusbar.h"
diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp
index 1482d3fe21e500601e3c53df7258269728cfd19d..56291c57a62fbd68c6cc546bb3aee8682192de71 100644
--- a/indra/newview/llfloaterfriends.cpp
+++ b/indra/newview/llfloaterfriends.cpp
@@ -50,7 +50,6 @@
 #include "llinventorymodel.h"
 #include "llnamelistctrl.h"
 #include "llnotificationsutil.h"
-#include "llnotify.h"
 #include "llresmgr.h"
 #include "llscrolllistctrl.h"
 #include "llscrolllistitem.h"
diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index 04ba11530add5ba2da00857d8cbb1681ae6ef5c1..e1409b8ad5af90229373e5894d8fc3c21d343b37 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -45,7 +45,6 @@
 #include "message.h"
 
 #include "llagent.h"
-#include "llalertdialog.h"
 #include "llbutton.h"
 #include "llcheckboxctrl.h"
 #include "llcombobox.h"
@@ -69,7 +68,6 @@
 #include "llviewerwindow.h"
 #include "llworld.h"
 #include "llfloateravatarpicker.h"
-#include "llnotify.h"
 #include "llxfermanager.h"
 #include "llvlcomposition.h"
 #include "llsurface.h"
diff --git a/indra/newview/llfloaterhud.cpp b/indra/newview/llfloaterhud.cpp
index 14cff3bcc3ad654aa74c639c29e7670426686240..d2ee3e44c534a57c8a275e03a1712448e11b1519 100644
--- a/indra/newview/llfloaterhud.cpp
+++ b/indra/newview/llfloaterhud.cpp
@@ -37,7 +37,6 @@
 // Viewer libs
 #include "llviewercontrol.h"
 #include "llmediactrl.h"
-#include "llalertdialog.h"
 
 // Linden libs
 #include "llnotificationsutil.h"
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 5b03292b22b4d95e0def974c3528e4bbdf928f7e..66bf5246b09039cba2dfcb25cd7cb59bb186caee 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -55,7 +55,6 @@
 #include "llavataractions.h"
 #include "lllineeditor.h"
 #include "llnamelistctrl.h"
-#include "llnotify.h"
 #include "llpanellandaudio.h"
 #include "llpanellandmedia.h"
 #include "llradiogroup.h"
diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index 16a76723ebfa99f0d452e528f7f2bf13cf567f23..5cfd56193e318533260d7660292770b5e2943e86 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -145,18 +145,21 @@ LLFloaterMediaSettings* LLFloaterMediaSettings::getInstance()
 //static 
 void LLFloaterMediaSettings::apply()
 {
-	LLSD settings;
-	sInstance->mPanelMediaSettingsGeneral->preApply();
-	sInstance->mPanelMediaSettingsGeneral->getValues( settings );
-	sInstance->mPanelMediaSettingsSecurity->preApply();
-	sInstance->mPanelMediaSettingsSecurity->getValues( settings );
-	sInstance->mPanelMediaSettingsPermissions->preApply();
-	sInstance->mPanelMediaSettingsPermissions->getValues( settings );
-	LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA );
-	LLSelectMgr::getInstance()->selectionSetMediaData(settings);
-	sInstance->mPanelMediaSettingsGeneral->postApply();
-	sInstance->mPanelMediaSettingsSecurity->postApply();
-	sInstance->mPanelMediaSettingsPermissions->postApply();
+	if (sInstance->haveValuesChanged())
+	{
+		LLSD settings;
+		sInstance->mPanelMediaSettingsGeneral->preApply();
+		sInstance->mPanelMediaSettingsGeneral->getValues( settings );
+		sInstance->mPanelMediaSettingsSecurity->preApply();
+		sInstance->mPanelMediaSettingsSecurity->getValues( settings );
+		sInstance->mPanelMediaSettingsPermissions->preApply();
+		sInstance->mPanelMediaSettingsPermissions->getValues( settings );
+		LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA );
+		LLSelectMgr::getInstance()->selectionSetMediaData(settings);
+		sInstance->mPanelMediaSettingsGeneral->postApply();
+		sInstance->mPanelMediaSettingsSecurity->postApply();
+		sInstance->mPanelMediaSettingsPermissions->postApply();
+	}
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -249,15 +252,6 @@ void LLFloaterMediaSettings::onTabChanged(void* user_data, bool from_click)
 	LLTabContainer* self = (LLTabContainer*)user_data;
 	gSavedSettings.setS32("LastMediaSettingsTab", self->getCurrentPanelIndex());
 }
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFloaterMediaSettings::enableOkApplyBtns( bool enable )
-{
-	childSetEnabled( "OK", enable );
-	childSetEnabled( "Apply", enable );
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 //
 const std::string LLFloaterMediaSettings::getHomeUrl()
@@ -272,17 +266,25 @@ const std::string LLFloaterMediaSettings::getHomeUrl()
 // virtual 
 void LLFloaterMediaSettings::draw()
 {
+	// Set the enabled state of the "Apply" button if values changed
+	childSetEnabled( "Apply", haveValuesChanged() );
+	
+	LLFloater::draw();
+}
+
+
+//private
+bool LLFloaterMediaSettings::haveValuesChanged() const
+{
+	bool values_changed = false;
 	// *NOTE: The code below is very inefficient.  Better to do this
 	// only when data change.
 	// Every frame, check to see what the values are.  If they are not
-	// the same as the default media data, enable the OK/Apply buttons
+	// the same as the initial media data, enable the OK/Apply buttons
 	LLSD settings;
 	sInstance->mPanelMediaSettingsGeneral->getValues( settings );
 	sInstance->mPanelMediaSettingsSecurity->getValues( settings );
-	sInstance->mPanelMediaSettingsPermissions->getValues( settings );
-
-	bool values_changed = false;
-	
+	sInstance->mPanelMediaSettingsPermissions->getValues( settings );	
 	LLSD::map_const_iterator iter = settings.beginMap();
 	LLSD::map_const_iterator end = settings.endMap();
 	for ( ; iter != end; ++iter )
@@ -295,9 +297,6 @@ void LLFloaterMediaSettings::draw()
 			break;
 		}
 	}
-	
-	enableOkApplyBtns(values_changed);
-	
-	LLFloater::draw();
+	return values_changed;
 }
 
diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h
index b72e3d855d216ac0aa652dde0ae0a34834ad22f8..cdfd5aa8ae5cad8119126bb998cabcb649ee64e7 100644
--- a/indra/newview/llfloatermediasettings.h
+++ b/indra/newview/llfloatermediasettings.h
@@ -85,7 +85,7 @@ protected:
 
 private:
 
-	void enableOkApplyBtns( bool enable );
+	bool haveValuesChanged() const;
 	
 	LLSD mInitialValues;
 	bool mWaitingToClose;
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
index c1e8d251eeb50843cf6a49eface5b071df9b9203..ec50ed596c7be81bc15ed63254cafe529d4a1dab 100644
--- a/indra/newview/llfloateropenobject.cpp
+++ b/indra/newview/llfloateropenobject.cpp
@@ -44,7 +44,6 @@
 #include "llnotificationsutil.h"
 #include "lltextbox.h"
 
-#include "llalertdialog.h"
 #include "llinventorybridge.h"
 #include "llfloaterinventory.h"
 #include "llinventorymodel.h"
@@ -225,7 +224,6 @@ void LLFloaterOpenObject::callbackMoveInventory(S32 result, void* data)
 
 	if (result == 0)
 	{
-		LLFloaterInventory::showAgentInventory();
 		LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
 		if (active_panel)
 		{
diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp
index 17bb8221ad5de23d43b3752dc6295094a8fb6833..7edc27d4c3b45e31230ecdbb21d93e02f2ebda0e 100644
--- a/indra/newview/llfloaterperms.cpp
+++ b/indra/newview/llfloaterperms.cpp
@@ -32,7 +32,6 @@
  */
 
 #include "llviewerprecompiledheaders.h"
-#include "llalertdialog.h"
 #include "llcheckboxctrl.h"
 #include "llfloaterperms.h"
 #include "llviewercontrol.h"
diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp
index 572eeb57fee969ef394b325a26a474f087470fab..8da44e203509428171ea76b7bfe7ab31257e6f7a 100644
--- a/indra/newview/llfloaterpostcard.cpp
+++ b/indra/newview/llfloaterpostcard.cpp
@@ -56,9 +56,8 @@
 #include "llstatusbar.h"
 #include "llviewerregion.h"
 #include "lleconomy.h"
+#include "message.h"
 
-#include "llgl.h"
-#include "llglheaders.h"
 #include "llimagejpeg.h"
 #include "llimagej2c.h"
 #include "llvfile.h"
diff --git a/indra/newview/llfloaterpostcard.h b/indra/newview/llfloaterpostcard.h
index 49cce5310613c7d0823c4c0c2d48acd200e85aab..0a44b507797fab2ff93ed9cdf7bacd0a8955da26 100644
--- a/indra/newview/llfloaterpostcard.h
+++ b/indra/newview/llfloaterpostcard.h
@@ -70,7 +70,7 @@ public:
 
 	void sendPostcard();
 
-protected:
+private:
 	
 	LLPointer<LLImageJPEG> mJPEGImage;
 	LLPointer<LLViewerTexture> mViewerImage;
@@ -78,7 +78,7 @@ protected:
 	LLAssetID mAssetID;
 	LLVector2 mImageScale;
 	LLVector3d mPosTakenGlobal;
-	boolean mHasFirstMsgFocus;
+	bool mHasFirstMsgFocus;
 };
 
 
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index ab27375b87e4fd475fd82c2a47586f6d3c84e03f..a333868b8c9296293b1fa6905b9ae673e6682554 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -588,6 +588,9 @@ void LLFloaterPreference::onOpen(const LLSD& key)
 	// when the floater is opened.  That will make cancel do its
 	// job
 	saveSettings();
+
+	// This is a "fresh" floater, closing floater shoud cancel any changes
+	mCancelOnClose = true;
 }
 
 void LLFloaterPreference::onVertexShaderEnable()
@@ -633,7 +636,11 @@ void LLFloaterPreference::onBtnOK()
 		// that prevents cancel from undoing our changes when we hit OK
 		mCancelOnClose = false;
 		closeFloater(false);
-		mCancelOnClose = true;
+
+		// closeFloater() will be called when viewer is quitting, leaving mCancelOnClose = true;
+		// will cancel all changes we saved here, don't let this happen.
+		// Fix for EXT-3465
+
 		gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
 		LLUIColorTable::instance().saveUserSettings();
 		std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 8a26078f3d3fe4643664a169ebd0fa525e8104af..496fa62d0521a1b40b5f20845d5e75b200697e3f 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -42,18 +42,18 @@
 #include "llglheaders.h"
 #include "llregionflags.h"
 #include "llstl.h"
+#include "llvfile.h"
+#include "llxfermanager.h"
 #include "indra_constants.h"
 #include "message.h"
 
 #include "llagent.h"
-#include "llalertdialog.h"
 #include "llappviewer.h"
 #include "llfloateravatarpicker.h"
 #include "llbutton.h" 
 #include "llcheckboxctrl.h"
 #include "llcombobox.h"
 #include "llfilepicker.h"
-#include "llfloaterdaycycle.h"
 #include "llfloatergodtools.h"	// for send_sim_wide_deletes()
 #include "llfloatertopobjects.h" // added to fix SL-32336
 #include "llfloatergroups.h"
@@ -62,7 +62,6 @@
 #include "llfloaterwindlight.h"
 #include "llinventorymodel.h"
 #include "lllineeditor.h"
-#include "llalertdialog.h"
 #include "llnamelistctrl.h"
 #include "llnotifications.h"
 #include "llnotificationsutil.h"
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index 704166d1065e66b22c612f04290a5b5039bd2993..a21b96bf1634f4b5da963ad58c1e75bc556652c9 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -35,9 +35,12 @@
 #define LL_LLFLOATERREGIONINFO_H
 
 #include <vector>
+#include "llassettype.h"
 #include "llfloater.h"
+#include "llhost.h"
 #include "llpanel.h"
 
+class LLDispatcher;
 class LLLineEditor;
 class LLMessageSystem;
 class LLPanelRegionInfo;
@@ -51,6 +54,7 @@ class LLNameListCtrl;
 class LLSliderCtrl;
 class LLSpinCtrl;
 class LLTextBox;
+class LLVFS;
 
 class LLPanelRegionGeneralInfo;
 class LLPanelRegionDebugInfo;
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index 932e49c79be542cd5e015149938fed648da7232d..9f3dcae8ef69c6d637f474a2625fb219fa952dd1 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -40,11 +40,14 @@
 // linden library includes
 #include "llassetstorage.h"
 #include "llfontgl.h"
-#include "llgl.h"			// for renderer
+#include "llimagej2c.h"
 #include "llinventory.h"
 #include "llnotificationsutil.h"
 #include "llstring.h"
 #include "llsys.h"
+#include "llvfile.h"
+#include "llvfs.h"
+#include "mean_collision_data.h"
 #include "message.h"
 #include "v3math.h"
 
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index c6589637080ddb3d6fce93925292b94c28ec8afb..595d84f9f0ac7ad6cc1bb1e8852778fc667f3fdb 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -38,6 +38,8 @@
 #include "lluri.h"
 #include "llagent.h"
 #include "llui.h"
+#include "llviewercontrol.h"
+#include "llweb.h"
 
 LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
 	LLFloater(key),
@@ -65,7 +67,6 @@ BOOL LLFloaterSearch::postBuild()
 	{
 		mBrowser->addObserver(this);
 		mBrowser->setTrusted(true);
-		mBrowser->setHomePageUrl(getString("search_url"));
 	}
 
 	return TRUE;
@@ -113,33 +114,32 @@ void LLFloaterSearch::search(const LLSD &key)
 	childHide("refresh_search");
 	mSearchGodLevel = gAgent.getGodLevel();
 
-	// get the URL for the search page
-	std::string url = getString("search_url");
-	if (! LLStringUtil::endsWith(url, "/"))
-	{
-		url += "/";
-	}
-
 	// work out the subdir to use based on the requested category
+	LLSD subs;
 	std::string category = key.has("category") ? key["category"].asString() : "";
 	if (mCategoryPaths.has(category))
 	{
-		url += mCategoryPaths[category].asString();
+		subs["CATEGORY"] = mCategoryPaths[category].asString();
 	}
 	else
 	{
-		url += mCategoryPaths["all"].asString();
+		subs["CATEGORY"] = mCategoryPaths["all"].asString();
 	}
 
-	// append the search query string
+	// add the search query string
 	std::string search_text = key.has("id") ? key["id"].asString() : "";
-	url += std::string("?q=") + LLURI::escape(search_text);
+	subs["QUERY"] = LLURI::escape(search_text);
 
-	// append the permissions token that login.cgi gave us
+	// add the permissions token that login.cgi gave us
+	// We use "search_token", and fallback to "auth_token" if not present.
 	LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token");
-	url += "&p=" + search_token.asString();
+	if (search_token.asString().empty())
+	{
+		search_token = LLLoginInstance::getInstance()->getResponse("auth_token");
+	}
+	subs["AUTH_TOKEN"] = search_token.asString();
 
-	// also append the user's preferred maturity (can be changed via prefs)
+	// add the user's preferred maturity (can be changed via prefs)
 	std::string maturity;
 	if (gAgent.prefersAdult())
 	{
@@ -153,14 +153,15 @@ void LLFloaterSearch::search(const LLSD &key)
 	{
 		maturity = "13";  // PG
 	}
-	url += "&r=" + maturity;
-
-	// add the current localization information
-	url += "&lang=" + LLUI::getLanguage();
+	subs["MATURITY"] = maturity;
 
 	// add the user's god status
-	std::string godlike = gAgent.isGodlike() ? "1" : "0";
-	url += "&g=" + godlike;
+	subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0";
+
+	// get the search URL and expand all of the substitutions
+	// (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
+	std::string url = gSavedSettings.getString("SearchURL");
+	url = LLWeb::expandURLSubstitutions(url, subs);
 
 	// and load the URL in the web view
 	mBrowser->navigateTo(url);
diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp
index 49e8f9c95678b2637eda063d5fa20a5e7ea660cd..e5260aa7b976598bbc8c9dac0ec5631ec10df4c8 100644
--- a/indra/newview/llfloatersellland.cpp
+++ b/indra/newview/llfloatersellland.cpp
@@ -39,7 +39,6 @@
 #include "lllineeditor.h"
 #include "llnotifications.h"
 #include "llnotificationsutil.h"
-#include "llnotify.h"
 #include "llparcel.h"
 #include "llselectmgr.h"
 #include "lltexturectrl.h"
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 7fb71d4d4f583fcabaf5ff9e632496c5f646fbbc..babef5b63df9640130d3a3939efc23519740d06d 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -93,7 +93,7 @@
 
 // Globals
 LLFloaterTools *gFloaterTools = NULL;
-
+bool LLFloaterTools::sShowObjectCost = true;
 
 const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =
 {
@@ -286,6 +286,8 @@ BOOL	LLFloaterTools::postBuild()
 	mStatusText["grab"] = getString("status_grab");
 	mStatusText["place"] = getString("status_place");
 	mStatusText["selectland"] = getString("status_selectland");
+
+	sShowObjectCost = gSavedSettings.getBOOL("ShowObjectRenderingCost");
 	
 	return TRUE;
 }
@@ -425,16 +427,19 @@ void LLFloaterTools::refresh()
 	childSetTextArg("prim_count", "[COUNT]", prim_count_string);
 
 	// calculate selection rendering cost
-	std::string prim_cost_string;
-	LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost());
-	childSetTextArg("RenderingCost", "[COUNT]", prim_cost_string);
+	if (sShowObjectCost)
+	{
+		std::string prim_cost_string;
+		LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost());
+		childSetTextArg("RenderingCost", "[COUNT]", prim_cost_string);
+	}
 
 
 	// disable the object and prim counts if nothing selected
 	bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();
 	childSetEnabled("obj_count", have_selection);
 	childSetEnabled("prim_count", have_selection);
-	childSetEnabled("RenderingCost", have_selection);
+	childSetEnabled("RenderingCost", have_selection && sShowObjectCost);
 
 	// Refresh child tabs
 	mPanelPermissions->refresh();
@@ -566,7 +571,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
 	mBtnEdit	->setToggleState( edit_visible );
 	mRadioGroupEdit->setVisible( edit_visible );
 	bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");
-	childSetVisible("RenderingCost", !linked_parts && (edit_visible || focus_visible || move_visible));
+	childSetVisible("RenderingCost", !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);
 
 	if (mCheckSelectIndividual)
 	{
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index 05a88a31d31b4ddffa7dea37ec6796227aaf1f3f..85aeb9f5239a3eed3645b8ee3da75e76f22c80f3 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -196,6 +196,9 @@ private:
 
 protected:
 	LLSD				mMediaSettings;
+
+public:
+	static bool		sShowObjectCost;
 	
 };
 
diff --git a/indra/newview/llfloaterurldisplay.cpp b/indra/newview/llfloaterurldisplay.cpp
index 3b9321a87697a72307b0fa200fc7dc3e6cf61e33..4b67cbb30872a2c0946abe2eb3d458c433f26d07 100644
--- a/indra/newview/llfloaterurldisplay.cpp
+++ b/indra/newview/llfloaterurldisplay.cpp
@@ -33,13 +33,14 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llregionhandle.h"
+#include "v3dmath.h"
+
 #include "llfloaterurldisplay.h"
 
 #include "llpanelplace.h"
 #include "lluictrlfactory.h"
 
-#include "v3dmath.h"
-
 ////////////////////////////////////////////////////////////////////////////
 // LLFloaterURLDisplay
 
diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp
index 5e769feea6158c776610ffa88d81970a0af1e434..91d0f0e370057086d8c9c350194be3a903b9f604 100644
--- a/indra/newview/llfloaterurlentry.cpp
+++ b/indra/newview/llfloaterurlentry.cpp
@@ -32,6 +32,8 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llhttpclient.h"
+
 #include "llfloaterurlentry.h"
 
 #include "llpanellandmedia.h"
diff --git a/indra/newview/llfloatervoicedevicesettings.cpp b/indra/newview/llfloatervoicedevicesettings.cpp
index 3951f4291f7b7ce3fd4fe3e069e51f97ea2acf7c..43024a4bd03fd3ae7178fda4dc29feb774d0cf73 100644
--- a/indra/newview/llfloatervoicedevicesettings.cpp
+++ b/indra/newview/llfloatervoicedevicesettings.cpp
@@ -40,6 +40,7 @@
 #include "llcombobox.h"
 #include "llfocusmgr.h"
 #include "lliconctrl.h"
+#include "llsliderctrl.h"
 #include "llviewercontrol.h"
 #include "llvoiceclient.h"
 #include "llvoicechannel.h"
@@ -60,6 +61,9 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings()
 	mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
 	mDevicesUpdated = FALSE;
 
+	// grab "live" mic volume level
+	mMicVolume = gSavedSettings.getF32("AudioLevelMic");
+
 	// ask for new device enumeration
 	// now do this in onOpen() instead...
 	//gVoiceClient->refreshDeviceLists();
@@ -71,6 +75,10 @@ LLPanelVoiceDeviceSettings::~LLPanelVoiceDeviceSettings()
 
 BOOL LLPanelVoiceDeviceSettings::postBuild()
 {
+	LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
+	// set mic volume tuning slider based on last mic volume setting
+	volume_slider->setValue(mMicVolume);
+
 	childSetCommitCallback("voice_input_device", onCommitInputDevice, this);
 	childSetCommitCallback("voice_output_device", onCommitOutputDevice, this);
 	
@@ -149,6 +157,15 @@ void LLPanelVoiceDeviceSettings::apply()
 		gSavedSettings.setString("VoiceOutputAudioDevice", s);
 		mOutputDevice = s;
 	}
+
+	// assume we are being destroyed by closing our embedding window
+	LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
+	if(volume_slider)
+	{
+		F32 slider_value = (F32)volume_slider->getValue().asReal();
+		gSavedSettings.setF32("AudioLevelMic", slider_value);
+		mMicVolume = slider_value;
+	}
 }
 
 void LLPanelVoiceDeviceSettings::cancel()
@@ -161,12 +178,22 @@ void LLPanelVoiceDeviceSettings::cancel()
 
 	if(mCtrlOutputDevices)
 		mCtrlOutputDevices->setSimple(mOutputDevice);
+
+	gSavedSettings.setF32("AudioLevelMic", mMicVolume);
+	LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
+	if(volume_slider)
+	{
+		volume_slider->setValue(mMicVolume);
+	}
 }
 
 void LLPanelVoiceDeviceSettings::refresh()
 {
-	// update the live input level display
-	gVoiceClient->tuningSetMicVolume();
+	//grab current volume
+	LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
+	// set mic volume tuning slider based on last mic volume setting
+	F32 current_volume = (F32)volume_slider->getValue().asReal();
+	gVoiceClient->tuningSetMicVolume(current_volume);
 
 	// Fill in popup menus
 	mCtrlInputDevices = getChild<LLComboBox>("voice_input_device");
@@ -236,6 +263,7 @@ void LLPanelVoiceDeviceSettings::initialize()
 {
 	mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
 	mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
+	mMicVolume = gSavedSettings.getF32("AudioLevelMic");
 	mDevicesUpdated = FALSE;
 
 	// ask for new device enumeration
diff --git a/indra/newview/llfloatervoicedevicesettings.h b/indra/newview/llfloatervoicedevicesettings.h
index 20958af780c37b084e1791a79ccc3c4fb30c2c99..d67283d0a224d5a4357bbeb4cb97c086998a3806 100644
--- a/indra/newview/llfloatervoicedevicesettings.h
+++ b/indra/newview/llfloatervoicedevicesettings.h
@@ -56,6 +56,7 @@ protected:
 	static void onCommitInputDevice(LLUICtrl* ctrl, void* user_data);
 	static void onCommitOutputDevice(LLUICtrl* ctrl, void* user_data);
 
+	F32 mMicVolume;
 	std::string mInputDevice;
 	std::string mOutputDevice;
 	class LLComboBox		*mCtrlInputDevices;
diff --git a/indra/newview/llfloaterwhitelistentry.cpp b/indra/newview/llfloaterwhitelistentry.cpp
index 04dbd38153e539825cfe60e65338445d341ab60e..705c8afd00f3e7c12a19c28123e79531f8f91660 100644
--- a/indra/newview/llfloaterwhitelistentry.cpp
+++ b/indra/newview/llfloaterwhitelistentry.cpp
@@ -82,6 +82,7 @@ void LLFloaterWhiteListEntry::onBtnOK( void* userdata )
 		std::string white_list_item = self->mWhiteListEdit->getText();
 
 		panel->addWhiteListEntry( white_list_item );
+		panel->updateWhitelistEnableStatus();
 	};
 	
 	self->closeFloater();	
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 7ca491a6987f02c5d28535d45f0c131940b9c42e..98f9171237a7c639150bc19262ee0559ebfc1c95 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -74,8 +74,8 @@
 #include "llmapimagetype.h"
 #include "llweb.h"
 #include "llslider.h"
+#include "message.h"
 
-#include "llglheaders.h"
 #include "llwindow.h"			// copyTextToClipboard()
 
 //---------------------------------------------------------------------------
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 321982ceb62d780b050f1eeea9064fc22facba0f..98fae1c2a0ac0ac5f0ade86291e48b0bda90f804 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -330,6 +330,7 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)
 	else
 	{
 		mFolders.insert(mFolders.begin(), folder);
+		folder->setShowLoadStatus(true);
 	}
 	folder->setOrigin(0, 0);
 	folder->reshape(getRect().getWidth(), 0);
@@ -748,6 +749,12 @@ void LLFolderView::sanitizeSelection()
 				}
 			}
 		}
+
+		// Don't allow invisible items (such as root folders) to be selected.
+		if (item->getDontShowInHierarchy())
+		{
+			items_to_remove.push_back(item);
+		}
 	}
 
 	std::vector<LLFolderViewItem*>::iterator item_it;
@@ -1939,6 +1946,26 @@ LLFolderViewItem* LLFolderView::getItemByID(const LLUUID& id)
 	return NULL;
 }
 
+LLFolderViewFolder* LLFolderView::getFolderByID(const LLUUID& id)
+{
+	if (id.isNull())
+	{
+		return this;
+	}
+
+	for (folders_t::iterator iter = mFolders.begin();
+		 iter != mFolders.end();
+		 ++iter)
+	{
+		LLFolderViewFolder *folder = (*iter);
+		if (folder->getListener()->getUUID() == id)
+		{
+			return folder;
+		}
+	}
+	return NULL;
+}
+
 bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata)
 {
 	std::string action = userdata.asString();
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index d18ba385d82d6caf88e95f33e1bb966dd26a5b32..2598af4df4bc954fe20b242b14ce032b9fbd4c6c 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -248,6 +248,7 @@ public:
 	void addItemID(const LLUUID& id, LLFolderViewItem* itemp);
 	void removeItemID(const LLUUID& id);
 	LLFolderViewItem* getItemByID(const LLUUID& id);
+	LLFolderViewFolder* getFolderByID(const LLUUID& id);
 	
 	bool doToSelected(LLInventoryModel* model, const LLSD& userdata);
 	
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 135821f662db00b9acfcc115425097a360d80f9c..9ae0c9100a2d65c8fe2e61b8301ee2885124bbfd 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -136,7 +136,8 @@ LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p)
 	mListener(p.listener),
 	mArrowImage(p.folder_arrow_image),
 	mBoxImage(p.selection_image),
-	mDontShowInHierarchy(false)
+	mDontShowInHierarchy(false),
+	mShowLoadStatus(false)
 {
 	refresh();
 }
@@ -198,7 +199,9 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)
 	}
 
 	LLFolderViewItem* itemp = mParentFolder->getPreviousFromChild( this, include_children );
-	while(itemp && !itemp->getVisible())
+
+	// Skip over items that are invisible or are hidden from the UI.
+	while(itemp && (!itemp->getVisible() || itemp->getDontShowInHierarchy()))
 	{
 		LLFolderViewItem* next_itemp = itemp->mParentFolder->getPreviousFromChild( itemp, include_children );
 		if (itemp == next_itemp) 
@@ -966,10 +969,11 @@ void LLFolderViewItem::draw()
 		}
 
 
-		if ( mIsLoading 
-			&& mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime") )
+		if ( (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime"))
+			|| (LLInventoryModel::backgroundFetchActive() && mShowLoadStatus) )
 		{
-			font->renderUTF8(LLTrans::getString("LoadingData"), 0, text_left, y, sSearchStatusColor,
+			std::string load_string = LLTrans::getString("LoadingData") + " ";
+			font->renderUTF8(load_string, 0, text_left, y, sSearchStatusColor,
 					  LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &right_x, FALSE);
 			text_left = right_x;
 		}
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 620aa070b99a6aa775af10d69798a375ac4aeca7..a43096dcb2efc09269a23ec73dab8876cd0c308a 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -163,6 +163,7 @@ protected:
 	BOOL                        mIsLoading;
 	LLTimer                     mTimeSinceRequestStart;
 	bool						mDontShowInHierarchy;
+	bool						mShowLoadStatus;
 
 	// helper function to change the selection from the root.
 	void changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected);
@@ -254,6 +255,8 @@ public:
 	BOOL getIsCurSelection() { return mIsCurSelection; }
 
 	BOOL hasVisibleChildren() { return mHasVisibleChildren; }
+	
+	void setShowLoadStatus(bool status) { mShowLoadStatus = status; }
 
 	// Call through to the viewed object and return true if it can be
 	// removed. Returns true if it's removed.
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 4f487ddf04ccb65b8be2b57ecd5c01702886594a..df7aa9eabf387adbaaa4e192d3a9a53d0f507a52 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -52,7 +52,6 @@
 #include "llagent.h"
 #include "lldelayedgestureerror.h"
 #include "llinventorymodel.h"
-#include "llnotify.h"
 #include "llviewermessage.h"
 #include "llvoavatarself.h"
 #include "llviewerstats.h"
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index fdb2b886a6a05032e7cdf80037b38a15a8a2d498..ff75d461df11d689f09186ae362d78020f040b63 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -35,6 +35,8 @@
 
 #include "llgroupactions.h"
 
+#include "message.h"
+
 #include "llagent.h"
 #include "llcommandhandler.h"
 #include "llfloaterreg.h"
@@ -197,12 +199,12 @@ void LLGroupActions::activate(const LLUUID& group_id)
 	gAgent.sendReliableMessage();
 }
 
-bool	isGroupUIVisible()
+static bool isGroupUIVisible()
 {
 	LLPanel* panel = LLSideTray::getInstance()->findChild<LLPanel>("panel_group_info_sidetray");
 	if(!panel)
 		return false;
-	return panel->getVisible();
+	return panel->isInVisibleChain();
 }
 
 // static
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp
index 80b706a215ec4d11757f70ffae98e4481e84d0dd..ab9db10f38893206977f49f68941f108bdaaddef 100644
--- a/indra/newview/llgrouplist.cpp
+++ b/indra/newview/llgrouplist.cpp
@@ -225,6 +225,11 @@ mGroupID(LLUUID::null)
 	}
 }
 
+LLGroupListItem::~LLGroupListItem()
+{
+	LLGroupMgr::getInstance()->removeObserver(this);
+}
+
 //virtual
 BOOL  LLGroupListItem::postBuild()
 {
@@ -277,8 +282,13 @@ void LLGroupListItem::setName(const std::string& name, const std::string& highli
 
 void LLGroupListItem::setGroupID(const LLUUID& group_id)
 {
+	LLGroupMgr::getInstance()->removeObserver(this);
+	
+	mID = group_id;
 	mGroupID = group_id;
 	setActive(group_id == gAgent.getGroupID());
+
+	LLGroupMgr::getInstance()->addObserver(this);
 }
 
 void LLGroupListItem::setGroupIconID(const LLUUID& group_icon_id)
@@ -337,4 +347,11 @@ void LLGroupListItem::onProfileBtnClick()
 	LLGroupActions::show(mGroupID);
 }
 
+void LLGroupListItem::changed(LLGroupChange gc)
+{
+	LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(mID);
+	if(group_data)
+		setGroupIconID(group_data->mInsigniaID);
+}
+
 //EOF
diff --git a/indra/newview/llgrouplist.h b/indra/newview/llgrouplist.h
index 41b4d0171170165355ebf99df5c4d742f36d3e59..33cfe005b9d864d7d7c62d87da2655998c2ca9bd 100644
--- a/indra/newview/llgrouplist.h
+++ b/indra/newview/llgrouplist.h
@@ -38,6 +38,7 @@
 #include "llpanel.h"
 #include "llpointer.h"
 #include "llstyle.h"
+#include "llgroupmgr.h"
 
 /**
  * Auto-updating list of agent groups.
@@ -80,9 +81,11 @@ class LLIconCtrl;
 class LLTextBox;
 
 class LLGroupListItem : public LLPanel
+	, public LLGroupMgrObserver
 {
 public:
 	LLGroupListItem();
+	~LLGroupListItem();
 	/*virtual*/ BOOL postBuild();
 	/*virtual*/ void setValue(const LLSD& value);
 	void onMouseEnter(S32 x, S32 y, MASK mask);
@@ -96,6 +99,7 @@ public:
 	void setGroupIconID(const LLUUID& group_icon_id);
 	void setGroupIconVisible(bool visible);
 
+	virtual void changed(LLGroupChange gc);
 private:
 	void setActive(bool active);
 	void onInfoBtnClick();
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index ebb5feb2bf6566633f525da7ed07b4ec1650d268..af58e81ca4da3d35a6c1ad1f7cc4d5557f125641 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -758,7 +758,8 @@ void LLGroupMgr::clearGroupData(const LLUUID& group_id)
 
 void LLGroupMgr::addObserver(LLGroupMgrObserver* observer) 
 { 
-	mObservers.insert(std::pair<LLUUID, LLGroupMgrObserver*>(observer->getID(), observer));
+	if( observer->getID() != LLUUID::null )
+		mObservers.insert(std::pair<LLUUID, LLGroupMgrObserver*>(observer->getID(), observer));
 }
 
 void LLGroupMgr::removeObserver(LLGroupMgrObserver* observer)
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index a0604be57ebc560e5cba81d9946ef00a2e6e39a0..487fdd4c5b404b25d6cee5b39110a78f19734218 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -45,6 +45,7 @@ class LLGroupMgrObserver
 {
 public:
 	LLGroupMgrObserver(const LLUUID& id) : mID(id){};
+	LLGroupMgrObserver() : mID(LLUUID::null){};
 	virtual ~LLGroupMgrObserver(){};
 	virtual void changed(LLGroupChange gc) = 0;
 	const LLUUID& getID() { return mID; }
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 47a168e354999135ae96e44ec83f459af5c99362..ca4383353012979d839e76cd9e6b6d1f88d406b0 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -49,6 +49,7 @@
 #include "lllogchat.h"
 #include "llpanelimcontrolpanel.h"
 #include "llscreenchannel.h"
+#include "llsyswellwindow.h"
 #include "lltrans.h"
 #include "llchathistory.h"
 #include "llviewerwindow.h"
@@ -339,6 +340,29 @@ void LLIMFloater::onSlide()
 //static
 LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 {
+	if (!gIMMgr->hasSession(session_id)) return NULL;
+
+	// we should make sure all related chiclets are in place when the session is a voice call
+	// chiclets come firts, then comes IM window
+	if (gIMMgr->isVoiceCall(session_id))
+	{
+		LLIMModel* im_model = LLIMModel::getInstance();
+		LLBottomTray* b_tray = LLBottomTray::getInstance();
+		
+		//*TODO hide that into Bottom tray
+		if (!b_tray->getChicletPanel()->findChiclet<LLChiclet>(session_id))
+		{
+			LLIMChiclet* chiclet = b_tray->createIMChiclet(session_id);
+			if(chiclet)
+			{
+				chiclet->setIMSessionName(im_model->getName(session_id));
+				chiclet->setOtherParticipantId(im_model->getOtherParticipantID(session_id));
+			}
+		}
+
+		LLIMWellWindow::getInstance()->addIMRow(session_id);
+	}
+		
 	bool not_existed = true;
 
 	if(isChatMultiTab())
@@ -469,7 +493,7 @@ bool LLIMFloater::toggle(const LLUUID& session_id)
 	if(!isChatMultiTab())
 	{
 		LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
-		if (floater && floater->getVisible() && floater->isDocked())
+		if (floater && floater->getVisible())
 		{
 			// clicking on chiclet to close floater just hides it to maintain existing
 			// scroll/text entry state
@@ -947,3 +971,20 @@ void LLIMFloater::initIMFloater()
 	// init chat window type before user changed it in preferences
 	isChatMultiTab();
 }
+
+//static
+void LLIMFloater::sRemoveTypingIndicator(const LLSD& data)
+{
+	LLUUID session_id = data["session_id"];
+	if (session_id.isNull()) return;
+
+	LLUUID from_id = data["from_id"];
+	if (gAgentID == from_id || LLUUID::null == from_id) return;
+
+	LLIMFloater* floater = LLIMFloater::findInstance(session_id);
+	if (!floater) return;
+
+	if (IM_NOTHING_SPECIAL != floater->mDialog) return;
+
+	floater->removeTypingIndicator();
+}
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index f90bc35c3417c305bd02698f826ce7a73b0352e4..bc7a43e852a2a9da3dc49f8e4c4e644873b453ab 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -33,9 +33,10 @@
 #ifndef LL_IMFLOATER_H
 #define LL_IMFLOATER_H
 
-#include "lltransientdockablefloater.h"
+#include "llinstantmessage.h"
 #include "lllogchat.h"
 #include "lltooldraganddrop.h"
+#include "lltransientdockablefloater.h"
 
 class LLLineEditor;
 class LLPanelChatControlPanel;
@@ -109,6 +110,9 @@ public:
 
 	static void initIMFloater();
 
+	//used as a callback on receiving new IM message
+	static void sRemoveTypingIndicator(const LLSD& data);
+
 private:
 	// process focus events to set a currently active session
 	/* virtual */ void onFocusLost();
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index e6ded5f371b9b9e05b8fc28d42d9e328b43c18d0..8b6762ce3802f567ad3dc09dbfcc049b5fa63c6e 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -66,7 +66,6 @@
 #include "llimview.h"                  // for LLIMModel to get other avatar id in chat
 #include "llkeyboard.h"
 #include "lllineeditor.h"
-#include "llnotify.h"
 #include "llpanelimcontrolpanel.h"
 #include "llrecentpeople.h"
 #include "llresmgr.h"
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 4d2ba16a4cf1c61c20fad5742fa0aad16d3b48b4..9e878f8c7593b8a7596e68ff2696b509e34c3651 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -72,7 +72,6 @@
 #include "llviewerwindow.h"
 #include "llnotifications.h"
 #include "llnotificationsutil.h"
-#include "llnotify.h"
 #include "llnearbychat.h"
 #include "llviewerregion.h"
 #include "llvoicechannel.h"
@@ -94,7 +93,8 @@ const static std::string ADHOC_NAME_SUFFIX(" Conference");
 std::string LLCallDialogManager::sPreviousSessionlName = "";
 std::string LLCallDialogManager::sCurrentSessionlName = "";
 LLIMModel::LLIMSession* LLCallDialogManager::sSession = NULL;
-
+LLVoiceChannel::EState LLCallDialogManager::sOldState = LLVoiceChannel::STATE_READY;
+const LLUUID LLOutgoingCallDialog::OCD_KEY = LLUUID("7CF78E11-0CFE-498D-ADB9-1417BF03DDB4");
 //
 // Globals
 //
@@ -154,7 +154,7 @@ LLIMModel::LLIMModel()
 	addNewMsgCallback(toast_callback);
 }
 
-LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
+LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice)
 :	mSessionID(session_id),
 	mName(name),
 	mType(type),
@@ -168,24 +168,42 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 	mCallBackEnabled(true),
 	mTextIMPossible(true),
 	mOtherParticipantIsAvatar(true),
-	mStartCallOnInitialize(false)
+	mStartCallOnInitialize(false),
+	mStartedAsIMCall(voice)
 {
+	// set P2P type by default
+	mSessionType = P2P_SESSION;
+
 	if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
 	{
 		mVoiceChannel  = new LLVoiceChannelP2P(session_id, name, other_participant_id);
+
+		// check if it was AVALINE call
+		if (!mOtherParticipantIsAvatar)
+		{
+			mSessionType = AVALINE_SESSION;
+		} 
 	}
 	else
 	{
 		mVoiceChannel = new LLVoiceChannelGroup(session_id, name);
+
+		// determine whether it is group or conference session
+		if (gAgent.isInGroup(mSessionID))
+		{
+			mSessionType = GROUP_SESSION;
+		}
+		else
+		{
+			mSessionType = ADHOC_SESSION;
+		} 
 	}
 
 	if(mVoiceChannel)
 	{
-		mVoiceChannelStateChangeConnection = mVoiceChannel->setStateChangedCallback(boost::bind(&LLIMSession::onVoiceChannelStateChanged, this, _1, _2));
+		mVoiceChannelStateChangeConnection = mVoiceChannel->setStateChangedCallback(boost::bind(&LLIMSession::onVoiceChannelStateChanged, this, _1, _2, _3));
 	}
-	// define what type of session was opened
-	setSessionType();
-	
+		
 	mSpeakers = new LLIMSpeakerMgr(mVoiceChannel);
 
 	// All participants will be added to the list of people we've recently interacted with.
@@ -218,53 +236,27 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 	}
 }
 
-void LLIMModel::LLIMSession::setSessionType()
-{
-	// set P2P type by default
-	mSessionType = P2P_SESSION;
-
-	if (dynamic_cast<LLVoiceChannelP2P*>(mVoiceChannel) && !mOtherParticipantIsAvatar) // P2P AVALINE channel was opened
-	{
-		mSessionType = AVALINE_SESSION;
-		return;
-	} 
-	else if(dynamic_cast<LLVoiceChannelGroup*>(mVoiceChannel)) // GROUP channel was opened
-	{
-		if (mType == IM_SESSION_CONFERENCE_START)
-		{
-			mSessionType = ADHOC_SESSION;
-			return;
-		} 
-		else if(mType == IM_SESSION_GROUP_START)
-		{
-			mSessionType = GROUP_SESSION;
-			return;
-		}		
-	}
-}
-
-void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
+void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction)
 {
-	// *TODO: remove hardcoded string!!!!!!!!!!!
-
 	bool is_p2p_session = dynamic_cast<LLVoiceChannelP2P*>(mVoiceChannel);
-	bool is_incoming_call = false;
 	std::string other_avatar_name;
 
 	if(is_p2p_session)
 	{
-		is_incoming_call = static_cast<LLVoiceChannelP2P*>(mVoiceChannel)->isIncomingCall();
 		gCacheName->getFullName(mOtherParticipantID, other_avatar_name);
+		std::string you = LLTrans::getString("You");
+		std::string started_call = LLTrans::getString("started_call");
+		std::string joined_call = LLTrans::getString("joined_call");
 
-		if(is_incoming_call)
+		if(direction == LLVoiceChannel::INCOMING_CALL)
 		{
 			switch(new_state)
 			{
 			case LLVoiceChannel::STATE_CALL_STARTED :
-				LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Started a voice call");
+				LLIMModel::getInstance()->addMessageSilently(mSessionID, other_avatar_name, mOtherParticipantID, started_call);
 				break;
 			case LLVoiceChannel::STATE_CONNECTED :
-				LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Joined the voice call");
+				LLIMModel::getInstance()->addMessageSilently(mSessionID, you, gAgent.getID(), joined_call);
 			default:
 				break;
 			}
@@ -274,10 +266,10 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
 			switch(new_state)
 			{
 			case LLVoiceChannel::STATE_CALL_STARTED :
-				LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Started a voice call");
+				LLIMModel::getInstance()->addMessageSilently(mSessionID, you, gAgent.getID(), started_call);
 				break;
 			case LLVoiceChannel::STATE_CONNECTED :
-				LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Joined the voice call");
+				LLIMModel::getInstance()->addMessageSilently(mSessionID, other_avatar_name, mOtherParticipantID, joined_call);
 			default:
 				break;
 			}
@@ -463,7 +455,7 @@ void LLIMModel::testMessages()
 
 //session name should not be empty
 bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, 
-						   const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
+						   const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice)
 {
 	if (name.empty())
 	{
@@ -477,7 +469,7 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co
 		return false;
 	}
 
-	LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids);
+	LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids, voice);
 	mId2SessionMap[session_id] = session;
 
 	LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id);
@@ -486,6 +478,12 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co
 
 }
 
+bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, bool voice)
+{
+	std::vector<LLUUID> no_ids;
+	return newSession(session_id, name, type, other_participant_id, no_ids, voice);
+}
+
 bool LLIMModel::clearSession(const LLUUID& session_id)
 {
 	if (mId2SessionMap.find(session_id) == mId2SessionMap.end()) return false;
@@ -585,12 +583,33 @@ bool LLIMModel::proccessOnlineOfflineNotification(
 
 bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, 
 						   const std::string& utf8_text, bool log2file /* = true */) { 
+
+	LLIMSession* session = addMessageSilently(session_id, from, from_id, utf8_text, log2file);
+	if (!session) return false;
+
+	// notify listeners
+	LLSD arg;
+	arg["session_id"] = session_id;
+	arg["num_unread"] = session->mNumUnread;
+	arg["participant_unread"] = session->mParticipantUnreadMessageCount;
+	arg["message"] = utf8_text;
+	arg["from"] = from;
+	arg["from_id"] = from_id;
+	arg["time"] = LLLogChat::timestamp(false);
+	mNewMsgSignal(arg);
+
+	return true;
+}
+
+LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, 
+													 const std::string& utf8_text, bool log2file /* = true */)
+{
 	LLIMSession* session = findIMSession(session_id);
 
 	if (!session)
 	{
 		llwarns << "session " << session_id << "does not exist " << llendl;
-		return false;
+		return NULL;
 	}
 
 	addToHistory(session_id, from, from_id, utf8_text);
@@ -604,19 +623,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
 		++(session->mParticipantUnreadMessageCount);
 	}
 
-
-	// notify listeners
-	LLSD arg;
-	arg["session_id"] = session_id;
-	arg["num_unread"] = session->mNumUnread;
-	arg["participant_unread"] = session->mParticipantUnreadMessageCount;
-	arg["message"] = utf8_text;
-	arg["from"] = from;
-	arg["from_id"] = from_id;
-	arg["time"] = LLLogChat::timestamp(false);
-	mNewMsgSignal(arg);
-
-	return true;
+	return session;
 }
 
 
@@ -1060,15 +1067,15 @@ public:
 
 			if (LLIMMgr::INVITATION_TYPE_VOICE == mInvitiationType)
 			{
-				gIMMgr->startCall(mSessionID);
+				gIMMgr->startCall(mSessionID, LLVoiceChannel::INCOMING_CALL);
 			}
 
 			if ((mInvitiationType == LLIMMgr::INVITATION_TYPE_VOICE 
 				|| mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE)
 				&& LLIMModel::getInstance()->findIMSession(mSessionID))
 			{
-				// always open IM window when connecting to voice
-				LLIMFloater::show(mSessionID);
+				// TODO remove in 2010, for voice calls we do not open an IM window
+				//LLIMFloater::show(mSessionID);
 			}
 
 			gIMMgr->clearPendingAgentListUpdates(mSessionID);
@@ -1267,71 +1274,45 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
 	}
 	sSession = session;
 	sSession->mVoiceChannel->setStateChangedCallback(LLCallDialogManager::onVoiceChannelStateChanged);
-	sPreviousSessionlName = sCurrentSessionlName;
-	sCurrentSessionlName = session->mName;
+	if(sCurrentSessionlName != session->mName)
+	{
+		sPreviousSessionlName = sCurrentSessionlName;
+		sCurrentSessionlName = session->mName;
+	}
 }
 
-void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
+void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction)
 {
 	LLSD mCallDialogPayload;
-	LLOutgoingCallDialog* ocd;
-	bool is_incoming;
+	LLOutgoingCallDialog* ocd = NULL;
+
+	if(sOldState == new_state)
+	{
+		return;
+	}
+
+	sOldState = new_state;
 
 	mCallDialogPayload["session_id"] = sSession->mSessionID;
 	mCallDialogPayload["session_name"] = sSession->mName;
 	mCallDialogPayload["other_user_id"] = sSession->mOtherParticipantID;
 	mCallDialogPayload["old_channel_name"] = sPreviousSessionlName;
+	mCallDialogPayload["state"] = new_state;
+	mCallDialogPayload["disconnected_channel_name"] = sSession->mName;
+	mCallDialogPayload["session_type"] = sSession->mSessionType;
 
 	switch(new_state)
 	{			
 	case LLVoiceChannel::STATE_CALL_STARTED :
 		// do not show "Calling to..." if it is incoming call
-		is_incoming = LLVoiceClient::getInstance()->isSessionIncoming(sSession->mSessionID);
-		// *TODO: implement for AdHoc and Group voice chats
-		if(is_incoming)
+		if(direction == LLVoiceChannel::INCOMING_CALL)
 		{
 			return;
 		}
-
-		ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
-		if (ocd)
-		{
-			ocd->getChild<LLTextBox>("calling")->setVisible(true);
-			ocd->getChild<LLTextBox>("leaving")->setVisible(true);
-			ocd->getChild<LLTextBox>("connecting")->setVisible(false);
-			ocd->getChild<LLTextBox>("noanswer")->setVisible(false);
-			ocd->getChild<LLButton>("Cancel")->setVisible(true);
-		}
-		return;
-
-	case LLVoiceChannel::STATE_RINGING :
-		ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
-		if (ocd)
-		{
-			ocd->getChild<LLTextBox>("calling")->setVisible(false);
-			ocd->getChild<LLTextBox>("leaving")->setVisible(true);
-			ocd->getChild<LLTextBox>("connecting")->setVisible(true);
-			ocd->getChild<LLTextBox>("noanswer")->setVisible(false);
-			ocd->getChild<LLButton>("Cancel")->setVisible(true);
-		}
-		return;
-
-	case LLVoiceChannel::STATE_ERROR :
-		mCallDialogPayload["start_timer"] = true;
-		ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
-		if (ocd)
-		{
-			ocd->getChild<LLTextBox>("calling")->setVisible(false);
-			ocd->getChild<LLTextBox>("leaving")->setVisible(false);
-			ocd->getChild<LLTextBox>("connecting")->setVisible(false);
-			ocd->getChild<LLTextBox>("noanswer")->setVisible(true);
-			ocd->getChild<LLButton>("Cancel")->setVisible(false);
-		}
-		return;
+		break;
 
 	case LLVoiceChannel::STATE_CONNECTED :
-	case LLVoiceChannel::STATE_HUNG_UP :
-		ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
+		ocd = LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
 		if (ocd)
 		{
 			ocd->closeFloater();
@@ -1342,6 +1323,11 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
 		break;
 	}
 
+	ocd = LLFloaterReg::getTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
+	if(ocd)
+	{
+		ocd->show(mCallDialogPayload);
+	}	
 }
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1371,12 +1357,13 @@ void LLCallDialog::onOpen(const LLSD& key)
 LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) :
 LLCallDialog(payload)
 {
-	LLOutgoingCallDialog* instance = LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", payload);
+	LLOutgoingCallDialog* instance = LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
 	if(instance && instance->getVisible())
 	{
 		instance->onCancel(instance);
 	}	
 }
+
 void LLOutgoingCallDialog::draw()
 {
 	if (lifetimeHasExpired())
@@ -1405,10 +1392,14 @@ void LLOutgoingCallDialog::onLifetimeExpired()
 	closeFloater();
 }
 
-void LLOutgoingCallDialog::onOpen(const LLSD& key)
+void LLOutgoingCallDialog::show(const LLSD& key)
 {
-	LLCallDialog::onOpen(key);
+	mPayload = key;
+
+	// hide all text at first
+	hideAllText();
 
+	// customize text strings
 	// tell the user which voice channel they are leaving
 	if (!mPayload["old_channel_name"].asString().empty())
 	{
@@ -1419,6 +1410,12 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)
 		childSetTextArg("leaving", "[CURRENT_CHAT]", getString("localchat"));
 	}
 
+	if (!mPayload["disconnected_channel_name"].asString().empty())
+	{
+		childSetTextArg("nearby", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString());
+		childSetTextArg("nearby_P2P", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString());
+	}
+
 	std::string callee_name = mPayload["session_name"].asString();
 	if (callee_name == "anonymous")
 	{
@@ -1435,12 +1432,48 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)
 
 	// stop timer by default
 	mLifetimeTimer.stop();
-	if(mPayload.has("start_timer"))
+
+	// show only necessary strings and controls
+	switch(mPayload["state"].asInteger())
 	{
-		mLifetimeTimer.reset();
+	case LLVoiceChannel::STATE_CALL_STARTED :
+		getChild<LLTextBox>("calling")->setVisible(true);
+		getChild<LLTextBox>("leaving")->setVisible(true);
+		break;
+	case LLVoiceChannel::STATE_RINGING :
+		getChild<LLTextBox>("leaving")->setVisible(true);
+		getChild<LLTextBox>("connecting")->setVisible(true);
+		break;
+	case LLVoiceChannel::STATE_ERROR :
+		getChild<LLTextBox>("noanswer")->setVisible(true);
+		getChild<LLButton>("Cancel")->setVisible(false);
+		mLifetimeTimer.start();
+		break;
+	case LLVoiceChannel::STATE_HUNG_UP :
+		if (mPayload["session_type"].asInteger() == LLIMModel::LLIMSession::P2P_SESSION)
+		{
+			getChild<LLTextBox>("nearby_P2P")->setVisible(true);
+		} 
+		else
+		{
+			getChild<LLTextBox>("nearby")->setVisible(true);
+		}
+		getChild<LLButton>("Cancel")->setVisible(false);
+		mLifetimeTimer.start();
 	}
+
+	openFloater(LLOutgoingCallDialog::OCD_KEY);
 }
 
+void LLOutgoingCallDialog::hideAllText()
+{
+	getChild<LLTextBox>("calling")->setVisible(false);
+	getChild<LLTextBox>("leaving")->setVisible(false);
+	getChild<LLTextBox>("connecting")->setVisible(false);
+	getChild<LLTextBox>("nearby_P2P")->setVisible(false);
+	getChild<LLTextBox>("nearby")->setVisible(false);
+	getChild<LLTextBox>("noanswer")->setVisible(false);
+}
 
 //static
 void LLOutgoingCallDialog::onCancel(void* user_data)
@@ -1470,6 +1503,7 @@ BOOL LLOutgoingCallDialog::postBuild()
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Class LLIncomingCallDialog
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
 LLIncomingCallDialog::LLIncomingCallDialog(const LLSD& payload) :
 LLCallDialog(payload)
 {
@@ -1479,26 +1513,34 @@ BOOL LLIncomingCallDialog::postBuild()
 {
 	LLDockableFloater::postBuild();
 
+	LLUUID session_id = mPayload["session_id"].asUUID();
 	LLSD caller_id = mPayload["caller_id"];
-	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
-
-	std::string call_type = getString("VoiceInviteP2P");
 	std::string caller_name = mPayload["caller_name"].asString();
+	
+	std::string call_type;
+	if (gAgent.isInGroup(session_id))
+	{
+		LLStringUtil::format_map_t args;
+		LLGroupData data;
+		if (gAgent.getGroupData(session_id, data))
+		{
+			args["[GROUP]"] = data.mName;
+			call_type = getString(mPayload["notify_box_type"], args);
+		}
+	}
+	else
+	{
+		call_type = getString(mPayload["notify_box_type"]);
+	}
+		
 	if (caller_name == "anonymous")
 	{
 		caller_name = getString("anonymous");
 	}
 	
 	setTitle(caller_name + " " + call_type);
-	
-	// If it is not a P2P invite, then it's an AdHoc invite
-	if ( type != IM_SESSION_P2P_INVITE )
-	{
-		call_type = getString("VoiceInviteAdHoc");
-	}
 
 	// check to see if this is an Avaline call
-	LLUUID session_id = mPayload["session_id"].asUUID();
 	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
 	childSetVisible("Start IM", is_avatar); // no IM for avaline
 
@@ -1587,11 +1629,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
 
 			if (voice)
 			{
-				if (gIMMgr->startCall(session_id))
-				{
-					// always open IM window when connecting to voice
-					LLIMFloater::show(session_id);
-				}
+				gIMMgr->startCall(session_id, LLVoiceChannel::INCOMING_CALL);
 			}
 
 			gIMMgr->clearPendingAgentListUpdates(session_id);
@@ -1630,11 +1668,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
 				}
 			}
 			
-			LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id);
-			if (new_session_id != LLUUID::null)
-			{
-				LLIMFloater::show(new_session_id);
-			}
+			LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id, true);
 
 			std::string url = gAgent.getRegion()->getCapability(
 				"ChatSessionRequest");
@@ -1710,11 +1744,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
 					payload["session_handle"].asString(),
 					payload["session_uri"].asString());
 
-				if (gIMMgr->startCall(session_id))
-				{
-					// always open IM window when connecting to voice
-					LLIMFloater::show(session_id);
-				}
+				gIMMgr->startCall(session_id);
 
 				gIMMgr->clearPendingAgentListUpdates(session_id);
 				gIMMgr->clearPendingInvitation(session_id);
@@ -1724,11 +1754,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
 				LLUUID new_session_id = gIMMgr->addSession(
 					payload["session_name"].asString(),
 					type,
-					session_id);
-				if (new_session_id != LLUUID::null)
-				{
-					LLIMFloater::show(new_session_id);
-				}
+					session_id, true);
 
 				std::string url = gAgent.getRegion()->getCapability(
 					"ChatSessionRequest");
@@ -1798,6 +1824,8 @@ LLIMMgr::LLIMMgr() :
 {
 	mPendingInvitations = LLSD::emptyMap();
 	mPendingAgentListUpdates = LLSD::emptyMap();
+
+	LLIMModel::getInstance()->addNewMsgCallback(boost::bind(&LLIMFloater::sRemoveTypingIndicator, _1));
 }
 
 // Add a message to a session. 
@@ -2021,11 +2049,7 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name,
 							const std::string& voice_session_handle,
 							const std::string& caller_uri)
 {
-	LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id);
-	if (session_id != LLUUID::null)
-	{
-		LLIMFloater::show(session_id);
-	}
+	LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id, true);
 
 	LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
 	if (speaker_mgr)
@@ -2046,11 +2070,11 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name,
 LLUUID LLIMMgr::addSession(
 	const std::string& name,
 	EInstantMessage dialog,
-	const LLUUID& other_participant_id)
+	const LLUUID& other_participant_id, bool voice)
 {
 	LLDynamicArray<LLUUID> ids;
 	ids.put(other_participant_id);
-	return addSession(name, dialog, other_participant_id, ids);
+	return addSession(name, dialog, other_participant_id, ids, voice);
 }
 
 // Adds a session using the given session_id.  If the session already exists 
@@ -2059,7 +2083,7 @@ LLUUID LLIMMgr::addSession(
 	const std::string& name,
 	EInstantMessage dialog,
 	const LLUUID& other_participant_id,
-	const LLDynamicArray<LLUUID>& ids)
+	const LLDynamicArray<LLUUID>& ids, bool voice)
 {
 	if (0 == ids.getLength())
 	{
@@ -2078,7 +2102,7 @@ LLUUID LLIMMgr::addSession(
 
 	if (new_session)
 	{
-		LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids);
+		LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids, voice);
 	}
 
 
@@ -2438,11 +2462,12 @@ void LLIMMgr::removeSessionObserver(LLIMSessionObserver *observer)
 	mSessionObservers.remove(observer);
 }
 
-bool LLIMMgr::startCall(const LLUUID& session_id)
+bool LLIMMgr::startCall(const LLUUID& session_id, LLVoiceChannel::EDirection direction)
 {
 	LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);
 	if (!voice_channel) return false;
 	
+	voice_channel->setCallDirection(direction);
 	voice_channel->activate();
 	return true;
 }
@@ -2456,6 +2481,14 @@ bool LLIMMgr::endCall(const LLUUID& session_id)
 	return true;
 }
 
+bool LLIMMgr::isVoiceCall(const LLUUID& session_id)
+{
+	LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
+	if (!im_session) return false;
+
+	return im_session->mStartedAsIMCall;
+}
+
 // create a floater and update internal representation for
 // consistency. Returns the pointer, caller (the class instance since
 // it is a private method) is not responsible for deleting the
@@ -2730,6 +2763,11 @@ public:
 		{
 			im_floater->processSessionUpdate(input["body"]["info"]);
 		}
+		LLIMSpeakerMgr* im_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+		if (im_mgr)
+		{
+			im_mgr->processSessionUpdate(input["body"]["info"]);
+		}
 	}
 };
 
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index f26889ac91d9d4114b9f12e89b574e5e2556d69f..09f0c9df7126af0dcfcd8d11f14f760b34990733 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -65,14 +65,13 @@ public:
 		} SType;
 
 		LLIMSession(const LLUUID& session_id, const std::string& name, 
-			const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids);
+			const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice);
 		virtual ~LLIMSession();
 
 		void sessionInitReplyReceived(const LLUUID& new_session_id);
-		void setSessionType(); //define what type of session was opened
 		void addMessagesFromHistory(const std::list<LLSD>& history);
 		void addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time);
-		void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
+		void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction);
 		static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata);
 
 		LLUUID mSessionID;
@@ -105,6 +104,9 @@ public:
 		bool mTextIMPossible;
 		bool mOtherParticipantIsAvatar;
 		bool mStartCallOnInitialize;
+
+		//if IM session is created for a voice call
+		bool mStartedAsIMCall;
 	};
 	
 
@@ -144,7 +146,10 @@ public:
 	 * @param name session name should not be empty, will return false if empty
 	 */
 	bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, 
-		const std::vector<LLUUID>& ids = std::vector<LLUUID>());
+		const std::vector<LLUUID>& ids, bool voice = false);
+
+	bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,
+		const LLUUID& other_participant_id, bool voice = false);
 
 	/**
 	 * Remove all session data associated with a session specified by session_id
@@ -163,6 +168,12 @@ public:
 	 */
 	bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true);
 
+	/**
+	 * Similar to addMessage(...) above but won't send a signal about a new message added
+	 */
+	LLIMModel::LLIMSession* addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, 
+		const std::string& utf8_text, bool log2file = true);
+
 	/**
 	 * Add a system message to an IM Model
 	 */
@@ -285,14 +296,14 @@ public:
 	// session.
 	LLUUID addSession(const std::string& name,
 					  EInstantMessage dialog,
-					  const LLUUID& other_participant_id);
+					  const LLUUID& other_participant_id, bool voice = false);
 
 	// Adds a session using a specific group of starting agents
 	// the dialog type is assumed correct. Returns the uuid of the session.
 	LLUUID addSession(const std::string& name,
 					  EInstantMessage dialog,
 					  const LLUUID& other_participant_id,
-					  const LLDynamicArray<LLUUID>& ids);
+					  const LLDynamicArray<LLUUID>& ids, bool voice = false);
 
 	/**
 	 * Creates a P2P session with the requisite handle for responding to voice calls.
@@ -384,7 +395,7 @@ public:
 	 * Start call in a session
 	 * @return false if voice channel doesn't exist
 	 **/
-	bool startCall(const LLUUID& session_id);
+	bool startCall(const LLUUID& session_id, LLVoiceChannel::EDirection direction = LLVoiceChannel::OUTGOING_CALL);
 
 	/**
 	 * End call in a session
@@ -392,6 +403,8 @@ public:
 	 **/
 	bool endCall(const LLUUID& session_id);
 
+	bool isVoiceCall(const LLUUID& session_id);
+
 private:
 
 	/**
@@ -448,12 +461,13 @@ public:
 
 	static void initClass();
 	static void onVoiceChannelChanged(const LLUUID &session_id);
-	static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
+	static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction);
 
 protected:
 	static std::string sPreviousSessionlName;
 	static std::string sCurrentSessionlName;
 	static LLIMModel::LLIMSession* sSession;
+	static LLVoiceChannel::EState sOldState;
 };
 
 class LLCallDialog : public LLDockableFloater
@@ -491,14 +505,18 @@ public:
 	LLOutgoingCallDialog(const LLSD& payload);
 
 	/*virtual*/ BOOL postBuild();
-	/*virtual*/ void onOpen(const LLSD& key);
+	void show(const LLSD& key);
 
 	static void onCancel(void* user_data);
+	static const LLUUID OCD_KEY;
 
 	// check timer state
 	/*virtual*/ void draw();
 
 private:
+
+	// hide all text boxes
+	void hideAllText();
 	// lifetime timer for NO_ANSWER notification
 	LLTimer	mLifetimeTimer;
 	// lifetime duration for NO_ANSWER notification
diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp
index 42d061ff7257023bdde20aeab2479657339f82ba..cb35a287e9c10b06db1232919d884e7acae6d9ce 100644
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -416,18 +416,6 @@ void LLInspectObject::updateDescription(LLSelectNode* nodep)
 
 	LLTextBox* textbox = getChild<LLTextBox>("object_description");
 	textbox->setValue(desc);
-
-	// Truncate description text to fit in widget
-	// *HACK: OMG, use lower-left corner to truncate text
-	// Don't round the position, we want the left of the character
-	S32 corner_index = textbox->getDocIndexFromLocalCoord( 0, 0, FALSE);
-	LLWString desc_wide = textbox->getWText();
-	// index == length if position is past last character
-	if (corner_index < (S32)desc_wide.length())
-	{
-		desc_wide = desc_wide.substr(0, corner_index);
-		textbox->setWText(desc_wide);
-	}
 }
 
 void LLInspectObject::updateMediaCurrentURL()
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 419910b5b6c77bbb6ac98ea6b92387bb25614855..922cb53a35902d1ac546f91fe7b61a122c82b4a9 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -192,12 +192,7 @@ BOOL LLInvFVBridge::isItemRemovable()
 	{
 		return TRUE;
 	}
-	if (gAgentWearables.isWearingItem(mUUID))
-	{
-		return FALSE;
-	}
-	const LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
-	if (avatar && avatar->isWearingAttachment(mUUID))
+	if (get_is_item_worn(mUUID))
 	{
 		return FALSE;
 	}
@@ -508,41 +503,6 @@ void hide_context_entries(LLMenuGL& menu,
 	}
 }
 
-bool isWornLink(LLUUID link_id)
-{
-	LLViewerInventoryItem *link = gInventory.getItem(link_id);
-	if (!link)
-		return false;
-	LLViewerInventoryItem *item = link->getLinkedItem();
-	if (!item)
-		return false;
-	
-	switch(item->getType())
-	{
-	case LLAssetType::AT_OBJECT:
-	{
-		LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject();
-		if(my_avatar && my_avatar->isWearingAttachment(item->getUUID()))
-			return true;
-	}
-	break;
-
-	case LLAssetType::AT_BODYPART:
-	case LLAssetType::AT_CLOTHING:
-		if(gAgentWearables.isWearingItem(item->getUUID()))
-			return true;
-		break;
-
-	case LLAssetType::AT_GESTURE:
-		if (LLGestureManager::instance().isGestureActive(item->getUUID()))
-			return true;
-		break;
-	default:
-		break;
-	}
-	return false;
-}
-
 // Helper for commonly-used entries
 void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
 										std::vector<std::string> &items,
@@ -554,7 +514,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
 	if (is_sidepanel)
 	{
 		// Sidepanel includes restricted menu.
-		if (obj && obj->getIsLinkType() && !isWornLink(mUUID))
+		if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID))
 		{
 			items.push_back(std::string("Remove Link"));
 		}
@@ -608,15 +568,18 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
 		disabled_items.push_back(std::string("Paste"));
 	}
 
-	items.push_back(std::string("Paste As Link"));
-	if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0)
+	if (gAgent.isGodlike())
 	{
-		disabled_items.push_back(std::string("Paste As Link"));
+		items.push_back(std::string("Paste As Link"));
+		if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0)
+		{
+			disabled_items.push_back(std::string("Paste As Link"));
+		}
 	}
 	items.push_back(std::string("Paste Separator"));
 
 
-	if (obj && obj->getIsLinkType() && !isWornLink(mUUID))
+	if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID))
 	{
 		items.push_back(std::string("Remove Link"));
 	}
@@ -983,7 +946,7 @@ bool LLInvFVBridge::isInOutfitsSidePanel() const
 		dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
 	if (!outfit_panel)
 		return false;
-	return outfit_panel->isAccordionPanel(my_panel);
+	return outfit_panel->isTabPanel(my_panel);
 }
 
 // +=================================================+
@@ -1206,7 +1169,7 @@ LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
 {
 	U8 font = LLFontGL::NORMAL;
 
-	if( gAgentWearables.isWearingItem( mUUID ) )
+	if (get_is_item_worn(mUUID))
 	{
 		// llinfos << "BOLD" << llendl;
 		font |= LLFontGL::BOLD;
@@ -1349,29 +1312,33 @@ BOOL LLItemBridge::isItemCopyable() const
 	LLViewerInventoryItem* item = getItem();
 	if (item)
 	{
-		// can't copy worn objects. DEV-15183
-		LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
-		if( !avatarp )
+		// Can't copy worn objects. DEV-15183
+		if(get_is_item_worn(mUUID))
 		{
 			return FALSE;
 		}
 
-		if(avatarp->isWearingAttachment(mUUID))
+		// You can never copy a link.
+		if (item->getIsLinkType())
 		{
 			return FALSE;
 		}
 
-		// All items can be copied, not all can be pasted.
-		// The only time an item can't be copied is if it's a link
-		// return (item->getPermissions().allowCopyBy(gAgent.getID()));
-		if (item->getIsLinkType())
+		if (gAgent.isGodlike())
 		{
-			return FALSE;
+			// All items can be copied in god mode since you can
+			// at least paste-as-link the item, though you 
+			// still may not be able paste the item.
+			return TRUE;
+		}
+		else
+		{
+			return (item->getPermissions().allowCopyBy(gAgent.getID()));
 		}
-		return TRUE;
 	}
 	return FALSE;
 }
+
 BOOL LLItemBridge::copyToClipboard() const
 {
 	if(isItemCopyable())
@@ -1482,10 +1449,7 @@ BOOL LLFolderBridge::isItemRemovable()
 		return FALSE;
 	}
 
-	// Allow protected types to be removed, but issue a warning.
-	// Restrict to god mode so users don't inadvertently mess up their inventory.
-	if(LLFolderType::lookupIsProtectedType(category->getPreferredType()) &&
-	   !gAgent.isGodlike())
+	if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
 	{
 		return FALSE;
 	}
@@ -1691,23 +1655,10 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
 					for( i = 0; i < descendent_items.count(); i++ )
 					{
 						LLInventoryItem* item = descendent_items[i];
-						if( (item->getType() == LLAssetType::AT_CLOTHING) ||
-							(item->getType() == LLAssetType::AT_BODYPART) )
+						if (get_is_item_worn(item->getUUID()))
 						{
-							if( gAgentWearables.isWearingItem( item->getUUID() ) )
-							{
-								is_movable = FALSE;  // It's generally movable, but not into the trash!
-								break;
-							}
-						}
-						else
-						if( item->getType() == LLAssetType::AT_OBJECT )
-						{
-							if( avatar->isWearingAttachment( item->getUUID() ) )
-							{
-								is_movable = FALSE;  // It's generally movable, but not into the trash!
-								break;
-							}
+							is_movable = FALSE;
+							break; // It's generally movable, but not into the trash!
 						}
 					}
 				}
@@ -2197,6 +2148,12 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model
 		restoreItem();
 		return;
 	}
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+	else if ("delete_system_folder" == action)
+	{
+		removeSystemFolder();
+	}
+#endif
 }
 
 void LLFolderBridge::openItem()
@@ -2323,13 +2280,27 @@ BOOL LLFolderBridge::removeItem()
 
 	LLNotification::Params params("ConfirmDeleteProtectedCategory");
 	params.payload(payload).substitutions(args).functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2));
-	if (LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
+	LLNotifications::instance().forceResponse(params, 0);
+	return TRUE;
+}
+
+
+BOOL LLFolderBridge::removeSystemFolder()
+{
+	const LLViewerInventoryCategory *cat = getCategory();
+	if (!LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
 	{
-		LLNotifications::instance().add(params);
+		return FALSE;
 	}
-	else
+
+	LLSD payload;
+	LLSD args;
+	args["FOLDERNAME"] = cat->getName();
+
+	LLNotification::Params params("ConfirmDeleteProtectedCategory");
+	params.payload(payload).substitutions(args).functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2));
 	{
-		LLNotifications::instance().forceResponse(params, 0);
+		LLNotifications::instance().add(params);
 	}
 	return TRUE;
 }
@@ -2498,6 +2469,13 @@ void LLFolderBridge::folderOptionsMenu()
 		}
 	}
 
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+	if (LLFolderType::lookupIsProtectedType(type))
+	{
+		mItems.push_back(std::string("Delete System Folder"));
+	}
+#endif
+
 	// wearables related functionality for folders.
 	//is_wearable
 	LLFindWearables is_wearable;
@@ -2509,7 +2487,10 @@ void LLFolderBridge::folderOptionsMenu()
 		checkFolderForContentsOfType(model, is_object) ||
 		checkFolderForContentsOfType(model, is_gesture) )
 	{
-		mItems.push_back(std::string("Folder Wearables Separator"));
+		if (!is_sidepanel)
+		{
+			mItems.push_back(std::string("Folder Wearables Separator"));
+		}
 
 		// Only enable add/replace outfit for non-default folders.
 		if (!is_default_folder)
@@ -2522,7 +2503,10 @@ void LLFolderBridge::folderOptionsMenu()
 			mItems.push_back(std::string("Wear As Ensemble"));
 		}
 		mItems.push_back(std::string("Remove From Outfit"));
-
+		if (!areAnyContentsWorn(model))
+		{
+			disabled_items.push_back(std::string("Remove From Outfit"));
+		}
 		mItems.push_back(std::string("Outfit Separator"));
 	}
 	hide_context_entries(*mMenu, mItems, disabled_items);
@@ -2544,6 +2528,35 @@ BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInv
 	return ((item_array.count() > 0) ? TRUE : FALSE );
 }
 
+class LLFindWorn : public LLInventoryCollectFunctor
+{
+public:
+	LLFindWorn() {}
+	virtual ~LLFindWorn() {}
+	virtual bool operator()(LLInventoryCategory* cat,
+							LLInventoryItem* item)
+	{
+		if (item && get_is_item_worn(item->getUUID()))
+		{
+			return TRUE;
+		}
+		return FALSE;
+	}
+};
+
+BOOL LLFolderBridge::areAnyContentsWorn(LLInventoryModel* model) const
+{
+	LLInventoryModel::cat_array_t cat_array;
+	LLInventoryModel::item_array_t item_array;
+	LLFindWorn is_worn;
+	model->collectDescendentsIf(mUUID,
+								cat_array,
+								item_array,
+								LLInventoryModel::EXCLUDE_TRASH,
+								is_worn);
+	return (item_array.size() > 0);
+}
+
 // Flags unused
 void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 {
@@ -2666,6 +2679,13 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 		mItems.push_back(std::string("--no options--"));
 		mDisabledItems.push_back(std::string("--no options--"));
 	}
+
+	// Preemptively disable system folder removal if more than one item selected.
+	if ((flags & FIRST_SELECTED_ITEM) == 0)
+	{
+		mDisabledItems.push_back(std::string("Delete System Folder"));
+	}
+	
 	hide_context_entries(menu, mItems, mDisabledItems);
 }
 
@@ -2916,6 +2936,9 @@ void saveItemsOrder(LLInventoryModel::item_array_t& items)
 		item->updateServer(FALSE);
 
 		gInventory.updateItem(item);
+
+		// Tell the parent folder to refresh its sort order.
+		gInventory.addChangedMask(LLInventoryObserver::SORT, item->getParentUUID());
 	}
 
 	gInventory.notifyObservers();
@@ -2937,6 +2960,27 @@ LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_a
 	return result;
 }
 
+// See also LLInventorySort where landmarks in the Favorites folder are sorted.
+class LLViewerInventoryItemSort
+{
+public:
+	bool operator()(const LLPointer<LLViewerInventoryItem>& a, const LLPointer<LLViewerInventoryItem>& b)
+	{
+		return a->getSortField() < b->getSortField();
+	}
+};
+
+/**
+ * Sorts passed items by LLViewerInventoryItem sort field.
+ *
+ * @param[in, out] items - array of items, not sorted.
+ */
+void rearrange_item_order_by_sort_field(LLInventoryModel::item_array_t& items)
+{
+	static LLViewerInventoryItemSort sort_functor;
+	std::sort(items.begin(), items.end(), sort_functor);
+}
+
 void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId)
 {
 	LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId);
@@ -2985,19 +3029,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 
 		if(is_movable && move_is_into_trash)
 		{
-			switch(inv_item->getType())
-			{
-			case LLAssetType::AT_CLOTHING:
-			case LLAssetType::AT_BODYPART:
-				is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID());
-				break;
-
-			case LLAssetType::AT_OBJECT:
-				is_movable = !avatar->isWearingAttachment(inv_item->getUUID());
-				break;
-			default:
-				break;
-			}
+			is_movable = inv_item->getIsLinkType() || !get_is_item_worn(inv_item->getUUID());
 		}
 
 		if ( is_movable )
@@ -3012,8 +3044,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 		}
 
 		const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
-		const LLUUID& landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
-		const BOOL folder_allows_reorder = ((mUUID == landmarks_id) || (mUUID == favorites_id));
+		const BOOL folder_allows_reorder = (mUUID == favorites_id);
 	   
 		// we can move item inside a folder only if this folder is Favorites. See EXT-719
 		accept = is_movable && ((mUUID != inv_item->getParentUUID()) || folder_allows_reorder);
@@ -3028,7 +3059,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 			// everything in the active window so that we don't follow
 			// the selection to its new location (which is very
 			// annoying).
-			LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+			LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
 			if (active_panel)
 			{
 				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
@@ -3053,6 +3084,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 					LLUUID srcItemId = inv_item->getUUID();
 					LLUUID destItemId = itemp->getListener()->getUUID();
 
+					// ensure items are sorted properly before changing order. EXT-3498
+					rearrange_item_order_by_sort_field(items);
+
 					// update order
 					updateItemsOrder(items, srcItemId, destItemId);
 
@@ -4066,8 +4100,7 @@ LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
 {
 	U8 font = LLFontGL::NORMAL;
 
-	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
-	if( avatar && avatar->isWearingAttachment( mUUID ) )
+	if(get_is_item_worn( mUUID ) )
 	{
 		font |= LLFontGL::BOLD;
 	}
@@ -4083,9 +4116,9 @@ LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
 
 std::string LLObjectBridge::getLabelSuffix() const
 {
-	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
-	if( avatar && avatar->isWearingAttachment( mUUID ) )
+	if (get_is_item_worn(mUUID))
 	{
+		LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
 		std::string attachment_point_name = avatar->getAttachedPointName(mUUID);
 
 		// e.g. "(worn on ...)" / "(attached to ...)"
@@ -4210,12 +4243,11 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 				return;
 			}
 
-			if( avatarp->isWearingAttachment( mUUID ) )
+			if( get_is_item_worn( mUUID ) )
 			{
 				items.push_back(std::string("Detach From Yourself"));
 			}
-			else
-			if( !isInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing())
+			else if (!isInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing())
 			{
 				items.push_back(std::string("Attach Separator"));
 				items.push_back(std::string("Object Wear"));
@@ -4441,7 +4473,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
 				if (gAgent.isTeen() && item->isWearableType() &&
 					(item->getWearableType() == WT_UNDERPANTS || item->getWearableType() == WT_UNDERSHIRT))
 					continue;
-				if( gAgentWearables.isWearingItem (item->getLinkedUUID()) )
+				if (get_is_item_worn(item->getUUID()))
 				{
 					LLWearableList::instance().getAsset(item->getAssetUUID(),
 														item->getName(),
@@ -4457,18 +4489,21 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
 			for(i = 0; i  < obj_count; ++i)
 			{
 				LLViewerInventoryItem *obj_item = obj_item_array.get(i);
-				gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
-				gMessageSystem->nextBlockFast(_PREHASH_ObjectData );
-				gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-				gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item->getLinkedUUID() );
-
-				gMessageSystem->sendReliable( gAgent.getRegion()->getHost() );
-
-				// this object might have been selected, so let the selection manager know it's gone now
-				LLViewerObject *found_obj = gObjectList.findObject( obj_item->getLinkedUUID());
-				if (found_obj)
+				if (get_is_item_worn(obj_item->getUUID()))
 				{
-					LLSelectMgr::getInstance()->remove(found_obj);
+					gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
+					gMessageSystem->nextBlockFast(_PREHASH_ObjectData );
+					gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+					gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item->getLinkedUUID() );
+					
+					gMessageSystem->sendReliable( gAgent.getRegion()->getHost() );
+					
+					// this object might have been selected, so let the selection manager know it's gone now
+					LLViewerObject *found_obj = gObjectList.findObject( obj_item->getLinkedUUID());
+					if (found_obj)
+					{
+						LLSelectMgr::getInstance()->remove(found_obj);
+					}
 				}
 			}
 		}
@@ -4478,7 +4513,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
 			for(i = 0; i  < gest_count; ++i)
 			{
 				LLViewerInventoryItem *gest_item = gest_item_array.get(i);
-				if ( LLGestureManager::instance().isGestureActive( gest_item->getLinkedUUID()) )
+				if (get_is_item_worn(gest_item->getUUID()))
 				{
 					LLGestureManager::instance().deactivateGesture( gest_item->getLinkedUUID() );
 					gInventory.updateItem( gest_item );
@@ -4492,7 +4527,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
 
 BOOL LLWearableBridge::renameItem(const std::string& new_name)
 {
-	if( gAgentWearables.isWearingItem( mUUID ) )
+	if (get_is_item_worn(mUUID))
 	{
 		gAgentWearables.setWearableName( mUUID, new_name );
 	}
@@ -4501,7 +4536,7 @@ BOOL LLWearableBridge::renameItem(const std::string& new_name)
 
 std::string LLWearableBridge::getLabelSuffix() const
 {
-	if( gAgentWearables.isWearingItem( mUUID ) )
+	if (get_is_item_worn(mUUID))
 	{
 		// e.g. "(worn)" 
 		return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn");
@@ -4535,7 +4570,7 @@ void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* mod
 	}
 	else if (isRemoveAction(action))
 	{
-		if(gAgentWearables.isWearingItem(mUUID))
+		if (get_is_item_worn(mUUID))
 		{
 			LLViewerInventoryItem* item = getItem();
 			if (item)
@@ -4566,7 +4601,7 @@ void LLWearableBridge::openItem()
 	}
 	else if(isAgentInventory())
 	{
-		if( !gAgentWearables.isWearingItem( mUUID ) )
+		if( !get_is_item_worn( mUUID ) )
 		{
 			wearOnAvatar();
 		}
@@ -4666,7 +4701,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 				case LLAssetType::AT_CLOTHING:
 					items.push_back(std::string("Take Off"));
 				case LLAssetType::AT_BODYPART:
-					if (gAgentWearables.isWearingItem(item->getUUID()))
+					if (get_is_item_worn(item->getUUID()))
 					{
 						disabled_items.push_back(std::string("Wearable Wear"));
 						disabled_items.push_back(std::string("Wearable Add"));
@@ -4697,7 +4732,7 @@ BOOL LLWearableBridge::canWearOnAvatar(void* user_data)
 		LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem();
 		if(!item || !item->isComplete()) return FALSE;
 	}
-	return (!gAgentWearables.isWearingItem(self->mUUID));
+	return (!get_is_item_worn(self->mUUID));
 }
 
 // Called from menus
@@ -4829,7 +4864,7 @@ BOOL LLWearableBridge::canEditOnAvatar(void* user_data)
 	LLWearableBridge* self = (LLWearableBridge*)user_data;
 	if(!self) return FALSE;
 
-	return (gAgentWearables.isWearingItem(self->mUUID));
+	return (get_is_item_worn(self->mUUID));
 }
 
 // static
@@ -4866,7 +4901,7 @@ BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data)
 	LLWearableBridge* self = (LLWearableBridge*)user_data;
 	if( self && (LLAssetType::AT_BODYPART != self->mAssetType) )
 	{
-		return gAgentWearables.isWearingItem( self->mUUID );
+		return get_is_item_worn( self->mUUID );
 	}
 	return FALSE;
 }
@@ -4876,7 +4911,7 @@ void LLWearableBridge::onRemoveFromAvatar(void* user_data)
 {
 	LLWearableBridge* self = (LLWearableBridge*)user_data;
 	if(!self) return;
-	if(gAgentWearables.isWearingItem(self->mUUID))
+	if(get_is_item_worn(self->mUUID))
 	{
 		LLViewerInventoryItem* item = self->getItem();
 		if (item)
@@ -4899,7 +4934,7 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
 	const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID);
 	if(wearable)
 	{
-		if( gAgentWearables.isWearingItem( item_id ) )
+		if( get_is_item_worn( item_id ) )
 		{
 			EWearableType type = wearable->getType();
 
@@ -5174,8 +5209,9 @@ void	LLAnimationBridgeAction::doIt()
 //virtual
 void	LLObjectBridgeAction::doIt()
 {
+	/*
 	LLFloaterReg::showInstance("properties", mUUID);
-
+	*/
 	LLInvFVBridgeAction::doIt();
 }
 
@@ -5247,7 +5283,7 @@ void LLWearableBridgeAction::doIt()
 	}
 	else if(isAgentInventory())
 	{
-		if(!gAgentWearables.isWearingItem(mUUID))
+		if(!get_is_item_worn(mUUID))
 		{
 			wearOnAvatar();
 		}
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 5efe0c1ed4f6af9bd1beaa26c8b869efe24e4bd8..07728cc35a588522063ec87f25b5a34a379be2d5 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -294,7 +294,9 @@ public:
 	static LLUIImagePtr getIcon(LLFolderType::EType preferred_type);
 
 	virtual BOOL renameItem(const std::string& new_name);
+
 	virtual BOOL removeItem();
+	BOOL removeSystemFolder();
 	bool removeItemResponse(const LLSD& notification, const LLSD& response);
 
 	virtual void pasteFromClipboard();
@@ -341,6 +343,7 @@ protected:
 	static void createNewEyes(void* user_data);
 
 	BOOL checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& typeToCheck);
+	BOOL areAnyContentsWorn(LLInventoryModel* model) const;
 
 	void modifyOutfit(BOOL append);
 	void determineFolderType();
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 01c7f0974d1bbb67a607cd80d208e97b17959419..ce4255448fe541f511827f9ca81639bd7592c4ce 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -341,3 +341,33 @@ LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
 	const std::string& icon_name = get_item_icon_name(asset_type, inventory_type, attachment_point, item_is_multi );
 	return LLUI::getUIImage(icon_name);
 }
+
+BOOL get_is_item_worn(const LLUUID& id)
+{
+	const LLViewerInventoryItem* item = gInventory.getItem(id);
+	if (!item)
+		return FALSE;
+	
+	switch(item->getType())
+	{
+		case LLAssetType::AT_OBJECT:
+		{
+			const LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject();
+			if(my_avatar && my_avatar->isWearingAttachment(item->getLinkedUUID()))
+				return TRUE;
+			break;
+		}
+		case LLAssetType::AT_BODYPART:
+		case LLAssetType::AT_CLOTHING:
+			if(gAgentWearables.isWearingItem(item->getLinkedUUID()))
+				return TRUE;
+			break;
+		case LLAssetType::AT_GESTURE:
+			if (LLGestureManager::instance().isGestureActive(item->getLinkedUUID()))
+				return TRUE;
+			break;
+		default:
+			break;
+	}
+	return FALSE;
+}
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 9916a2351cfdebe6f63d501cea4ec2250de9b7bc..968db84819bcb797615139b5c5ce1ec6880fbe3f 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -41,7 +41,9 @@
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 //
 // This is a collection of miscellaneous functions and classes
-// that don't fit cleanly into any other class header.
+// that don't fit cleanly into any other class header.  Eventually,
+// we should figure out where to put these functions so that we can
+// get rid of this generic file.
 //
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -98,14 +100,17 @@ public:
 };
 
 const std::string& get_item_icon_name(LLAssetType::EType asset_type,
-							 LLInventoryType::EType inventory_type,
-							 U32 attachment_point, 
-							 BOOL item_is_multi );
+									  LLInventoryType::EType inventory_type,
+									  U32 attachment_point, 
+									  BOOL item_is_multi );
 
 LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
-							 LLInventoryType::EType inventory_type,
-							 U32 attachment_point, 
-							 BOOL item_is_multi );
+						   LLInventoryType::EType inventory_type,
+						   U32 attachment_point, 
+						   BOOL item_is_multi );
+
+// Is this item or its baseitem is worn, attached, etc...
+BOOL get_is_item_worn(const LLUUID& id);
 
 #endif // LL_LLINVENTORYFUNCTIONS_H
 
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index 99e6dbe3c89f43cdf8aaa3d41adb47913d6537de..c1f192e2bfa9a98cab08e9a42d390d5f5e1f7307 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -62,6 +62,7 @@ public:
 		STRUCTURE = 16,		// structural change (eg item or folder moved)
 		CALLING_CARD = 32,	// (eg online, grant status, cancel)
 		REBUILD = 64, 		// item UI changed (eg item type different)
+		SORT = 128, 		// folder needs to be resorted.
 		ALL = 0xffffffff
 	};
 	LLInventoryObserver();
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 92b9dc427f5cc02c406ee73dde0f85147b64822b..3c34ba32e279cc363f63f72cdf350c2165009a14 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -278,6 +278,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
 		const LLUUID& item_id = (*items_iter);
 		const LLInventoryObject* model_item = model->getObject(item_id);
 		LLFolderViewItem* view_item = mFolders->getItemByID(item_id);
+		LLFolderViewFolder* view_folder = mFolders->getFolderByID(item_id);
 
 		//////////////////////////////
 		// LABEL Operation
@@ -320,7 +321,18 @@ void LLInventoryPanel::modelChanged(U32 mask)
 				view_item->refresh();
 			}
 		}
-	
+
+		//////////////////////////////
+		// SORT Operation
+		// Sort the folder.
+		if (mask & LLInventoryObserver::SORT)
+		{
+			if (view_folder)
+			{
+				view_folder->requestSort();
+			}
+		}	
+
 		// We don't typically care which of these masks the item is actually flagged with, since the masks
 		// may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
 		// Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
@@ -385,16 +397,6 @@ void LLInventoryPanel::modelChanged(U32 mask)
 			}
 		}
 	}
-
-	/* I don't think we need this code, but not positive -- Seraph
-	if (!handled)
-	{
-		// It's a small change that only requires a refresh.
-		// *TODO: figure out a more efficient way to do the refresh
-		// since it is expensive on large inventories
-		mFolders->refresh();
-	}
-	*/
 }
 
 // static
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index 08d56f8b9f0b0e3b816749c494942e0074cabf93..f25d2ef5743fb8e05b2828318dbc1853ab7789af 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -38,6 +38,7 @@
 #include "llinventory.h"
 #include "lllandmark.h"
 #include "llparcel.h"
+#include "llregionhandle.h"
 
 #include "llnotificationsutil.h"
 
diff --git a/indra/newview/lllandmarklist.cpp b/indra/newview/lllandmarklist.cpp
index d613cf6ba472acdfedd2e337f70a6ca913446352..bd9d22c32700af69284a7c6e2ddbbc13f305600b 100644
--- a/indra/newview/lllandmarklist.cpp
+++ b/indra/newview/lllandmarklist.cpp
@@ -39,7 +39,6 @@
 
 #include "llappviewer.h"
 #include "llagent.h"
-#include "llnotify.h"
 #include "llvfile.h"
 #include "llviewerstats.h"
 
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 33fd3e3bf126bf23eaa3d59cccc16207898445b4..fc9654e9adbe3999f5ec1ef8510ac9c1e464f5d5 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -39,6 +39,8 @@
 #include "lltrans.h"
 #include "llviewercontrol.h"
 
+#include "llinstantmessage.h"
+
 #include <boost/algorithm/string/trim.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/regex.hpp>
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 7d3da152c1cceb7080760bb43fe25d00d09d5723..2dc9f255d7a644f2d6c95310a411b1bc90ba4cf2 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -189,7 +189,7 @@ void LLLoginInstance::constructAuthParams(const LLSD& credentials)
 
 bool LLLoginInstance::handleLoginEvent(const LLSD& event)
 {
-	LL_DEBUGS("Login") << "LoginListener called!: \n" << event << LL_ENDL;
+	LL_DEBUGS("LLLogin") << "LoginListener called!: \n" << event << LL_ENDL;
 
 	if(!(event.has("state") && event.has("change") && event.has("progress")))
 	{
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 765b504afe0b2fa92713ab949febc7dfa04a500f..5f30ab4e0150b04ad54fdb77c2387be21703b0c7 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -101,6 +101,16 @@ const U32 ARROW_TO_AXIS[4] =
 	VZ
 };
 
+// Sort manipulator handles by their screen-space projection
+struct ClosestToCamera
+{
+	bool operator()(const LLManipTranslate::ManipulatorHandle& a,
+					const LLManipTranslate::ManipulatorHandle& b) const
+	{
+		return a.mEndPosition.mV[VZ] < b.mEndPosition.mV[VZ];
+	}
+};
+
 LLManipTranslate::LLManipTranslate( LLToolComposite* composite )
 :	LLManip( std::string("Move"), composite ),
 	mLastHoverMouseX(-1),
@@ -273,7 +283,6 @@ void LLManipTranslate::restoreGL()
 
 LLManipTranslate::~LLManipTranslate()
 {
-	for_each(mProjectedManipulators.begin(), mProjectedManipulators.end(), DeletePointer());
 }
 
 
@@ -888,8 +897,9 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 		planar_manip_xy_visible = TRUE;
 	}
 
-	for_each(mProjectedManipulators.begin(), mProjectedManipulators.end(), DeletePointer());
-	mProjectedManipulators.clear();
+	// Project up to 9 manipulators to screen space 2*X, 2*Y, 2*Z, 3*planes
+	std::vector<ManipulatorHandle> projected_manipulators;
+	projected_manipulators.reserve(9);
 	
 	for (S32 i = 0; i < num_arrow_manips; i+= 2)
 	{
@@ -899,12 +909,12 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 		LLVector4 projected_end = mManipulatorVertices[i + 1] * transform;
 		projected_end = projected_end * (1.f / projected_end.mV[VW]);
 
-		ManipulatorHandle* projManipulator = 
-			new ManipulatorHandle(LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]), 
+		ManipulatorHandle projected_manip(
+				LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]), 
 				LLVector3(projected_end.mV[VX], projected_end.mV[VY], projected_end.mV[VZ]), 
 				MANIPULATOR_IDS[i / 2],
 				10.f); // 10 pixel hotspot for arrows
-		mProjectedManipulators.insert(projManipulator);
+		projected_manipulators.push_back(projected_manip);
 	}
 
 	if (planar_manip_yz_visible)
@@ -916,12 +926,12 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 		LLVector4 projected_end = mManipulatorVertices[i + 1] * transform;
 		projected_end = projected_end * (1.f / projected_end.mV[VW]);
 
-		ManipulatorHandle* projManipulator = 
-			new ManipulatorHandle(LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]), 
+		ManipulatorHandle projected_manip(
+				LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]), 
 				LLVector3(projected_end.mV[VX], projected_end.mV[VY], projected_end.mV[VZ]), 
 				MANIPULATOR_IDS[i / 2],
 				20.f); // 20 pixels for planar manipulators
-		mProjectedManipulators.insert(projManipulator);
+		projected_manipulators.push_back(projected_manip);
 	}
 
 	if (planar_manip_xz_visible)
@@ -933,12 +943,12 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 		LLVector4 projected_end = mManipulatorVertices[i + 1] * transform;
 		projected_end = projected_end * (1.f / projected_end.mV[VW]);
 
-		ManipulatorHandle* projManipulator = 
-			new ManipulatorHandle(LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]), 
+		ManipulatorHandle projected_manip(
+				LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]), 
 				LLVector3(projected_end.mV[VX], projected_end.mV[VY], projected_end.mV[VZ]), 
 				MANIPULATOR_IDS[i / 2],
 				20.f); // 20 pixels for planar manipulators
-		mProjectedManipulators.insert(projManipulator);
+		projected_manipulators.push_back(projected_manip);
 	}
 
 	if (planar_manip_xy_visible)
@@ -950,12 +960,12 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 		LLVector4 projected_end = mManipulatorVertices[i + 1] * transform;
 		projected_end = projected_end * (1.f / projected_end.mV[VW]);
 
-		ManipulatorHandle* projManipulator = 
-			new ManipulatorHandle(LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]), 
+		ManipulatorHandle projected_manip(
+				LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]), 
 				LLVector3(projected_end.mV[VX], projected_end.mV[VY], projected_end.mV[VZ]), 
 				MANIPULATOR_IDS[i / 2],
 				20.f); // 20 pixels for planar manipulators
-		mProjectedManipulators.insert(projManipulator);
+		projected_manipulators.push_back(projected_manip);
 	}
 
 	LLVector2 manip_start_2d;
@@ -967,13 +977,18 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 	LLVector2 mousePos((F32)x - half_width, (F32)y - half_height);
 	LLVector2 mouse_delta;
 
-	for (minpulator_list_t::iterator iter = mProjectedManipulators.begin();
-		 iter != mProjectedManipulators.end(); ++iter)
+	// Keep order consistent with insertion via stable_sort
+	std::stable_sort( projected_manipulators.begin(),
+		projected_manipulators.end(),
+		ClosestToCamera() );
+
+	std::vector<ManipulatorHandle>::iterator it = projected_manipulators.begin();
+	for ( ; it != projected_manipulators.end(); ++it)
 	{
-		ManipulatorHandle* manipulator = *iter;
+		ManipulatorHandle& manipulator = *it;
 		{
-			manip_start_2d.setVec(manipulator->mStartPosition.mV[VX] * half_width, manipulator->mStartPosition.mV[VY] * half_height);
-			manip_end_2d.setVec(manipulator->mEndPosition.mV[VX] * half_width, manipulator->mEndPosition.mV[VY] * half_height);
+			manip_start_2d.setVec(manipulator.mStartPosition.mV[VX] * half_width, manipulator.mStartPosition.mV[VY] * half_height);
+			manip_end_2d.setVec(manipulator.mEndPosition.mV[VX] * half_width, manipulator.mEndPosition.mV[VY] * half_height);
 			manip_dir = manip_end_2d - manip_start_2d;
 
 			mouse_delta = mousePos - manip_start_2d;
@@ -985,9 +1000,9 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 
 			if (mouse_pos_manip > 0.f &&
 				mouse_pos_manip < manip_length &&
-				mouse_dist_manip_squared < manipulator->mHotSpotRadius * manipulator->mHotSpotRadius)
+				mouse_dist_manip_squared < manipulator.mHotSpotRadius * manipulator.mHotSpotRadius)
 			{
-				mHighlightedPart = manipulator->mManipID;
+				mHighlightedPart = manipulator.mManipID;
 				break;
 			}
 		}
diff --git a/indra/newview/llmaniptranslate.h b/indra/newview/llmaniptranslate.h
index 25ff35cc726cab28e32b5979a083211aa439960a..d20b86b2f465d954ffb9e1498994ca3593e81028 100644
--- a/indra/newview/llmaniptranslate.h
+++ b/indra/newview/llmaniptranslate.h
@@ -89,17 +89,6 @@ protected:
 	F32			getMinGridScale();
 
 private:
-	struct compare_manipulators
-	{
-		bool operator() (const ManipulatorHandle* const a, const ManipulatorHandle* const b) const
-		{
-			if (a->mEndPosition.mV[VZ] != b->mEndPosition.mV[VZ])
-				return (a->mEndPosition.mV[VZ] < b->mEndPosition.mV[VZ]);
-			else
-				return a->mManipID < b->mManipID;			
-		}
-	};
-	
 	S32			mLastHoverMouseX;
 	S32			mLastHoverMouseY;
 	BOOL		mSendUpdateOnMouseUp;
@@ -116,8 +105,6 @@ private:
 	LLVector3d	mDragCursorStartGlobal;
 	LLVector3d	mDragSelectionStartGlobal;
 	LLTimer		mUpdateTimer;
-	typedef std::set<ManipulatorHandle*, compare_manipulators> minpulator_list_t;
-	minpulator_list_t mProjectedManipulators;
 	LLVector4	mManipulatorVertices[18];
 	F32			mSnapOffsetMeters;
 	LLVector3	mSnapOffsetAxis;
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index f32866b1fea7dc0fea5fd4920aaf3115442bdca7..199bd966efe68c70ba6e0c982755420a23c63869 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -95,7 +95,8 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
 	mHidingInitialLoad (false),
 	mDecoupleTextureSize ( false ),
 	mTextureWidth ( 1024 ),
-	mTextureHeight ( 1024 )
+	mTextureHeight ( 1024 ),
+	mClearCache(false)
 {
 	{
 		LLColor4 color = p.caret_color().get();
@@ -489,6 +490,21 @@ void LLMediaCtrl::clr404RedirectUrl()
 		mMediaSource->getMediaPlugin()->set_status_redirect(404, "");
 }
 
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaCtrl::clearCache()
+{
+	if(mMediaSource)
+	{
+		mMediaSource->clearCache();
+	}
+	else
+	{
+		mClearCache = true;
+	}
+
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 //
 void LLMediaCtrl::navigateTo( std::string url_in, std::string mime_type)
@@ -617,7 +633,12 @@ bool LLMediaCtrl::ensureMediaSourceExists()
 			mMediaSource->setHomeURL(mHomePageUrl);
 			mMediaSource->setVisible( getVisible() );
 			mMediaSource->addObserver( this );
-
+			if(mClearCache)
+			{
+				mMediaSource->clearCache();
+				mClearCache = false;
+			}
+			
 			if(mHideLoading)
 			{
 				mHidingInitialLoad = true;
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index f07513a3fdbc921ba90d2527ba7fd859f63d3f37..8f9e6e71797a846676090c1f8a217768eb9e539c 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -117,6 +117,9 @@ public:
 		// set/clear URL to visit when a 404 page is reached
 		void set404RedirectUrl( std::string redirect_url );
 		void clr404RedirectUrl();
+		
+		// Clear the browser cache when the instance gets loaded
+		void clearCache();
 
 		// accessor/mutator for flag that indicates if frequent updates to texture happen
 		bool getFrequentUpdates() { return mFrequentUpdates; };
@@ -192,6 +195,7 @@ public:
 		bool mDecoupleTextureSize;
 		S32 mTextureWidth;
 		S32 mTextureHeight;
+		bool mClearCache;
 };
 
 #endif // LL_LLMediaCtrl_H
diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp
index 2694075a58c8b08a3a928f51c297045e8a326765..2bb2a3da6fb23d98b7ae83711d211efd74474559 100755
--- a/indra/newview/llmediadataclient.cpp
+++ b/indra/newview/llmediadataclient.cpp
@@ -224,7 +224,7 @@ bool LLMediaDataClient::processQueueTimer()
 	
 	if(!isEmpty())
 	{
-		LL_INFOS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue size is:	  " << mSortedQueue.size() 
+		LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue size is:	  " << mSortedQueue.size() 
 			<< ", RR queue size is:	  " << mRoundRobinQueue.size() << LL_ENDL;
 		LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue is:	  " << mSortedQueue << LL_ENDL;
 		LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, RR queue is:	  " << mRoundRobinQueue << LL_ENDL;
@@ -262,7 +262,7 @@ void LLMediaDataClient::sortQueue()
 		if (size > mMaxSortedQueueSize) 
 		{
 			U32 num_to_cull = (size - mMaxSortedQueueSize);
-			LL_INFOS("LLMediaDataClient") << "sorted queue MAXED OUT!  Culling " 
+			LL_INFOS_ONCE("LLMediaDataClient") << "sorted queue MAXED OUT!  Culling " 
 				<< num_to_cull << " items" << LL_ENDL;
 			while (num_to_cull-- > 0)
 			{
@@ -309,7 +309,7 @@ void LLMediaDataClient::serviceQueue()
 		{
 			if (request.isNull()) 
 			{
-				LL_INFOS("LLMediaDataClient") << "Skipping NULL request" << LL_ENDL;
+				LL_WARNS("LLMediaDataClient") << "Skipping NULL request" << LL_ENDL;
 			}
 			else {
 				LL_INFOS("LLMediaDataClient") << "Skipping : " << *request << " " 
@@ -402,7 +402,7 @@ std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::request_queue
 	LLMediaDataClient::request_queue_t::const_iterator end = q.end();
 	while (iter != end)
 	{
-		s << "\t" << i << "]: " << (*iter)->getObject()->getID().asString();
+		s << "\t" << i << "]: " << (*iter)->getObject()->getID().asString() << "(" << (*iter)->getObject()->getMediaInterest() << ")";
 		iter++;
 		i++;
 	}
@@ -636,8 +636,8 @@ void LLMediaDataClient::Responder::error(U32 status, const std::string& reason)
 			new RetryTimer(F32(retry_timeout/*secs*/), this);
 		}
 		else {
-			LL_INFOS("LLMediaDataClient") << *mRequest << " got SERVICE_UNAVAILABLE...retry count " << 
-			mRequest->getRetryCount() << " exceeds " << mRequest->getMaxNumRetries() << ", not retrying" << LL_ENDL;
+			LL_INFOS("LLMediaDataClient") << *mRequest << " got SERVICE_UNAVAILABLE...retry count " 
+				<< mRequest->getRetryCount() << " exceeds " << mRequest->getMaxNumRetries() << ", not retrying" << LL_ENDL;
 		}
 	}
 	else {
diff --git a/indra/newview/llmenucommands.cpp b/indra/newview/llmenucommands.cpp
index 28ddaa61c4c811aba63f35168ad0a2b55d4c170b..a2aef9ba63b5c837c4351b853a921a175185fbe6 100644
--- a/indra/newview/llmenucommands.cpp
+++ b/indra/newview/llmenucommands.cpp
@@ -49,7 +49,6 @@
 #include "llfloaterchat.h"
 #include "llfloaterworldmap.h"
 #include "lllineeditor.h"
-#include "llnotify.h"
 #include "llstatusbar.h"
 #include "llimview.h"
 #include "lltextbox.h"
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index c17427bec1c2a6ce6d2779ee0bfd2c0f03ffd801..22201aecb27371584418b3fcd691380c521beec7 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -160,9 +160,12 @@ void LLFloaterMove::setEnabled(BOOL enabled)
 // virtual
 void LLFloaterMove::setVisible(BOOL visible)
 {
-	// Ignore excessive calls of this method (from LLTransientFloaterMgr?).
+	// Do nothing with Stand/Stop Flying panel in excessive calls of this method (from LLTransientFloaterMgr?).
 	if (getVisible() == visible)
+	{
+		LLTransientDockableFloater::setVisible(visible);
 		return;
+	}
 
 	if (visible)
 	{
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 08bc1fac8b3fbbb7a8d7ac7e37b43e4db0532962..6210151d1b23ee992acf904026e0c3b95955201c 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -34,10 +34,12 @@
 
 #include "llnavigationbar.h"
 
-#include <llfloaterreg.h>
-#include <llfocusmgr.h>
-#include <lliconctrl.h>
-#include <llmenugl.h>
+#include "llregionhandle.h"
+
+#include "llfloaterreg.h"
+#include "llfocusmgr.h"
+#include "lliconctrl.h"
+#include "llmenugl.h"
 
 #include "llagent.h"
 #include "llviewerregion.h"
@@ -259,9 +261,14 @@ BOOL LLNavigationBar::postBuild()
 void LLNavigationBar::setVisible(BOOL visible)
 {
 	// change visibility of grandparent layout_panel to animate in and out
-	if (getParent() && getParent()->getParent()) 
+	if (getParent()) 
 	{
-		getParent()->getParent()->setVisible(visible);	
+		//to avoid some mysterious bugs like EXT-3352, at least try to log an incorrect parent to ping  about a problem. 
+		if(getParent()->getName() != "nav_bar_container")
+		{
+			LL_WARNS("LLNavigationBar")<<"NavigationBar has an unknown name of the parent: "<<getParent()->getName()<< LL_ENDL;
+		}
+		getParent()->setVisible(visible);	
 	}
 }
 
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 8fb4ea42119eb226eb45eb6a4af62dafe0892dda..8dbaa5ac53a4d0e67e620c463b536fefeb629fd5 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -32,6 +32,8 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "message.h"
+
 #include "llfloaterreg.h"
 #include "lltrans.h"
 
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 83a8dcd9f075b2b6b36d6c8459e8c53c80d09802..515c86bae82f6ee4bb64543982897d3216c6c675 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -39,6 +39,7 @@
 //#include "llnotificationsutil.h"
 #include "llchannelmanager.h"
 #include "llchat.h"
+#include "llinstantmessage.h"
 #include "llnotificationptr.h"
 
 namespace LLNotificationsUI
diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp
index 39381e3faaeeadc3bc6966a4eedee069fb635224..fa16cb6473898ffd913e873ac77d1ed4e7de21b0 100644
--- a/indra/newview/lloutputmonitorctrl.cpp
+++ b/indra/newview/lloutputmonitorctrl.cpp
@@ -243,7 +243,8 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id)
 		}
 		else
 		{
-			setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId));
+			// check only blocking on voice. EXT-3542
+			setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId, LLMute::flagVoiceChat));
 			LLMuteList::getInstance()->addObserver(this);
 		}
 	}
@@ -251,5 +252,6 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id)
 
 void LLOutputMonitorCtrl::onChange()
 {
-	setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId));
+	// check only blocking on voice. EXT-3542
+	setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId, LLMute::flagVoiceChat));
 }
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index b9f422ca6f6fae0878e7e3a11476fd9ad5dc5a0b..ffe7f5716766a1e82511812abf4085263819b745 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -396,7 +396,7 @@ void LLPanelProfileTab::updateButtons()
 					&& gAgent.isGodlike() || is_agent_mappable(getAvatarId());
 
 	childSetEnabled("show_on_map_btn", enable_map_btn);
-	childSetEnabled("call", LLVoiceClient::voiceEnabled());
+	childSetEnabled("call", LLAvatarActions::canCall(getAvatarId()));
 }
 
 //////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 70d92442ad6e69c1eb46bfdac10c16e8212829b0..0dae667e7f477fe980c147454950d63ff49a33ba 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -48,7 +48,6 @@
 #include "message.h"
 
 #include "llagent.h"
-#include "llalertdialog.h"
 #include "llavataractions.h"
 #include "llbutton.h"
 #include "llcheckboxctrl.h"
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index b6c58808ae12dfbc86b61efcb899d385ab57ff99..29b647415c3414d7cd20596404d41ea4aeb2d537 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -44,7 +44,6 @@
 #include "llnamelistctrl.h"
 #include "llnotifications.h"
 #include "llnotificationsutil.h"
-#include "llnotify.h"
 #include "llpanelgrouproles.h"
 #include "llscrolllistctrl.h"
 #include "llscrolllistitem.h"
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 4f76d32ad59209aa6c2fdf0cbf178a17226cc54d..70e47980799c24c324bbaa998e276bdf59b1979a 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -194,6 +194,7 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
 		childSetEnabled("pay_btn", FALSE);
 
         getChild<LLTextBox>("avatar_name")->setValue(im_session->mName);
+        getChild<LLTextBox>("avatar_name")->setToolTip(im_session->mName);
 	}
 	else
 	{
@@ -217,6 +218,7 @@ void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::str
 		avatar_name.append(" ");
 		avatar_name.append(last);
 		getChild<LLTextBox>("avatar_name")->setValue(avatar_name);
+		getChild<LLTextBox>("avatar_name")->setToolTip(avatar_name);
 	}
 }
 
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index e56ed00dcba05bd69a64af19f1a36a799fa365fa..e16bac209860f9096961629a9b93fee937510d99 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -37,6 +37,7 @@
 #include "llfloaterreg.h"
 #include "llsdutil.h"
 #include "llsdutil_math.h"
+#include "llregionhandle.h"
 
 #include "llaccordionctrl.h"
 #include "llaccordionctrltab.h"
@@ -232,11 +233,6 @@ void LLLandmarksPanel::onSelectionChange(LLInventorySubTreePanel* inventory_list
 		deselectOtherThan(inventory_list);
 		mCurrentSelectedList = inventory_list;
 	}
-
-	LLFolderViewItem* current_item = inventory_list->getRootFolder()->getCurSelectedItem();
-	if (!current_item)
-		return;
-
 	updateVerbs();
 }
 
@@ -245,6 +241,7 @@ void LLLandmarksPanel::onSelectorButtonClicked()
 	// TODO: mantipov: update getting of selected item
 	// TODO: bind to "i" button
 	LLFolderViewItem* cur_item = mFavoritesInventoryPanel->getRootFolder()->getCurSelectedItem();
+	if (!cur_item) return;
 
 	LLFolderViewEventListener* listenerp = cur_item->getListener();
 	if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)
@@ -333,6 +330,7 @@ void LLLandmarksPanel::processParcelInfo(const LLParcelData& parcel_data)
 	if(isLandmarkSelected())
 	{
 		LLFolderViewItem* cur_item = getCurSelectedItem();
+		if (!cur_item) return;
 		LLUUID id = cur_item->getListener()->getUUID();
 		LLInventoryItem* inv_item = mCurrentSelectedList->getModel()->getItem(id);
 		doActionOnCurSelectedLandmark(boost::bind(
@@ -760,7 +758,7 @@ void LLLandmarksPanel::onCustomAction(const LLSD& userdata)
 {
 	LLFolderViewItem* cur_item = getCurSelectedItem();
 	if(!cur_item)
-		return ;
+		return;
 	std::string command_name = userdata.asString();
 	if("more_info" == command_name)
 	{
@@ -864,18 +862,18 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co
 	// then ask LLFolderView permissions
 	if (can_be_modified)
 	{
-		LLFolderViewItem* selected =  getCurSelectedItem();
+		LLFolderViewItem* selected = getCurSelectedItem();
 		if ("cut" == command_name)
 		{
 			can_be_modified = mCurrentSelectedList->getRootFolder()->canCut();
 		}
 		else if ("rename" == command_name)
 		{
-			can_be_modified = selected? selected->getListener()->isItemRenameable() : false;
+			can_be_modified = selected ? selected->getListener()->isItemRenameable() : false;
 		}
 		else if ("delete" == command_name)
 		{
-			can_be_modified = selected? selected->getListener()->isItemRemovable(): false;
+			can_be_modified = selected ? selected->getListener()->isItemRemovable(): false;
 		}
 		else if("paste" == command_name)
 		{
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index a5bfa18851f3f0cae3ef51b6b501f1db78983e80..dbe962ed5999c3352ee10fbd158b91639f20b34f 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -62,7 +62,6 @@
 #include "llviewermenu.h"			// for handle_preferences()
 #include "llviewernetwork.h"
 #include "llviewerwindow.h"			// to link into child list
-#include "llnotify.h"
 #include "llurlsimstring.h"
 #include "lluictrlfactory.h"
 #include "llhttpclient.h"
@@ -273,6 +272,9 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 	// get the web browser control
 	LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
 	web_browser->addObserver(this);
+	
+	// Clear the browser's cache to avoid any potential for the cache messing up the login screen.
+	web_browser->clearCache();
 
 	// Need to handle login secondlife:///app/ URLs
 	web_browser->setTrusted( true );
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index cef21e85d6d584593b0115e4e740771e4eaca013..961d3dec8b993a278a6198fedef53a4b5aa1883b 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -400,6 +400,7 @@ void LLPanelMainInventory::onClearSearch()
 		mActivePanel->getRootFolder()->applyFunctorRecursively(opener);
 		mActivePanel->getRootFolder()->scrollToShowSelection();
 	}
+	mFilterSubString = "";
 }
 
 void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
@@ -417,6 +418,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
 
 	std::string uppercase_search_string = search_string;
 	LLStringUtil::toUpper(uppercase_search_string);
+	mFilterSubString = uppercase_search_string;
 	if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty())
 	{
 			// current filter and new filter empty, do nothing
@@ -431,7 +433,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
 	}
 
 	// set new filter string
-	mActivePanel->setFilterSubString(uppercase_search_string);
+	mActivePanel->setFilterSubString(mFilterSubString);
 }
 
 
@@ -484,6 +486,7 @@ void LLPanelMainInventory::onFilterSelected()
 	{
 		return;
 	}
+	setFilterSubString(mFilterSubString);
 	LLInventoryFilter* filter = mActivePanel->getFilter();
 	LLFloaterInventoryFinder *finder = getFinder();
 	if (finder)
@@ -530,11 +533,23 @@ BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 	return handled;
 }
 
-void LLPanelMainInventory::changed(U32 mask)
+// virtual
+void LLPanelMainInventory::changed(U32)
 {
+	// empty, but must have this defined for abstract base class.
 }
 
 
+// virtual
+void LLPanelMainInventory::draw()
+{
+	if (mActivePanel && mFilterEditor)
+	{
+		mFilterEditor->setText(mFilterSubString);
+	}	
+	LLPanel::draw();
+}
+
 void LLPanelMainInventory::setFilterTextFromFilter() 
 { 
 	mFilterText = mActivePanel->getFilter()->getFilterText(); 
@@ -1004,9 +1019,11 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
 		}
 		const LLUUID& item_id = current_item->getListener()->getUUID();
 		const std::string &item_name = current_item->getListener()->getName();
+		mFilterSubString = item_name;
 		LLInventoryFilter *filter = mActivePanel->getFilter();
 		filter->setFilterSubString(item_name);
 		mFilterEditor->setText(item_name);
+
 		mFilterEditor->setFocus(TRUE);
 		filter->setFilterUUID(item_id);
 		filter->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 92443df369b28070a536c1432011b455895ed42c..69f8a145833e466f58574e37fa65947f734057b7 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -72,7 +72,8 @@ public:
 									   void* cargo_data,
 									   EAcceptance* accept,
 									   std::string& tooltip_msg);
-	/*virtual*/ void changed(U32 mask);
+	/*virtual*/ void changed(U32);
+	/*virtual*/ void draw();
 
 	LLInventoryPanel* getPanel() { return mActivePanel; }
 	LLInventoryPanel* getActivePanel() { return mActivePanel; }
@@ -122,6 +123,7 @@ private:
 	LLInventoryPanel*			mActivePanel;
 	LLSaveFolderState*			mSavedFolderState;
 	std::string					mFilterText;
+	std::string					mFilterSubString;
 
 
 	//////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index 88eba14553425ed758bef0eb3d32bd053e520e29..f574f55bebf063c3f41b4ce8da3186ac5c5c7096 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -67,7 +67,6 @@ const char *CHECKERBOARD_DATA_URL = "data:image/svg+xml,%3Csvg xmlns=%22http://w
 ////////////////////////////////////////////////////////////////////////////////
 //
 LLPanelMediaSettingsGeneral::LLPanelMediaSettingsGeneral() :
-	mControls( NULL ),
 	mAutoLoop( NULL ),
 	mFirstClick( NULL ),
 	mAutoZoom( NULL ),
@@ -93,7 +92,6 @@ BOOL LLPanelMediaSettingsGeneral::postBuild()
 	mAutoPlay = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_PLAY_KEY );
 	mAutoScale = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_SCALE_KEY );
 	mAutoZoom = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_ZOOM_KEY );
-	mControls = getChild< LLComboBox >( LLMediaEntry::CONTROLS_KEY );
 	mCurrentURL = getChild< LLTextBox >( LLMediaEntry::CURRENT_URL_KEY );
 	mFirstClick = getChild< LLCheckBoxCtrl >( LLMediaEntry::FIRST_CLICK_INTERACT_KEY );
 	mHeightPixels = getChild< LLSpinCtrl >( LLMediaEntry::HEIGHT_PIXELS_KEY );
@@ -211,7 +209,6 @@ void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)
 	self->mAutoPlay->clear();
 	self->mAutoScale->clear();
 	self->mAutoZoom ->clear();
-	self->mControls->clear();
 	self->mCurrentURL->clear();
 	self->mFirstClick->clear();
 	self->mHeightPixels->clear();
@@ -221,7 +218,6 @@ void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)
 	self->mAutoPlay ->setEnabled(editable);
 	self->mAutoScale ->setEnabled(editable);
 	self->mAutoZoom  ->setEnabled(editable);
-	self->mControls ->setEnabled(editable);
 	self->mCurrentURL ->setEnabled(editable);
 	self->mFirstClick ->setEnabled(editable);
 	self->mHeightPixels ->setEnabled(editable);
@@ -283,7 +279,6 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_
 		{ LLMediaEntry::AUTO_PLAY_KEY,				self->mAutoPlay,		"LLCheckBoxCtrl" },
 		{ LLMediaEntry::AUTO_SCALE_KEY,				self->mAutoScale,		"LLCheckBoxCtrl" },
 		{ LLMediaEntry::AUTO_ZOOM_KEY,				self->mAutoZoom,		"LLCheckBoxCtrl" },
-		{ LLMediaEntry::CONTROLS_KEY,				self->mControls,		"LLComboBox" },
 		{ LLMediaEntry::CURRENT_URL_KEY,			self->mCurrentURL,		"LLTextBox" },
 		{ LLMediaEntry::HEIGHT_PIXELS_KEY,			self->mHeightPixels,	"LLSpinCtrl" },
 		{ LLMediaEntry::HOME_URL_KEY,				self->mHomeURL,			"LLLineEditor" },
@@ -416,7 +411,6 @@ void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in )
 	fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = (LLSD::Boolean)mAutoPlay->getValue();
 	fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = (LLSD::Boolean)mAutoScale->getValue();
 	fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = (LLSD::Boolean)mAutoZoom->getValue();
-	fill_me_in[LLMediaEntry::CONTROLS_KEY] = (LLSD::Integer)mControls->getCurrentIndex();
 	//Don't fill in current URL: this is only supposed to get changed via navigate
 	// fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue();
 	fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = (LLSD::Integer)mHeightPixels->getValue();
diff --git a/indra/newview/llpanelmediasettingsgeneral.h b/indra/newview/llpanelmediasettingsgeneral.h
index c6895b1dc9f5cd0de7b5a3e66a5af15fb6f84ac6..5f9032136253ffd76f5e8c72fcc5c122812e8b46 100644
--- a/indra/newview/llpanelmediasettingsgeneral.h
+++ b/indra/newview/llpanelmediasettingsgeneral.h
@@ -37,7 +37,6 @@
 
 class LLButton;
 class LLCheckBoxCtrl;
-class LLComboBox;
 class LLLineEditor;
 class LLSpinCtrl;
 class LLTextureCtrl;
@@ -90,7 +89,6 @@ private:
 
 	void checkHomeUrlPassesWhitelist();
 
-	LLComboBox* mControls;
 	LLCheckBoxCtrl* mAutoLoop;
 	LLCheckBoxCtrl* mFirstClick;
 	LLCheckBoxCtrl* mAutoZoom;
diff --git a/indra/newview/llpanelmediasettingspermissions.cpp b/indra/newview/llpanelmediasettingspermissions.cpp
index 2f3f550e35baf2a6bf47df8b1cf2aeca37d4181d..a23aed2e985370950242d454436000a6decdbb81 100644
--- a/indra/newview/llpanelmediasettingspermissions.cpp
+++ b/indra/newview/llpanelmediasettingspermissions.cpp
@@ -51,9 +51,11 @@
 #include "llnamebox.h"
 #include "lltrans.h"
 #include "llfloatermediasettings.h"
+
 ////////////////////////////////////////////////////////////////////////////////
 //
 LLPanelMediaSettingsPermissions::LLPanelMediaSettingsPermissions() :
+	mControls( NULL ),
     mPermsOwnerInteract( 0 ),
     mPermsOwnerControl( 0 ),
 	mPermsGroupName( 0 ),
@@ -71,6 +73,7 @@ LLPanelMediaSettingsPermissions::LLPanelMediaSettingsPermissions() :
 BOOL LLPanelMediaSettingsPermissions::postBuild()
 {
     // connect member vars with UI widgets
+	mControls = getChild< LLComboBox >( LLMediaEntry::CONTROLS_KEY );
     mPermsOwnerInteract = getChild< LLCheckBoxCtrl >( LLPanelContents::PERMS_OWNER_INTERACT_KEY );
     mPermsOwnerControl = getChild< LLCheckBoxCtrl >( LLPanelContents::PERMS_OWNER_CONTROL_KEY );
     mPermsGroupInteract = getChild< LLCheckBoxCtrl >( LLPanelContents::PERMS_GROUP_INTERACT_KEY );
@@ -123,19 +126,22 @@ void LLPanelMediaSettingsPermissions::draw()
 void LLPanelMediaSettingsPermissions::clearValues( void* userdata, bool editable)
 {	
 	LLPanelMediaSettingsPermissions *self =(LLPanelMediaSettingsPermissions *)userdata;
+
+	self->mControls->clear();
 	self->mPermsOwnerInteract->clear();
 	self->mPermsOwnerControl->clear();
-	self->mPermsGroupInteract ->clear();
+	self->mPermsGroupInteract->clear();
 	self->mPermsGroupControl->clear();
-	self->mPermsWorldInteract ->clear();
-	self->mPermsWorldControl ->clear();
+	self->mPermsWorldInteract->clear();
+	self->mPermsWorldControl->clear();
 	
+	self->mControls->setEnabled(editable);
 	self->mPermsOwnerInteract->setEnabled(editable);
-	self->mPermsOwnerControl ->setEnabled(editable);
+	self->mPermsOwnerControl->setEnabled(editable);
 	self->mPermsGroupInteract->setEnabled(editable);
-	self->mPermsGroupControl ->setEnabled(editable);
+	self->mPermsGroupControl->setEnabled(editable);
 	self->mPermsWorldInteract->setEnabled(editable);
-	self->mPermsWorldControl ->setEnabled(editable);
+	self->mPermsWorldControl->setEnabled(editable);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -175,6 +181,7 @@ void LLPanelMediaSettingsPermissions::initValues( void* userdata, const LLSD& me
 
     } data_set [] = 
     { 
+		{ LLMediaEntry::CONTROLS_KEY,					self->mControls,			"LLComboBox" },
         { LLPanelContents::PERMS_OWNER_INTERACT_KEY,    self->mPermsOwnerInteract,  "LLCheckBoxCtrl" },
         { LLPanelContents::PERMS_OWNER_CONTROL_KEY,     self->mPermsOwnerControl,   "LLCheckBoxCtrl" },
         { LLPanelContents::PERMS_GROUP_INTERACT_KEY,    self->mPermsGroupInteract,  "LLCheckBoxCtrl" },
@@ -194,27 +201,27 @@ void LLPanelMediaSettingsPermissions::initValues( void* userdata, const LLSD& me
         {
             if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
             {
-				// the sense of the checkboxes changed and it made sense
-				// to just reverse their sense back again here and avoid 
-				// changing server code.
+				// Most recent change to the "sense" of these checkboxes
+				// means the value in the checkbox matches that on the server
                 static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
-                    setValue( ! media_settings[ base_key ].asBoolean() );
+                    setValue( media_settings[ base_key ].asBoolean() );
             }
             else
             if ( data_set[ i ].ctrl_type == "LLComboBox" )
                 static_cast< LLComboBox* >( data_set[ i ].ctrl_ptr )->
                     setCurrentByIndex( media_settings[ base_key ].asInteger() );
+
 			data_set[ i ].ctrl_ptr->setEnabled(editable);
             data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
         };
     };
+
 	self->childSetEnabled("media_perms_label_owner", editable );
 	self->childSetText("media_perms_label_owner",  LLTrans::getString("Media Perms Owner") );
 	self->childSetEnabled("media_perms_label_group", editable );
 	self->childSetText("media_perms_label_group",  LLTrans::getString("Media Perms Group") );
 	self->childSetEnabled("media_perms_label_anyone", editable );
 	self->childSetText("media_perms_label_anyone", LLTrans::getString("Media Perms Anyone") );
-	
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -228,6 +235,9 @@ void LLPanelMediaSettingsPermissions::preApply()
 //
 void LLPanelMediaSettingsPermissions::getValues( LLSD &fill_me_in )
 {
+	// moved over from the 'General settings' tab
+	fill_me_in[LLMediaEntry::CONTROLS_KEY] = (LLSD::Integer)mControls->getCurrentIndex();
+
     // *NOTE: For some reason, gcc does not like these symbol references in the 
     // expressions below (inside the static_casts).  I have NO idea why :(.
     // For some reason, assigning them to const temp vars here fixes the link
@@ -237,13 +247,13 @@ void LLPanelMediaSettingsPermissions::getValues( LLSD &fill_me_in )
     const U8 group = LLMediaEntry::PERM_GROUP;
     const U8 anyone = LLMediaEntry::PERM_ANYONE;
     const LLSD::Integer control = static_cast<LLSD::Integer>(
-        (mPermsOwnerControl->getValue() ? none : owner ) |
-        (mPermsGroupControl->getValue() ? none : group ) |
-        (mPermsWorldControl->getValue() ? none : anyone ));
+		(mPermsOwnerControl->getValue() ? owner : none ) |
+		(mPermsGroupControl->getValue() ? group: none  ) |
+		(mPermsWorldControl->getValue() ? anyone : none ));
     const LLSD::Integer interact = static_cast<LLSD::Integer>(
-        (mPermsOwnerInteract->getValue() ? none : owner ) |
-        (mPermsGroupInteract->getValue() ? none : group ) |
-        (mPermsWorldInteract->getValue() ? none : anyone ));
+		(mPermsOwnerInteract->getValue() ? owner: none  ) |
+		(mPermsGroupInteract->getValue() ? group : none ) |
+		(mPermsWorldInteract->getValue() ? anyone : none ));
     fill_me_in[LLMediaEntry::PERMS_CONTROL_KEY] = control;
     fill_me_in[LLMediaEntry::PERMS_INTERACT_KEY] = interact;
 }
@@ -255,3 +265,5 @@ void LLPanelMediaSettingsPermissions::postApply()
 {
     // no-op
 }
+
+
diff --git a/indra/newview/llpanelmediasettingspermissions.h b/indra/newview/llpanelmediasettingspermissions.h
index 45a596c615ece82b0940aabf2ed1051c163c0483..bd0c3b8ab58312af35a483619bd5c55449ced646 100644
--- a/indra/newview/llpanelmediasettingspermissions.h
+++ b/indra/newview/llpanelmediasettingspermissions.h
@@ -65,6 +65,7 @@ public:
 	static void clearValues( void* userdata,  bool editable);
 	
 private:
+	LLComboBox* mControls;
 	LLCheckBoxCtrl* mPermsOwnerInteract;
 	LLCheckBoxCtrl* mPermsOwnerControl;
 	LLNameBox* mPermsGroupName;
diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp
index aea6b0aa3b5deacdad2c0f83f1f737c931f89a42..81842e385136e828e62111e0ffc1e3871dd456d4 100644
--- a/indra/newview/llpanelmediasettingssecurity.cpp
+++ b/indra/newview/llpanelmediasettingssecurity.cpp
@@ -323,7 +323,7 @@ void LLPanelMediaSettingsSecurity::addWhiteListEntry( const std::string& entry )
 	else
 	{
 		row[ "columns" ][ ICON_COLUMN ][ "type" ] = "icon";
-		row[ "columns" ][ ICON_COLUMN ][ "value" ] = "parcel_color_EXP";
+		row[ "columns" ][ ICON_COLUMN ][ "value" ] = "Parcel_Exp_Color";
 		row[ "columns" ][ ICON_COLUMN ][ "width" ] = 20;
 	};
 
@@ -333,9 +333,6 @@ void LLPanelMediaSettingsSecurity::addWhiteListEntry( const std::string& entry )
 
 	// add to the white list scroll box
 	mWhiteListList->addElement( row );
-
-	// update whitelist enable checkbox based on whether the home url passes the whitelist
-	updateWhitelistEnableStatus();
 };
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmediasettingssecurity.h b/indra/newview/llpanelmediasettingssecurity.h
index 937bfb1bf9478c405c0eae1ec36d1afad0866485..66ccb23f4654494ebbb1a635c28e7b479a24120b 100644
--- a/indra/newview/llpanelmediasettingssecurity.h
+++ b/indra/newview/llpanelmediasettingssecurity.h
@@ -63,7 +63,9 @@ public:
 	void setParent( LLFloaterMediaSettings* parent );
 	bool urlPassesWhiteList( const std::string& test_url );
 	const std::string makeValidUrl( const std::string& src_url );
-	
+
+	void updateWhitelistEnableStatus();	
+
 protected:
 	LLFloaterMediaSettings* mParent;
 	
@@ -78,8 +80,6 @@ private:
 	LLScrollListCtrl* mWhiteListList;
 	LLTextBox* mHomeUrlFailsWhiteListText;
 
-	void updateWhitelistEnableStatus();
-
 	static void onBtnAdd(void*);
 	static void onBtnDel(void*);
 };
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 4511bca23a55c35e3d1c52a3315449a19dea91f1..f9777147b71708ecc1eb899c25e89e87e16acfd9 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -56,7 +56,10 @@
 #include "llmenugl.h"
 #include "llviewermenu.h"
 
+#include "llviewercontrol.h"
+
 static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory");
+bool LLPanelOutfitsInventory::sShowDebugEditor = false;
 
 LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
 	mActivePanel(NULL),
@@ -74,18 +77,23 @@ LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
 // virtual
 BOOL LLPanelOutfitsInventory::postBuild()
 {
-	
-	initAccordionPanels();
+	sShowDebugEditor = gSavedSettings.getBOOL("ShowDebugAppearanceEditor");
+	initTabPanels();
 	initListCommandsHandlers();
 	return TRUE;
 }
 
-void LLPanelOutfitsInventory::updateParent()
+void LLPanelOutfitsInventory::updateVerbs()
 {
 	if (mParent)
 	{
 		mParent->updateVerbs();
 	}
+
+	if (mListCommands)
+	{
+		mListCommands->childSetVisible("look_edit_btn",sShowDebugEditor);
+	}
 }
 
 void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)
@@ -96,6 +104,7 @@ void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)
 // virtual
 void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
 {
+	mFilterSubString = string;
 	if (string == "")
 	{
 		mActivePanel->setFilterSubString(LLStringUtil::null);
@@ -127,7 +136,7 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
 	mActivePanel->setFilterSubString(string);
 }
 
-void LLPanelOutfitsInventory::onWear()
+void LLPanelOutfitsInventory::onWearButtonClick()
 {
 	LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
 	if (listenerp)
@@ -167,7 +176,7 @@ void LLPanelOutfitsInventory::onNew()
 void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
 {
 	updateListCommands();
-	updateParent();
+	updateVerbs();
 	if (getRootFolder()->needsAutoRename() && items.size())
 	{
 		getRootFolder()->startRenamingSelectedItem();
@@ -177,7 +186,6 @@ void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewIte
 
 void LLPanelOutfitsInventory::onSelectorButtonClicked()
 {
-	/*
 	  LLFolderViewItem* cur_item = getRootFolder()->getCurSelectedItem();
 
 	  LLFolderViewEventListener* listenerp = cur_item->getListener();
@@ -189,7 +197,6 @@ void LLPanelOutfitsInventory::onSelectorButtonClicked()
 
 	  LLSideTray::getInstance()->showPanel("sidepanel_appearance", key);
 	  } 
-	*/
 }
 
 LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction()
@@ -233,14 +240,17 @@ void LLPanelOutfitsInventory::initListCommandsHandlers()
 
 	mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::onGearButtonClick, this));
 	mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this));
-	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this));
+	mListCommands->childSetAction("make_outfit_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this));
+	mListCommands->childSetAction("wear_btn", boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this));
+
+	mListCommands->childSetAction("look_edit_btn", boost::bind(&LLPanelOutfitsInventory::onSelectorButtonClicked, this));
 
 	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
 	trash_btn->setDragAndDropHandler(boost::bind(&LLPanelOutfitsInventory::handleDragAndDropToTrash, this
-			,	_4 // BOOL drop
-			,	_5 // EDragAndDropType cargo_type
-			,	_7 // EAcceptance* accept
-			));
+				   ,       _4 // BOOL drop
+				   ,       _5 // EDragAndDropType cargo_type
+				   ,       _7 // EAcceptance* accept
+				   ));
 
 	mCommitCallbackRegistrar.add("panel_outfits_inventory_gear_default.Custom.Action",
 								 boost::bind(&LLPanelOutfitsInventory::onCustomAction, this, _2));
@@ -252,8 +262,10 @@ void LLPanelOutfitsInventory::initListCommandsHandlers()
 void LLPanelOutfitsInventory::updateListCommands()
 {
 	bool trash_enabled = isActionEnabled("delete");
+	bool wear_enabled = isActionEnabled("wear");
 
 	mListCommands->childSetEnabled("trash_btn", trash_enabled);
+	mListCommands->childSetEnabled("wear_btn", wear_enabled);
 }
 
 void LLPanelOutfitsInventory::onGearButtonClick()
@@ -308,7 +320,7 @@ void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata)
 	}
 	if (command_name == "wear")
 	{
-		onWear();
+		onWearButtonClick();
 	}
 	if (command_name == "add")
 	{
@@ -407,41 +419,44 @@ bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropTy
 ////////////////////////////////////////////////////////////////////////////////
 
 //////////////////////////////////////////////////////////////////////////////////
-// Accordion                                                                    //
+// Tab panels                                                                    //
 
-void LLPanelOutfitsInventory::initAccordionPanels()
+void LLPanelOutfitsInventory::initTabPanels()
 {
-	mAccordionPanels.resize(2);
+	mTabPanels.resize(2);
 	
 	LLInventoryPanel *myoutfits_panel = getChild<LLInventoryPanel>("outfitslist_accordionpanel");
 	myoutfits_panel->setFilterTypes(1LL << LLFolderType::FT_OUTFIT, LLInventoryFilter::FILTERTYPE_CATEGORY);
 	myoutfits_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
-	mAccordionPanels[0] = myoutfits_panel;
+	mTabPanels[0] = myoutfits_panel;
 	mActivePanel = myoutfits_panel;
 
 	LLInventoryPanel *cof_panel = getChild<LLInventoryPanel>("cof_accordionpanel");
 	cof_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
-	mAccordionPanels[1] = cof_panel;
+	mTabPanels[1] = cof_panel;
 
-	for (accordionpanels_vec_t::iterator iter = mAccordionPanels.begin();
-		 iter != mAccordionPanels.end();
+	for (tabpanels_vec_t::iterator iter = mTabPanels.begin();
+		 iter != mTabPanels.end();
 		 ++iter)
 	{
 		LLInventoryPanel *panel = (*iter);
-		panel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onAccordionSelectionChange, this, panel, _1, _2));
+		panel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, panel, _1, _2));
 	}
+
+	mAppearanceTabs = getChild<LLTabContainer>("appearance_tabs");
+	mAppearanceTabs->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onTabChange, this));
 }
 
-void LLPanelOutfitsInventory::onAccordionSelectionChange(LLInventoryPanel* accordion_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action)
+void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action)
 {
 	if (user_action && items.size() > 0)
 	{
-		for (accordionpanels_vec_t::iterator iter = mAccordionPanels.begin();
-			 iter != mAccordionPanels.end();
+		for (tabpanels_vec_t::iterator iter = mTabPanels.begin();
+			 iter != mTabPanels.end();
 			 ++iter)
 		{
 			LLInventoryPanel *panel = (*iter);
-			if (panel == accordion_panel)
+			if (panel == tab_panel)
 			{
 				mActivePanel = panel;
 			}
@@ -454,15 +469,28 @@ void LLPanelOutfitsInventory::onAccordionSelectionChange(LLInventoryPanel* accor
 	onSelectionChange(items, user_action);
 }
 
+void LLPanelOutfitsInventory::onTabChange()
+{
+	mActivePanel = (LLInventoryPanel*)childGetVisibleTab("appearance_tabs");
+	if (!mActivePanel)
+	{
+		return;
+	}
+	mActivePanel->setFilterSubString(mFilterSubString);
+
+	bool is_my_outfits = (mActivePanel->getName() == "outfitslist_accordionpanel");
+	mListCommands->childSetEnabled("make_outfit_btn", is_my_outfits);
+}
+
 LLInventoryPanel* LLPanelOutfitsInventory::getActivePanel()
 {
 	return mActivePanel;
 }
 
-bool LLPanelOutfitsInventory::isAccordionPanel(LLInventoryPanel *panel)
+bool LLPanelOutfitsInventory::isTabPanel(LLInventoryPanel *panel)
 {
-	for(accordionpanels_vec_t::iterator it = mAccordionPanels.begin();
-		it != mAccordionPanels.end();
+	for(tabpanels_vec_t::iterator it = mTabPanels.begin();
+		it != mTabPanels.end();
 		++it)
 	{
 		if (*it == panel)
diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h
index afeaef485d93ee907577516c8590d568561485fd..1e084750a09878021db5ec180ab18a33c03e2be5 100644
--- a/indra/newview/llpaneloutfitsinventory.h
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -44,6 +44,7 @@ class LLSaveFolderState;
 class LLButton;
 class LLMenuGL;
 class LLSidepanelAppearance;
+class LLTabContainer;
 
 class LLPanelOutfitsInventory : public LLPanel
 {
@@ -54,7 +55,6 @@ public:
 	/*virtual*/ BOOL postBuild();
 	
 	void onSearchEdit(const std::string& string);
-	void onWear();
 	void onAdd();
 	void onRemove();
 	void onEdit();
@@ -71,29 +71,32 @@ public:
 	LLFolderView* getRootFolder();
 
 protected:
-	void updateParent();
+	void updateVerbs();
 	bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const;
 
 private:
 	LLSidepanelAppearance*      mParent;
 	LLSaveFolderState*			mSavedFolderState;
+	LLTabContainer*				mAppearanceTabs;
+	std::string 				mFilterSubString;
 
 public:
 	//////////////////////////////////////////////////////////////////////////////////
-	// Accordion                                                                    //
+	// tab panels
 	LLInventoryPanel* 	getActivePanel();
-	bool isAccordionPanel(LLInventoryPanel *panel);
+	bool isTabPanel(LLInventoryPanel *panel);
 	
 protected:
-	void 				initAccordionPanels();
-	void 				onAccordionSelectionChange(LLInventoryPanel* accordion_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+	void 				initTabPanels();
+	void 				onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+	void 				onTabChange();
 	
 private:
 	LLInventoryPanel* 	mActivePanel;
-	typedef std::vector<LLInventoryPanel *> accordionpanels_vec_t;
-	accordionpanels_vec_t 		mAccordionPanels;
+	typedef std::vector<LLInventoryPanel *> tabpanels_vec_t;
+	tabpanels_vec_t 		mTabPanels;
 
-	// Accordion                                                                  //
+	// tab panels                                                               //
 	////////////////////////////////////////////////////////////////////////////////
 	
 
@@ -103,6 +106,7 @@ protected:
 	void initListCommandsHandlers();
 	void updateListCommands();
 	void onGearButtonClick();
+	void onWearButtonClick();
 	void onAddButtonClick();
 	void showActionMenu(LLMenuGL* menu, std::string spawning_view_name);
 	void onTrashButtonClick();
@@ -116,6 +120,9 @@ private:
 	LLMenuGL*					mMenuAdd;
 	// List Commands                                                              //
 	////////////////////////////////////////////////////////////////////////////////
+	///
+public:
+	static bool sShowDebugEditor;
 };
 
 #endif //LL_LLPANELOUTFITSINVENTORY_H
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 5fb7dab7be9267fe6d9fbd546bcd4e4437cf3557..e1348401533c804ccadff662eab9645c31c7e139 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -586,6 +586,7 @@ BOOL LLPanelPeople::postBuild()
 	registrar.add("People.Groups.ViewSort.Action",  boost::bind(&LLPanelPeople::onGroupsViewSortMenuItemClicked,  this, _2));
 	registrar.add("People.Recent.ViewSort.Action",  boost::bind(&LLPanelPeople::onRecentViewSortMenuItemClicked,  this, _2));
 
+	enable_registrar.add("People.Group.Minus.Enable",	boost::bind(&LLPanelPeople::isRealGroup,	this));
 	enable_registrar.add("People.Friends.ViewSort.CheckItem",	boost::bind(&LLPanelPeople::onFriendsViewSortMenuItemCheck,	this, _2));
 	enable_registrar.add("People.Recent.ViewSort.CheckItem",	boost::bind(&LLPanelPeople::onRecentViewSortMenuItemCheck,	this, _2));
 	enable_registrar.add("People.Nearby.ViewSort.CheckItem",	boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemCheck,	this, _2));
@@ -775,7 +776,7 @@ void LLPanelPeople::updateButtons()
 	buttonSetEnabled("teleport_btn",		friends_tab_active && item_selected && isFriendOnline(selected_uuids.front()));
 	buttonSetEnabled("view_profile_btn",	item_selected);
 	buttonSetEnabled("im_btn",				multiple_selected); // allow starting the friends conference for multiple selection
-	buttonSetEnabled("call_btn",			multiple_selected && LLVoiceClient::voiceEnabled());
+	buttonSetEnabled("call_btn",			multiple_selected && canCall());
 	buttonSetEnabled("share_btn",			item_selected); // not implemented yet
 
 	bool none_group_selected = item_selected && selected_id.isNull();
@@ -783,6 +784,29 @@ void LLPanelPeople::updateButtons()
 	buttonSetEnabled("chat_btn", !none_group_selected);
 }
 
+bool LLPanelPeople::canCall()
+{
+	std::vector<LLUUID> selected_uuids;
+	getCurrentItemIDs(selected_uuids);
+
+	bool result = false;
+
+	std::vector<LLUUID>::const_iterator
+		id = selected_uuids.begin(),
+		uuids_end = selected_uuids.end();
+
+	for (;id != uuids_end; ++id)
+	{
+		if (LLAvatarActions::canCall(*id))
+		{
+			result = true;
+			break;
+		}
+	}
+
+	return result;
+}
+
 std::string LLPanelPeople::getActiveTabName() const
 {
 	return mTabContainer->getCurrentPanel()->getName();
@@ -921,6 +945,11 @@ void LLPanelPeople::reSelectedCurrentTab()
 	mTabContainer->selectTab(mTabContainer->getCurrentPanelIndex());
 }
 
+bool LLPanelPeople::isRealGroup()
+{
+	return getCurrentItemID() != LLUUID::null;
+}
+
 void LLPanelPeople::onFilterEdit(const std::string& search_string)
 {
 	std::string search_upper = search_string;
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index a9cc6d0ccb6834e42c57ddc35a3c7a2827d568e0..f5cdc0935c3db29c7397cd402bd43842b97b2440 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -73,6 +73,7 @@ private:
 
 	bool					isFriendOnline(const LLUUID& id);
 	bool					isItemsFreeOfFriends(const std::vector<LLUUID>& uuids);
+	bool 					canCall();
 
 	void					updateButtons();
 	std::string				getActiveTabName() const;
@@ -118,6 +119,8 @@ private:
 	void					onGroupsViewSortMenuItemClicked(const LLSD& userdata);
 	void					onRecentViewSortMenuItemClicked(const LLSD& userdata);
 
+	//returns false only if group is "none"
+	bool					isRealGroup();
 	bool					onFriendsViewSortMenuItemCheck(const LLSD& userdata);
 	bool					onRecentViewSortMenuItemCheck(const LLSD& userdata);
 	bool					onNearbyViewSortMenuItemCheck(const LLSD& userdata);
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 04fe42de9f9840d006ecbeb5f3ebf1aa79154f08..0314642d9eb9cf0847e44d1ff2da526f1b107d89 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -81,6 +81,14 @@ void ContextMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids,
 	LLMenuGL::showPopup(spawning_view, mMenu, x, y);
 }
 
+void ContextMenu::hide()
+{
+	if(mMenu)
+	{
+		mMenu->hide();
+	}
+}
+
 //== NearbyMenu ===============================================================
 
 LLContextMenu* NearbyMenu::createMenu()
@@ -173,7 +181,25 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
 		const LLUUID& id = mUUIDs.front();
 		return LLAvatarActions::isFriend(id);
 	}
+	else if (item == std::string("can_call"))
+	{
+		bool result = false;
+		int size = mUUIDs.size();
+		std::cout << size << std::endl;
+		std::vector<LLUUID>::const_iterator
+			id = mUUIDs.begin(),
+			uuids_end = mUUIDs.end();
 
+		for (;id != uuids_end; ++id)
+		{
+			if (LLAvatarActions::canCall(*id))
+			{
+				result = true;
+				break;
+			}
+		}
+		return result;
+	}
 	return false;
 }
 
diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h
index ed0f8208f670e745d2d1d1a2a32ffb85298ad76a..14ae2985f027b6d3b9abcc84e5167eba21faf163 100644
--- a/indra/newview/llpanelpeoplemenus.h
+++ b/indra/newview/llpanelpeoplemenus.h
@@ -54,6 +54,8 @@ public:
 	 */
 	/*virtual*/ void show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y);
 
+	virtual void hide();
+
 protected:
 
 	virtual LLContextMenu* createMenu() = 0;
diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp
index 541361324a7ec91b173713285189f8d0cff03c7e..839452d0616ae7f638b2c3b6f2afc8137014fc22 100644
--- a/indra/newview/llpanelpick.cpp
+++ b/indra/newview/llpanelpick.cpp
@@ -91,12 +91,19 @@ LLPanelPickInfo::LLPanelPickInfo()
  , mAvatarId(LLUUID::null)
  , mSnapshotCtrl(NULL)
  , mPickId(LLUUID::null)
+ , mParcelId(LLUUID::null)
+ , mRequestedId(LLUUID::null)
 {
 }
 
 LLPanelPickInfo::~LLPanelPickInfo()
 {
 	LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
+
+	if (mParcelId.notNull())
+	{
+		LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelId, this);
+	}
 }
 
 void LLPanelPickInfo::onOpen(const LLSD& key)
@@ -156,12 +163,14 @@ void LLPanelPickInfo::processProperties(void* data, EAvatarProcessorType type)
 		return;
 	}
 
+	mParcelId = pick_info->parcel_id;
 	setSnapshotId(pick_info->snapshot_id);
 	setPickName(pick_info->name);
 	setPickDesc(pick_info->desc);
 	setPosGlobal(pick_info->pos_global);
-	setPickLocation(createLocationText(pick_info->user_name, pick_info->original_name, 
-		pick_info->sim_name, pick_info->pos_global));
+
+	// Send remote parcel info request to get parcel name and sim (region) name.
+	sendParcelInfoRequest();
 
 	// *NOTE dzaporozhan
 	// We want to keep listening to APT_PICK_INFO because user may 
@@ -169,6 +178,17 @@ void LLPanelPickInfo::processProperties(void* data, EAvatarProcessorType type)
 	// revomeObserver is called from onClickBack
 }
 
+void LLPanelPickInfo::sendParcelInfoRequest()
+{
+	if (mParcelId != mRequestedId)
+	{
+		LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelId, this);
+		LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelId);
+
+		mRequestedId = mParcelId;
+	}
+}
+
 void LLPanelPickInfo::setExitCallback(const commit_callback_t& cb)
 {
 	getChild<LLButton>("back_btn")->setClickedCallback(cb);
@@ -176,21 +196,16 @@ void LLPanelPickInfo::setExitCallback(const commit_callback_t& cb)
 
 void LLPanelPickInfo::processParcelInfo(const LLParcelData& parcel_data)
 {
-	// HACK: Flag 0x2 == adult region,
-	// Flag 0x1 == mature region, otherwise assume PG
-	std::string rating_icon = "icon_event.tga";
-	if (parcel_data.flags & 0x2)
-	{
-		rating_icon = "icon_event_adult.tga";
-	}
-	else if (parcel_data.flags & 0x1)
-	{
-		rating_icon = "icon_event_mature.tga";
-	}
+	setPickLocation(createLocationText(LLStringUtil::null, parcel_data.name,
+		parcel_data.sim_name, getPosGlobal()));
 
-	childSetValue("maturity", rating_icon);
+	// We have received parcel info for the requested ID so clear it now.
+	mRequestedId.setNull();
 
-	//*NOTE we don't removeObserver(...) ourselves cause LLRemoveParcelProcessor does it for us
+	if (mParcelId.notNull())
+	{
+		LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelId, this);
+	}
 }
 
 void LLPanelPickInfo::setEditPickCallback(const commit_callback_t& cb)
@@ -222,7 +237,8 @@ void LLPanelPickInfo::resetData()
 	setPickId(LLUUID::null);
 	setSnapshotId(LLUUID::null);
 	mPosGlobal.clearVec();
-	childSetValue("maturity", LLStringUtil::null);
+	mParcelId.setNull();
+	mRequestedId.setNull();
 }
 
 // static
@@ -273,9 +289,6 @@ void LLPanelPickInfo::setPickDesc(const std::string& desc)
 void LLPanelPickInfo::setPickLocation(const std::string& location)
 {
 	childSetValue(XML_LOCATION, location);
-
-	//preserving non-wrapped text for info/edit modes switching
-	mLocation = location;
 }
 
 void LLPanelPickInfo::onClickMap()
@@ -340,7 +353,7 @@ void LLPanelPickEdit::onOpen(const LLSD& key)
 		setPosGlobal(gAgent.getPositionGlobal());
 
 		LLUUID parcel_id = LLUUID::null, snapshot_id = LLUUID::null;
-		std::string pick_name, pick_desc;
+		std::string pick_name, pick_desc, region_name;
 
 		LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
 		if(parcel)
@@ -351,21 +364,17 @@ void LLPanelPickEdit::onOpen(const LLSD& key)
 			snapshot_id = parcel->getSnapshotID();
 		}
 
-		if(pick_name.empty())
+		LLViewerRegion* region = gAgent.getRegion();
+		if(region)
 		{
-			LLViewerRegion* region = gAgent.getRegion();
-			if(region)
-			{
-				pick_name = region->getName();
-			}
+			region_name = region->getName();
 		}
 
 		setParcelID(parcel_id);
-		childSetValue("pick_name", pick_name);
+		childSetValue("pick_name", pick_name.empty() ? region_name : pick_name);
 		childSetValue("pick_desc", pick_desc);
 		setSnapshotId(snapshot_id);
-		setPickLocation(createLocationText(LLStringUtil::null, SET_LOCATION_NOTICE, 
-			pick_name, getPosGlobal()));
+		setPickLocation(createLocationText(SET_LOCATION_NOTICE, pick_name, region_name, getPosGlobal()));
 
 		enableSaveButton(true);
 	}
@@ -394,8 +403,9 @@ void LLPanelPickEdit::setPickData(const LLPickData* pick_data)
 	childSetValue("pick_name", pick_data->name);
 	childSetValue("pick_desc", pick_data->desc);
 	setSnapshotId(pick_data->snapshot_id);
-	setPickLocation(createLocationText(pick_data->user_name, pick_data->original_name, /*pick_data->sim_name,*/ 
-		pick_data->name, pick_data->pos_global));
+	setPosGlobal(pick_data->pos_global);
+	setPickLocation(createLocationText(LLStringUtil::null, pick_data->name,
+			pick_data->sim_name, pick_data->pos_global));
 }
 
 BOOL LLPanelPickEdit::postBuild()
@@ -519,14 +529,22 @@ void LLPanelPickEdit::onClickSetLocation()
 	// Save location for later use.
 	setPosGlobal(gAgent.getPositionGlobal());
 
+	std::string parcel_name, region_name;
+
 	LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
 	if (parcel)
 	{
 		mParcelId = parcel->getID();
-		mSimName = parcel->getName();
+		parcel_name = parcel->getName();
 	}
-	setPickLocation(createLocationText(
-		LLStringUtil::null, SET_LOCATION_NOTICE, mSimName, getPosGlobal()));
+
+	LLViewerRegion* region = gAgent.getRegion();
+	if(region)
+	{
+		region_name = region->getName();
+	}
+
+	setPickLocation(createLocationText(SET_LOCATION_NOTICE, parcel_name, region_name, getPosGlobal()));
 
 	mLocationChanged = true;
 	enableSaveButton(TRUE);
diff --git a/indra/newview/llpanelpick.h b/indra/newview/llpanelpick.h
index 2c0830f2ac7f7f1d53f6c58312a644bfc239c761..95add387d0843122f4c35e768ff94f81567d119b 100644
--- a/indra/newview/llpanelpick.h
+++ b/indra/newview/llpanelpick.h
@@ -71,6 +71,11 @@ public:
 
 	/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
 
+	/**
+	 * Sends remote parcel info request to resolve parcel name from its ID.
+	 */
+	void sendParcelInfoRequest();
+
 	/**
 	 * Sets "Back" button click callback
 	 */
@@ -81,9 +86,9 @@ public:
 	 */
 	virtual void setEditPickCallback(const commit_callback_t& cb);
 
-	//This stuff we got from LLRemoteParcelObserver, in the last two we intentionally do nothing
+	//This stuff we got from LLRemoteParcelObserver, in the last one we intentionally do nothing
 	/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
-	/*virtual*/ void setParcelID(const LLUUID& parcel_id) {};
+	/*virtual*/ void setParcelID(const LLUUID& parcel_id) { mParcelId = parcel_id; }
 	/*virtual*/ void setErrorStatus(U32 status, const std::string& reason) {};
 
 protected:
@@ -154,8 +159,7 @@ protected:
 	LLVector3d mPosGlobal;
 	LLUUID mParcelId;
 	LLUUID mPickId;
-	std::string mSimName;
-	std::string mLocation;
+	LLUUID mRequestedId;
 };
 
 /**
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 7d21867efcbfaab673ba37797b091677ad3bb760..4d22d96072a3cb53c64da9a878167157a8d938c7 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -38,12 +38,14 @@
 #include "llagentpicksinfo.h"
 #include "llavatarconstants.h"
 #include "llcommandhandler.h"
+#include "lldispatcher.h"
 #include "llflatlistview.h"
 #include "llfloaterreg.h"
 #include "llfloaterworldmap.h"
 #include "llnotificationsutil.h"
 #include "lltexturectrl.h"
 #include "lltoggleablemenu.h"
+#include "lltrans.h"
 #include "llviewergenericmessage.h"	// send_generic_message
 #include "llmenugl.h"
 #include "llviewermenu.h"
@@ -56,7 +58,6 @@
 #include "llpanelprofile.h"
 #include "llpanelpick.h"
 #include "llpanelclassified.h"
-#include "llpanelprofileview.h"
 #include "llsidetray.h"
 
 static const std::string XML_BTN_NEW = "new_btn";
@@ -87,6 +88,14 @@ public:
 
 	bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
 	{
+		// handle app/classified/create urls first
+		if (params.size() == 1 && params[0].asString() == "create")
+		{
+			createClassified();
+			return true;
+		}
+
+		// then handle the general app/classified/{UUID}/{CMD} urls
 		if (params.size() < 2)
 		{
 			return false;
@@ -113,6 +122,31 @@ public:
 		return false;
 	}
 
+	void createClassified()
+	{
+		// open the new classified panel on the Me > Picks sidetray
+		LLSD params;
+		params["id"] = gAgent.getID();
+		params["open_tab_name"] = "panel_picks";
+		params["show_tab_panel"] = "create_classified";
+		LLSideTray::getInstance()->showPanel("panel_me", params);
+	}
+
+	void openClassified(LLAvatarClassifiedInfo* c_info)
+	{
+		// open the classified info panel on the Me > Picks sidetray
+		LLSD params;
+		params["id"] = c_info->creator_id;
+		params["open_tab_name"] = "panel_picks";
+		params["show_tab_panel"] = "classified_details";
+		params["classified_id"] = c_info->classified_id;
+		params["classified_avatar_id"] = c_info->creator_id;
+		params["classified_snapshot_id"] = c_info->snapshot_id;
+		params["classified_name"] = c_info->name;
+		params["classified_desc"] = c_info->description;
+		LLSideTray::getInstance()->showPanel("panel_profile_view", params);
+	}
+
 	/*virtual*/ void processProperties(void* data, EAvatarProcessorType type)
 	{
 		if (APT_CLASSIFIED_INFO != type)
@@ -127,22 +161,8 @@ public:
 			return;
 		}
 
-		// open the people profile page for the classified's owner
-		LLSD params;
-		params["id"] = c_info->creator_id;
-		params["classified"] = c_info->classified_id;
-		params["open_tab_name"] = "panel_profile";
-		LLPanelProfileView *profile = dynamic_cast<LLPanelProfileView*>(LLSideTray::getInstance()->showPanel("panel_profile_view", params));
-
-		// then open the classified panel on this user's profile panel
-		if (profile)
-		{
-			LLPanelPicks* panel_picks = profile->getChild<LLPanelPicks>("panel_picks");
-			if (panel_picks)
-			{
-				panel_picks->openClassifiedInfo(c_info);
-			}
-		}
+		// open the detail side tray for this classified
+		openClassified(c_info);
 
 		// remove our observer now that we're done
 		mClassifiedIds.erase(c_info->classified_id);
@@ -197,7 +217,9 @@ LLPanelPicks::LLPanelPicks()
 	mClassifiedsAccTab(NULL),
 	mPanelClassifiedInfo(NULL),
 	mPanelClassifiedEdit(NULL),
-	mClickThroughDisp(NULL)
+	mClickThroughDisp(NULL),
+	mNoClassifieds(false),
+	mNoPicks(false)
 {
 	mClickThroughDisp = new LLClassifiedClickThrough();
 	gGenericDispatcher.addHandler("classifiedclickthrough", mClickThroughDisp);
@@ -223,6 +245,11 @@ void LLPanelPicks::updateData()
 	// Send Picks request only when we need to, not on every onOpen(during tab switch).
 	if(isDirty())
 	{
+		mNoPicks = false;
+		mNoClassifieds = false;
+
+		childSetValue("picks_panel_text", LLTrans::getString("PicksClassifiedsLoadingText"));
+
 		mPicksList->clear();
 		LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(getAvatarId());
 
@@ -283,6 +310,8 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
 			resetDirty();
 			updateButtons();
 		}
+		
+		mNoPicks = !mPicksList->size();
 	}
 	else if(APT_CLASSIFIEDS == type)
 	{
@@ -316,9 +345,14 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
 			resetDirty();
 			updateButtons();
 		}
+		
+		mNoClassifieds = !mClassifiedsList->size();
+	}
+
+	if (mNoPicks && mNoClassifieds)
+	{
+		childSetValue("picks_panel_text", LLTrans::getString("NoPicksClassifiedsText"));
 	}
-	if(!mPicksList->size() && !mClassifiedsList->size())
-		childSetVisible("empty_picks_panel_text", true);
 }
 
 LLPickItem* LLPanelPicks::getSelectedPickItem()
@@ -692,33 +726,24 @@ void LLPanelPicks::openClassifiedInfo()
 
 	LLClassifiedItem* c_item = getSelectedClassifiedItem();
 
-	createClassifiedInfoPanel();
-
-	LLSD params;
- 	params["classified_id"] = c_item->getClassifiedId();
- 	params["avatar_id"] = c_item->getAvatarId();
- 	params["snapshot_id"] = c_item->getSnapshotId();
- 	params["name"] = c_item->getClassifiedName();
- 	params["desc"] = c_item->getDescription();
-
-	getProfilePanel()->openPanel(mPanelClassifiedInfo, params);
+	openClassifiedInfo(c_item->getClassifiedId(), c_item->getAvatarId(),
+					   c_item->getSnapshotId(), c_item->getClassifiedName(),
+					   c_item->getDescription());
 }
 
-void LLPanelPicks::openClassifiedInfo(LLAvatarClassifiedInfo *c_info)
+void LLPanelPicks::openClassifiedInfo(const LLUUID &classified_id, 
+									  const LLUUID &avatar_id,
+									  const LLUUID &snapshot_id,
+									  const std::string &name, const std::string &desc)
 {
-	if (! c_info)
-	{
-		return;
-	}
-
 	createClassifiedInfoPanel();
 
 	LLSD params;
-	params["classified_id"] = c_info->classified_id;
-	params["avatar_id"] = c_info->creator_id;
-	params["snapshot_id"] = c_info->snapshot_id;
-	params["name"] = c_info->name;
-	params["desc"] = c_info->description;
+	params["classified_id"] = classified_id;
+	params["avatar_id"] = avatar_id;
+	params["snapshot_id"] = snapshot_id;
+	params["name"] = name;
+	params["desc"] = desc;
 
 	getProfilePanel()->openPanel(mPanelClassifiedInfo, params);
 }
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 893a0c53a3b1bcf0fc9ceb4a034a229089e8075f..fd8a9e6938c2759379823c2c7dc0ef9d3c8d4a79 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -86,9 +86,6 @@ public:
 	// parent panels failed to work (picks related code was in my profile panel)
 	void setProfilePanel(LLPanelProfile* profile_panel);
 
-	// display the info panel for the given classified
-	void openClassifiedInfo(LLAvatarClassifiedInfo *c_info);
-
 protected:
 	/*virtual*/void updateButtons();
 
@@ -120,6 +117,10 @@ private:
 
 	void openPickInfo();
 	void openClassifiedInfo();
+	void openClassifiedInfo(const LLUUID &classified_id, const LLUUID &avatar_id,
+							const LLUUID &snapshot_id, const std::string &name,
+							const std::string &desc);
+	friend class LLPanelProfile;
 
 	void showAccordion(const std::string& name, bool show);
 
@@ -156,6 +157,11 @@ private:
 	LLAccordionCtrlTab* mClassifiedsAccTab;
 
 	LLClassifiedClickThrough* mClickThroughDisp;
+	
+	//true if picks list is empty after processing picks
+	bool mNoPicks;
+	//true if classifieds list is empty after processing classifieds
+	bool mNoClassifieds;
 };
 
 class LLPickItem : public LLPanel, public LLAvatarPropertiesObserver
diff --git a/indra/newview/llpanelplace.cpp b/indra/newview/llpanelplace.cpp
index 71d763b562062c6a9449738177ab5d8b2146fcc9..6985b73200bd57d18c342605b825aab70abf1b83 100644
--- a/indra/newview/llpanelplace.cpp
+++ b/indra/newview/llpanelplace.cpp
@@ -40,6 +40,7 @@
 #include "llsecondlifeurls.h"
 #include "llfloater.h"
 #include "llfloaterreg.h"
+#include "llregionhandle.h"
 
 #include "llagent.h"
 #include "llviewerwindow.h"
diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index 6ba3790fe226272b968670ad681ae8634dcba3c0..b80eb9db381657a05e22ce1bcc5e24fb38daebec 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -39,6 +39,8 @@
 #include "llsecondlifeurls.h"
 
 #include "llsdutil_math.h"
+#include "llregionhandle.h"
+#include "message.h"
 
 #include "lliconctrl.h"
 #include "lltextbox.h"
@@ -231,8 +233,10 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
 
 	if (!parcel_data.name.empty())
 	{
+		mParcelTitle = parcel_data.name;
+
 		mParcelName->setText(llformat("%s (%d, %d, %d)",
-							 parcel_data.name.c_str(), region_x, region_y, region_z));
+							 mParcelTitle.c_str(), region_x, region_y, region_z));
 	}
 	else
 	{
@@ -282,15 +286,12 @@ void LLPanelPlaceInfo::handleVisibilityChange(BOOL new_visibility)
 
 void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel)
 {
-	std::string name = mParcelName->getText();
-	if (name.empty())
-	{
-		name = mRegionName->getText();
-	}
+	std::string region_name = mRegionName->getText();
 
 	LLPickData data;
 	data.pos_global = pos_global;
-	data.name = name;
+	data.name = mParcelTitle.empty() ? region_name : mParcelTitle;
+	data.sim_name = region_name;
 	data.desc = mDescEditor->getText();
 	data.snapshot_id = mSnapshotCtrl->getImageAssetID();
 	data.parcel_id = mParcelID;
diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h
index b9bf92b534c975c60695c287f4e6f80ba0db351f..7dfc7b2444a08af5e0310f0a7208776f62502ffb 100644
--- a/indra/newview/llpanelplaceinfo.h
+++ b/indra/newview/llpanelplaceinfo.h
@@ -111,6 +111,7 @@ protected:
 	LLUUID					mParcelID;
 	LLUUID					mRequestedID;
 	LLVector3				mPosRegion;
+	std::string				mParcelTitle; // used for pick title without coordinates
 	std::string				mCurrentTitle;
 	S32						mScrollingPanelMinHeight;
 	S32						mScrollingPanelWidth;
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index 0c7cc9af3857370f289fbae71f94280020b227d9..402d50ba9c30a5fe4ed19dd153e4d6798f2b18fb 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -35,6 +35,7 @@
 #include "llpanelplaceprofile.h"
 
 #include "llparcel.h"
+#include "message.h"
 
 #include "lliconctrl.h"
 #include "lllineeditor.h"
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 3fe51106e4b34a56af0709feb45186ecf6d87191..5cc9c1951b5e6608eb9f8fe324eb5fc759e29177 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -57,6 +57,7 @@
 #include "llsliderctrl.h"
 #include "llstring.h"
 #include "llviewercontrol.h"
+#include "llviewerdisplay.h"
 #include "llviewerparcelmgr.h"
 #include "llviewermedia.h"
 #include "llviewermediafocus.h"
@@ -66,8 +67,11 @@
 
 #include "llfloatertools.h"  // to enable hide if build tools are up
 
+// Functions pulled from pipeline.cpp
 glh::matrix4f glh_get_current_modelview();
 glh::matrix4f glh_get_current_projection();
+// Functions pulled from llviewerdisplay.cpp
+bool get_hud_matrices(glh::matrix4f &proj, glh::matrix4f &model);
 
 // Warning: make sure these two match!
 const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM };
@@ -92,7 +96,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mTargetObjectNormal(LLVector3::zero),
 	mZoomObjectID(LLUUID::null),
 	mZoomObjectFace(0),
-	mVolumeSliderVisible(false)
+	mVolumeSliderVisible(0)
 {
 	mCommitCallbackRegistrar.add("MediaCtrl.Close",		boost::bind(&LLPanelPrimMediaControls::onClickClose, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Back",		boost::bind(&LLPanelPrimMediaControls::onClickBack, this));
@@ -112,6 +116,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mCommitCallbackRegistrar.add("MediaCtrl.Volume",	boost::bind(&LLPanelPrimMediaControls::onCommitVolumeSlider, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.ToggleMute",		boost::bind(&LLPanelPrimMediaControls::onToggleMute, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.ShowVolumeSlider",		boost::bind(&LLPanelPrimMediaControls::showVolumeSlider, this));
+	mCommitCallbackRegistrar.add("MediaCtrl.HideVolumeSlider",		boost::bind(&LLPanelPrimMediaControls::hideVolumeSlider, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.SkipBack",		boost::bind(&LLPanelPrimMediaControls::onClickSkipBack, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.SkipForward",	boost::bind(&LLPanelPrimMediaControls::onClickSkipForward, this));
 	
@@ -368,8 +373,8 @@ void LLPanelPrimMediaControls::updateShape()
 			mVolumeUpCtrl->setVisible(has_focus);
 			mVolumeDownCtrl->setVisible(has_focus);
 			mVolumeCtrl->setEnabled(has_focus);
-			mVolumeSliderCtrl->setEnabled(has_focus && mVolumeSliderVisible);
-			mVolumeSliderCtrl->setVisible(has_focus && mVolumeSliderVisible);
+			mVolumeSliderCtrl->setEnabled(has_focus && mVolumeSliderVisible > 0);
+			mVolumeSliderCtrl->setVisible(has_focus && mVolumeSliderVisible > 0);
 			
 			mWhitelistIcon->setVisible(false);
 			mSecureLockIcon->setVisible(false);
@@ -564,9 +569,6 @@ void LLPanelPrimMediaControls::updateShape()
 		//
 		// Calculate position and shape of the controls
 		//
-		LLVector3 min, max;
-
-		glh::matrix4f mat = glh_get_current_projection()*glh_get_current_modelview();
 		std::vector<LLVector3>::iterator vert_it;
 		std::vector<LLVector3>::iterator vert_end;
 		std::vector<LLVector3> vect_face;
@@ -603,8 +605,18 @@ void LLPanelPrimMediaControls::updateShape()
 		vert_it = vect_face.begin();
 		vert_end = vect_face.end();
 		
-		min = LLVector3(1,1,1);
-		max = LLVector3(-1,-1,-1);
+		glh::matrix4f mat;
+		if (!is_hud) 
+		{
+			mat = glh_get_current_projection() * glh_get_current_modelview();
+		}
+		else {
+			glh::matrix4f proj, modelview;
+			if (get_hud_matrices(proj, modelview))
+				mat = proj * modelview;
+		}
+		LLVector3 min = LLVector3(1,1,1);
+		LLVector3 max = LLVector3(-1,-1,-1);
 		for(; vert_it != vert_end; ++vert_it)
 		{
 			// project silhouette vertices into screen space
@@ -633,10 +645,15 @@ void LLPanelPrimMediaControls::updateShape()
 		media_controls_rect.mRight += getRect().getWidth() - mMediaRegion->getRect().mRight;
 		
 		// keep all parts of HUD on-screen
-		media_controls_rect.intersectWith(getParent()->getLocalRect());
+		LLRect window_rect = getParent()->getLocalRect();
+		media_controls_rect.intersectWith(window_rect);
 		
-		// clamp to minimum size, keeping centered
-		media_controls_rect.setCenterAndSize(media_controls_rect.getCenterX(), media_controls_rect.getCenterY(),
+		// clamp to minimum size, keeping rect inside window
+		S32 centerX = media_controls_rect.getCenterX();
+		S32 centerY = media_controls_rect.getCenterY();
+		window_rect.stretch(-mMinWidth/2, -mMinHeight/2);
+		window_rect.clampPointToRect(centerX, centerY);
+		media_controls_rect.setCenterAndSize(centerX, centerY,
 											 llmax(mMinWidth, media_controls_rect.getWidth()), llmax(mMinHeight, media_controls_rect.getHeight()));
 		
 		setShape(media_controls_rect, true);
@@ -698,7 +715,7 @@ void LLPanelPrimMediaControls::draw()
 				setVisible(FALSE);
 
 				mClearFaceOnFade = false;
-				mVolumeSliderVisible = false;
+				mVolumeSliderVisible = 0;
 				mTargetImplID = LLUUID::null;
 				mTargetObjectID = LLUUID::null;
 				mTargetObjectFace = 0;
@@ -1251,5 +1268,11 @@ void LLPanelPrimMediaControls::onToggleMute()
 
 void LLPanelPrimMediaControls::showVolumeSlider()
 {
-	mVolumeSliderVisible = true;
+	mVolumeSliderVisible++;
+}
+
+
+void LLPanelPrimMediaControls::hideVolumeSlider()
+{
+	mVolumeSliderVisible--;
 }
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 17e65b8b0c3698eec57b4079524bcbb288647da5..d899ee4473bc8955b935bd7732bd1b9f5734f9db 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -110,6 +110,7 @@ private:
 	void onCommitVolumeSlider();
 	void onToggleMute();
 	void showVolumeSlider();
+	void hideVolumeSlider();
 	
 	static void onScrollUp(void* user_data);
 	static void onScrollUpHeld(void* user_data);
@@ -204,7 +205,7 @@ private:
 	LLUUID mZoomObjectID;
 	S32 mZoomObjectFace;
 	
-	bool mVolumeSliderVisible;
+	S32 mVolumeSliderVisible;
 };
 
 #endif // LL_PANELPRIMMEDIACONTROLS_H
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 327482017465e21fe932a1e3f90a5793e0233786..c73ade53c8fc3d58fab1d63560316984456743e4 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -144,6 +144,7 @@ BOOL LLPanelProfile::postBuild()
 
 void LLPanelProfile::onOpen(const LLSD& key)
 {
+	// open the desired panel
 	if (key.has("open_tab_name"))
 	{
 		getTabContainer()[PANEL_PICKS]->onClosePanel();
@@ -155,6 +156,33 @@ void LLPanelProfile::onOpen(const LLSD& key)
 	{
 		getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId());
 	}
+
+	// support commands to open further pieces of UI
+	if (key.has("show_tab_panel"))
+	{
+		std::string panel = key["show_tab_panel"].asString();
+		if (panel == "create_classified")
+		{
+			LLPanelPicks* picks = dynamic_cast<LLPanelPicks *>(getTabContainer()[PANEL_PICKS]);
+			if (picks)
+			{
+				picks->createNewClassified();
+			}
+		}
+		else if (panel == "classified_details")
+		{
+			LLUUID classified_id = key["classified_id"].asUUID();
+			LLUUID avatar_id     = key["classified_avatar_id"].asUUID();
+			LLUUID snapshot_id   = key["classified_snapshot_id"].asUUID();
+			std::string name     = key["classified_name"].asString();
+			std::string desc     = key["classified_desc"].asString();
+			LLPanelPicks* picks = dynamic_cast<LLPanelPicks *>(getTabContainer()[PANEL_PICKS]);
+			if (picks)
+			{
+				picks->openClassifiedInfo(classified_id, avatar_id, snapshot_id, name, desc);
+			}
+		}
+	}
 }
 
 //*TODO redo panel toggling
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 43f80f6d6a5ab5dc1710866fbb2b458845bb8e3b..596bd2909a0cfb558e9d8bd44bdfb7aec91ec7c9 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -505,7 +505,7 @@ void LLTeleportHistoryPanel::refresh()
 			tab->setVisible(true);
 
 			// Expand all accordion tabs when filtering
-			if(!mFilterSubString.empty())
+			if(!sFilterSubString.empty())
 			{
 				tab->setDisplayChildren(true);
 			}
@@ -521,7 +521,7 @@ void LLTeleportHistoryPanel::refresh()
 
 		if (curr_flat_view)
 		{
-			LLTeleportHistoryFlatItem* item = new LLTeleportHistoryFlatItem(mCurrentItem, &mContextMenu, items[mCurrentItem].mTitle, mFilterSubString);
+			LLTeleportHistoryFlatItem* item = new LLTeleportHistoryFlatItem(mCurrentItem, &mContextMenu, items[mCurrentItem].mTitle, sFilterSubString);
 			curr_flat_view->addItem(item);
 
 			if (mLastSelectedItemIndex == mCurrentItem)
@@ -569,7 +569,7 @@ void LLTeleportHistoryPanel::replaceItem(S32 removed_index)
 	LLTeleportHistoryFlatItem* item = new LLTeleportHistoryFlatItem(history_items.size(), // index will be decremented inside loop below
 									&mContextMenu,
 									history_items[history_items.size() - 1].mTitle, // Most recent item, it was
-									mFilterSubString);
+									sFilterSubString);
 															 // added instead of removed
 	fv->addItem(item, LLUUID::null, ADD_TOP);
 
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index f646fea355cb49788edfa3f31066016f12a341de..0c0f891f325fd19216c0f33568572943b15382ae 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -109,7 +109,6 @@ private:
 	S32				mLastSelectedItemIndex;
 	bool				mDirty;
 	S32				mCurrentItem;
-	std::string				mFilterSubString;
 
 	typedef LLDynamicArray<LLAccordionCtrlTab*> item_containers_t;
 	item_containers_t mItemContainers;
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 48a7a32a3b1c7b80111b7649c1884b7f809d01c8..93e5b8fa15b81484d5139553d92d206b721bc5b2 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -42,11 +42,13 @@
 #include "llavatarlist.h"
 #include "llspeakers.h"
 #include "llviewermenu.h"
+#include "llvoiceclient.h"
 
 //LLParticipantList retrieves add, clear and remove events and updates view accordingly 
 #if LL_MSVC
 #pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
 #endif
+
 LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list,  bool use_context_menu/* = true*/):
 	mSpeakerMgr(data_source),
 	mAvatarList(avatar_list),
@@ -57,6 +59,7 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
 	mSpeakerRemoveListener = new SpeakerRemoveListener(*this);
 	mSpeakerClearListener = new SpeakerClearListener(*this);
 	mSpeakerModeratorListener = new SpeakerModeratorUpdateListener(*this);
+	mSpeakerMuteListener = new SpeakerMuteListener(*this);
 
 	mSpeakerMgr->addListener(mSpeakerAddListener, "add");
 	mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove");
@@ -87,6 +90,7 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
 	for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++)
 	{
 		const LLPointer<LLSpeaker>& speakerp = *it;
+
 		addAvatarIDExceptAgent(group_members, speakerp->mID);
 		if ( speakerp->mIsModerator )
 		{
@@ -103,6 +107,14 @@ LLParticipantList::~LLParticipantList()
 	mAvatarListRefreshConnection.disconnect();
 	mAvatarListReturnConnection.disconnect();
 
+	// It is possible Participant List will be re-created from LLCallFloater::onCurrentChannelChanged()
+	// See ticket EXT-3427
+	// hide menu before deleting it to stop enable and check handlers from triggering.
+	if(mParticipantListMenu)
+	{
+		mParticipantListMenu->hide();
+	}
+
 	delete mParticipantListMenu;
 	mParticipantListMenu = NULL;
 }
@@ -184,6 +196,27 @@ void LLParticipantList::setSortOrder(EParticipantSortOrder order)
 	}
 }
 
+void LLParticipantList::refreshVoiceState()
+{
+	LLSpeakerMgr::speaker_list_t speakers;
+	mSpeakerMgr->getSpeakerList(&speakers, TRUE);
+
+	for (LLSpeakerMgr::speaker_list_t::iterator iter = speakers.begin();
+		iter != speakers.end(); ++iter)
+	{
+		LLSpeaker* speakerp = (*iter).get();
+		const LLUUID& speaker_id = speakerp->mID;
+		LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*> (mAvatarList->getItemByValue(speaker_id));
+		if ( item )
+		{
+			// if voice is disabled for this speaker show non voice speakers as disabled
+			bool is_in_voice = speakerp->mStatus > LLSpeaker::STATUS_VOICE_ACTIVE
+				&& speakerp->mStatus != LLSpeaker::STATUS_MUTED;
+			item->setOnline(!is_in_voice);
+		}
+	}
+}
+
 bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
 {
 	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
@@ -248,6 +281,24 @@ bool LLParticipantList::onModeratorUpdateEvent(LLPointer<LLOldEvents::LLEvent> e
 	return true;
 }
 
+bool LLParticipantList::onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+	LLPointer<LLSpeaker> speakerp = (LLSpeaker*)event->getSource();
+	if (speakerp.isNull()) return false;
+
+	// update UI on confirmation of moderator mutes
+	if (event->getValue().asString() == "voice")
+	{
+		LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(mAvatarList->getItemByValue(speakerp->mID));
+		if (item)
+		{
+			LLOutputMonitorCtrl* indicator = item->getChild<LLOutputMonitorCtrl>("speaking_indicator");
+			indicator->setIsMuted(speakerp->mModeratorMutedVoice);
+		}
+	}
+	return true;
+}
+
 void LLParticipantList::sort()
 {
 	if ( !mAvatarList )
@@ -264,13 +315,21 @@ void LLParticipantList::sort()
 	}
 }
 
-// static
 void LLParticipantList::addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id)
 {
-	if (gAgent.getID() != avatar_id)
-	{
-		existing_list.push_back(avatar_id);
-	}
+	if (gAgent.getID() == avatar_id) return;
+
+	existing_list.push_back(avatar_id);
+	adjustParticipant(avatar_id);
+}
+
+void LLParticipantList::adjustParticipant(const LLUUID& speaker_id)
+{
+	LLPointer<LLSpeaker> speakerp = mSpeakerMgr->findSpeaker(speaker_id);
+	if (speakerp.isNull()) return;
+
+	// add listener to process moderation changes
+	speakerp->addListener(mSpeakerMuteListener);
 }
 
 //
@@ -315,6 +374,11 @@ bool LLParticipantList::SpeakerModeratorUpdateListener::handleEvent(LLPointer<LL
 		return mParent.onModeratorUpdateEvent(event, userdata);
 }
 
+bool LLParticipantList::SpeakerMuteListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+	return mParent.onSpeakerMuteEvent(event, userdata);
+}
+
 LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()
 {
 	// set up the callbacks for all of the avatar menu items
@@ -324,14 +388,27 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()
 	registrar.add("ParticipantList.ToggleAllowTextChat", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleAllowTextChat, this, _2));
 	registrar.add("ParticipantList.ToggleMuteText", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleMuteText, this, _2));
 
+	registrar.add("Avatar.Profile",	boost::bind(&LLAvatarActions::showProfile, mUUIDs.front()));
+	registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startIM, mUUIDs.front()));
+	registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, mUUIDs.front()));
+	registrar.add("Avatar.BlockUnblock", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleMuteVoice, this, _2));
+	registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::share, mUUIDs.front()));
+	registrar.add("Avatar.Pay",	boost::bind(&LLAvatarActions::pay, mUUIDs.front()));
+	registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startCall, mUUIDs.front()));
+
 	registrar.add("ParticipantList.ModerateVoice", boost::bind(&LLParticipantList::LLParticipantListMenu::moderateVoice, this, _2));
 
 	enable_registrar.add("ParticipantList.EnableItem", boost::bind(&LLParticipantList::LLParticipantListMenu::enableContextMenuItem,	this, _2));
 	enable_registrar.add("ParticipantList.CheckItem",  boost::bind(&LLParticipantList::LLParticipantListMenu::checkContextMenuItem,	this, _2));
 
 	// create the context menu from the XUI
-	return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
+	LLContextMenu* main_menu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
 		"menu_participant_list.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
+
+	main_menu->setItemVisible("Moderator Options", isGroupModerator());
+	main_menu->arrangeAndClear();
+
+	return main_menu;
 }
 
 void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y)
@@ -341,7 +418,7 @@ void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const
 	if (uuids.size() == 0) return;
 
 	const LLUUID speaker_id = mUUIDs.front();
-	BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, LLMute::flagVoiceChat);
+	BOOL is_muted = isMuted(speaker_id);
 
 	if (is_muted)
 	{
@@ -353,64 +430,17 @@ void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const
 		LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteSelected", false);
 		LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteOthers", false);
 	}
-
 }
 
 void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& userdata)
 {
-	const LLUUID speaker_id = mUUIDs.front();
 
-	std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
-	LLSD data;
-	data["method"] = "mute update";
-	data["session-id"] = mParent.mSpeakerMgr->getSessionID();
-	data["params"] = LLSD::emptyMap();
-	data["params"]["agent_id"] = speaker_id;
-	data["params"]["mute_info"] = LLSD::emptyMap();
-	//current value represents ability to type, so invert
-	data["params"]["mute_info"]["text"] = !mParent.mSpeakerMgr->findSpeaker(speaker_id)->mModeratorMutedText;
-
-	class MuteTextResponder : public LLHTTPClient::Responder
+	LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr);
+	if (mgr)
 	{
-	public:
-		MuteTextResponder(const LLUUID& session_id)
-		{
-			mSessionID = session_id;
-		}
-
-		virtual void error(U32 status, const std::string& reason)
-		{
-			llwarns << status << ": " << reason << llendl;
-
-			if ( gIMMgr )
-			{
-				//403 == you're not a mod
-				//should be disabled if you're not a moderator
-				if ( 403 == status )
-				{
-					gIMMgr->showSessionEventError(
-						"mute",
-						"not_a_moderator",
-						mSessionID);
-				}
-				else
-				{
-					gIMMgr->showSessionEventError(
-						"mute",
-						"generic",
-						mSessionID);
-				}
-			}
-		}
-
-	private:
-		LLUUID mSessionID;
-	};
-
-	LLHTTPClient::post(
-		url,
-		data,
-		new MuteTextResponder(mParent.mSpeakerMgr->getSessionID()));
+		const LLUUID speaker_id = mUUIDs.front();
+		mgr->toggleAllowTextChat(speaker_id);
+	}
 }
 
 void LLParticipantList::LLParticipantListMenu::toggleMute(const LLSD& userdata, U32 flags)
@@ -450,36 +480,59 @@ void LLParticipantList::LLParticipantListMenu::toggleMuteVoice(const LLSD& userd
 	toggleMute(userdata, LLMute::flagVoiceChat);
 }
 
-void LLParticipantList::LLParticipantListMenu::moderateVoice(const LLSD& userdata)
+bool LLParticipantList::LLParticipantListMenu::isGroupModerator()
+{
+	// Agent is in Group Call
+	if(gAgent.isInGroup(mParent.mSpeakerMgr->getSessionID()))
+	{
+		// Agent is Moderator
+		return mParent.mSpeakerMgr->findSpeaker(gAgentID)->mIsModerator;
+	}
+	return false;
+}
+
+bool LLParticipantList::LLParticipantListMenu::isMuted(const LLUUID& avatar_id)
 {
+	LLPointer<LLSpeaker> selected_speakerp = mParent.mSpeakerMgr->findSpeaker(avatar_id);
+	if (!selected_speakerp) return true;
 
+	return selected_speakerp->mStatus == LLSpeaker::STATUS_MUTED;
 }
-void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(const LLSD& userdata)
+
+void LLParticipantList::LLParticipantListMenu::moderateVoice(const LLSD& userdata)
 {
-	LLSpeakerMgr::speaker_list_t speakers;
-	mParent.mSpeakerMgr->getSpeakerList(&speakers, true);
+	if (!gAgent.getRegion()) return;
 
-	const LLUUID& excluded_avatar_id = mUUIDs.front();
-	bool should_mute = userdata.asString() == "mute";
-	for (LLSpeakerMgr::speaker_list_t::iterator iter = speakers.begin();
-		iter != speakers.end(); ++iter)
-	{
-		LLSpeaker* speakerp = (*iter).get();
-		LLUUID speaker_id = speakerp->mID;
-		if (excluded_avatar_id == speaker_id) continue;
+	bool moderate_selected = userdata.asString() == "selected";
+	const LLUUID& selected_avatar_id = mUUIDs.front();
+	bool is_muted = isMuted(selected_avatar_id);
 
-		LLMute mute(speaker_id, speakerp->mDisplayName, speakerp->mType == LLSpeaker::SPEAKER_AGENT ? LLMute::AGENT : LLMute::OBJECT);
+	if (moderate_selected)
+	{
+		moderateVoiceParticipant(selected_avatar_id, is_muted);
+	}
+	else
+	{
+		moderateVoiceOtherParticipants(selected_avatar_id, is_muted);
+	}
+}
 
-		if (should_mute)
-		{
-			LLMuteList::getInstance()->add(mute, LLMute::flagVoiceChat);
-		}
-		else
-		{
-			LLMuteList::getInstance()->remove(mute, LLMute::flagVoiceChat);
-		}
+void LLParticipantList::LLParticipantListMenu::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute)
+{
+	LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr);
+	if (mgr)
+	{
+		mgr->moderateVoiceParticipant(avatar_id, unmute);
 	}
+}
 
+void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute)
+{
+	LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr);
+	if (mgr)
+	{
+		mgr->moderateVoiceOtherParticipants(excluded_avatar_id, unmute);
+	}
 }
 
 bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata)
@@ -492,9 +545,35 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD&
 	else
 		if (item == "can_allow_text_chat" || "can_moderate_voice" == item)
 		{
-			LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mParent.mSpeakerMgr->getSessionID());
-			return im_session->mType == IM_SESSION_GROUP_START && mParent.mSpeakerMgr->findSpeaker(gAgentID)->mIsModerator;
+			return isGroupModerator();
+		}
+	else if (item == std::string("can_add"))
+		{
+			// We can add friends if:
+			// - there are selected people
+			// - and there are no friends among selection yet.
+
+			bool result = (mUUIDs.size() > 0);
+
+			std::vector<LLUUID>::const_iterator
+				id = mUUIDs.begin(),
+				uuids_end = mUUIDs.end();
+
+			for (;id != uuids_end; ++id)
+			{
+				if ( LLAvatarActions::isFriend(*id) )
+				{
+					result = false;
+					break;
+				}
+			}
+			return result;
 		}
+	else if (item == "can_call")
+	{
+		return LLVoiceClient::voiceEnabled();
+	}
+
 	return true;
 }
 
@@ -502,17 +581,26 @@ bool LLParticipantList::LLParticipantListMenu::checkContextMenuItem(const LLSD&
 {
 	std::string item = userdata.asString();
 	const LLUUID& id = mUUIDs.front();
+
 	if (item == "is_muted")
-		return LLMuteList::getInstance()->isMuted(id, LLMute::flagTextChat); 
-	else
-		if (item == "is_allowed_text_chat")
-		{
-			LLPointer<LLSpeaker> selected_speakerp = mParent.mSpeakerMgr->findSpeaker(id);
+	{
+		return LLMuteList::getInstance()->isMuted(id, LLMute::flagTextChat);
+	}
+	else if (item == "is_allowed_text_chat")
+	{
+		LLPointer<LLSpeaker> selected_speakerp = mParent.mSpeakerMgr->findSpeaker(id);
 
-			if (selected_speakerp.notNull())
-			{
-				return !selected_speakerp->mModeratorMutedText;
-			}
+		if (selected_speakerp.notNull())
+		{
+			return !selected_speakerp->mModeratorMutedText;
 		}
+	}
+	else if(item == "is_blocked")
+	{
+		return LLMuteList::getInstance()->isMuted(id, LLMute::flagVoiceChat);
+	}
+
 	return false;
 }
+
+//EOF
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index 83191a5b8d0b682dd673b821a399bc5728c89574..bc6c6c2b502eae4f1d166128adbffea3ce2632d0 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -52,10 +52,16 @@ class LLParticipantList
 		} EParticipantSortOrder;
 
 		/**
-		  * Set and sort Avatarlist by given order
-		  */
+		 * Set and sort Avatarlist by given order
+		 */
 		void setSortOrder(EParticipantSortOrder order = E_SORT_BY_NAME);
 
+		/**
+		 * Refreshes participants to display ones not in voice as disabled.
+		 * TODO: mantipov: probably should be moved into derived class for LLFloaterCall
+		 */
+		void refreshVoiceState();
+
 	protected:
 		/**
 		 * LLSpeakerMgr event handlers
@@ -64,6 +70,7 @@ class LLParticipantList
 		bool onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
 		bool onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
 		bool onModeratorUpdateEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+		bool onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
 
 		/**
 		 * Sorts the Avatarlist by stored order
@@ -109,6 +116,14 @@ class LLParticipantList
 			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
 		};
 		
+		class SpeakerMuteListener : public BaseSpeakerListner
+		{
+		public:
+			SpeakerMuteListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
+
+			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+		};
+
 		/**
 		 * Menu used in the participant list.
 		 */
@@ -129,9 +144,55 @@ class LLParticipantList
 			void toggleMuteText(const LLSD& userdata);
 			void toggleMuteVoice(const LLSD& userdata);
 		
+			/**
+			 * Return true if Agent is group moderator(and moderator of group call).
+			 */
+			bool isGroupModerator();
+
 			// Voice moderation support
+			/**
+			 * Check whether specified by argument avatar is muted for group chat or not.
+			 */
+			bool isMuted(const LLUUID& avatar_id);
+
+			/**
+			 * Processes Voice moderation menu items.
+			 *
+			 * It calls either moderateVoiceParticipant() or moderateVoiceParticipant() depend on
+			 * passed parameter.
+			 *
+			 * @param userdata can be "selected" or "others".
+			 *
+			 * @see moderateVoiceParticipant()
+			 * @see moderateVoiceOtherParticipants()
+			 */
 			void moderateVoice(const LLSD& userdata);
-			void moderateVoiceOtherParticipants(const LLSD& userdata);
+
+			/**
+			 * Mutes/Unmutes avatar for current group voice chat.
+			 *
+			 * It only marks avatar as muted for session and does not use local Agent's Block list.
+			 * It does not mute Agent itself.
+			 *
+			 * @param[in] avatar_id UUID of avatar to be processed
+			 * @param[in] unmute if true - specified avatar will be muted, otherwise - unmuted.
+			 *
+			 * @see moderateVoiceOtherParticipants()
+			 */
+			void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
+
+			/**
+			 * Mutes/Unmutes all avatars except specified for current group voice chat.
+			 *
+			 * It only marks avatars as muted for session and does not use local Agent's Block list.
+			 * It based call moderateVoiceParticipant() for each avatar should be muted/unmuted.
+			 *
+			 * @param[in] excluded_avatar_id UUID of avatar NOT to be processed
+			 * @param[in] unmute if true - avatars will be muted, otherwise - unmuted.
+			 *
+			 * @see moderateVoiceParticipant()
+			 */
+			void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute);
 		};
 
 	private:
@@ -140,8 +201,18 @@ class LLParticipantList
 
 		/**
 		 * Adds specified avatar ID to the existing list if it is not Agent's ID
+		 *
+		 * @param[in, out] existing_list - vector with avatars' UUIDs already in the list
+		 * @param[in] avatar_id - Avatar UUID to be added into the list
+		 */
+		void addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id);
+
+		/**
+		 * Adjusts passed participant to work properly.
+		 *
+		 * Adds SpeakerMuteListener to process moderation actions.
 		 */
-		static void addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id);
+		void adjustParticipant(const LLUUID& speaker_id);
 
 		LLSpeakerMgr*		mSpeakerMgr;
 		LLAvatarList*		mAvatarList;
@@ -153,6 +224,7 @@ class LLParticipantList
 		LLPointer<SpeakerRemoveListener>			mSpeakerRemoveListener;
 		LLPointer<SpeakerClearListener>				mSpeakerClearListener;
 		LLPointer<SpeakerModeratorUpdateListener>	mSpeakerModeratorListener;
+		LLPointer<SpeakerMuteListener>				mSpeakerMuteListener;
 
 		LLParticipantListMenu*    mParticipantListMenu;
 
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 30cb21c83ccfe0847277a251a412895f5269ceeb..f1891aa421ac2f4648f3da3d004834d744881889 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -59,7 +59,6 @@
 #include "llinventorymodel.h"
 #include "llkeyboard.h"
 #include "lllineeditor.h"
-#include "llnotify.h"
 #include "llradiogroup.h"
 #include "llscrolllistctrl.h"
 #include "llscrolllistitem.h"
diff --git a/indra/newview/llpreviewgesture.h b/indra/newview/llpreviewgesture.h
index 9d2653945371063c2ff1ae22422fc8c36a8214c6..19fa1dcc37bec737cffa9e66dd3754ebf129c0df 100644
--- a/indra/newview/llpreviewgesture.h
+++ b/indra/newview/llpreviewgesture.h
@@ -33,8 +33,9 @@
 #ifndef LL_LLPREVIEWGESTURE_H
 #define LL_LLPREVIEWGESTURE_H
 
-#include "llpreview.h"
+#include "llassettype.h"
 #include "llmultigesture.h"
+#include "llpreview.h"
 
 class LLMultiGesture;
 class LLLineEditor;
@@ -46,6 +47,7 @@ class LLScrollListItem;
 class LLButton;
 class LLGestureStep;
 class LLRadioGroup;
+class LLVFS;
 
 class LLPreviewGesture : public LLPreview
 {
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index 5d675fcda66b57fec9de9428943decc70cce828f..95756ac5f3d849019f08fe1c121b122f4819b7ac 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -44,7 +44,6 @@
 #include "llinventorymodel.h"
 #include "lllineeditor.h"
 #include "llnotificationsutil.h"
-#include "llnotify.h"
 #include "llresmgr.h"
 #include "roles_constants.h"
 #include "llscrollbar.h"
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 8d8031076909abe9e07e43e3c59f684d712a0d8d..646c9fb6a4ca5dc6d46bb664ff915cd0aedbfb2c 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -61,7 +61,6 @@
 #include "llvfile.h"
 
 #include "llagent.h"
-#include "llnotify.h"
 #include "llmenugl.h"
 #include "roles_constants.h"
 #include "llselectmgr.h"
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index 28a409d3ee8063a9ca7cf3401cca628358cc4df3..9d194c5557eb0db56bd37398244dac369a90c164 100644
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -51,6 +51,7 @@ struct 	LLEntryAndEdCore;
 class LLMenuBarGL;
 class LLFloaterScriptSearch;
 class LLKeywordToken;
+class LLVFS;
 class LLViewerInventoryItem;
 
 // Inner, implementation class.  LLPreviewScript and LLLiveLSLEditor each own one of these.
diff --git a/indra/newview/llremoteparcelrequest.h b/indra/newview/llremoteparcelrequest.h
index 3a16e25ef619cc136c8579443698c1f6622056cb..c04f6b1858f8dd6b2ef05e91225461748daba0e8 100644
--- a/indra/newview/llremoteparcelrequest.h
+++ b/indra/newview/llremoteparcelrequest.h
@@ -38,6 +38,7 @@
 #include "llhttpclient.h"
 #include "llpanel.h"
 
+class LLMessageSystem;
 class LLRemoteParcelInfoObserver;
 
 class LLRemoteParcelRequestResponder : public LLHTTPClient::Responder
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index f66f725070a68199dc1877d773ebb8adc4c04fe9..bd256ec9c28c83a8dbdb83033ab0253ea237e2f8 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -151,21 +151,49 @@ LLScreenChannel::~LLScreenChannel()
 	
 }
 
+std::list<LLToast*> LLScreenChannel::findToasts(const Matcher& matcher)
+{
+	std::list<LLToast*> res;
+
+	// collect stored toasts
+	for (std::vector<ToastElem>::iterator it = mStoredToastList.begin(); it
+			!= mStoredToastList.end(); it++)
+	{
+		if (matcher.matches(it->toast->getNotification()))
+		{
+			res.push_back(it->toast);
+		}
+	}
+
+	// collect displayed toasts
+	for (std::vector<ToastElem>::iterator it = mToastList.begin(); it
+			!= mToastList.end(); it++)
+	{
+		if (matcher.matches(it->toast->getNotification()))
+		{
+			res.push_back(it->toast);
+		}
+	}
+
+	return res;
+}
+
 //--------------------------------------------------------------------------
 void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
 {
 	S32 right_delta = old_world_rect.mRight - new_world_rect.mRight;
 	LLRect this_rect = getRect();
 
-	this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio());
 	switch(mChannelAlignment)
 	{
 	case CA_LEFT :
+		this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio());
 		break;
 	case CA_CENTRE :
-		this_rect.setCenterAndSize(new_world_rect.getWidth() / 2, new_world_rect.getHeight() / 2, this_rect.getWidth(), this_rect.getHeight());
-		break;
+		LLScreenChannelBase::updatePositionAndSize(old_world_rect, new_world_rect);
+		return;
 	case CA_RIGHT :
+		this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio());
 		this_rect.mLeft -= right_delta;
 		this_rect.mRight -= right_delta;
 	}
@@ -375,6 +403,16 @@ void LLScreenChannel::killToastByNotificationID(LLUUID id)
 	}
 }
 
+void LLScreenChannel::killMatchedToasts(const Matcher& matcher)
+{
+	std::list<LLToast*> to_delete = findToasts(matcher);
+	for (std::list<LLToast*>::iterator it = to_delete.begin(); it
+			!= to_delete.end(); it++)
+	{
+		killToastByNotificationID((*it)-> getNotificationID());
+	}
+}
+
 //--------------------------------------------------------------------------
 void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)
 {
@@ -776,17 +814,19 @@ void LLScreenChannel::updateShowToastsState()
 		return;
 	}
 
-	// *TODO: mantipov: what we have to do with derived classes: LLNotificationWellWindow & LLIMWelWindow?
-	// See EXT-3081 for details
 	// for Message Well floater showed in a docked state - adjust channel's height
-	if(dynamic_cast<LLSysWellWindow*>(floater) || dynamic_cast<LLIMFloater*>(floater))
+	if(dynamic_cast<LLSysWellWindow*>(floater) || dynamic_cast<LLIMFloater*>(floater)
+		|| dynamic_cast<LLScriptFloater*>(floater))
 	{
 		S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");;
 		LLRect this_rect = getRect();
 		if(floater->getVisible() && floater->isDocked())
 		{
 			channel_bottom += floater->getRect().getHeight();
-			channel_bottom += floater->getDockControl()->getTongueHeight();
+			if(floater->getDockControl())
+			{
+				channel_bottom += floater->getDockControl()->getTongueHeight();
+			}
 		}
 
 		if(channel_bottom != this_rect.mBottom)
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index b8efbb148f1478ab49e9fcf445df348f1e6347d5..321fb244a1bdf209a8a7376c5e65689674d283eb 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -151,6 +151,16 @@ public:
 	LLScreenChannel(LLUUID& id);
 	virtual ~LLScreenChannel();
 
+	class Matcher
+	{
+	public:
+		Matcher(){}
+		virtual ~Matcher() {}
+		virtual bool matches(const LLNotificationPtr) const = 0;
+	};
+
+	std::list<LLToast*> findToasts(const Matcher& matcher);
+
 	// Channel's outfit-functions
 	// update channel's size and position in the World View
 	void		updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect);
@@ -162,6 +172,7 @@ public:
 	void		addToast(const LLToast::Params& p);
 	// kill or modify a toast by its ID
 	void		killToastByNotificationID(LLUUID id);
+	void		killMatchedToasts(const Matcher& matcher);
 	void		modifyToastByNotificationID(LLUUID id, LLPanel* panel);
 	// hide all toasts from screen, but not remove them from a channel
 	void		hideToastsFromScreen();
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 5c4f6e88603c9e0cc26624e54a03af284b8bfd5a..1962d871a6bdc0d5795b112bfef00e9d5a7e7a21 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -66,6 +66,7 @@ LLScriptFloater::LLScriptFloater(const LLSD& key)
 : LLDockableFloater(NULL, true, key)
 , mScriptForm(NULL)
 {
+	setMouseDownCallback(boost::bind(&LLScriptFloater::onMouseDown, this));
 }
 
 bool LLScriptFloater::toggle(const LLUUID& object_id)
@@ -180,6 +181,23 @@ void LLScriptFloater::setVisible(BOOL visible)
 	hideToastsIfNeeded();
 }
 
+void LLScriptFloater::onMouseDown()
+{
+	if(getObjectId().notNull())
+	{
+		// Remove new message icon
+		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getObjectId());
+		if (chiclet == NULL)
+		{
+			llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
+		}
+		else
+		{
+			chiclet->setShowNewMessagesIcon(false);
+		}
+	}
+}
+
 void LLScriptFloater::hideToastsIfNeeded()
 {
 	using namespace LLNotificationsUI;
@@ -191,6 +209,7 @@ void LLScriptFloater::hideToastsIfNeeded()
 	if(channel)
 	{
 		channel->updateShowToastsState();
+		channel->redrawToasts();
 	}
 }
 
@@ -217,11 +236,18 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
 	script_notification_map_t::iterator it = mNotifications.find(object_id);
 	if(it != mNotifications.end())
 	{
+		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(object_id);
+		if(chiclet)
+		{
+			// Pass the new_message icon state further.
+			set_new_message = chiclet->getShowNewMessagesIcon();
+		}
+
 		LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", it->second.notification_id);
 		if(floater)
 		{
-			// Generate chiclet with a "new message" indicator if a docked window was opened. See EXT-3142.
-			set_new_message = floater->isShown();
+			// Generate chiclet with a "new message" indicator if a docked window was opened but not in focus. See EXT-3142.
+			set_new_message |= !floater->hasFocus();
 		}
 
 		onRemoveNotification(it->second.notification_id);
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index 95ec5a4d9cda0089720aeb48858bd674d1c5f92d..ed10dc5fe9402416ba3ef7c35aab9f7b55bcd232 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -169,6 +169,11 @@ protected:
 	 */
 	static void hideToastsIfNeeded();
 
+	/**
+	 * Removes chiclets new messages icon
+	 */
+	void onMouseDown();
+
 private:
 	LLToastNotifyPanel* mScriptForm;
 	LLUUID mObjectId;
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 77048f0d8af36fc241089967de320b2f6f4a3577..852f58e354430cc2620fc2f1d5b6817f6ce14751 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -2276,6 +2276,26 @@ BOOL LLSelectMgr::selectGetAllValid()
 	return TRUE;
 }
 
+//-----------------------------------------------------------------------------
+// selectGetAllValidAndObjectsFound() - return TRUE if selections are
+// valid and objects are found.
+//
+// For EXT-3114 - same as selectGetModify() without the modify check.
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetAllValidAndObjectsFound()
+{
+	for (LLObjectSelection::iterator iter = getSelection()->begin();
+		 iter != getSelection()->end(); iter++ )
+	{
+		LLSelectNode* node = *iter;
+		LLViewerObject* object = node->getObject();
+		if( !object || !node->mValid )
+		{
+			return FALSE;
+		}
+	}
+	return TRUE;
+}
 
 //-----------------------------------------------------------------------------
 // selectGetModify() - return TRUE if current agent can modify all
@@ -3493,7 +3513,7 @@ void LLSelectMgr::deselectAllIfTooFar()
 
 	// HACK: Don't deselect when we're navigating to rate an object's
 	// owner or creator.  JC
-	if (gPieObject->getVisible() || gPieRate->getVisible() )
+	if (gMenuObject->getVisible())
 	{
 		return;
 	}
@@ -5571,11 +5591,15 @@ void dialog_refresh_all()
 
 	gFloaterTools->dirty();
 
-	gPieObject->needsArrange();
+	gMenuObject->needsArrange();
 
-	if( gPieAttachment->getVisible() )
+	if( gMenuAttachmentSelf->getVisible() )
+	{
+		gMenuAttachmentSelf->arrange();
+	}
+	if( gMenuAttachmentOther->getVisible() )
 	{
-		gPieAttachment->arrange();
+		gMenuAttachmentOther->arrange();
 	}
 
 	LLFloaterProperties::dirtyAll();
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 2d377f1ec02262819917a575a896afdd1494ed5d..f7ce3f72aab6a5295204ad5b9a3b100c39d1a159 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -536,6 +536,7 @@ public:
 	// Returns TRUE if the viewer has information on all selected objects
 	BOOL selectGetAllRootsValid();
 	BOOL selectGetAllValid();
+	BOOL selectGetAllValidAndObjectsFound();
 
 	// returns TRUE if you can modify all selected objects. 
 	BOOL selectGetRootsModify();
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index eb3695a3719a75487fa2921532e50bffab7dc3d2..30b0075c4b24c62a8f0d38d69cf42d7347f732e4 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -113,9 +113,6 @@ BOOL LLSidepanelAppearance::postBuild()
 	mEditAppearanceBtn = getChild<LLButton>("editappearance_btn");
 	mEditAppearanceBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditAppearanceButtonClicked, this));
 
-	mWearBtn = getChild<LLButton>("wear_btn");
-	mWearBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onWearButtonClicked, this));
-
 	mEditBtn = getChild<LLButton>("edit_btn");
 	mEditBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditButtonClicked, this));
 
@@ -199,14 +196,6 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string)
 	}
 }
 
-void LLSidepanelAppearance::onWearButtonClicked()
-{
-	if (!mLookInfo->getVisible())
-	{
-		mPanelOutfitsInventory->onWear();
-	}
-}
-
 void LLSidepanelAppearance::onOpenOutfitButtonClicked()
 {
 	const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getCurrentOutfitLink();
@@ -284,7 +273,6 @@ void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible)
 	mLookInfo->setVisible(visible);
 	mPanelOutfitsInventory->setVisible(!visible);
 	mFilterEditor->setVisible(!visible);
-	mWearBtn->setVisible(!visible);
 	mEditBtn->setVisible(!visible);
 	mNewOutfitBtn->setVisible(!visible);
 	mCurrOutfitPanel->setVisible(!visible);
@@ -314,12 +302,10 @@ void LLSidepanelAppearance::updateVerbs()
 	{
 		const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL);
 		mEditBtn->setEnabled(is_correct_type);
-		mWearBtn->setEnabled(is_correct_type);
 	}
 	else
 	{
 		mEditBtn->setEnabled(FALSE);
-		mWearBtn->setEnabled(FALSE);
 	}
 }
 
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index 9c870f631a9fad7aa0f766d156928e9f29cc3aee..8ef2088edadc6bf6af0666918edd6b9519f3b951 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -67,7 +67,6 @@ private:
 
 	void onOpenOutfitButtonClicked();
 	void onEditAppearanceButtonClicked();
-	void onWearButtonClicked();
 	void onEditButtonClicked();
 	void onNewOutfitButtonClicked();
 	void onBackButtonClicked();
@@ -82,7 +81,6 @@ private:
 
 	LLButton*					mOpenOutfitBtn;
 	LLButton*					mEditAppearanceBtn;
-	LLButton*					mWearBtn;
 	LLButton*					mEditBtn;
 	LLButton*					mNewOutfitBtn;
 	LLPanel*					mCurrOutfitPanel;
diff --git a/indra/newview/llsidepanelinventorysubpanel.cpp b/indra/newview/llsidepanelinventorysubpanel.cpp
index 793904faa8c4aad20390e66c400fb464e0038010..56e342c3ceabf16a097fe87d8d35c85d23bf9d93 100644
--- a/indra/newview/llsidepanelinventorysubpanel.cpp
+++ b/indra/newview/llsidepanelinventorysubpanel.cpp
@@ -95,7 +95,9 @@ void LLSidepanelInventorySubpanel::setIsEditing(BOOL edit)
 
 BOOL LLSidepanelInventorySubpanel::getIsEditing() const
 {
-	return mIsEditing;
+
+	return TRUE; // Default everything to edit mode since we're not using an edit button anymore.
+	// return mIsEditing;
 }
 
 void LLSidepanelInventorySubpanel::reset()
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 25518d87d6e4f31ea0d073c28d1cbc8e9c4c165b..1965e634b6b213ecee4808196eb9518b1715b09e 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -172,7 +172,7 @@ void LLSidepanelItemInfo::refresh()
 		}
 	}
 
-	if (!getIsEditing())
+	if (!getIsEditing() || !item)
 	{
 		const std::string no_item_names[]={
 			"LabelItemName",
@@ -261,18 +261,6 @@ void LLSidepanelItemInfo::refreshFromItem(LLInventoryItem* item)
 											   GP_OBJECT_MANIPULATE)
 		&& is_obj_modify && is_complete;
 
-	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
-	bool item_in_trash = item->getUUID() == trash_id || gInventory.isObjectDescendentOf(item->getUUID(), trash_id);
-
-	if (is_modifiable && !item_in_trash)
-	{
-		setIsEditing(TRUE);
-	}
-	else
-	{
-		setIsEditing(FALSE);
-	}
-
 	childSetEnabled("LabelItemNameTitle",TRUE);
 	childSetEnabled("LabelItemName",is_modifiable && !is_calling_card); // for now, don't allow rename of calling cards
 	childSetText("LabelItemName",item->getName());
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 2c40e948de7182e708740dc6dc3af2c14fdc130c..50cec3184d38b66ac803d7f4f74c06223a8e6954 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -101,13 +101,25 @@ BOOL LLSidepanelTaskInfo::postBuild()
 	mBuyBtn = getChild<LLButton>("buy_btn");
 	mBuyBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onBuyButtonClicked, this));
 
-	childSetPrevalidate("Object Name",LLLineEditor::prevalidateASCIIPrintableNoPipe);
-	childSetPrevalidate("Object Description",LLLineEditor::prevalidateASCIIPrintableNoPipe);
-
 	mLabelGroupName = getChild<LLNameBox>("Group Name Proxy");
 
-	childSetCommitCallback("checkbox for sale",onClickForSale,this);
-
+	childSetCommitCallback("Object Name",						LLSidepanelTaskInfo::onCommitName,this);
+	childSetPrevalidate("Object Name",							LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetCommitCallback("Object Description",				LLSidepanelTaskInfo::onCommitDesc,this);
+	childSetPrevalidate("Object Description",					LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this));
+	childSetCommitCallback("checkbox share with group",			&LLSidepanelTaskInfo::onCommitGroupShare,this);
+	childSetAction("button deed",								&LLSidepanelTaskInfo::onClickDeedToGroup,this);
+	childSetCommitCallback("checkbox allow everyone move",		&LLSidepanelTaskInfo::onCommitEveryoneMove,this);
+	childSetCommitCallback("checkbox allow everyone copy",		&LLSidepanelTaskInfo::onCommitEveryoneCopy,this);
+	childSetCommitCallback("checkbox for sale",					&LLSidepanelTaskInfo::onCommitSaleInfo,this);
+	childSetCommitCallback("sale type",							&LLSidepanelTaskInfo::onCommitSaleType,this);
+	childSetCommitCallback("Edit Cost", 						&LLSidepanelTaskInfo::onCommitSaleInfo, this);
+	childSetCommitCallback("checkbox next owner can modify",	&LLSidepanelTaskInfo::onCommitNextOwnerModify,this);
+	childSetCommitCallback("checkbox next owner can copy",		&LLSidepanelTaskInfo::onCommitNextOwnerCopy,this);
+	childSetCommitCallback("checkbox next owner can transfer",	&LLSidepanelTaskInfo::onCommitNextOwnerTransfer,this);
+	childSetCommitCallback("clickaction",						&LLSidepanelTaskInfo::onCommitClickAction,this);
+	childSetCommitCallback("search_check",						&LLSidepanelTaskInfo::onCommitIncludeInSearch,this);
 	return TRUE;
 }
 
@@ -860,7 +872,7 @@ static bool callback_deed_to_group(const LLSD& notification, const LLSD& respons
 	return FALSE;
 }
 
-void LLSidepanelTaskInfo::onClickDeedToGroup()
+void LLSidepanelTaskInfo::onClickDeedToGroup(void *data)
 {
 	LLNotificationsUtil::add("DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group);
 }
@@ -869,121 +881,149 @@ void LLSidepanelTaskInfo::onClickDeedToGroup()
 /// Permissions checkboxes
 ///----------------------------------------------------------------------------
 
-void LLSidepanelTaskInfo::onCommitPerm(LLCheckBoxCtrl *ctrl, U8 field, U32 perm)
+// static
+void LLSidepanelTaskInfo::onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm)
 {
-	const LLViewerObject* object = mObjectSelection->getFirstRootObject();
-	if (!object) return;
+	LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject();
+	if(!object) return;
 
-	BOOL new_state = ctrl->get();
+	// Checkbox will have toggled itself
+	// LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+	LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
+	BOOL new_state = check->get();
+	
 	LLSelectMgr::getInstance()->selectionSetObjectPermissions(field, new_state, perm);
 }
 
-void LLSidepanelTaskInfo::onCommitGroupShare()
+// static
+void LLSidepanelTaskInfo::onCommitGroupShare(LLUICtrl *ctrl, void *data)
 {
-	LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox share with group");
-	onCommitPerm(ctrl, PERM_GROUP, PERM_MODIFY | PERM_MOVE | PERM_COPY);
+	onCommitPerm(ctrl, data, PERM_GROUP, PERM_MODIFY | PERM_MOVE | PERM_COPY);
 }
 
-void LLSidepanelTaskInfo::onCommitEveryoneMove()
+// static
+void LLSidepanelTaskInfo::onCommitEveryoneMove(LLUICtrl *ctrl, void *data)
 {
-	LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox allow everyone move");
-	onCommitPerm(ctrl, PERM_EVERYONE, PERM_MOVE);
+	onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_MOVE);
 }
 
 
-void LLSidepanelTaskInfo::onCommitEveryoneCopy()
+// static
+void LLSidepanelTaskInfo::onCommitEveryoneCopy(LLUICtrl *ctrl, void *data)
 {
-	LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox allow everyone copy");
-	onCommitPerm(ctrl, PERM_EVERYONE, PERM_COPY);
+	onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_COPY);
 }
 
-void LLSidepanelTaskInfo::onCommitNextOwnerModify()
+// static
+void LLSidepanelTaskInfo::onCommitNextOwnerModify(LLUICtrl* ctrl, void* data)
 {
-	LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox next owner can modify");
-	onCommitPerm(ctrl, PERM_NEXT_OWNER, PERM_MODIFY);
+	//llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerModify" << llendl;
+	onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_MODIFY);
 }
 
-void LLSidepanelTaskInfo::onCommitNextOwnerCopy()
+// static
+void LLSidepanelTaskInfo::onCommitNextOwnerCopy(LLUICtrl* ctrl, void* data)
 {
-	LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox next owner can copy");
-	onCommitPerm(ctrl, PERM_NEXT_OWNER, PERM_COPY);
+	//llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerCopy" << llendl;
+	onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_COPY);
 }
 
-void LLSidepanelTaskInfo::onCommitNextOwnerTransfer()
+// static
+void LLSidepanelTaskInfo::onCommitNextOwnerTransfer(LLUICtrl* ctrl, void* data)
 {
-	LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox next owner can transfer");
-	onCommitPerm(ctrl, PERM_NEXT_OWNER, PERM_TRANSFER);
+	//llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerTransfer" << llendl;
+	onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_TRANSFER);
 }
 
-void LLSidepanelTaskInfo::onCommitName()
+// static
+void LLSidepanelTaskInfo::onCommitName(LLUICtrl*, void* data)
 {
-	LLLineEditor* tb = getChild<LLLineEditor>("Object Name");
-	LLSelectMgr::getInstance()->selectionSetObjectName(tb->getText());
+	//llinfos << "LLSidepanelTaskInfo::onCommitName()" << llendl;
+	LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+	LLLineEditor*	tb = self->getChild<LLLineEditor>("Object Name");
+	if(tb)
+	{
+		LLSelectMgr::getInstance()->selectionSetObjectName(tb->getText());
+//		LLSelectMgr::getInstance()->selectionSetObjectName(self->mLabelObjectName->getText());
+	}
 }
 
-void LLSidepanelTaskInfo::onCommitDesc()
+
+// static
+void LLSidepanelTaskInfo::onCommitDesc(LLUICtrl*, void* data)
 {
-	LLLineEditor* le = getChild<LLLineEditor>("Object Description");
-	LLSelectMgr::getInstance()->selectionSetObjectDescription(le->getText());
+	//llinfos << "LLSidepanelTaskInfo::onCommitDesc()" << llendl;
+	LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+	LLLineEditor*	le = self->getChild<LLLineEditor>("Object Description");
+	if(le)
+	{
+		LLSelectMgr::getInstance()->selectionSetObjectDescription(le->getText());
+	}
 }
 
-void LLSidepanelTaskInfo::onCommitSaleInfo()
+// static
+void LLSidepanelTaskInfo::onCommitSaleInfo(LLUICtrl*, void* data)
 {
-	setAllSaleInfo();
+	LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+	self->setAllSaleInfo();
 }
 
-void LLSidepanelTaskInfo::onCommitSaleType()
+// static
+void LLSidepanelTaskInfo::onCommitSaleType(LLUICtrl*, void* data)
 {
-	setAllSaleInfo();
+	LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+	self->setAllSaleInfo();
 }
 
+
 void LLSidepanelTaskInfo::setAllSaleInfo()
 {
-	llinfos << "LLSidepanelTaskInfo::setAllSaleInfo()" << llendl;
-
 	LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_NOT;
+
 	LLCheckBoxCtrl *checkPurchase = getChild<LLCheckBoxCtrl>("checkbox for sale");
+	
 	// Set the sale type if the object(s) are for sale.
-	if (checkPurchase && checkPurchase->get())
+	if(checkPurchase && checkPurchase->get())
 	{
 		sale_type = static_cast<LLSaleInfo::EForSale>(getChild<LLComboBox>("sale type")->getValue().asInteger());
 	}
 
 	S32 price = -1;
-	const LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost");
+	
+	LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost");
 	price = (edit_price->getTentative()) ? DEFAULT_PRICE : edit_price->getValue().asInteger();
+
 	// If somehow an invalid price, turn the sale off.
 	if (price < 0)
 		sale_type = LLSaleInfo::FS_NOT;
-	LLSaleInfo sale_info(sale_type, price);
-	LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(sale_info);
 
-	// If turned off for-sale, make sure click-action buy is turned
-	// off as well
-	if (sale_type == LLSaleInfo::FS_NOT)
-	{
-		U8 click_action = 0;
-		LLSelectMgr::getInstance()->selectionGetClickAction(&click_action);
-		if (click_action == CLICK_ACTION_BUY)
-		{
-			LLSelectMgr::getInstance()->selectionSetClickAction(CLICK_ACTION_TOUCH);
-		}
-	}
-}
+	LLSaleInfo old_sale_info;
+	LLSelectMgr::getInstance()->selectGetSaleInfo(old_sale_info);
 
-// static
-void LLSidepanelTaskInfo::onClickForSale(LLUICtrl* ctrl, void* data)
-{
-	LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
-	self->updateUIFromSaleInfo();
-}
+	LLSaleInfo new_sale_info(sale_type, price);
+	LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(new_sale_info);
+	
+	U8 old_click_action = 0;
+	LLSelectMgr::getInstance()->selectionGetClickAction(&old_click_action);
 
-void LLSidepanelTaskInfo::updateUIFromSaleInfo()
-{
-	/* 
-	   TODO: Update sale button enable/disable state and default 
-	   sale button settings when this sale button is enabled/disabled.
-	*/
+	if (old_sale_info.isForSale()
+		&& !new_sale_info.isForSale()
+		&& old_click_action == CLICK_ACTION_BUY)
+	{
+		// If turned off for-sale, make sure click-action buy is turned
+		// off as well
+		LLSelectMgr::getInstance()->
+			selectionSetClickAction(CLICK_ACTION_TOUCH);
+	}
+	else if (new_sale_info.isForSale()
+		&& !old_sale_info.isForSale()
+		&& old_click_action == CLICK_ACTION_TOUCH)
+	{
+		// If just turning on for-sale, preemptively turn on one-click buy
+		// unless user have a different click action set
+		LLSelectMgr::getInstance()->
+			selectionSetClickAction(CLICK_ACTION_BUY);
+	}
 }
 
 struct LLSelectionPayable : public LLSelectedObjectFunctor
@@ -997,8 +1037,35 @@ struct LLSelectionPayable : public LLSelectedObjectFunctor
 	}
 };
 
+static U8 string_value_to_click_action(std::string p_value)
+{
+	if (p_value == "Touch")
+		return CLICK_ACTION_TOUCH;
+	if (p_value == "Sit")
+		return CLICK_ACTION_SIT;
+	if (p_value == "Buy")
+		return CLICK_ACTION_BUY;
+	if (p_value == "Pay")
+		return CLICK_ACTION_PAY;
+	if (p_value == "Open")
+		return CLICK_ACTION_OPEN;
+	if (p_value == "Zoom")
+		return CLICK_ACTION_ZOOM;
+	return CLICK_ACTION_TOUCH;
+}
+
+// static
+void LLSidepanelTaskInfo::onCommitClickAction(LLUICtrl* ctrl, void*)
+{
+	LLComboBox* box = (LLComboBox*)ctrl;
+	if (!box) return;
+	std::string value = box->getValue().asString();
+	U8 click_action = string_value_to_click_action(value);
+	doClickAction(click_action);
+}
+
 // static
-void LLSidepanelTaskInfo::onCommitClickAction(U8 click_action)
+void LLSidepanelTaskInfo::doClickAction(U8 click_action)
 {
 	if (click_action == CLICK_ACTION_BUY)
 	{
@@ -1020,7 +1087,7 @@ void LLSidepanelTaskInfo::onCommitClickAction(U8 click_action)
 	{
 		// Verify object has script with money() handler
 		LLSelectionPayable payable;
-		const BOOL can_pay = mObjectSelection->applyToObjects(&payable);
+		bool can_pay = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&payable);
 		if (!can_pay)
 		{
 			// Warn, but do it anyway.
@@ -1031,10 +1098,11 @@ void LLSidepanelTaskInfo::onCommitClickAction(U8 click_action)
 }
 
 // static
-void LLSidepanelTaskInfo::onCommitIncludeInSearch()
+void LLSidepanelTaskInfo::onCommitIncludeInSearch(LLUICtrl* ctrl, void* data)
 {
-	LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("search_check");
-	LLSelectMgr::getInstance()->selectionSetIncludeInSearch(ctrl->get());
+	LLCheckBoxCtrl* box = (LLCheckBoxCtrl*)ctrl;
+	llassert(box);
+	LLSelectMgr::getInstance()->selectionSetIncludeInSearch(box->get());
 }
 
 // virtual
@@ -1042,13 +1110,15 @@ void LLSidepanelTaskInfo::updateVerbs()
 {
 	LLSidepanelInventorySubpanel::updateVerbs();
 
+	/*
 	mOpenBtn->setVisible(!getIsEditing());
 	mPayBtn->setVisible(!getIsEditing());
 	mBuyBtn->setVisible(!getIsEditing());
-
-	mOpenBtn->setEnabled(enable_object_open());
 	//const LLViewerObject *obj = getFirstSelectedObject();
 	//mEditBtn->setEnabled(obj && obj->permModify());
+	*/
+
+	mOpenBtn->setEnabled(enable_object_open());
 }
 
 void LLSidepanelTaskInfo::onOpenButtonClicked()
@@ -1061,28 +1131,28 @@ void LLSidepanelTaskInfo::onOpenButtonClicked()
 
 void LLSidepanelTaskInfo::onPayButtonClicked()
 {
-	onCommitClickAction(CLICK_ACTION_PAY);
+	doClickAction(CLICK_ACTION_PAY);
 }
 
 void LLSidepanelTaskInfo::onBuyButtonClicked()
 {
-	onCommitClickAction(CLICK_ACTION_BUY);
+	doClickAction(CLICK_ACTION_BUY);
 }
 
 // virtual
 void LLSidepanelTaskInfo::save()
 {
-	onCommitGroupShare();
-	onCommitEveryoneMove();
-	onCommitEveryoneCopy();
-	onCommitNextOwnerModify();
-	onCommitNextOwnerCopy();
-	onCommitNextOwnerTransfer();
-	onCommitName();
-	onCommitDesc();
-	onCommitSaleInfo();
-	onCommitSaleType();
-	onCommitIncludeInSearch();
+	onCommitGroupShare(getChild<LLCheckBoxCtrl>("checkbox share with group"), this);
+	onCommitEveryoneMove(getChild<LLCheckBoxCtrl>("checkbox allow everyone move"), this);
+	onCommitEveryoneCopy(getChild<LLCheckBoxCtrl>("checkbox allow everyone copy"), this);
+	onCommitNextOwnerModify(getChild<LLCheckBoxCtrl>("checkbox next owner can modify"), this);
+	onCommitNextOwnerCopy(getChild<LLCheckBoxCtrl>("checkbox next owner can copy"), this);
+	onCommitNextOwnerTransfer(getChild<LLCheckBoxCtrl>("checkbox next owner can transfer"), this);
+	onCommitName(getChild<LLLineEditor>("Object Name"), this);
+	onCommitDesc(getChild<LLLineEditor>("Object Description"), this);
+	onCommitSaleInfo(NULL, this);
+	onCommitSaleType(NULL, this);
+	onCommitIncludeInSearch(getChild<LLCheckBoxCtrl>("search_check"), this);
 }
 
 void LLSidepanelTaskInfo::setObjectSelection(LLObjectSelectionHandle selection)
diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h
index 7c6d9983aead7660646f317301b160f934f3863b..cf36c20767b9089ddcea0244fbbc4d5efd642deb 100644
--- a/indra/newview/llsidepaneltaskinfo.h
+++ b/indra/newview/llsidepaneltaskinfo.h
@@ -72,28 +72,30 @@ protected:
 	static void onClickRelease(void*);
 		   void onClickGroup();
 		   void cbGroupID(LLUUID group_id);
+	static void onClickDeedToGroup(void*);
 
-	void onClickDeedToGroup();
-	void onCommitPerm(LLCheckBoxCtrl* ctrl, U8 field, U32 perm);
-	void onCommitGroupShare();
-	void onCommitEveryoneMove();
-	void onCommitEveryoneCopy();
-	void onCommitNextOwnerModify();
-	void onCommitNextOwnerCopy();
-	void onCommitNextOwnerTransfer();
-	void onCommitName();
-	void onCommitDesc();
-	void onCommitSaleInfo();
-	void onCommitSaleType();
-
-	void onCommitClickAction(U8 click_action);
-	void onCommitIncludeInSearch();
+	static void onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm);
 
+	static void onCommitGroupShare(LLUICtrl *ctrl, void *data);
+
+	static void onCommitEveryoneMove(LLUICtrl *ctrl, void *data);
+	static void onCommitEveryoneCopy(LLUICtrl *ctrl, void *data);
+
+	static void onCommitNextOwnerModify(LLUICtrl* ctrl, void* data);
+	static void onCommitNextOwnerCopy(LLUICtrl* ctrl, void* data);
+	static void onCommitNextOwnerTransfer(LLUICtrl* ctrl, void* data);
+	
+	static void onCommitName(LLUICtrl* ctrl, void* data);
+	static void onCommitDesc(LLUICtrl* ctrl, void* data);
+
+	static void onCommitSaleInfo(LLUICtrl* ctrl, void* data);
+	static void onCommitSaleType(LLUICtrl* ctrl, void* data);	
 	void setAllSaleInfo();
 
-	static void onClickForSale(LLUICtrl* ctrl, void *data);
-	void updateUIFromSaleInfo();
+	static void	onCommitClickAction(LLUICtrl* ctrl, void* data);
+	static void onCommitIncludeInSearch(LLUICtrl* ctrl, void*);
 
+	static void	doClickAction(U8 click_action);
 	void disableAll();
 
 private:
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index a1af2e5411a2d807877d9ed230b6102175eada4b..608165022fcf938a81acab1bae6ad16b2c1f5d73 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -354,8 +354,7 @@ LLButton* LLSideTray::createButton	(const std::string& name,const std::string& i
 	button->setLabel(name);
 	button->setClickedCallback(callback);
 
-	if(tooltip!="Home")
-		button->setToolTip(tooltip);
+	button->setToolTip(tooltip);
 	
 	if(image.length())
 	{
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 261bdbcfc05833b57611c03bc3c829583b619562..3861a96355cfe6731089c89c7500e145c2a1f173 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -36,6 +36,7 @@
 
 #include "llagent.h"
 #include "llappviewer.h"
+#include "llimview.h"
 #include "llmutelist.h"
 #include "llsdutil.h"
 #include "lluicolortable.h"
@@ -575,6 +576,143 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
 	}
 }
 
+class ModerationResponder : public LLHTTPClient::Responder
+{
+public:
+	ModerationResponder(const LLUUID& session_id)
+	{
+		mSessionID = session_id;
+	}
+
+	virtual void error(U32 status, const std::string& reason)
+	{
+		llwarns << status << ": " << reason << llendl;
+
+		if ( gIMMgr )
+		{
+			//403 == you're not a mod
+			//should be disabled if you're not a moderator
+			if ( 403 == status )
+			{
+				gIMMgr->showSessionEventError(
+					"mute",
+					"not_a_mod_error",
+					mSessionID);
+			}
+			else
+			{
+				gIMMgr->showSessionEventError(
+					"mute",
+					"generic_request_error",
+					mSessionID);
+			}
+		}
+	}
+
+private:
+	LLUUID mSessionID;
+};
+
+void LLIMSpeakerMgr::toggleAllowTextChat(const LLUUID& speaker_id)
+{
+	std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+	LLSD data;
+	data["method"] = "mute update";
+	data["session-id"] = getSessionID();
+	data["params"] = LLSD::emptyMap();
+	data["params"]["agent_id"] = speaker_id;
+	data["params"]["mute_info"] = LLSD::emptyMap();
+	//current value represents ability to type, so invert
+	data["params"]["mute_info"]["text"] = !findSpeaker(speaker_id)->mModeratorMutedText;
+
+	LLHTTPClient::post(url, data, new ModerationResponder(getSessionID()));
+}
+
+void LLIMSpeakerMgr::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute)
+{
+	if (gAgentID == avatar_id) return; // do not process myself
+
+	LLPointer<LLSpeaker> speakerp = findSpeaker(avatar_id);
+	if (!speakerp) return;
+
+	// *NOTE: mantipov: probably this condition will be incorrect when avatar will be blocked for
+	// text chat via moderation (LLSpeaker::mModeratorMutedText == TRUE)
+	bool is_in_voice = speakerp->mStatus <= LLSpeaker::STATUS_VOICE_ACTIVE || speakerp->mStatus == LLSpeaker::STATUS_MUTED;
+
+	// do not send voice moderation changes for avatars not in voice channel
+	if (!is_in_voice) return;
+
+	std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+	LLSD data;
+	data["method"] = "mute update";
+	data["session-id"] = getSessionID();
+	data["params"] = LLSD::emptyMap();
+	data["params"]["agent_id"] = avatar_id;
+	data["params"]["mute_info"] = LLSD::emptyMap();
+	data["params"]["mute_info"]["voice"] = !unmute;
+
+	LLHTTPClient::post(
+		url,
+		data,
+		new ModerationResponder(getSessionID()));
+}
+
+void LLIMSpeakerMgr::moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute_everyone_else)
+{
+	// *TODO: mantipov: add more intellectual processing of several following requests if it is needed.
+	/*
+		Such situation should be tested:
+		 "Moderator sends the same second request before first response is come"
+		Moderator sends "mute everyone else" for A and then for B
+			two requests to disallow voice chat are sent
+			UUID of B is stored.
+		Then first response (to disallow voice chat) is come
+			request to allow voice for stored avatar (B)
+		Then second response (to disallow voice chat) is come
+			have nothing to do, the latest selected speaker is already enabled
+
+			What can happen?
+		If request to allow voice for stored avatar (B) is processed on server BEFORE 
+		second request to disallow voice chat all speakers will be disabled on voice.
+		But I'm not sure such situation is possible. 
+		See EXT-3431.
+	*/
+
+	mReverseVoiceModeratedAvatarID = excluded_avatar_id;
+	moderateVoiceSession(getSessionID(), !unmute_everyone_else);
+}
+
+void LLIMSpeakerMgr::processSessionUpdate(const LLSD& session_update)
+{
+	if (mReverseVoiceModeratedAvatarID.isNull()) return;
+
+	if (session_update.has("moderated_mode") &&
+		session_update["moderated_mode"].has("voice"))
+	{
+		BOOL voice_moderated = session_update["moderated_mode"]["voice"];
+
+		moderateVoiceParticipant(mReverseVoiceModeratedAvatarID, voice_moderated);
+
+		mReverseVoiceModeratedAvatarID = LLUUID::null;
+	}
+}
+
+void LLIMSpeakerMgr::moderateVoiceSession(const LLUUID& session_id, bool disallow_voice)
+{
+	std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+	LLSD data;
+	data["method"] = "session update";
+	data["session-id"] = session_id;
+	data["params"] = LLSD::emptyMap();
+
+	data["params"]["update_info"] = LLSD::emptyMap();
+
+	data["params"]["update_info"]["moderated_mode"] = LLSD::emptyMap();
+	data["params"]["update_info"]["moderated_mode"]["voice"] = disallow_voice;
+
+	LLHTTPClient::post(url, data, new ModerationResponder(session_id));
+}
+
 
 //
 // LLActiveSpeakerMgr
diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h
index 04046a85878310409689409bcc54d4f3de4609ec..1a8c23f56a222de07168a7d8875da4cb0e7dabe5 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -158,8 +158,43 @@ public:
 	
 	void updateSpeakers(const LLSD& update);
 	void setSpeakers(const LLSD& speakers);
+
+	void toggleAllowTextChat(const LLUUID& speaker_id);
+
+	/**
+	 * Mutes/Unmutes avatar for current group voice chat.
+	 *
+	 * It only marks avatar as muted for session and does not use local Agent's Block list.
+	 * It does not mute Agent itself.
+	 *
+	 * @param[in] avatar_id UUID of avatar to be processed
+	 * @param[in] unmute if false - specified avatar will be muted, otherwise - unmuted.
+	 *
+	 * @see moderateVoiceOtherParticipants()
+	 */
+	void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
+
+	/**
+	 * Mutes/Unmutes all avatars except specified for current group voice chat.
+	 *
+	 * It only marks avatars as muted for session and does not use local Agent's Block list.
+	 * It based call moderateVoiceParticipant() for each avatar should be muted/unmuted.
+	 *
+	 * @param[in] excluded_avatar_id UUID of avatar NOT to be processed
+	 * @param[in] unmute_everyone_else if false - avatars will be muted, otherwise - unmuted.
+	 *
+	 * @see moderateVoiceParticipant()
+	 */
+	void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute_everyone_else);
+
+	void processSessionUpdate(const LLSD& session_update);
+
 protected:
 	virtual void updateSpeakerList();
+
+	void moderateVoiceSession(const LLUUID& session_id, bool disallow_voice);
+
+	LLUUID mReverseVoiceModeratedAvatarID;
 };
 
 class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr>
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 93655eb1f1aeaa742d54ba2f5d2ad23832bb192e..539673ab9e5db2f4c69897c8c2c8f36712102baf 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -121,7 +121,6 @@
 #include "lllogininstance.h" // Host the login module.
 #include "llpanellogin.h"
 #include "llmutelist.h"
-#include "llnotify.h"
 #include "llpanelavatar.h"
 #include "llavatarpropertiesprocessor.h"
 #include "llpanelevent.h"
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 4915720036d7dd89fad49dd10cf624537be2a797..9e724642379f89b9f8d8f85c981ca3e258cabec0 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -50,7 +50,6 @@
 #include "llkeyboard.h"
 #include "lllineeditor.h"
 #include "llmenugl.h"
-#include "llnotify.h"
 #include "llimview.h"
 #include "llsd.h"
 #include "lltextbox.h"
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 1ebf624eeb563f71734aef45e764b723eafc52c2..3769ddb1cc23b1461088e158085d0381956f9cc8 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -32,6 +32,8 @@
 
 #include "llviewerprecompiledheaders.h" // must be first include
 
+#include "llagent.h"
+
 #include "llflatlistview.h"
 #include "llfloaterreg.h"
 #include "llnotifications.h"
@@ -51,6 +53,7 @@
 LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLDockableFloater(NULL, key),
 													mChannel(NULL),
 													mMessageList(NULL),
+													mSysWellChiclet(NULL),
 													mSeparator(NULL),
 													NOTIFICATION_WELL_ANCHOR_NAME("notification_well_panel"),
 													IM_WELL_ANCHOR_NAME("im_well_panel")
@@ -80,6 +83,10 @@ BOOL LLSysWellWindow::postBuild()
 
 	mMessageList->addItem(mSeparator);
 
+	// click on SysWell Window should clear "new message" state (and 'Lit' status). EXT-3147.
+	// mouse up callback is not called in this case.
+	setMouseDownCallback(boost::bind(&LLSysWellWindow::releaseNewMessagesState, this));
+
 	return LLDockableFloater::postBuild();
 }
 
@@ -174,6 +181,11 @@ void LLSysWellWindow::setVisible(BOOL visible)
 		mChannel->updateShowToastsState();
 		mChannel->redrawToasts();
 	}
+
+	if (visible)
+	{
+		releaseNewMessagesState();
+	}
 }
 
 //---------------------------------------------------------------------------------
@@ -227,6 +239,14 @@ void LLSysWellWindow::reshapeWindow()
 	}
 }
 
+void LLSysWellWindow::releaseNewMessagesState()
+{
+	if (NULL != mSysWellChiclet)
+	{
+		mSysWellChiclet->setNewMessagesState(false);
+	}
+}
+
 //---------------------------------------------------------------------------------
 bool LLSysWellWindow::isWindowEmpty()
 {
@@ -246,6 +266,24 @@ void LLSysWellWindow::handleItemAdded(EItemType added_item_type)
 		// refresh list to recalculate mSeparator position
 		mMessageList->reshape(mMessageList->getRect().getWidth(), mMessageList->getRect().getHeight());
 	}
+
+	//fix for EXT-3254
+	//set limits for min_height. 
+	S32 parent_list_delta_height = getRect().getHeight() - mMessageList->getRect().getHeight();
+
+	std::vector<LLPanel*> items;
+	mMessageList->getItems(items);
+
+	if(items.size()>1)//first item is separator
+	{
+		S32 min_height;
+		S32 min_width;
+		getResizeLimits(&min_width,&min_height);
+
+		min_height = items[1]->getRect().getHeight() + 2 * mMessageList->getBorderWidth() + parent_list_delta_height;
+
+		setResizeLimits(min_width,min_height);
+	}
 }
 
 void LLSysWellWindow::handleItemRemoved(EItemType removed_item_type)
@@ -673,15 +711,15 @@ BOOL LLIMWellWindow::postBuild()
 void LLIMWellWindow::sessionAdded(const LLUUID& session_id,
 								   const std::string& name, const LLUUID& other_participant_id)
 {
-	if (mMessageList->getItemByValue(session_id) == NULL)
-	{
-		S32 chicletCounter = LLIMModel::getInstance()->getNumUnread(session_id);
-		if (chicletCounter > -1)
-		{
-			addIMRow(session_id, chicletCounter, name, other_participant_id);	
-			reshapeWindow();
-		}
-	}
+	if (mMessageList->getItemByValue(session_id)) return;
+
+	// For im sessions started as voice call chiclet gets created on the first incoming message
+	if (gIMMgr->isVoiceCall(session_id)) return;
+
+	if (!gIMMgr->hasSession(session_id)) return;
+
+	addIMRow(session_id, 0, name, other_participant_id);	
+	reshapeWindow();
 }
 
 //virtual
@@ -752,6 +790,13 @@ void LLIMWellWindow::addIMRow(const LLUUID& sessionId, S32 chicletCounter,
 //---------------------------------------------------------------------------------
 void LLIMWellWindow::delIMRow(const LLUUID& sessionId)
 {
+	//fix for EXT-3252
+	//without this line LLIMWellWindow receive onFocusLost
+	//and hide itself. It was becaue somehow LLIMChicklet was in focus group for
+	//LLIMWellWindow...
+	//But I didn't find why this happen..
+	gFocusMgr.clearLastFocusForGroup(this);
+
 	if (mMessageList->removeItemByValue(sessionId))
 	{
 		handleItemRemoved(IT_INSTANT_MESSAGE);
@@ -771,6 +816,10 @@ void LLIMWellWindow::delIMRow(const LLUUID& sessionId)
 	{
 		setVisible(FALSE);
 	}
+	else
+	{
+		setFocus(true);
+	}
 }
 
 void LLIMWellWindow::addObjectRow(const LLUUID& object_id, bool new_message/* = false*/)
@@ -810,4 +859,36 @@ void LLIMWellWindow::removeObjectRow(const LLUUID& object_id)
 	}
 }
 
+
+void LLIMWellWindow::addIMRow(const LLUUID& session_id)
+{
+	if (hasIMRow(session_id)) return;
+
+	LLIMModel* im_model = LLIMModel::getInstance();
+	addIMRow(session_id, 0, im_model->getName(session_id), im_model->getOtherParticipantID(session_id));
+	reshapeWindow();
+}
+
+bool LLIMWellWindow::hasIMRow(const LLUUID& session_id)
+{
+	return mMessageList->getItemByValue(session_id);
+}
+
+void LLIMWellWindow::onNewIM(const LLSD& data)
+{
+	LLUUID from_id = data["from_id"];
+	if (from_id.isNull() || gAgentID == from_id) return;
+
+	LLUUID session_id = data["session_id"];
+	if (session_id.isNull()) return;
+
+	if (!gIMMgr->isVoiceCall(session_id)) return;
+
+	if (hasIMRow(session_id)) return;
+
+	//first real message, time to create chiclet
+	addIMRow(session_id);
+}
+
+
 // EOF
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index 43b2723df02d9071481bd95ee31cb18dedd889ba..736b1b9fb4dd47df15c2a7df50f9b87a8f16c26c 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -47,6 +47,7 @@ class LLFlatListView;
 class LLChiclet;
 class LLIMChiclet;
 class LLScriptChiclet;
+class LLSysWellChiclet;
 
 
 class LLSysWellWindow : public LLDockableFloater
@@ -78,6 +79,8 @@ public:
 
 	void onStartUpToastClick(S32 x, S32 y, MASK mask);
 
+	void setSysWellChiclet(LLSysWellChiclet* chiclet) { mSysWellChiclet = chiclet; }
+
 	// size constants for the window and for its elements
 	static const S32 MAX_WINDOW_HEIGHT		= 200;
 	static const S32 MIN_WINDOW_WIDTH		= 318;
@@ -104,11 +107,17 @@ protected:
 	virtual const std::string& getAnchorViewName() = 0;
 
 	void reshapeWindow();
+	void releaseNewMessagesState();
 
 	// pointer to a corresponding channel's instance
 	LLNotificationsUI::LLScreenChannel*	mChannel;
 	LLFlatListView*	mMessageList;
 
+	/**
+	 * Reference to an appropriate Well chiclet to release "new message" state. EXT-3147
+	 */
+	LLSysWellChiclet* mSysWellChiclet;
+
 	/**
 	 *	Special panel which is used as separator of Notifications & IM Rows.
 	 *	It is always presents in the list and shown when it is necessary.
@@ -179,9 +188,14 @@ public:
 	/*virtual*/ void sessionRemoved(const LLUUID& session_id);
 	/*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
 
+	void onNewIM(const LLSD& data);
+
 	void addObjectRow(const LLUUID& object_id, bool new_message = false);
 	void removeObjectRow(const LLUUID& object_id);
 
+	void addIMRow(const LLUUID& session_id);
+	bool hasIMRow(const LLUUID& session_id);
+
 protected:
 	/*virtual*/ const std::string& getAnchorViewName() { return IM_WELL_ANCHOR_NAME; }
 
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index 8d3dcf8a9995e9fb1a5345402cb1d3264d6344a4..72ef383be93903091527c22b53552213b921ee66 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -31,8 +31,14 @@
  */
 
 #include "llviewerprecompiledheaders.h"
-#include "llagent.h"
+
 #include "lltexlayer.h"
+
+#include "llagent.h"
+#include "llimagej2c.h"
+#include "llimagetga.h"
+#include "llvfile.h"
+#include "llvfs.h"
 #include "llviewerstats.h"
 #include "llviewerregion.h"
 #include "llvoavatar.h"
diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp
index 0c7e61d00e2e75ffe9aea9289d37d700cabf8c38..d55468841d84b15848464638caeb3459542e27d0 100644
--- a/indra/newview/lltexlayerparams.cpp
+++ b/indra/newview/lltexlayerparams.cpp
@@ -30,11 +30,14 @@
  */
 
 #include "llviewerprecompiledheaders.h"
+
+#include "lltexlayerparams.h"
+
 #include "llagent.h"
+#include "llimagetga.h"
 #include "lltexlayer.h"
 #include "llvoavatarself.h"
 #include "llwearable.h"
-#include "lltexlayerparams.h"
 #include "llui.h"
 
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/lltexlayerparams.h b/indra/newview/lltexlayerparams.h
index 2b80dbdba4cf34833489f92347b57141af8321f9..93d01352d48d920882eaa0346d2bc29ba4d179ef 100644
--- a/indra/newview/lltexlayerparams.h
+++ b/indra/newview/lltexlayerparams.h
@@ -34,7 +34,11 @@
 
 #include "llviewervisualparam.h"
 
+class LLImageRaw;
+class LLImageTGA;
 class LLTexLayer;
+class LLTexLayerInterface;
+class LLViewerTexture;
 class LLVOAvatar;
 class LLWearable;
 
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index bc9c988648baeca9bdfdabbf7bf2a86397f67b73..4203cbbc433c178bc58d3a8b7920ac803b19a7f4 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -40,6 +40,7 @@
 
 #include "llworkerthread.h"
 
+class LLImageFormatted;
 class LLTextureCacheWorker;
 
 class LLTextureCache : public LLWorkerThread
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index e29c96bec4f8da7d55a460d096d6c844cf519b9e..83e0b5396066f8429226f593d8ed7f63d5b741bb 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -43,8 +43,10 @@
 #include "llhttpclient.h"
 #include "llhttpstatuscodes.h"
 #include "llimage.h"
+#include "llimagej2c.h"
 #include "llimageworker.h"
 #include "llworkerthread.h"
+#include "message.h"
 
 #include "llagent.h"
 #include "lltexturecache.h"
@@ -446,6 +448,7 @@ LLTextureFetchWorker::~LLTextureFetchWorker()
 	mFormattedImage = NULL;
 	clearPackets();
 	unlockWorkMutex();
+	mFetcher->removeFromHTTPQueue(mID);
 }
 
 void LLTextureFetchWorker::clearPackets()
@@ -819,6 +822,13 @@ bool LLTextureFetchWorker::doWork(S32 param)
 			if (mFormattedImage.notNull())
 			{
 				cur_size = mFormattedImage->getDataSize(); // amount of data we already have
+				if (mFormattedImage->getDiscardLevel() == 0)
+				{
+					// We already have all the data, just decode it
+					mLoadedDiscard = mFormattedImage->getDiscardLevel();
+					mState = DECODE_IMAGE;
+					return false;
+				}
 			}
 			mRequestedSize = mDesiredSize;
 			mRequestedDiscard = mDesiredDiscard;
@@ -869,24 +879,16 @@ bool LLTextureFetchWorker::doWork(S32 param)
  				llinfos << "HTTP GET failed for: " << mUrl
 						<< " Status: " << mGetStatus << " Reason: '" << mGetReason << "'"
 						<< " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl;
-				if (cur_size == 0)
+				++mHTTPFailCount;
+				if (mHTTPFailCount >= max_attempts)
 				{
-					++mHTTPFailCount;
-					if (mHTTPFailCount >= max_attempts)
-					{
-						resetFormattedData();
-						return true; // failed
-					}
-					else
-					{
-						mState = SEND_HTTP_REQ;
-						return false; // retry
-					}
+					resetFormattedData();
+					return true; // failed
 				}
 				else
 				{
-					mState = DECODE_IMAGE;
-					return false; // use what we have
+					mState = SEND_HTTP_REQ;
+					return false; // retry
 				}
 			}
 			
diff --git a/indra/newview/lltexturestatsuploader.cpp b/indra/newview/lltexturestatsuploader.cpp
index e0358e1fcafbdff4d942df50d8534df18871f457..1df73db9b08df833d3f5a445bcafcc78b2fd5428 100644
--- a/indra/newview/lltexturestatsuploader.cpp
+++ b/indra/newview/lltexturestatsuploader.cpp
@@ -34,6 +34,8 @@
 
 #include "lltexturestatsuploader.h"
 
+#include "llhttpclient.h"
+
 LLTextureStatsUploader::LLTextureStatsUploader()
 {
 }
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index b6e20608eb4d55d4e6545c6d142f555918dc7730..9573b884eb9ca96b4c3011de3abfc2716ee86b13 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -494,7 +494,7 @@ void LLGLTexMemBar::draw()
 #endif
 	//----------------------------------------------------------------------------
 
-	text = llformat("Textures: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d RAW:%d HTP:%d",
+	text = llformat("Textures: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d RAW:%d HTP:%d CRE:%d",
 					gTextureList.getNumImages(),
 					LLAppViewer::getTextureFetch()->getNumRequests(), LLAppViewer::getTextureFetch()->getNumDeletes(),
 					LLAppViewer::getTextureFetch()->mPacketCount, LLAppViewer::getTextureFetch()->mBadPacketCount, 
@@ -502,7 +502,8 @@ void LLGLTexMemBar::draw()
 					LLLFSThread::sLocal->getPending(),
 					LLAppViewer::getImageDecodeThread()->getPending(), 
 					LLImageRaw::sRawImageCount,
-					LLAppViewer::getTextureFetch()->getNumHTTPRequests());
+					LLAppViewer::getTextureFetch()->getNumHTTPRequests(),
+					gTextureList.mCreateTextureList.size());
 
 	LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, h_offset + line_height*2,
 									 text_color, LLFontGL::LEFT, LLFontGL::TOP);
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 4131e2755a8089ba08b0edfb43281d8edca6d054..2a56b2cd3a890fec6bc60f851744c431332c7aff 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -72,6 +72,8 @@ LLToast::LLToast(const LLToast::Params& p)
 {
 	LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL);
 
+	setCanDrag(FALSE);
+
 	if(mPanel)
 	{
 		insertPanel(mPanel);
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index 0c3c59870435267b99c15ccd37c5a035ee65e36f..3d25fd4f02d5011e8aa0d79d8f621c2fc1dc66c5 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -139,6 +139,7 @@ public:
 	// set whether this toast considered as hidden or not
 	void setIsHidden( bool is_toast_hidden ) { mIsHidden = is_toast_hidden; }
 
+	const LLNotificationPtr& getNotification() { return mNotification;}
 
 	// Registers signals/callbacks for events
 	toast_signal_t mOnFadeSignal;
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index a4f5164a8dd749db733d9462db9a647b600376e6..c48301fa1ef007dc6d5ba503bd2a17eb3ee0e4a9 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -30,10 +30,6 @@
  * $/LicenseInfo$
  */
 
-// *NOTE: this module is a copy-paste of llui/llalertdialog.h
-// Can we re-implement this as a subclass of LLAlertDialog and
-// avoid all this code duplication? It already caused EXT-2232.
-
 #include "llviewerprecompiledheaders.h" // must be first include
 
 #include "linden_common.h"
@@ -60,7 +56,7 @@ const F32 DEFAULT_BUTTON_DELAY = 0.5f;
 const S32 MSG_PAD = 8;
 
 /*static*/ LLControlGroup* LLToastAlertPanel::sSettings = NULL;
-/*static*/ LLAlertURLLoader* LLToastAlertPanel::sURLLoader;
+/*static*/ LLToastAlertPanel::URLLoader* LLToastAlertPanel::sURLLoader;
 
 //-----------------------------------------------------------------------------
 // Private methods
diff --git a/indra/newview/lltoastalertpanel.h b/indra/newview/lltoastalertpanel.h
index 38a635e8a452d78d66ab88b63c8b7a22503e5bc8..875ab82c54119ad252cee5f5d738aa1ed172d48c 100644
--- a/indra/newview/lltoastalertpanel.h
+++ b/indra/newview/lltoastalertpanel.h
@@ -30,10 +30,6 @@
  * $/LicenseInfo$
  */
 
-// *NOTE: this module is a copy-paste of llui/llalertdialog.h
-// Can we re-implement this as a subclass of LLAlertDialog and
-// avoid all this code duplication? It already caused EXT-2232.
-
 #ifndef LL_TOASTALERTPANEL_H
 #define LL_TOASTALERTPANEL_H
 
@@ -41,11 +37,9 @@
 #include "llfloater.h"
 #include "llui.h"
 #include "llnotificationptr.h"
-#include "llalertdialog.h"
 
 class LLButton;
 class LLCheckBoxCtrl;
-class LLAlertDialogTemplate;
 class LLLineEditor;
 
 /**
@@ -62,7 +56,16 @@ class LLToastAlertPanel
 public:
 	typedef bool (*display_callback_t)(S32 modal);
 
-	static void setURLLoader(LLAlertURLLoader* loader)
+	class URLLoader
+	{
+	public:
+		virtual void load(const std::string& url, bool force_open_externally = 0) = 0;
+		virtual ~URLLoader()
+		{
+		}
+	};
+
+	static void setURLLoader(URLLoader* loader)
 	{
 		sURLLoader = loader;
 	}
@@ -95,7 +98,7 @@ private:
 	BOOL hasTitleBar() const;
 
 private:
-	static LLAlertURLLoader* sURLLoader;
+	static URLLoader* sURLLoader;
 	static LLControlGroup* sSettings;
 
 	struct ButtonData
diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp
index eacc077a652d546898ea17226cd3e4c3d86ad58e..e49044cdca39fc88ce8cc41966a839b6234c949a 100644
--- a/indra/newview/lltoastgroupnotifypanel.cpp
+++ b/indra/newview/lltoastgroupnotifypanel.cpp
@@ -40,7 +40,6 @@
 #include "lliconctrl.h"
 #include "llinventoryfunctions.h"
 #include "llnotifications.h"
-#include "llnotify.h"
 #include "llviewertexteditor.h"
 
 #include "lluiconstants.h"
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index ed9e2e8818fd43fc38a0f06bb16a40975faa6075..b7add03e0e0453c0f0b071a368d127ffbc971cd9 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -34,6 +34,7 @@
 #include "lltoastimpanel.h"
 
 #include "llnotifications.h"
+#include "llinstantmessage.h"
 
 const S32 LLToastIMPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT	= 6;
 
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 6b9bff7b9e57ecd993e698337c35344897db803b..766cf83a01218b76e9269dea3bc3565f9bc9197a 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -38,6 +38,7 @@
 #include "llviewercontrol.h"
 
 // library includes
+#include "lldbstrings.h"
 #include "llnotifications.h"
 #include "lluiconstants.h"
 #include "llrect.h"
diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp
index afb9e261b0f4093b00b1c710a9d142ad66f5a2a1..755e64777716000ae2527c000cc5b38c026996b2 100644
--- a/indra/newview/lltoastpanel.cpp
+++ b/indra/newview/lltoastpanel.cpp
@@ -80,7 +80,7 @@ void LLToastPanel::snapToMessageHeight(LLTextBase* message, S32 maxLineCount)
 
 		//Knowing the height is set to max allowed, getTextPixelHeight returns needed text height
 		//Perhaps we need to pass maxLineCount as parameter to getTextPixelHeight to avoid previous reshape.
-		S32 requiredTextHeight = message->getContentsRect().getHeight();
+		S32 requiredTextHeight = message->getTextBoundingRect().getHeight();
 		S32 newTextHeight = llmin(requiredTextHeight, maxTextHeight);
 
 		//Calculate last delta height deducting previous heightDelta 
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 5ed8dc5fb9a2bacbcfb0c7f46781865f3cc567cc..74fbce890d9513b3eecd1f73fd4bc750c0041b06 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -1243,8 +1243,6 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick)
 		return false;
 	}
 
-
-
 	// Does this face have media?
 	const LLTextureEntry* tep = objectp->getTE(pick.mObjectFace);
 	if(!tep)
@@ -1257,11 +1255,11 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick)
 	
 	viewer_media_t media_impl = mep ? LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()) : NULL;
 
-	if (gSavedSettings.getBOOL("MediaOnAPrimUI")
-		&& media_impl.notNull())
+	if (gSavedSettings.getBOOL("MediaOnAPrimUI"))
 	{
-		if (!LLViewerMediaFocus::getInstance()->isFocusedOnFace(pick.getObject(), pick.mObjectFace) )
+		if (!LLViewerMediaFocus::getInstance()->isFocusedOnFace(pick.getObject(), pick.mObjectFace) || media_impl.isNull())
 		{
+			// It's okay to give this a null impl
 			LLViewerMediaFocus::getInstance()->setFocusFace(pick.getObject(), pick.mObjectFace, media_impl, pick.mNormal);
 		}
 		else
@@ -1445,28 +1443,29 @@ BOOL LLToolPie::pickRightMouseDownCallback()
 	{
 		LLParcelSelectionHandle selection = LLViewerParcelMgr::getInstance()->selectParcelAt( mPick.mPosGlobal );
 		gMenuHolder->setParcelSelection(selection);
-		gPieLand->show(x, y);
+		gMenuLand->show(x, y);
 
 		showVisualContextMenuEffect();
 
 	}
 	else if (mPick.mObjectID == gAgent.getID() )
 	{
-		if(!gPieSelf) 
+		if(!gMenuAvatarSelf) 
 		{
 			//either at very early startup stage or at late quitting stage,
 			//this event is ignored.
 			return TRUE ;
 		}
 
-		gPieSelf->show(x, y);
+		gMenuAvatarSelf->show(x, y);
 	}
 	else if (object)
 	{
 		gMenuHolder->setObjectSelection(LLSelectMgr::getInstance()->getSelection());
 
+		bool is_other_attachment = (object->isAttachment() && !object->isHUDAttachment() && !object->permYouOwner());
 		if (object->isAvatar() 
-			|| (object->isAttachment() && !object->isHUDAttachment() && !object->permYouOwner()))
+			|| is_other_attachment)
 		{
 			// Find the attachment's avatar
 			while( object && object->isAttachment())
@@ -1477,20 +1476,30 @@ BOOL LLToolPie::pickRightMouseDownCallback()
 			// Object is an avatar, so check for mute by id.
 			LLVOAvatar* avatar = (LLVOAvatar*)object;
 			std::string name = avatar->getFullname();
+			std::string mute_msg;
 			if (LLMuteList::getInstance()->isMuted(avatar->getID(), avatar->getFullname()))
 			{
-				gMenuHolder->childSetText("Avatar Mute", std::string("Unmute")); // *TODO:Translate
+				mute_msg = LLTrans::getString("UnmuteAvatar");
 			}
 			else
 			{
-				gMenuHolder->childSetText("Avatar Mute", std::string("Mute")); // *TODO:Translate
+				mute_msg = LLTrans::getString("MuteAvatar");
 			}
 
-			gPieAvatar->show(x, y);
+			if (is_other_attachment)
+			{
+				gMenuAttachmentOther->getChild<LLUICtrl>("Avatar Mute")->setValue(mute_msg);
+				gMenuAttachmentOther->show(x, y);
+			}
+			else
+			{
+				gMenuAvatarOther->getChild<LLUICtrl>("Avatar Mute")->setValue(mute_msg);
+				gMenuAvatarOther->show(x, y);
+			}
 		}
 		else if (object->isAttachment())
 		{
-			gPieAttachment->show(x, y);
+			gMenuAttachmentSelf->show(x, y);
 		}
 		else
 		{
@@ -1501,16 +1510,18 @@ BOOL LLToolPie::pickRightMouseDownCallback()
 			{
 				name = node->mName;
 			}
+			std::string mute_msg;
 			if (LLMuteList::getInstance()->isMuted(object->getID(), name))
 			{
-				gMenuHolder->childSetText("Object Mute", std::string("Unmute")); // *TODO:Translate
+				mute_msg = LLTrans::getString("UnmuteObject");
 			}
 			else
 			{
-				gMenuHolder->childSetText("Object Mute", std::string("Mute")); // *TODO:Translate
+				mute_msg = LLTrans::getString("MuteObject");
 			}
 			
-			gPieObject->show(x, y);
+			gMenuHolder->childSetText("Object Mute", mute_msg);
+			gMenuObject->show(x, y);
 
 			showVisualContextMenuEffect();
 		}
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index f8c82f8b22b64881feded6201ca025050166e8de..0b6bd4b40133b84729eb52d70fa731099f0230f7 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -41,6 +41,7 @@
 #include "llfloaterurldisplay.h"
 #include "llfloaterworldmap.h"
 #include "llpanellogin.h"
+#include "llregionhandle.h"
 #include "llsidetray.h"
 #include "llslurl.h"
 #include "llstartup.h"			// gStartupState
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index a041f3ac98d2083e4d85cec105c3325b68a87a45..bb49804aff0162b1acaf11d1ac6385c53ea4c8d2 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -32,12 +32,13 @@
 
 #include "llviewerprecompiledheaders.h"
 
-#include "linden_common.h"
-
-#include "llagent.h"
 #include "llviewerassetstorage.h"
+
 #include "llvfile.h"
 #include "llvfs.h"
+#include "message.h"
+
+#include "llagent.h"
 
 LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
 										   LLVFS *vfs, const LLHost &upstream_host)
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 6339d23fa71cd3168407fd1dbd7eb71fcb620232..57434bd1e4c58faffe7f8a3f237ced3efb2d1121 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -63,7 +63,6 @@
 #include "llviewerjoystick.h"
 #include "llviewerparcelmgr.h"
 #include "llparcel.h"
-#include "llnotify.h"
 #include "lloverlaybar.h"
 #include "llkeyboard.h"
 #include "llerrorcontrol.h"
@@ -73,6 +72,8 @@
 #include "llrender.h"
 #include "llbottomtray.h"
 #include "llnavigationbar.h"
+#include "llfloatertools.h"
+#include "llpaneloutfitsinventory.h"
 
 #ifdef TOGGLE_HACKED_GODLIKE_VIEWER
 BOOL 				gHackGodmode = FALSE;
@@ -120,12 +121,6 @@ static bool handleSetShaderChanged(const LLSD& newvalue)
 	return true;
 }
 
-static bool handleSetSelfInvisible( const LLSD& newvalue)
-{
-	LLVOAvatarSelf::onChangeSelfInvisible( newvalue.asBoolean() );
-	return true;
-}
-
 static bool handleReleaseGLBufferChanged(const LLSD& newvalue)
 {
 	if (gPipeline.isInit())
@@ -516,34 +511,25 @@ bool toggle_show_snapshot_button(const LLSD& newvalue)
 
 bool toggle_show_navigation_panel(const LLSD& newvalue)
 {
-	LLRect floater_view_rect = gFloaterView->getRect();
-	LLRect notify_view_rect = gNotifyBoxView->getRect();
-	LLNavigationBar* navbar = LLNavigationBar::getInstance();
-	
-	//if newvalue contains 0 => navbar should turn invisible, so floater_view_rect should get higher, 
-	//and to do this pm=1, else if navbar becomes visible pm=-1 so floater_view_rect gets lower.
-	int pm=newvalue.asBoolean()?-1:1;
-	floater_view_rect.mTop += pm*(navbar->getDefNavBarHeight()-navbar->getDefFavBarHeight());
-	notify_view_rect.mTop += pm*(navbar->getDefNavBarHeight()-navbar->getDefFavBarHeight());
-	gFloaterView->setRect(floater_view_rect);
-	floater_view_rect = gFloaterView->getRect();
-	navbar->showNavigationPanel(newvalue.asBoolean());
+	LLNavigationBar::getInstance()->showNavigationPanel(newvalue.asBoolean());
 	return true;
 }
 
 bool toggle_show_favorites_panel(const LLSD& newvalue)
 {
-	LLRect floater_view_rect = gFloaterView->getRect();
-	LLRect notify_view_rect = gNotifyBoxView->getRect();
-	LLNavigationBar* navbar = LLNavigationBar::getInstance();
-	
-	//if newvalue contains 0 => favbar should turn invisible, so floater_view_rect should get higher, 
-	//and to do this pm=1, else if favbar becomes visible pm=-1 so floater_view_rect gets lower.
-	int pm=newvalue.asBoolean()?-1:1;
-	floater_view_rect.mTop += pm*navbar->getDefFavBarHeight();
-	notify_view_rect.mTop += pm*navbar->getDefFavBarHeight();
-	gFloaterView->setRect(floater_view_rect);
-	navbar->showFavoritesPanel(newvalue.asBoolean());
+	LLNavigationBar::getInstance()->showFavoritesPanel(newvalue.asBoolean());
+	return true;
+}
+
+bool toggle_show_appearance_editor(const LLSD& newvalue)
+{
+	LLPanelOutfitsInventory::sShowDebugEditor = newvalue.asBoolean();
+	return true;
+}
+
+bool toggle_show_object_render_cost(const LLSD& newvalue)
+{
+	LLFloaterTools::sShowObjectCost = newvalue.asBoolean();
 	return true;
 }
 
@@ -567,7 +553,6 @@ void settings_setup_listeners()
 	gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
 	gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
 	gSavedSettings.getControl("RenderAvatarMaxVisible")->getSignal()->connect(boost::bind(&handleAvatarMaxVisibleChanged, _2));
-	gSavedSettings.getControl("RenderAvatarInvisible")->getSignal()->connect(boost::bind(&handleSetSelfInvisible, _2));
 	gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2));
 	gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));
 	gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2));
@@ -690,6 +675,8 @@ void settings_setup_listeners()
 	gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&toggle_show_snapshot_button, _2));
 	gSavedSettings.getControl("ShowNavbarNavigationPanel")->getSignal()->connect(boost::bind(&toggle_show_navigation_panel, _2));
 	gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2));
+	gSavedSettings.getControl("ShowDebugAppearanceEditor")->getSignal()->connect(boost::bind(&toggle_show_appearance_editor, _2));
+	gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2));
 }
 
 #if TEST_CACHED_CONTROL
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index bcb811680cd9efa189cdfa027d41b61d5caa3bb4..c837ebef88df19315c610547bb6974542d752880 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -1003,10 +1003,10 @@ void render_hud_attachments()
 	glh_set_current_modelview(current_mod);
 }
 
-BOOL setup_hud_matrices()
+LLRect get_whole_screen_region()
 {
 	LLRect whole_screen = gViewerWindow->getWindowRectScaled();
-
+	
 	// apply camera zoom transform (for high res screenshots)
 	F32 zoom_factor = LLViewerCamera::getInstance()->getZoomFactor();
 	S16 sub_region = LLViewerCamera::getInstance()->getZoomSubRegion();
@@ -1018,52 +1018,43 @@ BOOL setup_hud_matrices()
 		int tile_y = sub_region / num_horizontal_tiles;
 		int tile_x = sub_region - (tile_y * num_horizontal_tiles);
 		glh::matrix4f mat;
-
+		
 		whole_screen.setLeftTopAndSize(tile_x * tile_width, gViewerWindow->getWindowHeightScaled() - (tile_y * tile_height), tile_width, tile_height);
 	}
-
-	return setup_hud_matrices(whole_screen);
+	return whole_screen;
 }
 
-BOOL setup_hud_matrices(const LLRect& screen_region)
+bool get_hud_matrices(const LLRect& screen_region, glh::matrix4f &proj, glh::matrix4f &model)
 {
 	LLVOAvatar* my_avatarp = gAgent.getAvatarObject();
 	if (my_avatarp && my_avatarp->hasHUDAttachment())
 	{
 		F32 zoom_level = gAgent.mHUDCurZoom;
 		LLBBox hud_bbox = my_avatarp->getHUDBBox();
-
-		// set up transform to keep HUD objects in front of camera
-		glMatrixMode(GL_PROJECTION);
+		
 		F32 hud_depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f);
-		glh::matrix4f proj = gl_ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, hud_depth);
+		proj = gl_ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, hud_depth);
 		proj.element(2,2) = -0.01f;
-
+		
 		F32 aspect_ratio = LLViewerCamera::getInstance()->getAspect();
-
+		
 		glh::matrix4f mat;
 		F32 scale_x = (F32)gViewerWindow->getWindowWidthScaled() / (F32)screen_region.getWidth();
 		F32 scale_y = (F32)gViewerWindow->getWindowHeightScaled() / (F32)screen_region.getHeight();
 		mat.set_scale(glh::vec3f(scale_x, scale_y, 1.f));
 		mat.set_translate(
 			glh::vec3f(clamp_rescale((F32)screen_region.getCenterX(), 0.f, (F32)gViewerWindow->getWindowWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio),
-						clamp_rescale((F32)screen_region.getCenterY(), 0.f, (F32)gViewerWindow->getWindowHeightScaled(), 0.5f * scale_y, -0.5f * scale_y),
-						0.f));
+					   clamp_rescale((F32)screen_region.getCenterY(), 0.f, (F32)gViewerWindow->getWindowHeightScaled(), 0.5f * scale_y, -0.5f * scale_y),
+					   0.f));
 		proj *= mat;
-
-		glLoadMatrixf(proj.m);
-		glh_set_current_projection(proj);
-
-		glMatrixMode(GL_MODELVIEW);
-		glh::matrix4f model((GLfloat*) OGL_TO_CFR_ROTATION);
+		
+		glh::matrix4f tmp_model((GLfloat*) OGL_TO_CFR_ROTATION);
 		
 		mat.set_scale(glh::vec3f(zoom_level, zoom_level, zoom_level));
 		mat.set_translate(glh::vec3f(-hud_bbox.getCenterLocal().mV[VX] + (hud_depth * 0.5f), 0.f, 0.f));
-
-		model *= mat;
-		glLoadMatrixf(model.m);
-		glh_set_current_modelview(model);
-
+		
+		tmp_model *= mat;
+		model = tmp_model;		
 		return TRUE;
 	}
 	else
@@ -1072,6 +1063,35 @@ BOOL setup_hud_matrices(const LLRect& screen_region)
 	}
 }
 
+bool get_hud_matrices(glh::matrix4f &proj, glh::matrix4f &model)
+{
+	LLRect whole_screen = get_whole_screen_region();
+	return get_hud_matrices(whole_screen, proj, model);
+}
+
+BOOL setup_hud_matrices()
+{
+	LLRect whole_screen = get_whole_screen_region();
+	return setup_hud_matrices(whole_screen);
+}
+
+BOOL setup_hud_matrices(const LLRect& screen_region)
+{
+	glh::matrix4f proj, model;
+	bool result = get_hud_matrices(screen_region, proj, model);
+	if (!result) return result;
+	
+	// set up transform to keep HUD objects in front of camera
+	glMatrixMode(GL_PROJECTION);
+	glLoadMatrixf(proj.m);
+	glh_set_current_projection(proj);
+	
+	glMatrixMode(GL_MODELVIEW);
+	glLoadMatrixf(model.m);
+	glh_set_current_modelview(model);
+	return TRUE;
+}
+
 static LLFastTimer::DeclareTimer FTM_SWAP("Swap");
 
 void render_ui(F32 zoom_factor, int subfield)
diff --git a/indra/newview/llviewergenericmessage.h b/indra/newview/llviewergenericmessage.h
index 6e1f0945b8c2595ccb707c1bbbf75802d85bdae8..6b0a2e5d81bdba4b5f65e56f11127534085ba8c8 100644
--- a/indra/newview/llviewergenericmessage.h
+++ b/indra/newview/llviewergenericmessage.h
@@ -36,6 +36,7 @@
 
 class LLUUID;
 class LLDispatcher;
+class LLMessageSystem;
 
 
 void send_generic_message(const std::string& method,
diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp
index b8f91697e5262a83b2d62774cf10f0f395c090ef..5af79b4fd32a3f40224534b57acd85109f591c05 100644
--- a/indra/newview/llviewerhelp.cpp
+++ b/indra/newview/llviewerhelp.cpp
@@ -81,8 +81,7 @@ void LLViewerHelp::showTopic(const std::string &topic)
 
 	// work out the URL for this topic and display it 
 	showHelp();
-	const LLOSInfo& osinfo = LLAppViewer::instance()->getOSInfo();
-	std::string helpURL = LLViewerHelpUtil::buildHelpURL( help_topic, gSavedSettings, osinfo );
+	std::string helpURL = LLViewerHelpUtil::buildHelpURL( help_topic );
 	setRawURL( helpURL );
 }
 
diff --git a/indra/newview/llviewerhelputil.cpp b/indra/newview/llviewerhelputil.cpp
index df08470518a32a66a9648ecacee8beb0ba678294..5ba4fc834c6cf33cfa78d28a9b190b4337e0b902 100644
--- a/indra/newview/llviewerhelputil.cpp
+++ b/indra/newview/llviewerhelputil.cpp
@@ -34,12 +34,11 @@
 #include "llviewerprecompiledheaders.h"
 #include "llviewerhelputil.h"
 
-#include "llcontrol.h"
+#include "llsd.h"
 #include "llstring.h"
-#include "llsys.h"
 #include "lluri.h"
-#include "llversioninfo.h"
-
+#include "llweb.h"
+#include "llviewercontrol.h"
 
 //////////////////////////////////////////////
 // Build a help URL from a topic and formatter
@@ -59,40 +58,14 @@ std::string LLViewerHelpUtil::helpURLEncode( const std::string &component )
 	return escaped;
 }
 
-static std::string buildHelpVersion( const U32 ver_int )
-{
-	std::ostringstream ver_str;
-	ver_str << ver_int;
-	return ver_str.str(); // not encoded - numbers are rfc3986-safe
-}
-
 //static
-std::string LLViewerHelpUtil::buildHelpURL( const std::string &topic,
-					    LLControlGroup &savedSettings,
-					    const LLOSInfo &osinfo )
+std::string LLViewerHelpUtil::buildHelpURL( const std::string &topic)
 {
-	std::string helpURL = savedSettings.getString("HelpURLFormat");
 	LLSD substitution;
 	substitution["TOPIC"] = helpURLEncode(topic);
 	
-	substitution["CHANNEL"] = helpURLEncode(savedSettings.getString("VersionChannelName"));
-
-	substitution["VERSION"] = helpURLEncode(LLVersionInfo::getVersion());
-	substitution["VERSION_MAJOR"] = buildHelpVersion(LLVersionInfo::getMajor());
-	substitution["VERSION_MINOR"] = buildHelpVersion(LLVersionInfo::getMinor());
-	substitution["VERSION_PATCH"] = buildHelpVersion(LLVersionInfo::getPatch());
-	substitution["VERSION_BUILD"] = buildHelpVersion(LLVersionInfo::getBuild());
-	
-	substitution["OS"] = helpURLEncode(osinfo.getOSStringSimple());
-
-	std::string language = savedSettings.getString("Language");
-	if( language.empty() || language == "default" )
-	{
-		language = savedSettings.getString("SystemLanguage");
-	}
-	substitution["LANGUAGE"] = helpURLEncode(language);
-		
-	LLStringUtil::format(helpURL, substitution);
-
-	return helpURL;
+	// get the help URL and expand all of the substitutions
+	// (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
+	std::string helpURL = gSavedSettings.getString("HelpURLFormat");
+	return LLWeb::expandURLSubstitutions(helpURL, substitution);
 }
diff --git a/indra/newview/llviewerhelputil.h b/indra/newview/llviewerhelputil.h
index 8ee0d96023932988177598c8b170d18229374f68..95e6744842bb7d3b4e82bb0b6d6e3e9735e369ed 100644
--- a/indra/newview/llviewerhelputil.h
+++ b/indra/newview/llviewerhelputil.h
@@ -41,9 +41,7 @@ class LLViewerHelpUtil
 {
  public:
 	static std::string helpURLEncode( const std::string &component );
-	static std::string buildHelpURL( const std::string &topic,
-					 LLControlGroup &savedSettings,
-					 const LLOSInfo &osinfo);
+	static std::string buildHelpURL( const std::string &topic );
 };
 
 #endif // header guard
diff --git a/indra/newview/llviewerhome.cpp b/indra/newview/llviewerhome.cpp
index 58630978c4895a3c23c60cd1b66436ddd9c9ec21..6299b4fabd0a69b555214097604c2d20e3726635 100644
--- a/indra/newview/llviewerhome.cpp
+++ b/indra/newview/llviewerhome.cpp
@@ -35,12 +35,11 @@
 #include "llviewerhome.h"
 
 #include "lllogininstance.h"
+#include "llsd.h"
 #include "llui.h"
 #include "lluri.h"
-#include "llsd.h"
-#include "llversioninfo.h"
 #include "llviewercontrol.h"
-#include "llviewernetwork.h"
+#include "llweb.h"
 
 //static
 std::string LLViewerHome::getHomeURL()
@@ -49,16 +48,12 @@ std::string LLViewerHome::getHomeURL()
 	// this value from settings.xml and support various substitutions
 
 	LLSD substitution;
-	substitution["VERSION"] = LLVersionInfo::getVersion();
-	substitution["CHANNEL"] = LLURI::escape(gSavedSettings.getString("VersionChannelName"));
-	substitution["LANGUAGE"] = LLUI::getLanguage();
-	substitution["AUTH_KEY"] = LLURI::escape(getAuthKey());
-	substitution["GRID"] = LLViewerLogin::getInstance()->getGridLabel();
+	substitution["AUTH_TOKEN"] = LLURI::escape(getAuthKey());
 
+	// get the home URL and expand all of the substitutions
+	// (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
 	std::string homeURL = gSavedSettings.getString("HomeSidePanelURL");
-	LLStringUtil::format(homeURL, substitution);
-		
-	return homeURL;	
+	return LLWeb::expandURLSubstitutions(homeURL, substitution);
 }
 
 //static
@@ -67,7 +62,13 @@ std::string LLViewerHome::getAuthKey()
 	// return the value of the (optional) auth token returned by login.cgi
 	// this lets the server provide an authentication token that we can
 	// blindly pass to the Home web page for it to perform authentication.
-	static const std::string authKeyName("home_sidetray_token");
-	return LLLoginInstance::getInstance()->getResponse(authKeyName);
+	// We use "home_sidetray_token", and fallback to "auth_token" if not
+	// present.
+	LLSD auth_token = LLLoginInstance::getInstance()->getResponse("home_sidetray_token");
+	if (auth_token.asString().empty())
+	{
+		auth_token = LLLoginInstance::getInstance()->getResponse("auth_token");
+	}
+	return auth_token.asString();
 }
 
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 8dcd1b8f93a772bb221f8b734bb70bc247be9d0a..5605f425e099c058d220abe5da5eb7c727bb4c88 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -43,7 +43,6 @@
 #include "llviewercontrol.h"
 #include "llconsole.h"
 #include "llinventorymodel.h"
-#include "llnotify.h"
 #include "llgesturemgr.h"
 
 #include "llinventorybridge.h"
diff --git a/indra/newview/llviewerjoint.h b/indra/newview/llviewerjoint.h
index 0e993a2ebe2dde54ade93156f3a1ae1a9a82162d..08c4ec36fdedd3a90e5b59b8e9df377dbd584096 100644
--- a/indra/newview/llviewerjoint.h
+++ b/indra/newview/llviewerjoint.h
@@ -37,7 +37,6 @@
 // Header Files
 //-----------------------------------------------------------------------------
 #include "lljoint.h"
-#include "llapr.h"
 
 class LLFace;
 class LLViewerJointMesh;
diff --git a/indra/newview/llviewerjointmesh.h b/indra/newview/llviewerjointmesh.h
index 543679c44bd41a47f63584e1667c22cd76a0bb48..d62b0ada850874bc595ebd72111ee4908879959d 100644
--- a/indra/newview/llviewerjointmesh.h
+++ b/indra/newview/llviewerjointmesh.h
@@ -37,7 +37,6 @@
 #include "llviewertexture.h"
 #include "llpolymesh.h"
 #include "v4color.h"
-#include "llapr.h"
 
 class LLDrawable;
 class LLFace;
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 57e4ed0c1ec67a0128569b4c4561918f082c4ae2..df62c9628d48141e0f0694a5620576fa64abdb93 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -160,36 +160,25 @@ public:
 		std::string media_type = content["content-type"].asString();
 		std::string::size_type idx1 = media_type.find_first_of(";");
 		std::string mime_type = media_type.substr(0, idx1);
-		completeAny(status, mime_type);
-	}
 
-	virtual void error( U32 status, const std::string& reason )
-	{
-		if(status == 401)
-		{
-			// This is the "you need to authenticate" status.  
-			// Treat this like an html page.
-			completeAny(status, "text/html");
-		}
-		else
-		if(status == 403)
-		{
-			completeAny(status, "text/html");
-		}
-		else
-		if(status == 404)
-		{
-			// 404 is content not found - sites often have bespoke 404 pages so
-			// treat them like an html page.
-			completeAny(status, "text/html");
-		}
-		else
-		if(status == 406)
+		lldebugs << "status is " << status << ", media type \"" << media_type << "\"" << llendl;
+		
+		// 2xx status codes indicate success.
+		// Most 4xx status codes are successful enough for our purposes.
+		// 499 is the error code for host not found, timeout, etc.
+		if(	((status >= 200) && (status < 300))	||
+			((status >= 400) && (status < 499))	)
 		{
-			// 406 means the server sent something that we didn't indicate was acceptable
-			// Eventually we should send what we accept in the headers but for now,
-			// treat 406s like an html page.
-			completeAny(status, "text/html");
+			// The probe was successful.
+			
+			if(mime_type.empty())
+			{
+				// Some sites don't return any content-type header at all.
+				// Treat an empty mime type as text/html.
+				mime_type = "text/html";
+			}
+			
+			completeAny(status, mime_type);
 		}
 		else
 		{
@@ -200,6 +189,7 @@ public:
 				mMediaImpl->mMediaSourceFailed = true;
 			}
 		}
+
 	}
 
 	void completeAny(U32 status, const std::string& mime_type)
@@ -249,6 +239,7 @@ static LLViewerMedia::impl_id_map sViewerMediaTextureIDMap;
 static LLTimer sMediaCreateTimer;
 static const F32 LLVIEWERMEDIA_CREATE_DELAY = 1.0f;
 static F32 sGlobalVolume = 1.0f;
+static F64 sLowestLoadableImplInterest = 0.0f;
 
 //////////////////////////////////////////////////////////////////////////////////////////
 static void add_media_impl(LLViewerMediaImpl* media)
@@ -558,6 +549,37 @@ bool LLViewerMedia::getInWorldMediaDisabled()
 	return sInWorldMediaDisabled;
 }
 
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLViewerMedia::isInterestingEnough(const LLVOVolume *object, const F64 &object_interest)
+{
+	bool result = false;
+	
+	if (NULL == object)
+	{
+		result = false;
+	}
+	// Focused?  Then it is interesting!
+	else if (LLViewerMediaFocus::getInstance()->getFocusedObjectID() == object->getID())
+	{
+		result = true;
+	}
+	// Selected?  Then it is interesting!
+	// XXX Sadly, 'contains()' doesn't take a const :(
+	else if (LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(object)))
+	{
+		result = true;
+	}
+	else 
+	{
+		lldebugs << "object interest = " << object_interest << ", lowest loadable = " << sLowestLoadableImplInterest << llendl;
+		if(object_interest >= sLowestLoadableImplInterest)
+			result = true;
+	}
+	
+	return result;
+}
+
 LLViewerMedia::impl_list &LLViewerMedia::getPriorityList()
 {
 	return sViewerMediaImplList;
@@ -683,6 +705,8 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
 	// Setting max_cpu to 0.0 disables CPU usage checking.
 	bool check_cpu_usage = (max_cpu != 0.0f);
 	
+	LLViewerMediaImpl* lowest_interest_loadable = NULL;
+	
 	// Notes on tweakable params:
 	// max_instances must be set high enough to allow the various instances used in the UI (for the help browser, search, etc.) to be loaded.
 	// If max_normal + max_low is less than max_instances, things will tend to get unloaded instead of being set to slideshow.
@@ -769,6 +793,9 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
 		
 		if(!pimpl->getUsedInUI() && (new_priority != LLPluginClassMedia::PRIORITY_UNLOADED))
 		{
+			// This is a loadable inworld impl -- the last one in the list in this class defines the lowest loadable interest.
+			lowest_interest_loadable = pimpl;
+			
 			impl_count_total++;
 		}
 		
@@ -799,6 +826,22 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
 
 		total_cpu += pimpl->getCPUUsage();
 	}
+
+	// Re-calculate this every time.
+	sLowestLoadableImplInterest	= 0.0f;
+
+	// Only do this calculation if we've hit the impl count limit -- up until that point we always need to load media data.
+	if(lowest_interest_loadable && (impl_count_total >= (int)max_instances))
+	{
+		// Get the interest value of this impl's object for use by isInterestingEnough
+		LLVOVolume *object = lowest_interest_loadable->getSomeObject();
+		if(object)
+		{
+			// NOTE: Don't use getMediaInterest() here.  We want the pixel area, not the total media interest,
+			// 		so that we match up with the calculation done in LLMediaDataClient.
+			sLowestLoadableImplInterest = object->getPixelArea();
+		}
+	}
 	
 	if(gSavedSettings.getBOOL("MediaPerformanceManagerDebug"))
 	{
@@ -876,6 +919,7 @@ LLViewerMediaImpl::LLViewerMediaImpl(	  const LLUUID& texture_id,
 	mMimeTypeProbe(NULL),
 	mMediaAutoPlay(false),
 	mInNearbyMediaList(false),
+	mClearCache(false),
 	mIsUpdated(false)
 { 
 
@@ -1086,6 +1130,12 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)
 		media_source->setBrowserUserAgent(LLViewerMedia::getCurrentUserAgent());
 		media_source->focus(mHasFocus);
 		
+		if(mClearCache)
+		{
+			mClearCache = false;
+			media_source->clear_cache();
+		}
+		
 		mMediaSource = media_source;
 
 		updateVolume();
@@ -1298,6 +1348,19 @@ std::string LLViewerMediaImpl::getCurrentMediaURL()
 	return mMediaURL;
 }
 
+//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::clearCache()
+{
+	if(mMediaSource)
+	{
+		mMediaSource->clear_cache();
+	}
+	else
+	{
+		mClearCache = true;
+	}
+}
+
 //////////////////////////////////////////////////////////////////////////////////////////
 void LLViewerMediaImpl::mouseDown(S32 x, S32 y, MASK mask, S32 button)
 {
@@ -1580,7 +1643,12 @@ void LLViewerMediaImpl::navigateInternal()
 
 		if(scheme.empty() || "http" == scheme || "https" == scheme)
 		{
-			LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this), 10.0f);
+			// If we don't set an Accept header, LLHTTPClient will add one like this:
+			//    Accept: application/llsd+xml
+			// which is really not what we want.
+			LLSD headers = LLSD::emptyMap();
+			headers["Accept"] = "*/*";
+			LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this), headers, 10.0f);
 		}
 		else if("data" == scheme || "file" == scheme || "about" == scheme)
 		{
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 349a66867a1d185c1a17651107cad4c6b85d9422..28fb379960cf09edc769a8f7164e27a41d0d10b2 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -112,6 +112,8 @@ class LLViewerMedia
 		static void setInWorldMediaDisabled(bool disabled);
 		static bool getInWorldMediaDisabled();
 				
+		static bool isInterestingEnough(const LLVOVolume* object, const F64 &object_interest);
+	
 		// Returns the priority-sorted list of all media impls.
 		static impl_list &getPriorityList();
 		
@@ -186,6 +188,7 @@ public:
 	std::string getCurrentMediaURL();
 	std::string getHomeURL() { return mHomeURL; }
     void setHomeURL(const std::string& home_url) { mHomeURL = home_url; };
+	void clearCache();
 	std::string getMimeType() { return mMimeType; }
 	void scaleMouse(S32 *mouse_x, S32 *mouse_y);
 	void scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y);
@@ -353,6 +356,7 @@ public:
 	bool mMediaAutoPlay;
 	std::string mMediaEntryURL;
 	bool mInNearbyMediaList;	// used by LLFloaterNearbyMedia::refreshList() for performance reasons
+	bool mClearCache;
 	
 private:
 	BOOL mIsUpdated ;
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index f639c841e70d00bd1d5fa441ca25ad6b75a81d17..a0ac9c209175a636e87b84e834de24358bd61e1d 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -51,6 +51,7 @@
 #include "llkeyboard.h"
 #include "lltoolmgr.h"
 #include "llvovolume.h"
+#include "llhelp.h"
 
 //
 // LLViewerMediaFocus
@@ -144,9 +145,19 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
 		}
 		
 		mFocusedImplID = LLUUID::null;
-		mFocusedObjectID = LLUUID::null;
-		mFocusedObjectFace = 0;
+		if (objectp.notNull())
+		{
+			// Still record the focused object...it may mean we need to load media data.
+			// This will aid us in determining this object is "important enough"
+			mFocusedObjectID = objectp->getID();
+			mFocusedObjectFace = face;
+		}
+		else {
+			mFocusedObjectID = LLUUID::null;
+			mFocusedObjectFace = 0;
+		}
 	}
+	
 }
 
 void LLViewerMediaFocus::clearFocus()
@@ -292,7 +303,7 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent)
 	{
 		media_impl->handleKeyHere(key, mask);
 
-		if (key == KEY_ESCAPE)
+		if (KEY_ESCAPE == key)
 		{
 			// Reset camera zoom in this case.
 			if(mFocusedImplID.notNull())
@@ -305,6 +316,15 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent)
 			
 			clearFocus();
 		}
+		
+		if ( KEY_F1 == key && LLUI::sHelpImpl && mMediaControls.get())
+		{
+			std::string help_topic;
+			if (mMediaControls.get()->findHelpTopic(help_topic))
+			{
+				LLUI::sHelpImpl->showTopic(help_topic);
+			}
+		}
 	}
 	
 	return true;
@@ -336,7 +356,7 @@ BOOL LLViewerMediaFocus::handleScrollWheel(S32 x, S32 y, S32 clicks)
 
 void LLViewerMediaFocus::update()
 {
-	if(mFocusedImplID.notNull() || mFocusedObjectID.notNull())
+	if(mFocusedImplID.notNull())
 	{
 		// We have a focused impl/face.
 		if(!getFocus())
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 9683ec924bdbfd83a7ffbf1485b29961c5bfc77f..51c9a942982eacd953e11e958af03e6bc698a651 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -56,6 +56,7 @@
 #include "llfloatercustomize.h"
 #include "llfloaterchatterbox.h"
 #include "llfloatergodtools.h"
+#include "llfloaterinventory.h"
 #include "llfloaterland.h"
 #include "llfloaterpay.h"
 #include "llfloaterreporter.h"
@@ -134,11 +135,12 @@ LLMenuGL		*gPopupMenuView = NULL;
 LLMenuBarGL		*gLoginMenuBarView = NULL;
 
 // Pie menus
-LLContextMenu	*gPieSelf	= NULL;
-LLContextMenu	*gPieAvatar = NULL;
-LLContextMenu	*gPieObject = NULL;
-LLContextMenu	*gPieAttachment = NULL;
-LLContextMenu	*gPieLand	= NULL;
+LLContextMenu	*gMenuAvatarSelf	= NULL;
+LLContextMenu	*gMenuAvatarOther = NULL;
+LLContextMenu	*gMenuObject = NULL;
+LLContextMenu	*gMenuAttachmentSelf = NULL;
+LLContextMenu	*gMenuAttachmentOther = NULL;
+LLContextMenu	*gMenuLand	= NULL;
 
 const std::string SAVE_INTO_INVENTORY("Save Object Back to My Inventory");
 const std::string SAVE_INTO_TASK_INVENTORY("Save Object Back to Object Contents");
@@ -146,7 +148,6 @@ const std::string SAVE_INTO_TASK_INVENTORY("Save Object Back to Object Contents"
 LLMenuGL* gAttachSubMenu = NULL;
 LLMenuGL* gDetachSubMenu = NULL;
 LLMenuGL* gTakeOffClothes = NULL;
-LLContextMenu* gPieRate = NULL;
 LLContextMenu* gAttachScreenPieMenu = NULL;
 LLContextMenu* gAttachPieMenu = NULL;
 LLContextMenu* gAttachBodyPartPieMenus[8];
@@ -375,25 +376,31 @@ void init_menus()
 	gMenuHolder->addChild( gPopupMenuView );
 
 	///
-	/// Pie menus
+	/// Context menus
 	///
-	gPieSelf = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_pie_self.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+	const widget_registry_t& registry =
+		LLViewerMenuHolderGL::child_registry_t::instance();
+	gMenuAvatarSelf = LLUICtrlFactory::createFromFile<LLContextMenu>(
+		"menu_avatar_self.xml", gMenuHolder, registry);
+	gMenuAvatarOther = LLUICtrlFactory::createFromFile<LLContextMenu>(
+		"menu_avatar_other.xml", gMenuHolder, registry);
 
-	// TomY TODO: what shall we do about these?
 	gDetachScreenPieMenu = gMenuHolder->getChild<LLContextMenu>("Object Detach HUD", true);
 	gDetachPieMenu = gMenuHolder->getChild<LLContextMenu>("Object Detach", true);
 
-	gPieAvatar = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_pie_avatar.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-
-	gPieObject = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_pie_object.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+	gMenuObject = LLUICtrlFactory::createFromFile<LLContextMenu>(
+		"menu_object.xml", gMenuHolder, registry);
 
 	gAttachScreenPieMenu = gMenuHolder->getChild<LLContextMenu>("Object Attach HUD");
 	gAttachPieMenu = gMenuHolder->getChild<LLContextMenu>("Object Attach");
-	gPieRate = gMenuHolder->getChild<LLContextMenu>("Rate Menu");
 
-	gPieAttachment = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_pie_attachment.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+	gMenuAttachmentSelf = LLUICtrlFactory::createFromFile<LLContextMenu>(
+		"menu_attachment_self.xml", gMenuHolder, registry);
+	gMenuAttachmentOther = LLUICtrlFactory::createFromFile<LLContextMenu>(
+		"menu_attachment_other.xml", gMenuHolder, registry);
 
-	gPieLand = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_pie_land.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+	gMenuLand = LLUICtrlFactory::createFromFile<LLContextMenu>(
+		"menu_land.xml", gMenuHolder, registry);
 
 	///
 	/// set up the colors
@@ -402,12 +409,13 @@ void init_menus()
 
 	LLColor4 context_menu_color = LLUIColorTable::instance().getColor("MenuPopupBgColor");
 	
-	gPieSelf->setBackgroundColor( context_menu_color );
-	gPieAvatar->setBackgroundColor( context_menu_color );
-	gPieObject->setBackgroundColor( context_menu_color );
-	gPieAttachment->setBackgroundColor( context_menu_color );
+	gMenuAvatarSelf->setBackgroundColor( context_menu_color );
+	gMenuAvatarOther->setBackgroundColor( context_menu_color );
+	gMenuObject->setBackgroundColor( context_menu_color );
+	gMenuAttachmentSelf->setBackgroundColor( context_menu_color );
+	gMenuAttachmentOther->setBackgroundColor( context_menu_color );
 
-	gPieLand->setBackgroundColor( context_menu_color );
+	gMenuLand->setBackgroundColor( context_menu_color );
 
 	color = LLUIColorTable::instance().getColor( "MenuPopupBgColor" );
 	gPopupMenuView->setBackgroundColor( color );
@@ -626,6 +634,20 @@ class LLAdvancedCheckHUDInfo : public view_listener_t
 	}
 };
 
+
+//////////////
+// FLYING   //
+//////////////
+
+class LLAdvancedAgentFlyingInfo : public view_listener_t
+{
+	bool handleEvent(const LLSD&)
+	{
+		return gAgent.getFlying();
+	}
+};
+
+
 ///////////////////////
 // CLEAR GROUP CACHE //
 ///////////////////////
@@ -2263,20 +2285,23 @@ void cleanup_menus()
 	delete gMenuParcelObserver;
 	gMenuParcelObserver = NULL;
 
-	delete gPieSelf;
-	gPieSelf = NULL;
+	delete gMenuAvatarSelf;
+	gMenuAvatarSelf = NULL;
 
-	delete gPieAvatar;
-	gPieAvatar = NULL;
+	delete gMenuAvatarOther;
+	gMenuAvatarOther = NULL;
 
-	delete gPieObject;
-	gPieObject = NULL;
+	delete gMenuObject;
+	gMenuObject = NULL;
 
-	delete gPieAttachment;
-	gPieAttachment = NULL;
+	delete gMenuAttachmentSelf;
+	gMenuAttachmentSelf = NULL;
 
-	delete gPieLand;
-	gPieLand = NULL;
+	delete gMenuAttachmentOther;
+	gMenuAttachmentSelf = NULL;
+
+	delete gMenuLand;
+	gMenuLand = NULL;
 
 	delete gMenuBarView;
 	gMenuBarView = NULL;
@@ -2519,8 +2544,6 @@ void handle_object_edit()
 
 void handle_object_inspect()
 {
-	// Disable sidepanel inspector
-	/*
 	LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
 	LLViewerObject* selected_objectp = selection->getFirstRootObject();
 	if (selected_objectp)
@@ -2529,9 +2552,11 @@ void handle_object_inspect()
 		key["task"] = "task";
 		LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
 	}
-	*/
 
+	/*
+	// Old floater properties
 	LLFloaterReg::showInstance("inspect", LLSD());
+	*/
 }
 
 //---------------------------------------------------------------------------
@@ -2630,7 +2655,7 @@ bool enable_object_edit()
 		enable = LLViewerParcelMgr::getInstance()->allowAgentBuild()
 			|| LLSelectMgr::getInstance()->getSelection()->isAttachment();
 	} 
-	else if (LLSelectMgr::getInstance()->selectGetModify())
+	else if (LLSelectMgr::getInstance()->selectGetAllValidAndObjectsFound())
 	{
 		enable = true;
 	}
@@ -4911,7 +4936,7 @@ class LLEditDelete : public view_listener_t
 
 		// When deleting an object we may not actually be done
 		// Keep selection so we know what to delete when confirmation is needed about the delete
-		gPieObject->hide();
+		gMenuObject->hide();
 		return true;
 	}
 };
@@ -4944,7 +4969,7 @@ void handle_object_delete()
 
 		// When deleting an object we may not actually be done
 		// Keep selection so we know what to delete when confirmation is needed about the delete
-		gPieObject->hide();
+		gMenuObject->hide();
 		return;
 }
 
@@ -5586,7 +5611,15 @@ class LLShowSidetrayPanel : public view_listener_t
 	bool handleEvent(const LLSD& userdata)
 	{
 		std::string panel_name = userdata.asString();
-		LLSideTray::getInstance()->showPanel(panel_name, LLSD());
+		// Open up either the sidepanel or new floater.
+		if (LLSideTray::getInstance()->isPanelActive(panel_name))
+		{
+			LLFloaterInventory::showAgentInventory();
+		}
+		else
+		{
+			LLSideTray::getInstance()->showPanel(panel_name, LLSD());
+		}
 		return true;
 	}
 };
@@ -6006,7 +6039,7 @@ public:
 protected:
 	virtual void done()
 	{
-		gPieAttachment->buildDrawLabels();
+		gMenuAttachmentSelf->buildDrawLabels();
 		gInventory.removeObserver(this);
 		delete this;
 	}
@@ -7693,6 +7726,9 @@ void initialize_menus()
 	// Advanced Other Settings	
 	view_listener_t::addMenu(new LLAdvancedClearGroupCache(), "Advanced.ClearGroupCache");
 
+	// Advanced > Shortcuts
+	view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying");
+	
 	// Advanced > Render > Types
 	view_listener_t::addMenu(new LLAdvancedToggleRenderType(), "Advanced.ToggleRenderType");
 	view_listener_t::addMenu(new LLAdvancedCheckRenderType(), "Advanced.CheckRenderType");
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 01a6b341707bb4f28a85a63924d0c2943d497f59..d3c34f0de426943b29912b490814d543e4057906 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -36,6 +36,7 @@
 #include "llmenugl.h"
 #include "llsafehandle.h"
 
+class LLMessageSystem;
 class LLSD;
 class LLUICtrl;
 class LLView;
@@ -160,21 +161,13 @@ extern LLMenuGL*		gPopupMenuView;
 extern LLViewerMenuHolderGL*	gMenuHolder;
 extern LLMenuBarGL*		gLoginMenuBarView;
 
-// Pie menus
-extern LLContextMenu		*gPieSelf;
-extern LLContextMenu		*gPieAvatar;
-extern LLContextMenu		*gPieObject;
-extern LLContextMenu		*gPieAttachment;
-
-extern LLContextMenu		*gPieLand;
-extern LLContextMenu		*gPieRate;
-
-// Pie menus
-extern LLContextMenu	*gPieSelfSimple;
-extern LLContextMenu	*gPieAvatarSimple;
-extern LLContextMenu	*gPieObjectSimple;
-extern LLContextMenu	*gPieAttachmentSimple;
-extern LLContextMenu	*gPieLandSimple;
+// Context menus in 3D scene
+extern LLContextMenu		*gMenuAvatarSelf;
+extern LLContextMenu		*gMenuAvatarOther;
+extern LLContextMenu		*gMenuObject;
+extern LLContextMenu		*gMenuAttachmentSelf;
+extern LLContextMenu		*gMenuAttachmentOther;
+extern LLContextMenu		*gMenuLand;
 
 // Needed to build menus when attachment site list available
 extern LLMenuGL* gAttachSubMenu;
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index bb556ff87448c8c837df881661883a630ae56f98..de6fcbd8bc481882f4fde21ff56602e10c624548 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -42,6 +42,12 @@
 #include "llfloaterimportcollada.h"
 #include "llfloatermodelpreview.h"
 #include "llfloatersnapshot.h"
+#include "llimage.h"
+#include "llimagebmp.h"
+#include "llimagepng.h"
+#include "llimagej2c.h"
+#include "llimagejpeg.h"
+#include "llimagetga.h"
 #include "llinventorymodel.h"	// gInventory
 #include "llresourcedata.h"
 #include "llfloaterperms.h"
@@ -49,6 +55,8 @@
 #include "llviewercontrol.h"	// gSavedSettings
 #include "llviewertexturelist.h"
 #include "lluictrlfactory.h"
+#include "llvfile.h"
+#include "llvfs.h"
 #include "llviewerinventory.h"
 #include "llviewermenu.h"	// gMenuHolder
 #include "llviewerregion.h"
@@ -70,6 +78,7 @@
 #include "lltransactiontypes.h"
 #include "lluuid.h"
 #include "llvorbisencode.h"
+#include "message.h"
 
 // system libraries
 #include <boost/tokenizer.hpp>
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index 800325df0bd48236cd60246cadb294d00e0e8b66..71679033119ed3c250835f6c07d2a900a546d2a0 100644
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -34,6 +34,7 @@
 #define LLVIEWERMENUFILE_H
 
 #include "llfoldertype.h"
+#include "llassetstorage.h"
 #include "llinventorytype.h"
 
 class LLTransactionID;
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 0489077dc89e9d7b1b207f1916cb514f1fa25207..810bf59e412e1a919c6b7b992eb98161e28d4e7a 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -38,8 +38,14 @@
 #include "lleconomy.h"
 #include "llfloaterreg.h"
 #include "llfollowcamparams.h"
+#include "llregionhandle.h"
 #include "llsdserialize.h"
+#include "llteleportflags.h"
 #include "lltransactionflags.h"
+#include "llvfile.h"
+#include "llvfs.h"
+#include "llxfermanager.h"
+#include "mean_collision_data.h"
 
 #include "llagent.h"
 #include "llcallingcard.h"
@@ -59,7 +65,6 @@
 #include "llnearbychat.h"
 #include "llnotifications.h"
 #include "llnotificationsutil.h"
-#include "llnotify.h"
 #include "llpanelgrouplandmoney.h"
 #include "llpanelplaces.h"
 #include "llrecentpeople.h"
@@ -926,34 +931,40 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f
 void inventory_offer_mute_callback(const LLUUID& blocked_id,
 								   const std::string& first_name,
 								   const std::string& last_name,
-								   BOOL is_group)
+								   BOOL is_group, LLOfferInfo* offer = NULL)
 {
 	std::string from_name;
 	LLMute::EType type;
-
 	if (is_group)
 	{
 		type = LLMute::GROUP;
 		from_name = first_name;
 	}
+	else if(offer && offer->mFromObject)
+	{
+		//we have to block object by name because blocked_id is an id of owner
+		type = LLMute::BY_NAME;
+		from_name = offer->mFromName;
+	}
 	else
 	{
 		type = LLMute::AGENT;
 		from_name = first_name + " " + last_name;
 	}
 
-	LLMute mute(blocked_id, from_name, type);
+	// id should be null for BY_NAME mute, see  LLMuteList::add for details  
+	LLMute mute(type == LLMute::BY_NAME ? LLUUID::null : blocked_id, from_name, type);
 	if (LLMuteList::getInstance()->add(mute))
 	{
 		LLPanelBlockedList::showPanelAndSelect(blocked_id);
 	}
 
 	// purge the message queue of any previously queued inventory offers from the same source.
-	class OfferMatcher : public LLNotifyBoxView::Matcher
+	class OfferMatcher : public LLNotificationsUI::LLScreenChannel::Matcher
 	{
 	public:
 		OfferMatcher(const LLUUID& to_block) : blocked_id(to_block) {}
-		BOOL matches(const LLNotificationPtr notification) const
+		bool matches(const LLNotificationPtr notification) const
 		{
 			if(notification->getName() == "ObjectGiveItem" 
 				|| notification->getName() == "ObjectGiveItemUnknownUser"
@@ -966,7 +977,9 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id,
 	private:
 		const LLUUID& blocked_id;
 	};
-	gNotifyBoxView->purgeMessagesMatching(OfferMatcher(blocked_id));
+
+	LLNotificationsUI::LLChannelManager::getInstance()->killToastsFromChannel(LLUUID(
+			gSavedSettings.getString("NotificationChannelUUID")), OfferMatcher(blocked_id));
 }
 
 LLOfferInfo::LLOfferInfo(const LLSD& sd)
@@ -1062,7 +1075,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
 	// * we can't build two messages at once.
 	if (2 == button)
 	{
-		gCacheName->get(mFromID, mFromGroup, &inventory_offer_mute_callback);
+		gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,_4,this));
 	}
 
 	std::string from_string; // Used in the pop-up.
@@ -1196,7 +1209,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
 	// * we can't build two messages at once.
 	if (2 == button)
 	{
-		gCacheName->get(mFromID, mFromGroup, &inventory_offer_mute_callback);
+		gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,_4,this));
 	}
 	
 	LLMessageSystem* msg = gMessageSystem;
@@ -1473,6 +1486,8 @@ void inventory_offer_handler(LLOfferInfo* info)
 		// Note: sets inventory_task_offer_callback as the callback
 		p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_task_offer_callback, info, _1, _2));
 		p.name = name_found ? "ObjectGiveItem" : "ObjectGiveItemUnknownUser";
+		// Pop up inv offer chiclet and let the user accept (keep), or reject (and silently delete) the inventory.
+		LLNotifications::instance().add(p);
 	}
 	else // Agent -> Agent Inventory Offer
 	{
@@ -1496,18 +1511,14 @@ void inventory_offer_handler(LLOfferInfo* info)
 		
 		// In viewer 2 we're now auto receiving inventory offers and messaging as such (not sending reject messages).
 		info->send_auto_receive_response();
-	}
 
-	// Pop up inv offer notification and let the user accept (keep), or reject (and silently delete) the inventory.
-	LLNotifications::instance().add(p);
-
-	// TODO(EM): Recheck this after we will know how script notifications should look like.
-	// Inform user that there is a script floater via toast system
-	// {
-	// 	payload["give_inventory_notification"] = TRUE;
-	// 	LLNotificationPtr notification = LLNotifications::instance().add(p.payload(payload)); 
-	// 	LLScriptFloaterManager::getInstance()->setNotificationToastId(object_id, notification->getID());
-	// }
+		// Inform user that there is a script floater via toast system
+		{
+			payload["give_inventory_notification"] = TRUE;
+			LLNotificationPtr notification = LLNotifications::instance().add(p.payload(payload)); 
+			LLScriptFloaterManager::getInstance()->setNotificationToastId(object_id, notification->getID());
+		}
+	}
 }
 
 bool lure_callback(const LLSD& notification, const LLSD& response)
@@ -4834,24 +4845,25 @@ bool script_question_cb(const LLSD& notification, const LLSD& response)
 		LLMuteList::getInstance()->add(LLMute(item_id, notification["payload"]["object_name"].asString(), LLMute::OBJECT));
 
 		// purge the message queue of any previously queued requests from the same source. DEV-4879
-		class OfferMatcher : public LLNotifyBoxView::Matcher
+		class OfferMatcher : public LLNotificationsUI::LLScreenChannel::Matcher
 		{
 		public:
 			OfferMatcher(const LLUUID& to_block) : blocked_id(to_block) {}
-			BOOL matches(const LLNotificationPtr notification) const
+			bool matches(const LLNotificationPtr notification) const
 			{
 				if (notification->getName() == "ScriptQuestionCaution"
 					|| notification->getName() == "ScriptQuestion")
 				{
 					return (notification->getPayload()["item_id"].asUUID() == blocked_id);
 				}
-				return FALSE;
+				return false;
 			}
 		private:
 			const LLUUID& blocked_id;
 		};
-		// should do this via the channel
-		gNotifyBoxView->purgeMessagesMatching(OfferMatcher(item_id));
+
+		LLNotificationsUI::LLChannelManager::getInstance()->killToastsFromChannel(LLUUID(
+				gSavedSettings.getString("NotificationChannelUUID")), OfferMatcher(item_id));
 	}
 
 	if (response["Details"])
@@ -5295,6 +5307,7 @@ void send_group_notice(const LLUUID& group_id,
 bool handle_lure_callback(const LLSD& notification, const LLSD& response)
 {
 	std::string text = response["message"].asString();
+	text.append("\r\n").append(LLAgentUI::buildSLURL());
 	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	if(0 == option)
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index 1a98828010f8e1ac2f0bb6e7b32589139cc29a0f..8404d6fde026b097b038ebcbd87077c76142e0a7 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -33,10 +33,12 @@
 #ifndef LL_LLVIEWERMESSAGE_H
 #define LL_LLVIEWERMESSAGE_H
 
+#include "llassettype.h"
 #include "llinstantmessage.h"
 #include "llpointer.h"
 #include "lltransactiontypes.h"
 #include "lluuid.h"
+#include "message.h"
 #include "stdenums.h"
 
 //
@@ -47,6 +49,7 @@ class LLInventoryObject;
 class LLInventoryItem;
 class LLMeanCollisionData;
 class LLMessageSystem;
+class LLVFS;
 class LLViewerObject;
 class LLViewerRegion;
 
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 801c46035a20e2c438d23c9b8c70ba2edb67cd54..d7b55d7e978ef571c951f87edd9374ee3d761dec 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -34,8 +34,11 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "llviewernetwork.h"
-#include "llviewercontrol.h"
+
 #include "llevents.h"
+#include "net.h"
+
+#include "llviewercontrol.h"
 #include "lllogin.h"
 
 struct LLGridData
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 7a1abfd4e84597eaa6e5d65e8656d80b5f588c34..be68a2ef42e7674c74b9fb196ae8d609c0aef0e3 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -54,7 +54,6 @@
 #include "llfloatergroups.h"
 #include "llfloatersellland.h"
 #include "llfloatertools.h"
-#include "llnotify.h"
 #include "llparcelselection.h"
 #include "llresmgr.h"
 #include "llsdutil.h"
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index 6a0ad5757f2579dc6eb84527a86c05f00aea3b8a..50f905416c845997f4a5ba817bfbf857d37d73ce 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -41,17 +41,6 @@
 
 #include "linden_common.h"
 
-// We may want to take the windows.h include out, but it used to be in 
-// linden_common.h, and hence in all the libraries.  This is better. JC
-#if LL_WINDOWS
-	// Limit Windows API to small and manageable set.
-	// If you get undefined symbols, find the appropriate
-	// Windows header file and include that in your .cpp file.
-	#define WIN32_LEAN_AND_MEAN
-	#include <winsock2.h>
-	#include <windows.h>
-#endif
-
 // Work around stupid Microsoft STL warning
 #ifdef LL_WINDOWS
 #pragma warning (disable : 4702) // warning C4702: unreachable code
@@ -76,21 +65,14 @@
 //#include "llpreprocessor.h"
 #include "llallocator.h"
 #include "llapp.h"
-#include "llapr.h"
 #include "llcriticaldamp.h"
-//#include "lldarray.h"
-//#include "lldarrayptr.h"
 #include "lldefs.h"
 #include "lldepthstack.h"
-//#include "lldqueueptr.h"
-#include "llendianswizzle.h"
 #include "llerror.h"
 #include "llfasttimer.h"
 #include "llframetimer.h"
 #include "llhash.h"
 #include "lllocalidhashmap.h"
-#include "llmap.h"
-//#include "llmemory.h"
 #include "llnametable.h"
 #include "llpointer.h"
 #include "llpriqueuemap.h"
@@ -100,7 +82,6 @@
 //#include "llsecondlifeurls.h"
 #include "llsd.h"
 #include "llsingleton.h"
-#include "llstack.h"
 #include "llstat.h"
 #include "llstl.h"
 #include "llstrider.h"
@@ -117,19 +98,7 @@
 #include "timing.h"
 #include "u64.h"
 
-// Library includes from llimage
-//#include "llblockdata.h"
-#include "llimage.h"
-#include "llimagebmp.h"
-#include "llimagepng.h"
-#include "llimagej2c.h"
-#include "llimagejpeg.h"
-#include "llimagetga.h"
-#include "llmapimagetype.h"
-
 // Library includes from llmath project
-//#include "camera.h"
-//#include "coordframe.h"
 #include "llmath.h"
 #include "llbboxlocal.h"
 #include "llcamera.h"
@@ -157,80 +126,11 @@
 ////#include "vmath.h"
 #include "xform.h"
 
-// Library includes from llmessage project
-//#include "llassetstorage.h"
-#include "llcachename.h"
-#include "llcircuit.h"
-#include "lldatapacker.h"
-#include "lldbstrings.h"
-#include "lldispatcher.h"
-#include "lleventflags.h"
-#include "llhost.h"
-#include "llinstantmessage.h"
-#include "llinvite.h"
-//#include "llloginflags.h"
-#include "llmail.h"
-#include "llmessagethrottle.h"
-#include "llnamevalue.h"
-#include "llpacketack.h"
-#include "llpacketbuffer.h"
-#include "llpacketring.h"
-#include "llpartdata.h"
-//#include "llqueryflags.h"
-//#include "llregionflags.h"
-#include "llregionhandle.h"
-#include "lltaskname.h"
-#include "llteleportflags.h"
-#include "llthrottle.h"
-#include "lltransfermanager.h"
-#include "lltransfersourceasset.h"
-#include "lltransfersourcefile.h"
-#include "lltransfertargetfile.h"
-#include "lltransfertargetvfile.h"
-#include "lluseroperation.h"
-#include "llvehicleparams.h"
-#include "llxfer.h"
-#include "llxfer_file.h"
-#include "llxfer_mem.h"
-#include "llxfer_vfile.h"
-#include "llxfermanager.h"
-#include "machine.h"
-#include "mean_collision_data.h"
-#include "message.h"
-#include "message_prehash.h"
-#include "net.h"
-//#include "network.h"
-#include "partsyspacket.h"
-#include "patch_code.h"
-#include "patch_dct.h"
-#include "sound_ids.h"
-
-// Builds work with all headers below commented out as of 2009-09-10 JC
-
-// Library includes from llprimitive
-#include "imageids.h"
-#include "legacy_object_types.h"
-#include "llmaterialtable.h"
-//#include "llprimitive.h"
-#include "lltextureanim.h"
-//#include "lltextureentry.h"
-#include "lltreeparams.h"
-//#include "llvolume.h"
-#include "llvolumemgr.h"
-#include "material_codes.h"
-
 // Library includes from llvfs
-#include "llassettype.h"
 #include "lldir.h"
-//#include "lldir_linux.h"
-//#include "lldir_mac.h"
-//#include "lldir_win32.h"
-#include "llvfile.h"
-#include "llvfs.h"
 
-// Library includes from llui
-// In skinning-7, llui.h dependencies are changing too often.
-//#include "llui.h"
+// Library includes from llmessage project
+#include "llcachename.h"
 
 // llxuixml
 #include "llinitparam.h"
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 939d5e3970dff8b12f36ae38f81b68ead2bde7e1..a1a3bc6d6a05299a5ea334b19c48ef32868a2e68 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -39,6 +39,7 @@
 #include "llfloaterreg.h"
 #include "llmemory.h"
 #include "lltimer.h"
+#include "llvfile.h"
 
 #include "llappviewer.h"
 
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 80b8999a7aeb30507022a3aca7614ac92d107692..b0a9ee0dc5213989f95cd821f0acf5b4ce257c8f 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -51,7 +51,6 @@
 #include "llmenugl.h"
 #include "llnotecard.h"
 #include "llnotificationsutil.h"
-#include "llnotify.h"
 #include "llpanelplaces.h"
 #include "llpreview.h"
 #include "llpreviewnotecard.h"
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index c9558860dbefd88923dd70b5fc152c35aaec4b49..2b97642736659d42d2dd866189f421e76eb9a3b3 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -108,6 +108,19 @@ const F64 log_2 = log(2.0);
 //----------------------------------------------------------------------------------------------
 //namespace: LLViewerTextureAccess
 //----------------------------------------------------------------------------------------------
+
+LLLoadedCallbackEntry::LLLoadedCallbackEntry(loaded_callback_func cb,
+					  S32 discard_level,
+					  BOOL need_imageraw, // Needs image raw for the callback
+					  void* userdata ) 
+	: mCallback(cb),
+	  mLastUsedDiscard(MAX_DISCARD_LEVEL+1),
+	  mDesiredDiscard(discard_level),
+	  mNeedsImageRaw(need_imageraw),
+	  mUserData(userdata)
+{
+}
+
 LLViewerMediaTexture* LLViewerTextureManager::createMediaTexture(const LLUUID &media_id, BOOL usemipmaps, LLImageGL* gl_image)
 {
 	return new LLViewerMediaTexture(media_id, usemipmaps, gl_image) ;		
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index bf4b1cf800de1a2815ca0e61728706695483b55e..548451723dd53794d107c12ba82e91ee323f6b93 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -49,12 +49,14 @@
 
 class LLFace;
 class LLImageGL ;
+class LLImageRaw;
 class LLViewerObject;
 class LLViewerTexture;
 class LLViewerFetchedTexture ;
 class LLViewerMediaTexture ;
 class LLTexturePipelineTester ;
 
+
 typedef	void	(*loaded_callback_func)( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
 
 class LLVFile;
@@ -68,14 +70,7 @@ public:
 	LLLoadedCallbackEntry(loaded_callback_func cb,
 						  S32 discard_level,
 						  BOOL need_imageraw, // Needs image raw for the callback
-						  void* userdata ) 
-		: mCallback(cb),
-		  mLastUsedDiscard(MAX_DISCARD_LEVEL+1),
-		  mDesiredDiscard(discard_level),
-		  mNeedsImageRaw(need_imageraw),
-		  mUserData(userdata)
-	{
-	}
+						  void* userdata );
 
 	loaded_callback_func	mCallback;
 	S32						mLastUsedDiscard;
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index e066546bd8108b8428d228c828576428b9cc4871..8252b7df003910c33844e85b46c6e4a112a08023 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -588,7 +588,7 @@ void LLViewerTextureList::updateImages(F32 max_time)
 	F32 total_max_time = max_time;
 	max_time -= updateImagesFetchTextures(max_time);
 	
-	max_time = llmax(max_time, total_max_time*.25f); // at least 25% of max_time
+	max_time = llmax(max_time, total_max_time*.50f); // at least 50% of max_time
 	max_time -= updateImagesCreateTextures(max_time);
 	
 	if (!mDirtyTextureList.empty())
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index 028f8441ab0a44f48dadbe2dd38f580ca8ad5018..ab55bfd04d99093a54b7d1aa97149fa49f197410 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -53,6 +53,7 @@ const BOOL GL_TEXTURE_NO = FALSE;
 const BOOL IMMEDIATE_YES = TRUE;
 const BOOL IMMEDIATE_NO = FALSE;
 
+class LLImageJ2C;
 class LLMessageSystem;
 class LLTextureView;
 
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index a532c9da6496b6747f88b07d1f30601e17a44a3e..e06d7ec5d32d6ad459cc25c2d66e5dd539b38357 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -32,6 +32,8 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llviewerwindow.h"
+
 #if LL_WINDOWS
 #pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
 #endif
@@ -46,7 +48,6 @@
 #include "llpanellogin.h"
 #include "llviewerkeyboard.h"
 #include "llviewermenu.h"
-#include "llviewerwindow.h"
 
 #include "llviewquery.h"
 #include "llxmltree.h"
@@ -82,7 +83,6 @@
 
 // newview includes
 #include "llagent.h"
-#include "llalertdialog.h"
 #include "llbox.h"
 #include "llconsole.h"
 #include "llviewercontrol.h"
@@ -129,7 +129,6 @@
 #include "llmorphview.h"
 #include "llmoveview.h"
 #include "llnavigationbar.h"
-#include "llnotify.h"
 #include "lloverlaybar.h"
 #include "llpreviewtexture.h"
 #include "llprogressview.h"
@@ -259,19 +258,21 @@ public:
 	virtual void recordMessage(LLError::ELevel level,
 								const std::string& message)
 	{
-		// only log warnings to chat console
-		if (level == LLError::LEVEL_WARN)
-		{
-			LLFloaterChat* chat_floater = LLFloaterReg::findTypedInstance<LLFloaterChat>("chat");
-			if (chat_floater && gSavedSettings.getBOOL("WarningsAsChat"))
-			{
-				LLChat chat;
-				chat.mText = message;
-				chat.mSourceType = CHAT_SOURCE_SYSTEM;
+		//FIXME: this is NOT thread safe, and will do bad things when a warning is issued from a non-UI thread
 
-				chat_floater->addChat(chat, FALSE, FALSE);
-			}
-		}
+		// only log warnings to chat console
+		//if (level == LLError::LEVEL_WARN)
+		//{
+			//LLFloaterChat* chat_floater = LLFloaterReg::findTypedInstance<LLFloaterChat>("chat");
+			//if (chat_floater && gSavedSettings.getBOOL("WarningsAsChat"))
+			//{
+			//	LLChat chat;
+			//	chat.mText = message;
+			//	chat.mSourceType = CHAT_SOURCE_SYSTEM;
+
+			//	chat_floater->addChat(chat, FALSE, FALSE);
+			//}
+		//}
 	}
 };
 
@@ -1450,7 +1451,6 @@ void LLViewerWindow::initBase()
 
 	gDebugView = getRootView()->getChild<LLDebugView>("DebugView");
 	gDebugView->init();
-	gNotifyBoxView = getRootView()->getChild<LLNotifyBoxView>("notify_container");
 	gToolTipView = getRootView()->getChild<LLToolTipView>("tooltip view");
 
 	// Add the progress bar view (startup view), which overrides everything
@@ -1529,12 +1529,12 @@ void LLViewerWindow::initWorldUI()
 	
 	if (!gSavedSettings.getBOOL("ShowNavbarNavigationPanel"))
 	{
-		toggle_show_navigation_panel(LLSD(0));
+		navbar->showNavigationPanel(FALSE);
 	}
 
 	if (!gSavedSettings.getBOOL("ShowNavbarFavoritesPanel"))
 	{
-		toggle_show_favorites_panel(LLSD(0));
+		navbar->showFavoritesPanel(FALSE);
 	}
 
 	if (!gSavedSettings.getBOOL("ShowCameraButton"))
@@ -1628,8 +1628,6 @@ void LLViewerWindow::shutdownViews()
 	gMorphView = NULL;
 
 	gHUDView = NULL;
-
-	gNotifyBoxView = NULL;
 }
 
 void LLViewerWindow::shutdownGL()
@@ -1997,9 +1995,6 @@ void LLViewerWindow::draw()
 #if LL_DEBUG
 	LLView::sIsDrawing = FALSE;
 #endif
-	
-	// UI post-draw Updates
-	gNotifyBoxView->updateNotifyBoxView();	
 }
 
 // Takes a single keydown event, usually when UI is visible
@@ -2595,7 +2590,6 @@ void LLViewerWindow::updateUI()
 				else if (dynamic_cast<LLUICtrl*>(viewp) 
 						&& viewp != gMenuHolder
 						&& viewp != gFloaterView
-						&& viewp != gNotifyBoxView
 						&& viewp != gConsole) 
 				{
 					if (dynamic_cast<LLFloater*>(viewp))
@@ -3140,7 +3134,6 @@ void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback
 		return;
 	}
 	
-	// push back pick info object
 	BOOL in_build_mode = LLFloaterReg::instanceVisible("build");
 	if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha)
 	{
@@ -3149,27 +3142,8 @@ void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback
 		pick_transparent = TRUE;
 	}
 
-	// center initial pick frame buffer region under mouse cursor
-	// since that area is guaranteed to be onscreen and hence a valid
-	// part of the framebuffer
-	if (mPicks.empty())
-	{
-		mPickScreenRegion.setCenterAndSize(x, y_from_bot, PICK_DIAMETER, PICK_DIAMETER);
-
-		if (mPickScreenRegion.mLeft < mWorldViewRectScaled.mLeft) mPickScreenRegion.translate(mWorldViewRectScaled.mLeft - mPickScreenRegion.mLeft, 0);
-		if (mPickScreenRegion.mBottom < mWorldViewRectScaled.mBottom) mPickScreenRegion.translate(0, mWorldViewRectScaled.mBottom - mPickScreenRegion.mBottom);
-		if (mPickScreenRegion.mRight > mWorldViewRectScaled.mRight ) mPickScreenRegion.translate(mWorldViewRectScaled.mRight - mPickScreenRegion.mRight, 0);
-		if (mPickScreenRegion.mTop > mWorldViewRectScaled.mTop ) mPickScreenRegion.translate(0, mWorldViewRectScaled.mTop - mPickScreenRegion.mTop);
-	}
-
-	// set frame buffer region for picking results
-	// stack multiple picks left to right
-	LLRect screen_region = mPickScreenRegion;
-	screen_region.translate(mPicks.size() * PICK_DIAMETER, 0);
-
-	LLPickInfo pick(LLCoordGL(x, y_from_bot), screen_region, mask, pick_transparent, TRUE, callback);
-
-	schedulePick(pick);
+	LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, TRUE, callback);
+	schedulePick(pick_info);
 }
 
 void LLViewerWindow::schedulePick(LLPickInfo& pick_info)
@@ -3184,10 +3158,11 @@ void LLViewerWindow::schedulePick(LLPickInfo& pick_info)
 	
 		return;
 	}
-	llassert_always(pick_info.mScreenRegion.notEmpty());
 	mPicks.push_back(pick_info);
 	
 	// delay further event processing until we receive results of pick
+	// only do this for async picks so that handleMouseUp won't be called
+	// until the pick triggered in handleMouseDown has been processed, for example
 	mWindow->delayInputProcessing();
 }
 
@@ -3235,20 +3210,18 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_trans
 		return LLPickInfo();
 	}
 
-	pickAsync(x, y_from_bot, gKeyboard->currentMask(TRUE), NULL, pick_transparent);
-	// assume that pickAsync put the results in the back of the mPicks list
-	if(mPicks.size() != 0)
-	{
-		mLastPick = mPicks.back();
-		mLastPick.fetchResults();
-		mPicks.pop_back();
-	}
-	else
+	BOOL in_build_mode = LLFloaterReg::instanceVisible("build");
+	if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha)
 	{
-		lldebugs << "List of last picks is empty: Using stub pick" << llendl;
-		mLastPick = LLPickInfo();
+		// build mode allows interaction with all transparent objects
+		// "Show Debug Alpha" means no object actually transparent
+		pick_transparent = TRUE;
 	}
 
+	// shortcut queueing in mPicks and just update mLastPick in place
+	mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), gKeyboard->currentMask(TRUE), pick_transparent, TRUE, NULL);
+	mLastPick.fetchResults();
+
 	return mLastPick;
 }
 
@@ -4761,13 +4734,11 @@ LLPickInfo::LLPickInfo()
 }
 
 LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos, 
-					   const LLRect& screen_region,
 						MASK keyboard_mask, 
 						BOOL pick_transparent,
 						BOOL pick_uv_coords,
 						void (*pick_callback)(const LLPickInfo& pick_info))
 	: mMousePt(mouse_pos),
-	  mScreenRegion(screen_region),
 	  mKeyMask(keyboard_mask),
 	  mPickCallback(pick_callback),
 	  mPickType(PICK_INVALID),
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 1d564a133835c2e867cefbb320bb8f69ffde31e5..b488276a18e07073a4be86fd75e9336270a2dd99 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -50,6 +50,7 @@
 #include "llmousehandler.h"
 #include "llcursortypes.h"
 #include "llhandle.h"
+#include "llimage.h"
 
 #include <boost/function.hpp>
 #include <boost/signals2.hpp>
@@ -88,7 +89,6 @@ public:
 public:
 	LLPickInfo();
 	LLPickInfo(const LLCoordGL& mouse_pos, 
-		const LLRect& screen_region,
 		MASK keyboard_mask, 
 		BOOL pick_transparent, 
 		BOOL pick_surface_info,
@@ -120,7 +120,6 @@ public:
 	LLVector3		mNormal;
 	LLVector3		mBinormal;
 	BOOL			mPickTransparent;
-	LLRect			mScreenRegion;
 	void		    getSurfaceInfo();
 
 private:
@@ -345,7 +344,6 @@ public:
 	void			performPick();
 	void			returnEmptyPicks();
 
-
 	void			pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& pick_info), BOOL pick_transparent = FALSE);
 	LLPickInfo		pickImmediate(S32 x, S32 y, BOOL pick_transparent);
 	LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth,
@@ -397,7 +395,7 @@ public:
 private:
 	bool                    shouldShowToolTipFor(LLMouseHandler *mh);
 	static bool onAlert(const LLSD& notify);
-	
+
 	void			switchToolByMask(MASK mask);
 	void			destroyWindow();
 	void			drawMouselookInstructions();
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 226d85ec9904526a7cc95ddab77da0ba3038ffc9..6e93bf1bf272dbb391f796d6ea84424baf39f516 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -45,6 +45,7 @@
 
 #include "llaudioengine.h"
 #include "noise.h"
+#include "sound_ids.h"
 
 #include "llagent.h" //  Get state values from here
 #include "llagentwearables.h"
@@ -64,7 +65,6 @@
 #include "llkeyframewalkmotion.h"
 #include "llmutelist.h"
 #include "llmoveview.h"
-#include "llnotify.h"
 #include "llquantize.h"
 #include "llregionhandle.h"
 #include "llresmgr.h"
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index b4c45c23d4bf65d75aae92bce0159dc0c74d8067..ecd6b05ded23b911a70b372391bea3a50f7ddee2 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -2021,43 +2021,6 @@ void LLVOAvatarSelf::onCustomizeEnd()
 	}
 }
 
-// static
-void LLVOAvatarSelf::onChangeSelfInvisible(BOOL newvalue)
-{
-	LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
-	if (avatarp)
-	{
-		if (newvalue)
-		{
-			// we have just requested to set the avatar's baked textures to invisible
-			avatarp->setInvisible(TRUE);
-		}
-		else
-		{
-			avatarp->setInvisible(FALSE);
-		}
-	}
-}
-
-void LLVOAvatarSelf::setInvisible(BOOL newvalue)
-{
-	if (newvalue)
-	{
-		setCompositeUpdatesEnabled(FALSE);
-		for (U32 i = 0; i < mBakedTextureDatas.size(); i++ )
-		{
-			setNewBakedTexture(mBakedTextureDatas[i].mTextureIndex, IMG_INVISIBLE);
-		}
-		gAgent.sendAgentSetAppearance();
-	}
-	else
-	{
-		setCompositeUpdatesEnabled(TRUE);
-		invalidateAll();
-		gAgent.sendAgentSetAppearance();
-	}
-}
-
 // HACK: this will null out the avatar's local texture IDs before the TE message is sent
 //       to ensure local texture IDs are not sent to other clients in the area.
 //       this is a short-term solution. The long term solution will be to not set the texture
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index c7bd4eaadc4e5ae792a5f9e7347d42a942331753..dc70996f0b3a30c6ac47a625a83119e3cd6e7946 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -308,8 +308,6 @@ public:
 	// Visibility
 	//--------------------------------------------------------------------
 public:
-	static void		onChangeSelfInvisible(BOOL newvalue);
-	void			setInvisible(BOOL newvalue);
 	bool			sendAppearanceMessage(LLMessageSystem *mesgsys) const;
 
 /**                    Appearance
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 175b6f1d1072e239438972b9fb18b1b52c59a1b3..60a2c3b638949482cb05a23acc788990c7fc4e80 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -122,6 +122,7 @@ LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& sess
 	mSessionID(session_id), 
 	mState(STATE_NO_CHANNEL_INFO), 
 	mSessionName(session_name),
+	mCallDirection(OUTGOING_CALL),
 	mIgnoreNextSessionLeave(FALSE)
 {
 	mNotifyArgs["VOICE_CHANNEL_NAME"] = mSessionName;
@@ -228,7 +229,6 @@ void LLVoiceChannel::handleStatusChange(EStatusType type)
 		{
 			// if forceably removed from channel
 			// update the UI and revert to default channel
-			LLNotificationsUtil::add("VoiceChannelDisconnected", mNotifyArgs);
 			deactivate();
 		}
 		mIgnoreNextSessionLeave = FALSE;
@@ -405,7 +405,7 @@ void LLVoiceChannel::doSetState(const EState& new_state)
 	EState old_state = mState;
 	mState = new_state;
 	if (!mStateChangedCallback.empty())
-		mStateChangedCallback(old_state, mState);
+		mStateChangedCallback(old_state, mState, mCallDirection);
 }
 
 //static
@@ -740,6 +740,7 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
 	case STATUS_LEFT_CHANNEL:
 		if (callStarted() && !mIgnoreNextSessionLeave && !sSuspended)
 		{
+			// *TODO: use it to show DECLINE voice notification
 			if (mState == STATE_RINGING)
 			{
 				// other user declined call
@@ -747,8 +748,7 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
 			}
 			else
 			{
-				// other user hung up
-				LLNotificationsUtil::add("VoiceChannelDisconnectedP2P", mNotifyArgs);
+				// other user hung up				
 			}
 			deactivate();
 		}
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index 1bed329ba2e0d3d63b1ffa60854e3a6103149c45..77801142cbb4989b1be60868910b877914f5550c 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -52,7 +52,13 @@ public:
 		STATE_CONNECTED
 	} EState;
 
-	typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state)> state_changed_signal_t;
+	typedef enum e_voice_channel_direction
+	{
+		INCOMING_CALL,
+		OUTGOING_CALL
+	} EDirection;
+
+	typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction)> state_changed_signal_t;
 
 	// on current channel changed signal
 	typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t;
@@ -87,6 +93,9 @@ public:
 	void updateSessionID(const LLUUID& new_session_id);
 	const LLSD& getNotifyArgs() { return mNotifyArgs; }
 
+	void setCallDirection(EDirection direction) {mCallDirection = direction;}
+	EDirection getCallDirection() {return mCallDirection;}
+
 	static LLVoiceChannel* getChannelByID(const LLUUID& session_id);
 	static LLVoiceChannel* getChannelByURI(std::string uri);
 	static LLVoiceChannel* getCurrentVoiceChannel() { return sCurrentVoiceChannel; }
@@ -103,6 +112,9 @@ protected:
 	void doSetState(const EState& state);
 	void setURI(std::string uri);
 
+	// there can be two directions ICOMING and OUTGOING
+	EDirection mCallDirection;
+
 	std::string	mURI;
 	std::string	mCredentials;
 	LLUUID		mSessionID;
@@ -175,9 +187,6 @@ public:
 
 	void setSessionHandle(const std::string& handle, const std::string &inURI);
 
-	// returns TRUE if call is incoming and FALSE otherwise
-	BOOL isIncomingCall() { return mReceivedCall; }
-
 protected:
 	virtual void setState(EState state);
 
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index aa69b46857988168d9ef20ddfe53d247d2508e81..cfa1f05ec0089157c566f8bb5b9ce642601dd1e0 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -113,23 +113,15 @@ static void setUUIDFromStringHash(LLUUID &uuid, const std::string &str)
 static int scale_mic_volume(float volume)
 {
 	// incoming volume has the range [0.0 ... 2.0], with 1.0 as the default.
-	// Map it as follows: 0.0 -> 40, 1.0 -> 44, 2.0 -> 75
-
-	volume -= 1.0f;		// offset volume to the range [-1.0 ... 1.0], with 0 at the default.
-	int scaled_volume = 44;	// offset scaled_volume by its default level
-	if(volume < 0.0f)
-		scaled_volume += ((int)(volume * 4.0f));	// (44 - 40)
-	else
-		scaled_volume += ((int)(volume * 31.0f));	// (75 - 44)
-	
-	return scaled_volume;
+	// Map it to Vivox levels as follows: 0.0 -> 30, 1.0 -> 50, 2.0 -> 70
+	return 30 + (int)(volume * 20.0f);
 }
 
 static int scale_speaker_volume(float volume)
 {
 	// incoming volume has the range [0.0 ... 1.0], with 0.5 as the default.
-	// Map it as follows: 0.0 -> 0, 0.5 -> 50, 1.0 -> 100
-	return (int)(volume * 100.0f);
+	// Map it to Vivox levels as follows: 0.0 -> 30, 0.5 -> 50, 1.0 -> 70
+	return 30 + (int)(volume * 40.0f);
 }
 
 class LLViewerVoiceAccountProvisionResponder :
@@ -4271,7 +4263,6 @@ void LLVoiceClient::mediaStreamUpdatedEvent(
 				{
 					// Send the voice chat invite to the GUI layer
 					// *TODO: Question: Should we correlate with the mute list here?
-					session->mIncoming = true;
 					session->mIMSessionID = LLIMMgr::computeSessionID(IM_SESSION_P2P_INVITE, session->mCallerID);
 					session->mVoiceInvitePending = true;
 					if(session->mName.empty())
@@ -6346,20 +6337,6 @@ LLVoiceClient::sessionState *LLVoiceClient::findSession(const LLUUID &participan
 	return result;
 }
 
-bool LLVoiceClient::isSessionIncoming(const LLUUID &session_id)
-{
-	for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
-	{
-		sessionState *session = *iter;
-		if(session->mIMSessionID == session_id)
-		{
-			return session->mIncoming;
-			break;
-		}
-	}
-	return false;
-}
-
 LLVoiceClient::sessionState *LLVoiceClient::addSession(const std::string &uri, const std::string &handle)
 {
 	sessionState *result = NULL;
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index 92e79a004d8973d69455fa557b0239ed27a142d9..347fae6156b9d45e571d0e49c8757c15d2b1d4ad 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -125,7 +125,7 @@ class LLVoiceClient: public LLSingleton<LLVoiceClient>
 		void tuningCaptureStartSendMessage(int duration);
 		void tuningCaptureStopSendMessage();
 		
-		void tuningSetMicVolume(float volume=0.5f);
+		void tuningSetMicVolume(float volume);
 		void tuningSetSpeakerVolume(float volume);
 		float tuningGetEnergy(void);
 				
@@ -527,8 +527,6 @@ static	void updatePosition(void);
 		// Currently this will be false only for PSTN P2P calls.
 		// NOTE: this will return true if the session can't be found. 
 		bool isSessionTextIMPossible(const LLUUID &session_id);
-
-		bool isSessionIncoming(const LLUUID &session_id);
 		
 	private:
 
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 60294ccb2697ed4899d53b9d827380a3cae31382..cba99b034befce0bf6a410b60b763e2b296d6d74 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -72,6 +72,7 @@
 #include "llmediadataclient.h"
 #include "llmeshrepository.h"
 #include "llagent.h"
+#include "llviewermediafocus.h"
 
 const S32 MIN_QUIET_FRAMES_COALESCE = 30;
 const F32 FORCE_SIMPLE_RENDER_AREA = 512.f;
@@ -148,8 +149,7 @@ public:
 		}
 	virtual bool isInterestingEnough() const
 		{
-			// TODO: use performance manager to control this
-			return true;
+			return LLViewerMedia::isInterestingEnough(mObject, getMediaInterest());
 		}
 
 	virtual std::string getCapabilityUrl(const std::string &name) const
@@ -214,8 +214,8 @@ void LLVOVolume::markDead()
 	if (!mDead)
 	{
 		LLMediaDataClientObject::ptr_t obj = new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false);
-		sObjectMediaClient->removeFromQueue(obj);
-		sObjectMediaNavigateClient->removeFromQueue(obj);
+		if (sObjectMediaClient) sObjectMediaClient->removeFromQueue(obj);
+		if (sObjectMediaNavigateClient) sObjectMediaNavigateClient->removeFromQueue(obj);
 		
 		// Detach all media impls from this object
 		for(U32 i = 0 ; i < mMediaImplList.size() ; i++)
@@ -232,15 +232,18 @@ void LLVOVolume::markDead()
 void LLVOVolume::initClass()
 {
 	// gSavedSettings better be around
-	const F32 queue_timer_delay = gSavedSettings.getF32("PrimMediaRequestQueueDelay");
-	const F32 retry_timer_delay = gSavedSettings.getF32("PrimMediaRetryTimerDelay");
-	const U32 max_retries = gSavedSettings.getU32("PrimMediaMaxRetries");
-	const U32 max_sorted_queue_size = gSavedSettings.getU32("PrimMediaMaxSortedQueueSize");
-	const U32 max_round_robin_queue_size = gSavedSettings.getU32("PrimMediaMaxRoundRobinQueueSize");
-    sObjectMediaClient = new LLObjectMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries, 
-													 max_sorted_queue_size, max_round_robin_queue_size);
-    sObjectMediaNavigateClient = new LLObjectMediaNavigateClient(queue_timer_delay, retry_timer_delay, 
-																 max_retries, max_sorted_queue_size, max_round_robin_queue_size);
+	if (gSavedSettings.getBOOL("PrimMediaMasterEnabled"))
+	{
+		const F32 queue_timer_delay = gSavedSettings.getF32("PrimMediaRequestQueueDelay");
+		const F32 retry_timer_delay = gSavedSettings.getF32("PrimMediaRetryTimerDelay");
+		const U32 max_retries = gSavedSettings.getU32("PrimMediaMaxRetries");
+		const U32 max_sorted_queue_size = gSavedSettings.getU32("PrimMediaMaxSortedQueueSize");
+		const U32 max_round_robin_queue_size = gSavedSettings.getU32("PrimMediaMaxRoundRobinQueueSize");
+		sObjectMediaClient = new LLObjectMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries, 
+														 max_sorted_queue_size, max_round_robin_queue_size);
+		sObjectMediaNavigateClient = new LLObjectMediaNavigateClient(queue_timer_delay, retry_timer_delay, 
+																	 max_retries, max_sorted_queue_size, max_round_robin_queue_size);
+	}
 }
 
 // static
@@ -1794,14 +1797,15 @@ LLVector3 LLVOVolume::getApproximateFaceNormal(U8 face_id)
 
 void LLVOVolume::requestMediaDataUpdate(bool isNew)
 {
-    sObjectMediaClient->fetchMedia(new LLMediaDataClientObjectImpl(this, isNew));
+    if (sObjectMediaClient)
+		sObjectMediaClient->fetchMedia(new LLMediaDataClientObjectImpl(this, isNew));
 }
 
 bool LLVOVolume::isMediaDataBeingFetched() const
 {
 	// I know what I'm doing by const_casting this away: this is just 
 	// a wrapper class that is only going to do a lookup.
-	return sObjectMediaClient->isInQueue(new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false));
+	return (sObjectMediaClient) ? sObjectMediaClient->isInQueue(new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false)) : false;
 }
 
 void LLVOVolume::cleanUpMediaImpls()
@@ -2000,7 +2004,7 @@ void LLVOVolume::mediaNavigated(LLViewerMediaImpl *impl, LLPluginClassMedia* plu
 		// "bounce back" to the current URL from the media entry
 		mediaNavigateBounceBack(face_index);
 	}
-	else
+	else if (sObjectMediaNavigateClient)
 	{
 		
 		llinfos << "broadcasting navigate with URI " << new_location << llendl;
@@ -2069,7 +2073,8 @@ void LLVOVolume::mediaEvent(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin,
 
 void LLVOVolume::sendMediaDataUpdate()
 {
-    sObjectMediaClient->updateMedia(new LLMediaDataClientObjectImpl(this, false));
+    if (sObjectMediaClient)
+		sObjectMediaClient->updateMedia(new LLMediaDataClientObjectImpl(this, false));
 }
 
 void LLVOVolume::removeMediaImpl(S32 texture_index)
@@ -2164,6 +2169,9 @@ viewer_media_t LLVOVolume::getMediaImpl(U8 face_id) const
 
 F64 LLVOVolume::getTotalMediaInterest() const
 {
+	if (LLViewerMediaFocus::getInstance()->getFocusedObjectID() == getID())
+		return F64_MAX;
+	
 	F64 interest = (F64)-1.0;  // means not interested;
     int i = 0;
 	const int end = getNumTEs();
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 2f39eb58e628a17a809906e39519ed9df5fa2baa..e414d9da4d8ffaf068e136803a828b44e2008b3c 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -37,7 +37,6 @@
 #include "llviewertexture.h"
 #include "llviewermedia.h"
 #include "llframetimer.h"
-#include "llapr.h"
 #include "m3math.h"		// LLMatrix3
 #include "m4math.h"		// LLMatrix4
 #include <map>
diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp
index 697fefee3a5176a5a8686efe30d7a3b49d5873ed..8be8f494dabd41d8e6b70464209a7766297fedd9 100644
--- a/indra/newview/llwaterparammanager.cpp
+++ b/indra/newview/llwaterparammanager.cpp
@@ -51,16 +51,13 @@
 #include "llsdserialize.h"
 
 #include "v4math.h"
-#include "llviewerdisplay.h"
 #include "llviewercontrol.h"
-#include "llviewerwindow.h"
 #include "lldrawpoolwater.h"
 #include "llagent.h"
 #include "llviewerregion.h"
 
 #include "llwlparammanager.h"
 #include "llwaterparamset.h"
-#include "llpostprocess.h"
 #include "llfloaterwater.h"
 
 #include "curl/curl.h"
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 0405b9d28b76eb397649e169c4c8d45c1917d94b..b789bd3650af03ed6b00e0f57ee3426cbdcb15af 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -356,7 +356,7 @@ BOOL LLWearable::importFile( LLFILE* file )
 
 	if( num_parameters != mVisualParamIndexMap.size() )
 	{
-		llwarns << "Wearable parameter mismatch. Reading in " << num_parameters << " from file, but created " << mVisualParamIndexMap.size() << " from avatar parameters. " << llendl;
+		llwarns << "Wearable parameter mismatch. Reading in " << num_parameters << " from file, but created " << mVisualParamIndexMap.size() << " from avatar parameters. type: " <<  mType << llendl;
 	}
 
 	// parameters
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index 31047413efdcee87c56fa73a6be6dd6097260560..bd7619f7e5e39c3c55ad5791d0120ea4831f0090 100644
--- a/indra/newview/llwearablelist.cpp
+++ b/indra/newview/llwearablelist.cpp
@@ -41,7 +41,6 @@
 #include "llviewerinventory.h"
 #include "llviewerstats.h"
 #include "llnotificationsutil.h"
-#include "llnotify.h"
 #include "llinventorymodel.h"
 #include "lltrans.h"
 
diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp
index 72431bd22f2c7aa148e031cb0bcc617bf19c5f03..f8bb7336db5dfff3fc647861baa531a4477e77d1 100644
--- a/indra/newview/llweb.cpp
+++ b/indra/newview/llweb.cpp
@@ -38,14 +38,20 @@
 // Library includes
 #include "llwindow.h"	// spawnWebBrowser()
 
-#include "llviewerwindow.h"
-#include "llviewercontrol.h"
+#include "llappviewer.h"
 #include "llfloatermediabrowser.h"
 #include "llfloaterreg.h"
-#include "llalertdialog.h"
+#include "lllogininstance.h"
+#include "llsd.h"
 #include "lltoastalertpanel.h"
+#include "llui.h"
+#include "lluri.h"
+#include "llversioninfo.h"
+#include "llviewercontrol.h"
+#include "llviewernetwork.h"
+#include "llviewerwindow.h"
 
-class URLLoader : public LLAlertURLLoader
+class URLLoader : public LLToastAlertPanel::URLLoader
 {
 	virtual void load(const std::string& url , bool force_open_externally)
 	{
@@ -65,7 +71,6 @@ static URLLoader sAlertURLLoader;
 // static
 void LLWeb::initClass()
 {
-	LLAlertDialog::setURLLoader(&sAlertURLLoader);
 	LLToastAlertPanel::setURLLoader(&sAlertURLLoader);
 }
 
@@ -124,3 +129,24 @@ std::string LLWeb::escapeURL(const std::string& url)
 	}
 	return escaped_url;
 }
+
+//static
+std::string LLWeb::expandURLSubstitutions(const std::string &url,
+										  const LLSD &default_subs)
+{
+	LLSD substitution = default_subs;
+	substitution["VERSION"] = LLVersionInfo::getVersion();
+	substitution["VERSION_MAJOR"] = LLVersionInfo::getMajor();
+	substitution["VERSION_MINOR"] = LLVersionInfo::getMinor();
+	substitution["VERSION_PATCH"] = LLVersionInfo::getPatch();
+	substitution["VERSION_BUILD"] = LLVersionInfo::getBuild();
+	substitution["CHANNEL"] = LLVersionInfo::getChannel();
+	substitution["LANGUAGE"] = LLUI::getLanguage();
+	substitution["GRID"] = LLViewerLogin::getInstance()->getGridLabel();
+	substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+
+	std::string expanded_url = url;
+	LLStringUtil::format(expanded_url, substitution);
+
+	return LLWeb::escapeURL(expanded_url);
+}
diff --git a/indra/newview/llweb.h b/indra/newview/llweb.h
index 96a53db2ca053cd136f5c4ea82d8179df9d0f1e1..f4666c9280a975897ee44bbf8c1bc4ad1177c0c0 100644
--- a/indra/newview/llweb.h
+++ b/indra/newview/llweb.h
@@ -57,8 +57,11 @@ public:
 	/// Load the given url in the operating system's web browser
 	static void loadURLExternal(const std::string& url);
 
-	// Returns escaped url (eg, " " to "%20") - used by all loadURL methods
+	/// Returns escaped url (eg, " " to "%20") - used by all loadURL methods
 	static std::string escapeURL(const std::string& url);
+	/// Expands various strings like [LANG], [VERSION], etc. in a URL
+	static std::string expandURLSubstitutions(const std::string &url,
+											  const LLSD &default_subs);
 };
 
 #endif
diff --git a/indra/newview/llwldaycycle.cpp b/indra/newview/llwldaycycle.cpp
index fcc43c2b1f7b8cc1d390ad63f48c1abb2f84602e..000d50795fef590a7b86fab373cee4216cf05e4c 100644
--- a/indra/newview/llwldaycycle.cpp
+++ b/indra/newview/llwldaycycle.cpp
@@ -33,11 +33,13 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "llwldaycycle.h"
-#include "llsdserialize.h"
-#include "llwlparammanager.h"
+
 #include "llnotificationsutil.h"
+#include "llsdserialize.h"
 #include "llxmlnode.h"
 
+#include "llwlparammanager.h"
+
 #include <map>
 
 LLWLDayCycle::LLWLDayCycle() : mDayRate(120)
diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp
index c3a70705cfcb2ec6e2db8e7b44114e8513a8ea3d..7cac564619e280ad67f0cd8d87c858871396fdea 100644
--- a/indra/newview/llwlparammanager.cpp
+++ b/indra/newview/llwlparammanager.cpp
@@ -42,17 +42,12 @@
 #include "llspinctrl.h"
 #include "llcheckboxctrl.h"
 #include "lluictrlfactory.h"
-#include "llviewercamera.h"
 #include "llcombobox.h"
 #include "lllineeditor.h"
 #include "llsdserialize.h"
 
 #include "v4math.h"
-#include "llviewerdisplay.h"
 #include "llviewercontrol.h"
-#include "llviewerwindow.h"
-#include "lldrawpoolwater.h"
-#include "llviewerregion.h"
 
 #include "llwlparamset.h"
 #include "llpostprocess.h"
diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp
index 6a074d9697fc70402087c999fca59cfae8b12864..06040a574c579a6387023c72d111cde6fbba9eed 100644
--- a/indra/newview/llworldmapmessage.cpp
+++ b/indra/newview/llworldmapmessage.cpp
@@ -33,6 +33,7 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "llworldmapmessage.h"
+#include "message.h"
 
 #include "llworldmap.h"
 #include "llagent.h"
diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp
index af8cb6b9fb87868e5801d38daff5376bb520e725..15417614af905117eb42c2ab66d9d837ccb1ef38 100644
--- a/indra/newview/llxmlrpclistener.cpp
+++ b/indra/newview/llxmlrpclistener.cpp
@@ -21,13 +21,14 @@
 // external library headers
 #include <boost/scoped_ptr.hpp>
 #include <boost/range.hpp>          // boost::begin(), boost::end()
+#include <xmlrpc-epi/xmlrpc.h>
+#include "curl/curl.h"
+
 // other Linden headers
 #include "llerror.h"
 #include "stringize.h"
 #include "llxmlrpctransaction.h"
 
-#include <xmlrpc-epi/xmlrpc.h>
-
 #if LL_WINDOWS
 #pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
 #endif
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index cac266a68371c6b03d37f428f32999b4991e7be3..224e267d17f8f1a4708d149aabe8a4e85ee8507d 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -7298,10 +7298,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 					stateSort(camera, ref_result);
 				}	
 				
-				gGL.setColorMask(true, true);
-				mWaterRef.clear();
-				gGL.setColorMask(true, false);
-			
 				ref_mask = mRenderTypeMask;
 				mRenderTypeMask = mask;
 			}
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index cdbeed111e3104e06148cc7bc9c89697f1324ab7..91402acc0a61f2d3ff1caa1c1f08fb4679ae743e 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -67,7 +67,7 @@
 	 value="0 0 1 1" />
 	<color
 	 name="Yellow"
-	 value="1 1 0 1" />
+	 value="0.114 0.65 0.1" />
 	<color
 	 name="Unused?"
 	 value="1 0.5 0 1" />
@@ -378,7 +378,7 @@
      reference="White_25" />
     <color
      name="InventorySearchStatusColor"
-     reference="Black" />
+     reference="EmphasisColor" />
     <color
      name="LabelDisabledColor"
 	 reference="White_25" />
@@ -513,7 +513,7 @@
      reference="White" />
     <color
      name="ObjectChatColor"
-     reference="0.7 0.8 0.9 1" />
+     reference="EmphasisColor" />
     <color
      name="OverdrivenColor"
      value="1 0 0 1" />
diff --git a/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png b/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png
index aa3898ca99f816f86ecb763761d43d91a3d7420a..0ac5b72b8f70e67faef73d07f1ffcd483690c4c1 100644
Binary files a/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png and b/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Unread_IM.png b/indra/newview/skins/default/textures/bottomtray/Unread_IM.png
index 598342ea805b903d7e1b5bc9b25d86d41d2d9c96..5c0c85b864e4d3c76c17fe10e46994e191cddf6e 100644
Binary files a/indra/newview/skins/default/textures/bottomtray/Unread_IM.png and b/indra/newview/skins/default/textures/bottomtray/Unread_IM.png differ
diff --git a/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png
index 60676b43fd96e34c728bf71ab5fcfc0a442cb491..dd9133bcc463fe3303ae364bdd381ae3132f66a0 100644
Binary files a/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png and b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png differ
diff --git a/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png
index 98cde96aff13e42fc24f71d793613b32737e7b34..0080e71f4191729d2902dc07d49329c185833100 100644
Binary files a/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png and b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 0a54e1112b74ed19803c500515a947da5614b52a..35dafe131122ff0a496912513ef76c71f6bef6f2 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -143,6 +143,7 @@ with the same filename but different name
   <texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+  <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
 
   <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
@@ -593,9 +594,9 @@ with the same filename but different name
 
   <texture name="Unread_IM" file_name="bottomtray/Unread_IM.png" preload="false" />
   <texture name="Unread_Msg" file_name="bottomtray/Unread_Msg.png" preload="false" />
-  
-  <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" />
-  <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" />
+
+  <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png"  preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+  <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
 
   <texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" />
   <texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml
index f89ad2f997f23a4597cf33f234eb7c1df5fa1317..6956b73371440f6570f75a48f9b6f41593b0aca8 100644
--- a/indra/newview/skins/default/xui/en/floater_aaa.xml
+++ b/indra/newview/skins/default/xui/en/floater_aaa.xml
@@ -18,6 +18,7 @@
  single_instance="true"
  width="320">
   <string name="nudge_parabuild">Nudge 1</string>
+  <string name="test_the_vlt">This string is extracted.</string>
   <chat_history
    allow_html="true"
    bg_readonly_color="ChatHistoryBgColor"
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index 10b72144e709caa8423fd289c60d22237e500616..a64716cb35cae5c01a18250505f8d4c1bf2e65d3 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1561,7 +1561,7 @@ Only large parcels can be listed in search.
              left="10"
              name="at URL:"
              width="100">
-                Home URL:
+                Home Page:
             </text>
             <line_editor
              follows="left|top"
@@ -1590,7 +1590,7 @@ Only large parcels can be listed in search.
              left="10"
              name="CurrentURL:"
              width="100">
-                Current URL:
+                Current Page:
             </text>
              <button
      follows="top|right"
@@ -1672,9 +1672,7 @@ Only large parcels can be listed in search.
              name="replace_texture_help"
              width="300"
              word_wrap="true">
-             Objects using this texture will show the movie or web page after you click the play arrow.
-
-Select the thumbnail to choose a different texture.
+             Objects using this texture will show the movie or web page after you click the play arrow.  Select the thumbnail to choose a different texture.
             </text>
             <check_box
              height="16"
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
index a0cb94eb691e9153e1e257f09f1a319311e32f42..54b6edb0ec19f495c1c288b749a0f438aa930f5d 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
  legacy_header_height="18"
- height="950"
+ height="650"
  layout="topleft"
  name="avatar_texture_debug"
  help_topic="avatar_texture_debug"
@@ -16,9 +16,9 @@
      length="1"
      height="16"
      layout="topleft"
-     left="10"
+     left="30"
      name="label"
-     top="24"
+     top="40"
      width="80">
         Baked Textures
     </text>
@@ -27,7 +27,7 @@
      length="1"
      height="16"
      layout="topleft"
-     left_pad="60"
+     left_pad="50"
      name="composite_label"
      top_delta="0"
      width="120">
@@ -40,16 +40,37 @@
      layout="topleft"
      left_pad="530"
      name="Dump"
-     top_delta="1"
+     top_delta="0"
      width="150" />
 
+    <scroll_container
+     color="DkGray2"
+     opaque="true"
+     follows="all"
+     height="590"
+     layout="topleft"
+     left="5"
+     top_pad="5"
+     name="profile_scroll"
+     reserve_scroll_corner="false"
+     width="1240">
+    <panel
+     name="scroll_content_panel"
+     follows="left|top"
+     min_height="300"
+     layout="topleft"
+     top="0"
+     background_visible="false"
+     height="950"
+     left="0"
+     width="1250">
     <texture_picker
      height="143"
      label="Hair"
      layout="topleft"
      left="10"
      name="hair-baked"
-     top="47"
+     top="17"
      width="128" />
     <texture_picker
      height="143"
@@ -74,7 +95,7 @@
      layout="topleft"
      left="10"
      name="head-baked"
-     top="197"
+     top="167"
      width="128" />
     <texture_picker
      height="143"
@@ -107,7 +128,7 @@
      layout="topleft"
      left="10"
      name="eyes-baked"
-     top="347"
+     top="317"
      width="128" />
     <texture_picker
      height="143"
@@ -132,7 +153,7 @@
      layout="topleft"
      left="10"
      name="upper-baked"
-     top="497"
+     top="467"
      width="128" />
     <texture_picker
      height="143"
@@ -197,7 +218,7 @@
      layout="topleft"
      left="10"
      name="lower-baked"
-     top="647"
+     top="617"
      width="128" />
     <texture_picker
      height="143"
@@ -270,7 +291,7 @@
      layout="topleft"
      left="10"
      name="skirt-baked"
-     top="797"
+     top="767"
      width="128" />
     <texture_picker
      height="143"
@@ -280,5 +301,6 @@
      name="skirt"
      top_delta="0"
      width="128" />
-
+</panel>
+</scroll_container>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 645c2973d887c17baa269fd1ec99d86aaa8d8ddb..156370a459792dcfc5f26def89d8b7648263eab6 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -12,14 +12,14 @@
  can_dock="false"
  can_minimize="false"
  visible="true"
- width="300"
+ width="360"
  can_resize="true"
- min_width="300"
+ min_width="360"
  min_height="350">
   <layout_stack
   follows="all"
   height="320"
-  width="300"
+  width="360"
   layout="topleft"
   orientation="horizontal"
   name="im_panels"
@@ -30,14 +30,15 @@
       layout="topleft"
       follows="left"
       label="IM Control Panel"
+      min_width="115" 
       auto_resize="false"
-      user_resize="false" />
+      user_resize="true" />
     <layout_panel
        left="0"
        top="0"
        height="200"
-	     width="185"
-       user_resize="false">
+	     width="245"
+       user_resize="true">
         <button
           height="20"
           follows="left|top"
@@ -63,7 +64,7 @@
          parse_highlights="true"
          allow_html="true"
         left="1"
-         width="180">
+         width="240">
         </chat_history>
         <line_editor
          bottom="0" 
@@ -73,7 +74,7 @@
          label="To"
          layout="bottomleft"
          name="chat_editor"
-         width="180">
+         width="240">
         </line_editor>
     </layout_panel>
   </layout_stack>
diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
index acd59b6f090ef343063ffc018a1710ff175646e3..81c54ae55e729e915dbd2e1e19811185d7342957 100644
--- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
@@ -26,6 +26,10 @@
      name="VoiceInviteAdHoc">
         has joined a Voice Chat call with a conference chat.
     </floater.string>
+    <floater.string
+     name="VoiceInviteGroup">
+        has joined a Voice Chat call with the group [GROUP].
+    </floater.string>
     <avatar_icon
      enabled="false"
      follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/floater_media_browser.xml b/indra/newview/skins/default/xui/en/floater_media_browser.xml
index d6b20c80159ede8227fff41b0df76b701644efbd..4b280ac59fda1b9afdcacb286244a339d40a4acb 100644
--- a/indra/newview/skins/default/xui/en/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_browser.xml
@@ -171,7 +171,7 @@
              enabled="false"
              follows="left|top"
              height="20"
-             label="Send Current URL to Parcel"
+             label="Send Current Page to Parcel"
              layout="topleft"
              left="0"
              name="assign"
diff --git a/indra/newview/skins/default/xui/en/floater_media_settings.xml b/indra/newview/skins/default/xui/en/floater_media_settings.xml
index 8122386fae35c3fb7c31072949454e9b43b5a779..681731b0da538e79d8c11f5a47f83175d83ebce4 100644
--- a/indra/newview/skins/default/xui/en/floater_media_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_settings.xml
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
  legacy_header_height="18"
- bottom="666" 
  can_close="true" 
  can_drag_on_left="false" 
  can_minimize="true"
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index ae4d5042efc07178bb5759b1fbc690462680c588..c6bc093c6c9aa233b29815abba36e26b9570e6c0 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -69,7 +69,29 @@ Calling [CALLEE_NAME]
      word_wrap="true">
 No Answer.  Please try again later.
     </text>
-    <text
+  <text
+   font="SansSerifLarge"
+   height="40"
+   layout="topleft"
+   left="77"
+   name="nearby"
+   top="27"
+   width="315"
+   word_wrap="true">
+    You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnected to Nearby Voice Chat.
+  </text>
+  <text
+   font="SansSerifLarge"
+   height="40"
+   layout="topleft"
+   left="77"
+   name="nearby_P2P"
+   top="27"
+   width="315"
+   word_wrap="true">
+    [VOICE_CHANNEL_NAME] has ended the call.  You will now be reconnected to Nearby Voice Chat.
+  </text>
+  <text
      font="SansSerif"
      height="50"
      layout="topleft"
@@ -80,7 +102,7 @@ No Answer.  Please try again later.
      word_wrap="true">
 Leaving [CURRENT_CHAT].
     </text>
-    <button
+  <button
      height="24"
      label="Cancel"
      label_selected="Cancel"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
index 602a18ea56c421f9755b1e3b4ee972dba2e152df..abc30c335cdc0c6bc8627f0f94a4389411831b88 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
@@ -3,15 +3,15 @@
  legacy_header_height="18"
  auto_tile="true"
  can_resize="true"
- follows="left|bottom"
- height="331"
+ follows="left|top"
+ height="313"
  layout="topleft"
  min_height="120"
- min_width="300"
+ min_width="320"
  name="preview_texture"
  help_topic="preview_texture"
- width="300">
-    <floater.string
+ width="320">
+   <floater.string
      name="Title">
         Texture: [NAME]
     </floater.string>
@@ -43,72 +43,38 @@
      max_length="127"
      name="desc"
      width="190" />
-    <button
-     follows="left|bottom"
-     height="22"
-     label="OK"
-     layout="topleft"
-     left="80"
-     name="Keep"
-     top="302"
-     width="100" />
-    <button
-     follows="left|bottom"
-     height="22"
-     label="Cancel"
-     layout="topleft"
-     left_pad="5"
-     name="Discard"
-     top_delta="0"
-     width="100" />
-    <button
-     follows="left|bottom"
-     height="22"
-     label="Save As"
-     layout="topleft"
-     left_pad="5"
-     name="save_tex_btn"
-     top_delta="0"
-     width="100" />
     <text
      type="string"
+     halign="right"
      length="1"
-     follows="left|bottom"
+     follows="right|bottom"
      height="16"
      layout="topleft"
-     left="13"
+     left="110"
      name="dimensions"
-     top="309"
-     width="303">
+     top="255"
+     width="200">
         [WIDTH]px x [HEIGHT]px
     </text>
     <text
      type="string"
+     halign="right"
      length="1"
-     bg_visible="false"
-     border_drop_shadow_visible="false"
-     border_visible="false"
-     top="309"
-     drop_shadow_visible="true"
-     enabled="true"
      follows="right|bottom"
-     font="SansSerifSmall"
-     h_pad="0"
-     halign="right"
-     height="14"
-     left="54"
-     mouse_opaque="true"
-     name="aspect_ratio"
-     v_pad="0"
-     width="110">
-    	Preview Aspect Ratio
+     height="16"
+     layout="topleft"
+     left_delta="-110"
+     name="dimensions"
+     top_pad="5"
+     width="200">
+        Preview aspect ratio
     </text>
     <combo_box
      allow_text_entry="true" 
-     top="306" 
+     top_delta="-3" 
      follows="right|bottom" 
-     height="20"
-     left="176"
+     height="23"
+     left_pad="10"
      max_chars="20"
      mouse_opaque="true"
      enabled="true"
@@ -140,4 +106,31 @@
 		2:1
 	</combo_item>
 	</combo_box>
+    <button
+     follows="right|bottom"
+     height="22"
+     label="OK"
+     layout="topleft"
+     left="6"
+     name="keep"
+     top_pad="5"
+     width="100" />
+    <button
+     follows="right|bottom"
+     height="22"
+     label="Cancel"
+     layout="topleft"
+     left_pad="5"
+     name="discard"
+     top_delta="0"
+     width="100" />
+    <button
+     follows="right|bottom"
+     height="22"
+     label="Save As"
+     layout="topleft"
+     left_pad="5"
+     name="save_tex_btn"
+     top_delta="0"
+     width="100" />
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index e6bdcdf78e6be45ece7573885d95934cf0693a60..9c1a5499db4dd44b5d8509ff0ecda784d6ba2e11 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -12,10 +12,6 @@
  single_instance="true"
  title="FIND"
  width="670">
-    <floater.string
-     name="search_url">
-        http://int.searchwww-phx0.damballah.lindenlab.com/viewer
-    </floater.string>
     <floater.string
      name="loading_text">
         Loading...
diff --git a/indra/newview/skins/default/xui/en/floater_select_key.xml b/indra/newview/skins/default/xui/en/floater_select_key.xml
index 6050aede79e1a49b83b017e051e04e943c2d1e2e..93aa1f0e31aabab87ecb54469f5bdfcbbd32e063 100644
--- a/indra/newview/skins/default/xui/en/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/en/floater_select_key.xml
@@ -21,7 +21,7 @@
      word_wrap="true"
      width="220">
         Press a key to set your
-Speak button toggle
+Speak button trigger.
     </text>
     <button
      height="23"
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index 113da9ea4db2725c9b386470bdb5f16168a555a8..695021f7550cacf58369260ae2670f54fdcaecd8 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -101,7 +101,7 @@
     <filter_editor
      follows="left|top|right"
      height="23"
-     label="Filter textures"
+     label="Filter Textures"
      layout="topleft"
      left="175"
      name="inventory search editor"
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 8d4f406286b71b12a60eaaec5b70bfcdd1852a16..6cc52cfdd2cd757b76162b19f126998695b3f0de 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -2679,6 +2679,7 @@ even though the user gets a free copy.
 			 height="18"
 			 layout="topleft"
 			 left="10"
+       use_ellipsis="true" 
 			 read_only="true"
 			 name="media_info"
 			 width="180" />
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
index c1a211967c18054804f1257e33cf150a7050031b..a86126227e41f4b4677d0a1ff6e6c8f8e40f6745 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -31,12 +31,14 @@
         No one near
     </string>
     <panel
-     bevel_style="in"
+     bevel_style="out"
+     border="true"
      follows="left|right|top"
      height="62"
      layout="topleft"
      left="0"
      name="control_panel"
+     top="0"
      width="282">
         <panel
          height="18"
@@ -79,51 +81,14 @@
              visible="true"
              width="20" />
         </panel>
-        <layout_stack
-         animate="false"
-         bottom="10"
-         clip="false"
+        <button
          follows="left|right|top"
          height="24"
-         layout="bottomleft"
-         orientation="horizontal"
-         width="262">
-            <layout_panel
-             auto_resize="false" 
-             follows="left"
-             layout="topleft"
-             min_width="24"
-             name="microphone_icon_panel" 
-             top="0"
-             user_resize="false"
-             width="24">
-                <icon
-                 height="24"
-                 image_name="Microphone_On"
-                 layout="topleft"
-                 name="Microphone_On"
-                 top="0"
-                 width="24" />
-            </layout_panel>
-            <layout_panel
-             auto_resize="false"
-             layout="topleft"
-             min_width="100" 
-             name="leave_btn_panel" 
-             top="0"
-             user_resize="false"
-             visible="false" 
-             width="100">
-                <button
-                 follows="left|right|top"
-                 height="24"
-                 label="Leave Call"
-                 left="0" 
-                 name="leave_call_btn"
-                 top="0" 
-                 width="100" />
-            </layout_panel>
-        </layout_stack>
+         label="Leave Call"
+         left="91" 
+         name="leave_call_btn"
+         top_pad="6" 
+         width="100" />
     </panel>
     <avatar_list
      follows="all"
@@ -143,4 +108,12 @@
      name="non_avatar_caller"
      top="70"
      width="282" />
+    <view_border
+     bevel_style="out"
+     follows="left|top|right|bottom"
+     height="206"
+     layout="topleft"
+     left="0"
+     top="63"
+     width="282" />
 </floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml
index 16f6e49092ecdb98ce2c6cad643b10d6948f1a2e..00e00b9694f1ad89143c1ba2ce8d40fe5afb6737 100644
--- a/indra/newview/skins/default/xui/en/inspect_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_object.xml
@@ -9,7 +9,7 @@
  bg_opaque_image="Inspector_Background"
  can_close="false"
  can_minimize="false"
- height="148"
+ height="150"
  layout="topleft"
  name="inspect_object"
  single_instance="true"
@@ -71,13 +71,15 @@ owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
    width="196">
 L$300,000
   </text>
-   <text
+  <text
+   clip_partial="true" 
    follows="all"
    font="SansSerifSmall"
-   height="36"
+   height="37"
    left="8"
    name="object_description"
    top_pad="0"
+   use_ellipses="true" 
    width="220"
    word_wrap="true">
 This is a really long description for an object being as how it is at least 80 characters in length and maybe more like 120 at this point. Who knows, really?
@@ -90,8 +92,8 @@ This is a really long description for an object being as how it is at least 80 c
    height="13"
    left_delta="0"
    name="object_media_url"
-   top_pad="0"
-   width="291"
+   bottom_pad="2"
+   width="200"
    max_length = "50"
    use_ellipses="true">
    http://www.superdupertest.com
@@ -102,7 +104,7 @@ This is a really long description for an object being as how it is at least 80 c
    label="Buy"
    left="8"
    name="buy_btn"
-   top="119"
+   top="121"
    width="80" />
   <button
    follows="top|left"
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5b94645b603af76db3d12c70a6dadb88e5c00be6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu
+ layout="topleft"
+ name="Avatar Pie">
+    <menu_item_call
+     label="View Profile"
+     name="Profile...">
+        <menu_item_call.on_click
+         function="ShowAgentProfile"
+         parameter="hit object" />
+    </menu_item_call>
+   <menu_item_call
+     enabled="false"
+     label="Add Friend"
+     name="Add Friend">
+        <menu_item_call.on_click
+         function="Avatar.AddFriend" />
+        <menu_item_call.on_enable
+         function="Avatar.EnableAddFriend" />
+    </menu_item_call>
+    <menu_item_call
+     label="IM"
+     name="Send IM...">
+        <menu_item_call.on_click
+         function="Avatar.SendIM" />
+    </menu_item_call>
+    <menu_item_call
+     label="Call"
+     name="Call">
+        <menu_item_call.on_click
+         function="Avatar.Call" />
+    </menu_item_call>
+      <menu_item_call
+         label="Invite to Group"
+         name="Invite...">
+      <menu_item_call.on_click
+         function="Avatar.InviteToGroup" />
+      </menu_item_call>
+   <menu_item_separator />
+    <menu_item_call
+     enabled="false"
+     label="Block"
+     name="Avatar Mute">
+        <menu_item_call.on_click
+         function="Avatar.Mute" />
+        <menu_item_call.on_enable
+         function="Avatar.EnableMute" />
+    </menu_item_call>
+    <menu_item_call
+     label="Report"
+     name="abuse">
+        <menu_item_call.on_click
+         function="Avatar.ReportAbuse" />
+    </menu_item_call>
+        <menu_item_call
+         label="Freeze"
+         name="Freeze...">
+            <menu_item_call.on_click
+             function="Avatar.Freeze" />
+            <menu_item_call.on_visible
+             function="Avatar.EnableFreezeEject"/>
+        </menu_item_call>
+        <menu_item_call
+         label="Eject"
+         name="Eject...">
+            <menu_item_call.on_click
+             function="Avatar.Eject" />
+            <menu_item_call.on_visible
+             function="Avatar.EnableFreezeEject"/>
+        </menu_item_call>
+        <menu_item_call
+         label="Debug"
+         name="Debug...">
+            <menu_item_call.on_click
+             function="Avatar.Debug" />
+            <menu_item_call.on_visible
+             function="IsGodCustomerService"/>
+        </menu_item_call>
+	    <menu_item_call
+         label="Zoom In"
+          name="Zoom In">
+        <menu_item_call.on_click
+           function="Tools.LookAtSelection"
+           parameter="zoom" />
+    </menu_item_call>
+   <menu_item_call
+     enabled="false"
+     label="Pay"
+     name="Pay...">
+        <menu_item_call.on_click
+         function="PayObject" />
+        <menu_item_call.on_enable
+         function="EnablePayAvatar" />
+    </menu_item_call>
+   <menu_item_separator />
+   <menu_item_call
+       label="Object Profile"
+       name="Object Inspect">
+         <menu_item_call.on_click
+          function="Object.Inspect" />
+         <menu_item_call.on_enable
+          function="Object.EnableInspect" />
+   </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c85dbbb1bcd6c664dd5c98538ff5257cad60344f
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Attachment Pie">
+    <menu_item_call
+     enabled="false"
+     label="Touch"
+     layout="topleft"
+     name="Attachment Object Touch">
+        <menu_item_call.on_click
+         function="Object.Touch" />
+        <menu_item_call.on_enable
+         function="Object.EnableTouch"
+         name="EnableTouch"
+         parameter="Touch" />
+    </menu_item_call>
+    <!--menu_item_call
+     label="Stand Up"
+     layout="topleft"
+     name="Stand Up">
+        <menu_item_call.on_click
+         function="Self.StandUp"
+         parameter="" />
+        <menu_item_call.on_enable
+         function="Self.EnableStandUp" />
+    </menu_item_call-->
+        <menu_item_call
+     enabled="false"
+     label="Edit"
+     layout="topleft"
+     name="Edit...">
+        <menu_item_call.on_click
+         function="Object.Edit" />
+        <menu_item_call.on_enable
+         function="EnableEdit" />
+    </menu_item_call>
+    <menu_item_call
+     enabled="false"
+     label="Detach"
+     layout="topleft"
+     name="Detach">
+        <menu_item_call.on_click
+         function="Attachment.Detach" />
+        <menu_item_call.on_enable
+         function="Attachment.EnableDetach" />
+    </menu_item_call>
+      <menu_item_call
+     enabled="false"
+     label="Drop"
+     layout="topleft"
+     name="Drop">
+        <menu_item_call.on_click
+         function="Attachment.Drop" />
+        <menu_item_call.on_enable
+         function="Attachment.EnableDrop" />
+    </menu_item_call>
+    <!--menu_item_call
+     label="My Profile"
+     layout="topleft"
+     name="Profile...">
+        <menu_item_call.on_click
+         function="ShowAgentProfile"
+         parameter="agent" />
+    </menu_item_call>
+    <menu_item_call
+     label="My Appearance"
+     layout="topleft"
+     name="Appearance...">
+        <menu_item_call.on_click
+         function="ShowFloater"
+         parameter="appearance" />
+        <menu_item_call.on_enable
+         function="Edit.EnableCustomizeAvatar" />
+
+    </menu_item_call-->
+    <menu_item_separator
+      layout="topleft" />
+    
+       <menu_item_call
+     label="Stand Up"
+     layout="topleft"
+     name="Stand Up">
+        <menu_item_call.on_click
+         function="Self.StandUp"
+         parameter="" />
+        <menu_item_call.on_enable
+         function="Self.EnableStandUp" />
+    </menu_item_call>
+     <menu_item_call
+     label="My Appearance"
+     layout="topleft"
+     name="Appearance...">
+        <menu_item_call.on_click
+         function="ShowFloater"
+         parameter="appearance" />
+        <menu_item_call.on_enable
+         function="Edit.EnableCustomizeAvatar" />
+    </menu_item_call>
+   <menu_item_call
+     label="My Friends"
+     layout="topleft"
+     name="Friends...">
+        <menu_item_call.on_click
+         function="SideTray.PanelPeopleTab"
+         parameter="friends_panel" />
+    </menu_item_call>
+    <menu_item_call
+     label="My Groups"
+     layout="topleft"
+     name="Groups...">
+        <menu_item_call.on_click
+         function="SideTray.PanelPeopleTab"
+         parameter="groups_panel" />
+    </menu_item_call>
+   <menu_item_call
+     label="My Profile"
+     layout="topleft"
+     name="Profile...">
+        <menu_item_call.on_click
+         function="ShowAgentProfile"
+         parameter="agent" />
+    </menu_item_call>
+    
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0ad41546d204575e0eb369304c55a3f76a1b8c9b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu
+ layout="topleft"
+ name="Avatar Pie">
+    <menu_item_call
+     label="View Profile"
+     name="Profile...">
+        <menu_item_call.on_click
+         function="ShowAgentProfile"
+         parameter="hit object" />
+    </menu_item_call>
+   <menu_item_call
+     enabled="false"
+     label="Add Friend"
+     name="Add Friend">
+        <menu_item_call.on_click
+         function="Avatar.AddFriend" />
+        <menu_item_call.on_enable
+         function="Avatar.EnableAddFriend" />
+    </menu_item_call>
+    <menu_item_call
+     label="IM"
+     name="Send IM...">
+        <menu_item_call.on_click
+         function="Avatar.SendIM" />
+    </menu_item_call>
+    <menu_item_call
+     label="Call"
+     name="Call">
+        <menu_item_call.on_click
+         function="Avatar.Call" />
+    </menu_item_call>
+      <menu_item_call
+         label="Invite to Group"
+         name="Invite...">
+      <menu_item_call.on_click
+         function="Avatar.InviteToGroup" />
+      </menu_item_call>
+   <menu_item_separator />
+    <menu_item_call
+     enabled="false"
+     label="Block"
+     name="Avatar Mute">
+        <menu_item_call.on_click
+         function="Avatar.Mute" />
+        <menu_item_call.on_enable
+         function="Avatar.EnableMute" />
+    </menu_item_call>
+    <menu_item_call
+     label="Report"
+     name="abuse">
+        <menu_item_call.on_click
+         function="Avatar.ReportAbuse" />
+    </menu_item_call>
+        <menu_item_call
+         label="Freeze"
+         name="Freeze...">
+            <menu_item_call.on_click
+             function="Avatar.Freeze" />
+            <menu_item_call.on_visible
+             function="Avatar.EnableFreezeEject"/>
+        </menu_item_call>
+        <menu_item_call
+         label="Eject"
+         name="Eject...">
+            <menu_item_call.on_click
+             function="Avatar.Eject" />
+            <menu_item_call.on_visible
+             function="Avatar.EnableFreezeEject"/>
+        </menu_item_call>
+        <menu_item_call
+         label="Debug"
+         name="Debug...">
+            <menu_item_call.on_click
+             function="Avatar.Debug" />
+            <menu_item_call.on_visible
+             function="IsGodCustomerService"/>
+        </menu_item_call>
+	    <menu_item_call
+         label="Zoom In"
+          name="Zoom In">
+        <menu_item_call.on_click
+           function="Tools.LookAtSelection"
+           parameter="zoom" />
+    </menu_item_call>
+   <menu_item_call
+     enabled="false"
+     label="Pay"
+     name="Pay...">
+        <menu_item_call.on_click
+         function="PayObject" />
+        <menu_item_call.on_enable
+         function="EnablePayAvatar" />
+    </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c6ce612a76482f0e1f58719f662fc9debe623c29
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Self Pie">
+       <menu_item_call
+     label="Stand Up"
+     layout="topleft"
+     name="Stand Up">
+        <menu_item_call.on_click
+         function="Self.StandUp"
+         parameter="" />
+        <menu_item_call.on_enable
+         function="Self.EnableStandUp" />
+    </menu_item_call>
+    <context_menu
+     label="Take Off &gt;"
+     layout="topleft"
+     name="Take Off &gt;">
+        <context_menu
+         label="Clothes &gt;"
+         layout="topleft"
+         name="Clothes &gt;">
+            <menu_item_call
+             enabled="false"
+             label="Shirt"
+             layout="topleft"
+             name="Shirt">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="shirt" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="shirt" />
+            </menu_item_call>
+            <menu_item_call
+             enabled="false"
+             label="Pants"
+             layout="topleft"
+             name="Pants">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="pants" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="pants" />
+            </menu_item_call>
+            <menu_item_call
+             enabled="false"
+             label="Skirt"
+             layout="topleft"
+             name="Skirt">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="skirt" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="skirt" />
+            </menu_item_call>
+            <menu_item_call
+             enabled="false"
+             label="Shoes"
+             layout="topleft"
+             name="Shoes">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="shoes" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="shoes" />
+            </menu_item_call>
+            <menu_item_call
+             enabled="false"
+             label="Socks"
+             layout="topleft"
+             name="Socks">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="socks" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="socks" />
+            </menu_item_call>
+            <menu_item_call
+             enabled="false"
+             label="Jacket"
+             layout="topleft"
+             name="Jacket">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="jacket" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="jacket" />
+            </menu_item_call>
+            <menu_item_call
+             enabled="false"
+             label="Gloves"
+             layout="topleft"
+             name="Gloves">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="gloves" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="gloves" />
+            </menu_item_call>
+           <menu_item_call
+                 enabled="false"
+                 label="Undershirt"
+                 layout="topleft"
+                 name="Self Undershirt">
+                    <menu_item_call.on_click
+                     function="Edit.TakeOff"
+                     parameter="undershirt" />
+                    <menu_item_call.on_enable
+                     function="Edit.EnableTakeOff"
+                     parameter="undershirt" />
+                </menu_item_call>
+               <menu_item_call
+                 enabled="false"
+                 label="Underpants"
+                 layout="topleft"
+                 name="Self Underpants">
+                    <menu_item_call.on_click
+                     function="Edit.TakeOff"
+                     parameter="underpants" />
+                    <menu_item_call.on_enable
+                     function="Edit.EnableTakeOff"
+                     parameter="underpants" />
+                </menu_item_call>
+               <menu_item_call
+                 enabled="false"
+                 label="Tattoo"
+                 layout="topleft"
+                 name="Self Tattoo">
+                    <menu_item_call.on_click
+                     function="Edit.TakeOff"
+                     parameter="tattoo" />
+                    <menu_item_call.on_enable
+                     function="Edit.EnableTakeOff"
+                     parameter="tattoo" />
+                </menu_item_call>
+               <menu_item_call
+                 enabled="false"
+                 label="Alpha"
+                 layout="topleft"
+                 name="Self Alpha">
+                    <menu_item_call.on_click
+                     function="Edit.TakeOff"
+                     parameter="alpha" />
+                    <menu_item_call.on_enable
+                     function="Edit.EnableTakeOff"
+                     parameter="alpha" />
+                </menu_item_call>				
+                <menu_item_separator
+                 layout="topleft" />
+                <menu_item_call
+                 label="All Clothes"
+                 layout="topleft"
+                 name="All Clothes">
+                    <menu_item_call.on_click
+                     function="Edit.TakeOff"
+                     parameter="all" />
+                </menu_item_call>
+        </context_menu>
+        <context_menu
+         label="HUD &gt;"
+         layout="topleft"
+         name="Object Detach HUD" />
+        <context_menu
+         label="Detach &gt;"
+         layout="topleft"
+         name="Object Detach" />
+        <menu_item_call
+         label="Detach All"
+         layout="topleft"
+         name="Detach All">
+            <menu_item_call.on_click
+             function="Self.RemoveAllAttachments"
+             parameter="" />
+            <menu_item_call.on_enable
+             function="Self.EnableRemoveAllAttachments" />
+        </menu_item_call>
+    </context_menu>
+     <menu_item_call
+     label="My Appearance"
+     layout="topleft"
+     name="Appearance...">
+        <menu_item_call.on_click
+         function="ShowFloater"
+         parameter="appearance" />
+        <menu_item_call.on_enable
+         function="Edit.EnableCustomizeAvatar" />
+    </menu_item_call>
+   <menu_item_call
+     label="My Friends"
+     layout="topleft"
+     name="Friends...">
+        <menu_item_call.on_click
+         function="SideTray.PanelPeopleTab"
+         parameter="friends_panel" />
+    </menu_item_call>
+   <!--menu_item_call
+     label="My Gestures"
+     layout="topleft"
+     name="Gestures...">
+        <menu_item_call.on_click
+         function="ShowFloater"
+         parameter="gestures" />
+    </menu_item_call-->
+    <menu_item_call
+     label="My Groups"
+     layout="topleft"
+     name="Groups...">
+        <menu_item_call.on_click
+         function="SideTray.PanelPeopleTab"
+         parameter="groups_panel" />
+    </menu_item_call>
+   <menu_item_call
+     label="My Profile"
+     layout="topleft"
+     name="Profile...">
+        <menu_item_call.on_click
+         function="ShowAgentProfile"
+         parameter="agent" />
+    </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 0f400777b82a3c8a41dc3f0551c8bc48f907a3d2..d29dfa70348c0a03308def9c9a4e043645b4841c 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -471,6 +471,14 @@
          function="Inventory.DoToSelected"
          parameter="delete" />
     </menu_item_call>
+    <menu_item_call
+     label="Delete System Folder"
+     layout="topleft"
+     name="Delete System Folder">
+        <menu_item_call.on_click
+         function="Inventory.DoToSelected"
+         parameter="delete_system_folder" />
+    </menu_item_call>
     <menu_item_separator
      layout="topleft" />
     <menu_item_separator
diff --git a/indra/newview/skins/default/xui/en/menu_land.xml b/indra/newview/skins/default/xui/en/menu_land.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d88a2f8d25a1e3d4810cf736ff8c49457a17db64
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_land.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Land Pie">
+    <menu_item_call
+     label="About Land"
+     name="Place Information...">
+        <menu_item_call.on_click
+         function="ShowFloater"
+         parameter="about_land" />
+    </menu_item_call>
+ <!--   <menu_item_call
+     label="Go Here"
+     name="Go Here">
+        <menu_item_call.on_click
+         function="GoToObject" />
+    </menu_item_call>-->
+    <menu_item_call
+     label="Sit Here"
+     name="Sit Here">
+        <menu_item_call.on_click
+         function="Land.Sit" />
+    </menu_item_call>
+    <menu_item_separator
+     layout="topleft" />
+        <menu_item_call
+     enabled="false"
+     label="Buy This Land"
+     name="Land Buy">
+        <menu_item_call.on_click
+         function="ShowFloater"
+         parameter="buy land" />
+        <menu_item_call.on_enable
+         function="World.EnableBuyLand" />
+    </menu_item_call>
+   <menu_item_call
+     enabled="false"
+     label="Buy Pass"
+     name="Land Buy Pass">
+        <menu_item_call.on_click
+         function="Land.BuyPass" />
+        <menu_item_call.on_enable
+         function="Land.EnableBuyPass" />
+    </menu_item_call>
+            <menu_item_separator
+     layout="topleft" />
+   <menu_item_call
+     enabled="false"
+     label="Build"
+     name="Create">
+        <menu_item_call.on_click
+         function="Land.Build" />
+        <menu_item_call.on_enable
+         function="EnableEdit" />
+    </menu_item_call>
+    <menu_item_call
+     enabled="false"
+     label="Edit Terrain"
+     name="Edit Terrain">
+        <menu_item_call.on_click
+         function="Land.Edit" />
+        <menu_item_call.on_enable
+         function="EnableEdit" />
+    </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml
new file mode 100644
index 0000000000000000000000000000000000000000..62500c5116c22473631907763b0c62564f0e6b9d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_object.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Object Pie">
+   <menu_item_call
+     enabled="false"
+     label="Touch"
+     name="Object Touch">
+        <menu_item_call.on_click
+         function="Object.Touch" />
+        <menu_item_call.on_enable
+         function="Object.EnableTouch"
+         name="EnableTouch"
+         parameter="Touch" />
+   </menu_item_call>
+   <menu_item_call
+     label="Edit"
+     name="Edit...">
+        <menu_item_call.on_click
+         function="Object.Edit" />
+        <menu_item_call.on_visible
+         function="EnableEdit"/>
+    </menu_item_call>
+    <menu_item_call
+      label="Build"
+      name="Build">
+      <menu_item_call.on_click
+       function="Object.Edit" />
+      <menu_item_call.on_visible
+       function="VisibleBuild"/>
+    </menu_item_call>
+   <menu_item_call
+     enabled="false"
+     label="Open"
+     name="Open">
+        <menu_item_call.on_click
+         function="Object.Open" />
+        <menu_item_call.on_enable
+         function="Object.EnableOpen" />
+   </menu_item_call>
+   <menu_item_call
+     enabled="false"
+     label="Sit Here"
+     name="Object Sit">
+        <menu_item_call.on_click
+         function="Object.SitOrStand" />
+        <menu_item_call.on_enable
+         function="Object.EnableSitOrStand"
+         name="EnableSitOrStand"
+         parameter="Sit Here,Stand Up" />
+    </menu_item_call>
+   <menu_item_call
+       label="Object Profile"
+       name="Object Inspect">
+         <menu_item_call.on_click
+          function="Object.Inspect" />
+         <menu_item_call.on_enable
+          function="Object.EnableInspect" />
+   </menu_item_call>
+<menu_item_separator layout="topleft" />
+   <context_menu
+         label="Put On &gt;"
+         name="Put On" >
+   <menu_item_call
+      enabled="false"
+      label="Wear"
+      name="Wear">
+            <menu_item_call.on_click
+             function="Object.AttachToAvatar" />
+            <menu_item_call.on_enable
+             function="Object.EnableWear" />
+   </menu_item_call>
+   <context_menu
+         label="Attach &gt;"
+         name="Object Attach" />
+   <context_menu
+         label="Attach HUD &gt;"
+         name="Object Attach HUD" />
+   </context_menu>
+   <context_menu
+         label="Remove &gt;"
+         name="Remove">
+   <menu_item_call
+     enabled="false"
+     label="Take"
+     name="Pie Object Take">
+        <menu_item_call.on_click
+         function="Tools.BuyOrTake" />
+        <menu_item_call.on_enable
+         function="Tools.EnableBuyOrTake"
+         parameter="Buy,Take" />
+    </menu_item_call>
+   <menu_item_call
+         enabled="false"
+         label="Report Abuse"
+         name="Report Abuse...">
+            <menu_item_call.on_click
+             function="Object.ReportAbuse" />
+            <menu_item_call.on_enable
+             function="Object.EnableReportAbuse" />
+   </menu_item_call>
+   <menu_item_call
+          enabled="false"
+          label="Block"
+          name="Object Mute">
+             <menu_item_call.on_click
+              function="Object.Mute" />
+             <menu_item_call.on_enable
+              function="Object.EnableMute" />
+   </menu_item_call>
+   <menu_item_call
+      enabled="false"
+      label="Return"
+      name="Return...">
+         <menu_item_call.on_click
+          function="Object.Return" />
+         <menu_item_call.on_enable
+          function="Object.EnableReturn" />
+     </menu_item_call>
+     <menu_item_call
+   enabled="false"
+   label="Delete"
+   name="Delete">
+      <menu_item_call.on_click
+       function="Object.Delete" />
+      <menu_item_call.on_enable
+       function="Object.EnableDelete" />
+    </menu_item_call>
+    </context_menu>
+   <menu_item_separator layout="topleft" />
+   <menu_item_call
+   enabled="false"
+   label="Take Copy"
+   name="Take Copy">
+      <menu_item_call.on_click
+       function="Tools.TakeCopy" />
+      <menu_item_call.on_enable
+       function="Tools.EnableTakeCopy" />
+  </menu_item_call>
+   <menu_item_call
+   enabled="false"
+   label="Pay"
+   name="Pay...">
+  <menu_item_call.on_click
+   function="PayObject" />
+  <menu_item_call.on_enable
+   function="EnablePayObject" />
+</menu_item_call>
+  <menu_item_call
+   enabled="false"
+   label="Buy"
+   name="Buy...">
+      <menu_item_call.on_click
+       function="Object.Buy" />
+      <menu_item_call.on_enable
+       function="Object.EnableBuy" />
+   </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml
index 0422972cd423624ddf1c2c778137e6cc4be773ad..449202aaaa0310fe6057be964191f4816269128b 100644
--- a/indra/newview/skins/default/xui/en/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml
@@ -16,7 +16,7 @@
         <menu_item_call.on_click
          function="Avatar.AddFriend" />
         <menu_item_call.on_enable
-         function="Avatar.EnableItem"
+         function="ParticipantList.EnableItem"
          parameter="can_add" />
     </menu_item_call>
     <menu_item_call
@@ -30,11 +30,14 @@
      label="Call"
      layout="topleft"
      name="Call">
-        <menu_item_call.on_click
+         <menu_item_call.on_click
          function="Avatar.Call" />
+        <menu_item_call.on_enable
+         function="ParticipantList.EnableItem"
+         parameter="can_call" />
     </menu_item_call>
     <menu_item_call
-     enabled="false"
+     enabled="true"
      label="Share"
      layout="topleft"
      name="Share">
@@ -49,22 +52,22 @@
          function="Avatar.Pay" />
     </menu_item_call>
     <menu_item_check
-     label="Block/Unblock"
+     label="Block Voice"
      layout="topleft"
      name="Block/Unblock">
         <menu_item_check.on_click
          function="Avatar.BlockUnblock" />
         <menu_item_check.on_check
-         function="Avatar.CheckItem"
+         function="ParticipantList.CheckItem"
          parameter="is_blocked" />
         <menu_item_check.on_enable
-         function="Avatar.EnableItem"
+         function="ParticipantList.EnableItem"
          parameter="can_block" />
     </menu_item_check>
         <menu_item_separator
          layout="topleft" />
     <menu_item_check
-     label="Mute Text"
+     label="Block Text"
      layout="topleft"
      name="MuteText">
         <on_check
@@ -76,6 +79,10 @@
          function="ParticipantList.EnableItem"
          parameter="can_mute_text" />
     </menu_item_check>
+    <context_menu
+     label="Moderator Options &gt;"
+     layout="topleft"
+     name="Moderator Options" >
     <menu_item_check
      label="Allow text chat"
      layout="topleft"
@@ -136,4 +143,5 @@
          function="ParticipantList.EnableItem"
          parameter="can_moderate_voice" />
     </menu_item_call>
+    </context_menu>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
index 304492bedb2c330abba093bc6d2d9a20b62ea7db..df3cb26b04d783d8ca8dfaca66917e9825546034 100644
--- a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
@@ -19,5 +19,7 @@
    name="Leave Selected Group">
       <menu_item_call.on_click
        function="People.Group.Minus.Action"/>
+      <menu_item_call.on_enable
+       function="People.Group.Minus.Enable"/>
   </menu_item_call>
 </menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
index 39469f7101c061d6abf29c5039b41f8d7f1fe9e5..5f2e6e0f6c6b76c263a58bf727097967949f11d9 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -32,6 +32,9 @@
      name="Call">
         <menu_item_call.on_click
          function="Avatar.Call" />
+        <menu_item_call.on_enable
+         function="Avatar.EnableItem"
+         parameter="can_call" />
     </menu_item_call>
     <menu_item_call
      label="Share"
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
index df74d2dcd4bb30849de221ca280ff8a14656fa03..0d3dd3366d4b91e84a9162458650986a4fc95c0f 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
@@ -27,6 +27,9 @@
      name="Call">
         <on_click
          function="Avatar.Call" />
+        <on_enable
+         function="Avatar.EnableItem"
+         parameter="can_call" />
     </menu_item_call>
     <menu_item_call
      enabled="false"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 185b7b78f6e8d4645b138e394eaf1d5354f6c643..c8f4621d8a839ea75f1769523075cd1f9442fc34 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5013,14 +5013,14 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you [O
        index="0"
        name="Keep"
        text="Keep"/>
-      <button
-       index="4"
-       name="Show"
-       text="Show"/> 
       <button
        index="1"
        name="Discard"
        text="Discard"/>
+      <button
+       index="2"
+       name="Mute"
+       text="Block"/>
     </form>
   </notification>
 
diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index f5fce65c7302cf0419f3ca3a41188a7a774f4e52..f3a2297151466f4e8c9c15c00a5264236322c831 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -36,9 +36,9 @@
          follows="all"
          height="20"
          label="Call"
-         left_delta="40"
+         left_delta="10"
          name="call_btn"
-         width="100" />
+         width="160" />
         <button
          bottom="40"
          follows="all"
@@ -46,14 +46,15 @@
          label="Leave Call"
          name="end_call_btn"
          visible="false"
-         width="100" />
+          />
         <button
          follows="all"
          bottom="10"
          height="20"
          label="Voice Controls"
          name="voice_ctrls_btn"
+         use_ellipses="true" 
          visible="false"
-         width="100" />
+          />
     </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index a41d492624bc48c72f3fb5ccd942416fdc81522f..3e2910458f818e6e2dd7576d7fdbafaa9d3ba98e 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -114,7 +114,7 @@
           width="82"
           tool_tip="Shows/hides gestures">
              <gesture_combo_box.drop_down_button
-              pad_right="10" 
+              pad_right="10"
               use_ellipses="true" />
          </gesture_combo_box>
         </layout_panel>
@@ -126,7 +126,7 @@
          image_name="spacer24.tga"
          layout="topleft"
          left="0"
-         min_width="4" 
+         min_width="4"
          name="DUMMY"
          top="0"
          width="4"/>
@@ -168,7 +168,7 @@
          image_name="spacer24.tga"
          layout="topleft"
          left="0"
-         min_width="4" 
+         min_width="4"
          name="DUMMY"
          top="0"
          width="4"/>
@@ -211,7 +211,7 @@
          image_name="spacer24.tga"
          layout="topleft"
          left="0"
-         min_width="4" 
+         min_width="4"
          name="DUMMY"
          top="0"
          width="4"/>
@@ -243,7 +243,7 @@
         <layout_panel
          mouse_opaque="false"
          follows="left|right"
-         height="28"
+         height="29"
          layout="topleft"
          top="0"
          name="chiclet_list_panel"
@@ -251,24 +251,24 @@
          min_width="180"
          user_resize="false"
          auto_resize="true">
-<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same 
+<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same
 as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991-->
             <chiclet_panel
 	    mouse_opaque="false"
              follows="left|right"
              height="23"
              layout="topleft"
-             left="0"
+             left="1"
              min_width="180"
              name="chiclet_list"
-             top="4"
+             top="6"
              chiclet_padding="4"
              scrolling_offset="40"
              width="189">
                 <button
                  auto_resize="true"
                  follows="right"
-                 height="23"
+                 height="29"
                  image_selected="SegmentedBtn_Left_Off"
                  image_unselected="SegmentedBtn_Left_Off"
 		 image_hover_selected="SegmentedBtn_Left_Over"
@@ -278,14 +278,16 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
 		 image_overlay="Arrow_Small_Left"
                  layout="topleft"
                  name="chicklet_left_scroll_button"
+        scale_image="true"
                  tab_stop="false"
-                 top="0"
+                 top="-2"
+                 right_pad="2"
                  visible="false"
-                 width="20" />
+                 width="7" />
                 <button
                  auto_resize="true"
                  follows="right"
-                 height="23"
+                 height="29"
                  image_selected="SegmentedBtn_Right_Off"
                  image_unselected="SegmentedBtn_Right_Off"
 		 image_hover_selected="SegmentedBtn_Right_Over"
@@ -295,10 +297,11 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
 		 image_overlay="Arrow_Small_Right"
                  layout="topleft"
                  name="chicklet_right_scroll_button"
+        scale_image="true"
                  tab_stop="false"
-                 top="0"
+                 top="-2"
                  visible="false"
-                 width="20" />
+                 width="7" />
             </chiclet_panel>
         </layout_panel>
         <icon
@@ -309,7 +312,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
          image_name="spacer24.tga"
          layout="topleft"
          left="0"
-         min_width="4" 
+         min_width="4"
          top="0"
          width="5"/>
         <layout_panel
@@ -320,18 +323,18 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
          min_height="28"
          top="0"
          name="im_well_panel"
-         width="34"
-         min_width="34"
+         width="35"
+         min_width="35"
          user_resize="false">
             <chiclet_im_well
-             flash_period="0.3" 
+             flash_period="0.3"
              follows="right"
              height="23"
              layout="topleft"
              left="0"
              name="im_well"
              top="4"
-             width="34">
+             width="35">
              <!--
 Emulate 4 states of button by background images, see detains in EXT-3147. The same should be for notification_well button
 xml attribute           Description
@@ -342,21 +345,22 @@ image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well
              -->
                 <button
                  auto_resize="true"
-                 flash_color="EmphasisColor"
+                 flash_color="Yellow"
                  follows="right"
                  halign="center"
                  height="23"
-                 image_overlay="Notices_Unread"
-                 image_overlay_alignment="center" 
+                 image_overlay="Unread_IM"
+                 image_overlay_alignment="center"
                  image_pressed="WellButton_Lit"
                  image_pressed_selected="WellButton_Lit_Selected"
                  image_selected="PushButton_Selected_Press"
+                 label_color="Black"
                  left="0"
                  max_displayed_count="99"
                  name="Unread IM messages"
                  pad_left="0"
                  pad_right="0"
-                 width="34" >
+                 width="35" >
                     <button.init_callback
                      function="Button.SetDockableFloaterToggle"
                      parameter="im_well_window" />
@@ -370,9 +374,10 @@ image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well
          layout="topleft"
          min_height="28"
          top="0"
+         left_pad="4"
          name="notification_well_panel"
-         width="34"
-         min_width="34"
+         width="35"
+         min_width="35"
          user_resize="false">
             <chiclet_notification
              flash_period="0.25"
@@ -383,23 +388,24 @@ image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well
              max_displayed_count="99"
              name="notification_well"
              top="4"
-             width="34">
+             width="35">
               <button
-                 image_selected="PushButton_Selected_Press"
+                 bottom_pad="3"
                  image_pressed="WellButton_Lit"
                  image_pressed_selected="WellButton_Lit_Selected"
+                 image_selected="PushButton_Selected_Press"
               auto_resize="true"
                halign="center"
                height="23"
                follows="right"
-               flash_color="EmphasisColor"
-               left="0"
+               flash_color="Yellow"
+                label_color="Black"
+               left="5"
                name="Unread"
                image_overlay="Notices_Unread"
-               image_overlay_alignment="center" 
-               pad_right="0"
-               pad_left="0"
-               width="34" >
+               image_overlay_alignment="center"
+               pad_right="5"
+               width="35" >
                   <button.init_callback
                    function="Button.SetDockableFloaterToggle"
                    parameter="notification_well_window" />
@@ -413,7 +419,7 @@ image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well
          height="10"
          image_name="spacer24.tga"
          layout="topleft"
-         min_width="4" 
+         min_width="4"
          right="-1"
          top="0"
          width="4"/>
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index a5445a57831b000b8b92988e9a8799dda4020081..86b30ebfcee32b2a40e13d0c776e13d15dff967c 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -24,9 +24,10 @@
      follows="left|right|bottom"
      height="23"
      label="Group Profile"
-     left_delta="28"
+     left_delta="10"
      name="group_info_btn"
-     width="125" />
+     use_ellipses="true" 
+     width="160" />
     <panel
      background_visible="true"
      bg_alpha_color="DkGray2"
@@ -43,24 +44,27 @@
          follows="all"
          height="23"
          label="Call Group"
-         left_delta="28"
+         left_delta="10"
          name="call_btn"
-         width="125" />
+         use_ellipses="true" 
+         width="160" />
         <button
          bottom="40"
          follows="all"
          height="23"
          label="Leave Call"
          name="end_call_btn"
+         use_ellipses="true" 
          visible="false"
-         width="125" />
+          />
         <button
          bottom="10"
          follows="all"
          height="23"
          label="Open Voice Controls"
          name="voice_ctrls_btn"
+         use_ellipses="true" 
          visible="false"
-         width="125" />
+          />
     </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index c9db75b5d86c3c0d1efa26441bc55d409419bb39..6187b8f1e2eec26a4e1839da1154387dbcc14a5b 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -33,21 +33,31 @@ name="login_html"
 start_url=""
 top="0"
 height="600"
-     width="996" />
-<panel
+     width="980" />
+<layout_stack
 follows="left|bottom|right"
 name="login_widgets"
 layout="topleft"
+orientation="horizontal"
 top="519"
 width="996"
-     height="80">
+height="80">
+<layout_panel
+auto_resize="false"
+follows="left|bottom"
+name="login"
+layout="topleft"
+width="695"
+min_width="695"
+user_resize="false"
+height="80">
 <text
 follows="left|bottom"
 font="SansSerifSmall"
 height="16"
-left="20"
 name="first_name_text"
 top="20"
+left="20"
 width="150">
 First name:
 </text>
@@ -145,7 +155,7 @@ name="Typeregionname"   value="" />
 <combo_box
 allow_text_entry="true"
 font="SansSerifSmall"
-   follows="left|bottom"
+   follows="left|right|bottom"
    height="23"
 layout="topleft"
 top_pad="2"
@@ -164,14 +174,20 @@ width="135"
   name="connect_btn"
   top="35"
   width="90" />
- <text
+</layout_panel>
+<layout_panel
+follows="right|bottom"
+name="links"
+width="200"
+min_width="200"
+user_resize="false"
+height="80">
+   <text
 follows="right|bottom"
 font="SansSerifSmall"
-text_color="EmphasisColor"
 halign="right"
 height="16"
 top="12"
-left_pad="5"
 right="-10"
 name="create_new_account_text"
   width="180">
@@ -183,7 +199,9 @@ font="SansSerifSmall"
 text_color="EmphasisColor"
 halign="right"
 height="16"
-name="forgot_password_text"    top_pad="12"
+name="forgot_password_text"
+top_pad="12"
+right="-10"
   width="180">
        Forgot your name or password?
 </text>
@@ -195,6 +213,7 @@ halign="right"
 height="16"
 name="login_help"
 top_pad="2"
+right="-10"
     width="180">
        Need help logging in?   </text>
 <!--  <text
@@ -208,5 +227,6 @@ top_pad="2"
     word_wrap="true">
        [VERSION]
    </text>-->
-</panel>
+   </layout_panel>
+</layout_stack>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index c0168f62881b9a7059f68b49b545d8c611b90660..c7353f62c139755576ca867fc5008fcf0464d49d 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -17,7 +17,7 @@
      text_pad_left="14"
      follows="left|top|right"
 	height="23"
-     label="Filter"
+     label="Filter Inventory"
      layout="topleft"
      left="15"
 max_length="300"
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index 24c40b32fba71044489b1eeae39d84bbc7d402d1..5217ab357173d6057f150ba8f654db72a2a16013 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -17,7 +17,7 @@
    height="15"
    left="10"
    name="home_label">
-    Home URL:
+    Home Page:
   </text>
   <text
    visible="false" 
@@ -27,7 +27,7 @@
    left_delta="64"
    text_color="red"
    name="home_fails_whitelist_label">
-    (This URL does not pass the specified whitelist)
+    (This page does not pass the specified whitelist)
   </text>
   <line_editor 
    bottom_delta="-24" 
@@ -37,7 +37,7 @@
    height="20" 
    left="10" 
    name="home_url"
-   tool_tip="The home URL for this media source"
+   tool_tip="The home page for this media source"
    width="340"> 
     <!--  <line_editor.commit_callback
 	     function="Media.CommitHomeURL"/> -->
@@ -69,7 +69,7 @@
    height="15" 
    left="10" 
    name="current_url_label">
-    Current URL:
+    Current Page:
   </text>
   <text 
    bottom_delta="-20" 
@@ -79,7 +79,7 @@
    height="20" 
    left="10" 
    name="current_url"
-   tool_tip="The current URL for this media source"
+   tool_tip="The current page for this media source"
    value="" 
    width="340" />
   <button 
@@ -93,35 +93,6 @@
    <button.commit_callback
 	     function="Media.ResetCurrentUrl"/>
   </button>
-  <text 
-   bottom_delta="-5" 
-   follows="top|left" 
-   height="15"
-   left="10" 
-   name="controls_label">
-    Controls:
-  </text>
-  <combo_box 
-   allow_text_entry="false" 
-   bottom_delta="-20"
-   follows="left|top"
-   height="18" 
-   left="10" 
-   max_chars="20"
-   name="controls" 
-   width="120">
-    <combo_item 
-	 name="Standard" 
-	 value="Standard">
-      Standard
-    </combo_item>
-    <combo_item 
-	 name="Mini" 
-	 value="Mini">
-      Mini
-    </combo_item>
-  </combo_box>
-
   <check_box 
    bottom_delta="-25" 
    enabled="true" 
@@ -135,7 +106,6 @@
    name="auto_loop" 
    radio_style="false" 
    width="150" />
-
   <check_box 
    bottom_delta="-25" 
    visible="false" 
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
index 85f534c4a3bf4e192ec3366ed4940328634e172d..b5c237151005547dc559168cba1aee708f6ec48a 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
@@ -4,13 +4,42 @@
  enabled="true" 
  follows="left|top|right|bottom"
  height="500" 
- label="Controls" 
+ label="Customize" 
  left="102" 
  mouse_opaque="true"
  name="Media settings for controls" 
  help_topic = "media_settings_controls"
  width="365">
 
+  <text
+   bottom_delta="-50"
+   follows="top|left"
+   height="15"
+   left="10"
+   name="controls_label">
+    Controls:
+  </text>
+  <combo_box
+   allow_text_entry="false"
+   bottom_delta="0"
+   follows="left|top"
+   height="18"
+   left="100"
+   max_chars="20"
+   name="controls"
+   width="120">
+    <combo_item
+	 name="Standard"
+	 value="Standard">
+      Standard
+    </combo_item>
+    <combo_item
+	 name="Mini"
+	 value="Mini">
+      Mini
+    </combo_item>
+  </combo_box>
+
   <text 
    bottom_delta="-50" 
    follows="top|left" 
@@ -27,7 +56,7 @@
    font="SansSerifSmall"
    height="16" 
    initial_value="false"
-   label="Disable Navigation &amp; Interactivity" 
+   label="Allow Navigation &amp; Interactivity" 
    left="30" 
    mouse_opaque="true"
    name="perms_owner_interact" 
@@ -41,7 +70,7 @@
    font="SansSerifSmall"
    height="16" 
    initial_value="false"
-   label="Hide Control Bar" 
+   label="Show Control Bar" 
    left="30" 
    mouse_opaque="true"
    name="perms_owner_control" 
@@ -74,7 +103,7 @@
    font="SansSerifSmall"
    height="16" 
    initial_value="false"
-   label="Disable Navigation &amp; Interactivity" 
+   label="Allow Navigation &amp; Interactivity" 
    left="30" 
    mouse_opaque="true"
    name="perms_group_interact" 
@@ -88,7 +117,7 @@
    font="SansSerifSmall"
    height="16" 
    initial_value="false"
-   label="Hide Control Bar" 
+   label="Show Control Bar" 
    left="30" 
    mouse_opaque="true"
    name="perms_group_control" 
@@ -111,7 +140,7 @@
    font="SansSerifSmall"
    height="16" 
    initial_value="false"
-   label="Disable Navigation &amp; Interactivity" 
+   label="Allow Navigation &amp; Interactivity" 
    left="30" 
    mouse_opaque="true"
    name="perms_anyone_interact" 
@@ -125,7 +154,7 @@
    font="SansSerifSmall"
    height="16" 
    initial_value="false"
-   label="Hide Control Bar" 
+   label="Show Control Bar" 
    left="30" 
    mouse_opaque="true"
    name="perms_anyone_control" 
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
index 6e82713f06278e34b99c5c7696bb5a975e5d4cd1..1f580831f92f28ac5563cb3990442ec936ab0366 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
@@ -17,7 +17,7 @@
    font="SansSerifSmall"
    height="16" 
    initial_value="false"
-   label="Only Allow Access to Specified URLs (by prefix)" 
+   label="Only Allow Access to Specified URL patterns" 
    left="10" 
    mouse_opaque="true"
    name="whitelist_enable" 
@@ -48,7 +48,7 @@
    bottom_delta="0"
    text_color="0.4 0.4 0.4 1.0" 
    name="home_url_fails_some_items_in_whitelist">
-    Entries that the home URL fails against are marked:
+    Entries that the home page fails against are marked:
   </text>
   <button 
    bottom_delta="-36" 
@@ -81,10 +81,9 @@
    height="40"
    left="30"
    text_color="0.6 0.0 0.0 1.0"
+   word_wrap="true" 
    name="home_url_fails_whitelist">
-Warning: the home URL specified in the General tab 
-fails to pass this whitelist. It has been disabled 
-until a valid entry has been added.
+Warning: the home page specified in the General tab fails to pass this whitelist. It has been disabled until a valid entry has been added.
   </text>
 
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index e8e4a9dbb25e44c95544a9bb1897cf21208c806c..74265a51cad89d2d8fa327f56065d8924c69e521 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -149,6 +149,7 @@
 
     <favorites_bar
      follows="left|right|top"
+     font="SansSerif"
      height="15"
      layout="topleft"
      left="0"
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index db95d01b43503b02e036101f3cc20341e226ba4f..5c99022f357b7f3c333e2fe25ca52a31891d9327 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -1,61 +1,114 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="Outfits"
-       height="510"
-   width="333"
-      follows="top|left"
-             left="0"
-	     top_pad="0">
-    <accordion
-     single_expansion="true"
-     height="510"
-             layout="topleft"
-             left="0"
-      follows="top|left"
-     name="outfits_accordion"
-	     top_pad="0"
-             width="333">
-     <accordion_tab
-            expanded="false"
-            layout="topleft"
-         name="tab_cof"
-         title="Current Outfit">
-	 <inventory_panel
+
+ <panel name="Outfits"
+ background_visible="true"
+  follows="all"
+ height="550"
+ label="Things"
+ layout="topleft"
+ min_height="350"
+ min_width="240"
+ width="330"
+ border="false">
+   <tab_container
+     follows="all"
+     height="500"
+     layout="topleft"
+     left="10"
+     name="appearance_tabs"
+     tab_min_width="100"
+     tab_height="30"
+     tab_position="top"
+     halign="center"
+     width="313">
+      <inventory_panel
+        label="MY OUTFITS"
+        help_topic="my_outfits_tab"
 	    allow_multi_select="true"
+	    follows="all"
 	    border="false"
-            height="460"
-	     left="0"
-             top="0"
-		 mouse_opaque="true"
-	         name="cof_accordionpanel"
-		 start_folder="Current Outfit" />
-        </accordion_tab>
-        <accordion_tab
-            expanded="true"
-            layout="topleft"
-         name="tab_outfits"
-         title="My Outfits">
-	 <inventory_panel
-	 	 allow_multi_select="true"
-		 border="false"
-	     follows="all"
-		 left="0"
-             top="0"
-            height="460"
-		 mouse_opaque="true"
-	     name="outfitslist_accordionpanel"
-		 start_folder="My Outfits" />
-        </accordion_tab>
-	</accordion>
-	<!--<button bottom="0"
-		 halign="center"
-		 height="23"
-		 label=">"
-		 enabled="false"
-	     mouse_opaque="false"
-		 name="selector"
-		 width="20"
-		 left="0"
-		 visible="false"
-	     follows="right|bottom"
-		 tool_tip="View outfit properties" />-->
+	    left="0"
+        top="0"
+        height="500"
+        width="290"
+ 		mouse_opaque="true"
+ 	    name="outfitslist_accordionpanel"
+ 		start_folder="My Outfits" /> 
+         <inventory_panel
+        label="WEARING"
+        help_topic="now_wearing_tab"
+        allow_multi_select="true"
+        border="false"
+        height="500"
+        width="290"
+        left="0"
+        top="0"
+        mouse_opaque="true"
+        name="cof_accordionpanel"
+        start_folder="Current Outfit" />
+   </tab_container>
+	<panel
+	  background_visible="true"
+	  follows="bottom|left"
+	  height="50"
+	  layout="topleft"
+	  left="0"
+	  visible="true"
+	  name="bottom_panel"
+	  top_pad="10"
+	  width="313">
+		 <button
+		  follows="bottom|left"
+		  tool_tip="Show additional options"
+		  height="18"
+		  image_disabled="OptionsMenu_Disabled"
+		  image_selected="OptionsMenu_Press"
+		  image_unselected="OptionsMenu_Off"
+		  layout="topleft"
+		  left="10"
+		  name="options_gear_btn"
+		  top="6"
+		  width="18" />
+         <dnd_button
+		  follows="bottom|left"
+		  height="18"
+		  image_selected="TrashItem_Press"
+		  image_unselected="TrashItem_Off"
+		  layout="topleft"
+		  right="-5"
+		  name="trash_btn"
+		  tool_tip="Remove selected item"
+		  top="6"
+		  width="18" />
+	 <button
+	  follows="bottom|left"
+		height="23" 
+		label="Edit Look" 
+		layout="topleft"
+        left="10"
+		name="look_edit_btn"
+        top="26"
+        visible="false" 
+		width="90" />
+     <button
+      follows="bottom|left"
+      height="23" 
+      label="Make Outfit" 
+      layout="topleft"
+      name="make_outfit_btn"
+      tool_tip="Save appearance as an outfit"
+       top="26"
+      right="-110"
+      width="90" />
+     <button
+      follows="bottom|right" 
+      height="23" 
+      label="Wear"
+      layout="topleft"
+      name="wear_btn"
+      right="-10"
+       top="26"
+      tool_tip="Wear selected outfit"
+      width="90" />
+	 </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 4facedc7ea7db4d96674de726fa9cc732773e56a..2230229b14d23c8af9b5e59b92fa09b6e1ee934c 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -20,12 +20,9 @@
   height="535"
   layout="topleft"
   left="6"
-  name="empty_picks_panel_text"
+  name="picks_panel_text"
   top="10"
-  visible="false" 
-  width="313">
-   There are no picks/classifieds here
- </text>
+  width="313"/>
  <accordion
   fit_parent="true" 
   follows="all"
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index 88df529ec1f20d0cb389b432cffdceb6360d515a..d4a6c7f3b3353286151c0bad623e59996f0b05a1 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -22,7 +22,7 @@ background_visible="true"
      height="23"
      layout="topleft"
      left="15"
-     label="Filter"
+     label="Filter Places"
      max_length="300"
      name="Filter"
      top="3"
@@ -77,6 +77,7 @@ background_visible="true"
          layout="topleft"
          left="5"
          name="teleport_btn"
+         tool_tip="Teleport to the selected area"
          top="0"
          width="100" />
         <button
@@ -86,6 +87,7 @@ background_visible="true"
          layout="topleft"
          left_pad="5"
          name="map_btn"
+         tool_tip="Show selected area on the map"
          top="0"
          width="70" />
         <button
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 78b90eefcca3e447fc3f0102e7ec30e5ef12e898..405ff02836fc323727987eec35eeff2980421f61 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -284,7 +284,7 @@ Avatars:
      enabled_control="EnableVoiceChat"
      control_name="PushToTalkToggle"
      height="20"
-     label="Toggle mode for microphone when I press the speak trigger key:"
+     label="Toggle mode for microphone when I press the Speak trigger key:"
      layout="topleft"
      left="30"
      name="push_to_talk_toggle_check"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index a7def5306e33ba9b3c6b0e6d62487b5ab9e121d3..a65f7d3a543c9ca74bf77539e8aec8e76f6b28c8 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -3,7 +3,7 @@
  border="true"
  follows="left|top|right|bottom"
  height="408"
- label="Input &amp; Camera"
+ label="Setup"
  layout="topleft"
  left="102"
  name="Input panel"
@@ -223,7 +223,7 @@
      follows="left|top"
      height="23"
      label="Reset"
-     label_selected="Set"
+     label_selected="Reset"
      layout="topleft"
      left_pad="3"
      name="reset_cache"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index 5332007bafaca34268828d8bfd33ce7f0cfa2330..d8e3f4ccfb479f01a7f8bd47cf27b7d6cd76d696 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -348,23 +348,24 @@
    label="Input/Output devices"
    layout="topleft"
    left="30"
-   top="270"
+   top="262"
    name="device_settings_btn"
    width="190">
   </button>
     <panel
-     background_visible="true"
+     background_visible="false"
      bg_alpha_color="DkGray"
      visiblity_control="ShowDeviceSettings"
      border="false"
      follows="top|left"
-     height="145"
+     height="120"
      label="Device Settings"
      layout="topleft"
      left="0"
      name="device_settings_panel"
      class="panel_voice_device_settings"
-     width="501">
+     width="501"
+     top="285">
       <panel.string
         name="default_text">
         Default
@@ -397,8 +398,33 @@
      left="165"
      max_chars="128"
      name="voice_input_device"
-     top_pad="0"
+     top_pad="-2"
      width="200" />
+   <text
+     type="string"
+     length="1"
+     follows="left|top"
+     height="16"
+     layout="topleft"
+     left="165"
+     name="My volume label"
+     top_pad="5"
+     width="200">
+        My volume:
+    </text>
+      <slider_bar
+        control_name="AudioLevelMic"
+     follows="left|top"
+     height="17"
+     increment="0.05"
+     initial_value="1.0"
+     layout="topleft"
+     left="160"
+     max_val="2"
+     name="mic_volume_slider"
+     tool_tip="Change the volume using this slider"
+     top_pad="-2"
+     width="220" />
     <text
      type="string"
      text_color="EmphasisColor"
@@ -408,7 +434,7 @@
      layout="topleft"
      left_pad="5"
      name="wait_text"
-     top_delta="5"
+     top_delta="0"
      width="110">
         Please wait
     </text>
@@ -417,7 +443,7 @@
      layout="topleft"
      left_delta="0"
      name="bar0"
-     top_delta="-5"
+     top_delta="0"
      width="20" />
     <locate
      height="20"
@@ -453,7 +479,7 @@
              left="80"
              name="speaker_icon"
              mouse_opaque="false"
-             top_pad="4"
+             top_pad="-8"
              visible="true"
              width="22" />
     <text
@@ -475,7 +501,7 @@
      left="165"
      max_chars="128"
      name="voice_output_device"
-     top_pad="0"
+     top_pad="-2"
      width="200" />
     </panel>
     </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index b4f72a48bc285326dc7c760c0ca6dc7ad6fa9c6d..b14089c3a24ea4f831b203bec5ac7835b742fef1 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -5,6 +5,7 @@
 	background_visible="false"
 	height="200"
 	layout="topleft"
+	help_topic="prim_media_controls"
 	mouse_opaque="false"
 	width="800">
   <string name="control_background_image_name">Inspector_Background</string>
@@ -190,7 +191,7 @@
 		layout="topleft"
 		top="14"
 		min_width="22"
-		width="22">
+		width="24">
 	  <button
 		  image_overlay="Play_Off"
 		  image_disabled="PushButton_Disabled"
@@ -200,6 +201,8 @@
 		  hover_glow_amount="0.15"
 		  layout="topleft"
 		  tool_tip = "Play media"
+		  left_delta="2"
+		  top="4"
 		  height="22"
 		  min_width="22"
 		  width="22">
@@ -214,7 +217,7 @@
 		layout="topleft"
 		top="18"
 		min_width="22"
-		width="22">
+		width="24">
 	  <button
 		  image_overlay="Pause_Off"
 		  image_disabled="PushButton_Disabled"
@@ -224,6 +227,9 @@
 		  hover_glow_amount="0.15"
 		  layout="topleft"
 		  height="22"
+		  width="22"
+		  left_delta="-1"
+		  top="4"
 		  tool_tip = "Pause media">
 		<button.commit_callback
 			function="MediaCtrl.Pause" />
@@ -393,6 +399,8 @@
 			function="MediaCtrl.ToggleMute" />
 		<button.mouseenter_callback
 			function="MediaCtrl.ShowVolumeSlider" />
+		<button.mouseleave_callback
+			function="MediaCtrl.HideVolumeSlider" />
 	  </button>
 	  <slider
 		  orientation="vertical"
@@ -408,6 +416,10 @@
 		  volume="true">
 		<slider.commit_callback
 			function="MediaCtrl.Volume"/>
+		<slider.mouseenter_callback
+			function="MediaCtrl.ShowVolumeSlider" />
+		<slider.mouseleave_callback
+			function="MediaCtrl.HideVolumeSlider" />
 	  </slider>
 	</layout_panel>
 	<panel
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
index 32fc9fce01c87e19636f85b0a1d0e7c2cf7446c0..06da64533bd919b1d275f6f7d55e47225e80e95d 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
@@ -151,7 +151,7 @@
         <button
          follows="bottom|left"
          font="SansSerifBigBold"
-         tool_tip=""
+         tool_tip="Show additional optioins"
          height="18"
          image_disabled="OptionsMenu_Disabled"
          image_selected="OptionsMenu_Press"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index 3dac1a96140ee385511d5af6376c6da19097a8fe..7f4b4aef8209334d1b7c9d13af92c91d171c9bf8 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -85,72 +85,21 @@ left="0"
    class="panel_outfits_inventory"
    filename="panel_outfits_inventory.xml"
    name="panel_outfits_inventory"
-   height="510"
+   height="550"
    min_height="510"
    width="333"
    top_pad="0"
-   follows="top|left"
+   follows="all"
    />
-   <panel
-   visible="true"
-   name="bottom_panel"
-   height="50"
-   left="0"
-   top_pad="3"
-   follows="bottom|left"
-   width="333">
-      <button
-       follows="bottom|left"
-       tool_tip="Show additional options"
-       height="18"
-       image_disabled="OptionsMenu_Disabled"
-       image_selected="OptionsMenu_Press"
-       image_unselected="OptionsMenu_Off"
-       layout="topleft"
-       left="10"
-       name="options_gear_btn"
-       top="6"
-       width="18" />
-      <button
-       follows="bottom|left"
-       height="18"
-       image_selected="AddItem_Press"
-       image_unselected="AddItem_Off"
-       image_disabled="AddItem_Disabled"
-       layout="topleft"
-       left_pad="5"
-   name="newlook_btn"
-       tool_tip="Add new outfit"
-       width="18" />
-      <dnd_button
-       follows="bottom|left"
-       height="18"
-       image_selected="TrashItem_Press"
-       image_unselected="TrashItem_Off"
-       layout="topleft"
-       right="-5"
-       name="trash_btn"
-       tool_tip="Remove selected item"
-       top="6"
-       width="18" />
-      <button
-       follows="bottom|left"
-      height="23"
-      label="Wear"
-      layout="topleft"
-      name="wear_btn"
-      right="-5"
-      top_pad="0"
-      width="90" />
-   </panel>
-   <!--   <button
-   follows="bottom|left"
-   height="23"
-   label="New outfit"
-   layout="topleft"
-   left_pad="5"
-   right="-10"
-   width="100" />-->
+  <!--   <button
+	  follows="bottom|left"
+		height="23"
+		label="New outfit"
+		layout="topleft"
+		left_pad="5"
+		right="-10"
+		name="newlook_btn"
+		 width="100" />-->
    <panel
    class="panel_look_info"
    filename="panel_look_info.xml"
@@ -158,6 +107,7 @@ left="0"
    layout="topleft"
    left="0"
    name="panel_look_info"
+   top="35"
    visible="false" />
    <panel
    class="panel_edit_wearable"
@@ -166,5 +116,7 @@ left="0"
    layout="topleft"
    left="0"
    name="panel_edit_wearable"
+   top="35"
    visible="false" />
-</panel>
\ No newline at end of file
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 3cddbed2d493ed1c559ccd5e9fee7843b30bcaff..7b0b4b0bde13c1fa8801f98e09f3a2d0c7417eaf 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -510,4 +510,22 @@ top_pad="10"
 			Price: L$
 	    </text-->
 	</panel>
+    <panel
+		 height="25"
+		 layout="bottomright"
+		 help_topic="button_tab"
+		 name="button_panel"
+		 left="5"
+		 bottom="5"
+		 width="313">
+	    <button
+		     follows="bottom|right"
+		     height="25"
+		     label="Cancel"
+		     layout="topleft"
+		     name="cancel_btn"
+		     right="-1"
+		     left_pad="10"
+		     width="100" />
+	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index eff2ca1fcdeb516846c561c6b157507de783f9d9..5b379b54e3030c3f8d4d6701392ac999bc57f9ca 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -487,7 +487,7 @@
 		     height="25"
 		     label="Open"
 		     layout="topleft"
-		     left_pad="5"
+		     left="5"
 		     name="open_btn"
 		     top="0"
 		     width="60" />
@@ -509,23 +509,5 @@
 		     name="buy_btn"
 		     top="0"
 		     width="60" />
-	    <button
-		     follows="bottom|right"
-		     height="25"
-		     label="Cancel"
-		     layout="topleft"
-		     name="cancel_btn"
-		     right="-1"
-		     top="0"
-		     width="70" />
-	    <button
-		     follows="bottom|right"
-		     height="25"
-		     label="Save"
-		     layout="topleft"
-		     name="save_btn"
-		     left_pad="-135"
-		     top="0"
-		     width="60" />
 	</panel>
 </panel>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 6938048d8b4c459453374327660a6811f96b895a..d8c7bde383052c3abcc043d31729d31cc6d2a211 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -460,7 +460,7 @@ Returns the rotation of detected object number (returns &lt;0,0,0,1&gt; if numbe
 	</string>
 	<string name="LSLTipText_llDetectedGroup" translate="false">
 integer llDetectedGroup(integer number)
-Returns an integer that is a boolean representing if the detected object or avatar is in the same group that the prim containing the script is set to
+Returns TRUE if detected object is part of same group as owner
 	</string>
 	<string name="LSLTipText_llDetectedLinkNumber" translate="false">
 integer llDetectedLinkNumber(integer number)
@@ -2075,6 +2075,10 @@ this texture in your inventory
 	<!-- panel classified -->
 	<string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string>
 	<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
+  
+  <!-- panel picks -->
+  <string name="NoPicksClassifiedsText">There are no picks/classifieds here</string>
+  <string name="PicksClassifiedsLoadingText">Loading...</string>
 
 	<!-- Multi Preview Floater -->
 	<string name="MultiPreviewTitle">Preview</string>
@@ -2113,6 +2117,10 @@ this texture in your inventory
 		Unknown file extension .%s
 Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
 	</string>
+  <string name="MuteObject">Block</string>
+  <string name="MuteAvatar">Block</string>
+  <string name="UnmuteObject">Unblock</string>
+  <string name="UnmuteAvatar">Unblock</string>
 	<string name="AddLandmarkNavBarMenu">Add to My Landmarks...</string>
 	<string name="EditLandmarkNavBarMenu">Edit my Landmark...</string>
 
@@ -2839,6 +2847,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 	<string name="IM_to_label">To</string>
 	<string name="IM_moderator_label">(Moderator)</string>
 
+	<!-- voice calls -->
+	<string name="started_call">Started a voice call</string>
+	<string name="joined_call">Joined the voice call</string>
+
   <string name="ringing-im">
     Joining Voice Chat...
   </string>
@@ -2874,6 +2886,14 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
   <string name="muted_message">
     You have blocked this resident. Sending a message will automatically unblock them.
   </string>
+  <!--Some times string name is getting from the body of server response.
+  For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post. 
+  In case of the EXT-3115 issue 'generic' is passed into the gIMMgr::showSessionStartError as a string name.
+  Also there are some other places where "generic" is used.
+  So, let add string with name="generic" with the same value as "generic_request_error" -->
+  <string name="generic">
+    Error making request, please try again later.
+  </string>
   <string name="generic_request_error">
     Error making request, please try again later.
   </string>
@@ -2901,6 +2921,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
   <string name="message_session_event">
     Unable to send your message to the chat session with [RECIPIENT].
   </string>
+  <string name="mute">
+    Error while moderating.
+  </string>
   <string name="removed_from_group">
     You have been removed from the group.
   </string>
diff --git a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
index 9990324d03f02509b4adaaba9b8ff731b0124f8f..102dc0c16d8df0a004ad2bf3f304ccc3b247a58f 100644
--- a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
+++ b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
@@ -8,7 +8,7 @@
     header_image="Accordion_Off"
     header_image_over="Accordion_Over"
     header_image_pressed="Accordion_Press"
-    header_image_expanded="Accordion_Selected"
+    header_image_focused="Accordion_Selected"
     header_text_color="LtGray"
     font="SansSerif"
     />
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index 28ed56054328059e32d7edf3c0414da51fd3f5e7..d7aa71a441e7056c645c348f50fc1ee9cc3d8ef5 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -18,5 +18,6 @@
 	font="SansSerifSmall"
         hover_glow_amount="0.15"
         halign="center"
+        pad_bottom="2" 
         scale_image="true">
 </button>
diff --git a/indra/newview/skins/default/xui/en/widgets/floater.xml b/indra/newview/skins/default/xui/en/widgets/floater.xml
index 19fb520b44543ed883f98533026c542977df7fa8..85d0c633af5fb362983869118c12a711f1550fe5 100644
--- a/indra/newview/skins/default/xui/en/widgets/floater.xml
+++ b/indra/newview/skins/default/xui/en/widgets/floater.xml
@@ -9,8 +9,6 @@
  background_visible="true"
  background_opaque="false"
  header_height="25"
-         top="0"
-         left="0" 
  close_image="Icon_Close_Foreground"
  restore_image="Icon_Restore_Foreground"
  minimize_image="Icon_Minimize_Foreground"
diff --git a/indra/newview/tests/llcapabilitylistener_test.cpp b/indra/newview/tests/llcapabilitylistener_test.cpp
index 4759c7dc912189b401ebcf9217eb3ce971de2aef..ca7d02fc688341d87ff384a47cd348c4b6137c5a 100644
--- a/indra/newview/tests/llcapabilitylistener_test.cpp
+++ b/indra/newview/tests/llcapabilitylistener_test.cpp
@@ -50,6 +50,7 @@
 #include "tests/networkio.h"
 #include "tests/commtest.h"
 #include "tests/wrapllerrs.h"
+#include "message.h"
 #include "stringize.h"
 
 #if defined(LL_WINDOWS)
diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp
index 68743357a6f5636d362db4c7bca200c2026fc953..ec612c460601388449ba326c7bac0433b18b2314 100644
--- a/indra/newview/tests/llviewerhelputil_test.cpp
+++ b/indra/newview/tests/llviewerhelputil_test.cpp
@@ -36,54 +36,59 @@
 #include "../test/lltut.h"
 
 #include "../llviewerhelputil.h"
-#include "../llversioninfo.h"
+#include "../llweb.h"
 #include "llcontrol.h"
-#include "llsys.h"
 
 #include <iostream>
 
-//----------------------------------------------------------------------------
-// Implementation of enough of LLControlGroup to support the tests:
+// values for all of the supported substitutions parameters
+static std::string gHelpURL;
+static std::string gVersion;
+static std::string gChannel;
+static std::string gLanguage;
+static std::string gGrid;
+static std::string gOS;
 
-static std::map<std::string,std::string> test_stringvec;
+//----------------------------------------------------------------------------
+// Mock objects for the dependencies of the code we're testing
 
 LLControlGroup::LLControlGroup(const std::string& name)
-	: LLInstanceTracker<LLControlGroup, std::string>(name)
-{
-}
-
-LLControlGroup::~LLControlGroup()
-{
-}
-
-// Implementation of just the LLControlGroup methods we requre
+	: LLInstanceTracker<LLControlGroup, std::string>(name) {}
+LLControlGroup::~LLControlGroup() {}
 BOOL LLControlGroup::declareString(const std::string& name,
 				   const std::string& initial_val,
 				   const std::string& comment,
-				   BOOL persist)
-{
-	test_stringvec[name] = initial_val;
-	return true;
-}
-
-void LLControlGroup::setString(const std::string& name, const std::string& val)
+				   BOOL persist) {return TRUE;}
+void LLControlGroup::setString(const std::string& name, const std::string& val){}
+std::string LLControlGroup::getString(const std::string& name)
 {
-	test_stringvec[name] = val;
+	if (name == "HelpURLFormat")
+		return gHelpURL;
+	return "";
 }
+LLControlGroup gSavedSettings("test");
 
-std::string LLControlGroup::getString(const std::string& name)
+static void substitute_string(std::string &input, const std::string &search, const std::string &replace)
 {
-	return test_stringvec[name];
+	size_t pos = input.find(search);
+	while (pos != std::string::npos)
+	{
+		input = input.replace(pos, search.size(), replace);
+		pos = input.find(search);
+	}
 }
 
-S32 LLVersionInfo::getMajor() { return 2; }
-S32 LLVersionInfo::getMinor() { return 0; }
-S32 LLVersionInfo::getPatch() { return 0; }
-S32 LLVersionInfo::getBuild() { return 200099; }
-const std::string &LLVersionInfo::getVersion()
+std::string LLWeb::expandURLSubstitutions(const std::string &url,
+										  const LLSD &default_subs)
 {
-	static std::string version = "2.0.0.200099";
-	return version;
+	std::string new_url = url;
+	substitute_string(new_url, "[TOPIC]", default_subs["TOPIC"].asString());
+	substitute_string(new_url, "[VERSION]", gVersion);
+	substitute_string(new_url, "[CHANNEL]", gChannel);
+	substitute_string(new_url, "[LANGUAGE]", gLanguage);
+	substitute_string(new_url, "[GRID]", gGrid);
+	substitute_string(new_url, "[OS]", gOS);
+	return new_url;
 }
 
 //----------------------------------------------------------------------------
@@ -101,41 +106,52 @@ namespace tut
 	template<> template<>
 	void viewerhelputil_object_t::test<1>()
 	{
-		LLOSInfo osinfo;
-		LLControlGroup cgr("test");
-		cgr.declareString("HelpURLFormat", "fooformat", "declared_for_test", FALSE);
-		cgr.declareString("VersionChannelName", "foochannelname", "declared_for_test", FALSE);
-		cgr.declareString("Language", "foolanguage", "declared_for_test", FALSE);
 		std::string topic("test_topic");
-
 		std::string subresult;
 
-		cgr.setString("HelpURLFormat", "fooformat");
-		subresult = LLViewerHelpUtil::buildHelpURL(topic, cgr, osinfo);
+		gHelpURL = "fooformat";
+		subresult = LLViewerHelpUtil::buildHelpURL(topic);
 		ensure_equals("no substitution tags", subresult, "fooformat");
 
-		cgr.setString("HelpURLFormat", "");
-		subresult = LLViewerHelpUtil::buildHelpURL(topic, cgr, osinfo);
+		gHelpURL = "";
+		subresult = LLViewerHelpUtil::buildHelpURL(topic);
 		ensure_equals("blank substitution format", subresult, "");
 
-		cgr.setString("HelpURLFormat", "[LANGUAGE]");
-		cgr.setString("Language", "");
-		subresult = LLViewerHelpUtil::buildHelpURL(topic, cgr, osinfo);
+		gHelpURL = "[TOPIC]";
+		subresult = LLViewerHelpUtil::buildHelpURL(topic);
+		ensure_equals("topic name", subresult, "test_topic");
+
+		gHelpURL = "[LANGUAGE]";
+		gLanguage = "";
+		subresult = LLViewerHelpUtil::buildHelpURL(topic);
 		ensure_equals("simple substitution with blank", subresult, "");
 
-		cgr.setString("HelpURLFormat", "[LANGUAGE]");
-		cgr.setString("Language", "Esperanto");
-		subresult = LLViewerHelpUtil::buildHelpURL(topic, cgr, osinfo);
+		gHelpURL = "[LANGUAGE]";
+		gLanguage = "Esperanto";
+		subresult = LLViewerHelpUtil::buildHelpURL(topic);
 		ensure_equals("simple substitution", subresult, "Esperanto");
 
-		cgr.setString("HelpURLFormat", "[XXX]");
-		subresult = LLViewerHelpUtil::buildHelpURL(topic, cgr, osinfo);
+		gHelpURL = "http://secondlife.com/[LANGUAGE]";
+		gLanguage = "Gaelic";
+		subresult = LLViewerHelpUtil::buildHelpURL(topic);
+		ensure_equals("simple substitution with url", subresult, "http://secondlife.com/Gaelic");
+
+		gHelpURL = "[XXX]";
+		subresult = LLViewerHelpUtil::buildHelpURL(topic);
 		ensure_equals("unknown substitution", subresult, "[XXX]");
 
-		cgr.setString("HelpURLFormat", "[LANGUAGE]/[LANGUAGE]");
-		cgr.setString("Language", "Esperanto");
-		subresult = LLViewerHelpUtil::buildHelpURL(topic, cgr, osinfo);
+		gHelpURL = "[LANGUAGE]/[LANGUAGE]";
+		gLanguage = "Esperanto";
+		subresult = LLViewerHelpUtil::buildHelpURL(topic);
 		ensure_equals("multiple substitution", subresult, "Esperanto/Esperanto");
+
+		gHelpURL = "http://[CHANNEL]/[VERSION]/[LANGUAGE]/[OS]/[GRID]/[XXX]";
+		gChannel = "Second Life Test";
+		gVersion = "2.0";
+		gLanguage = "gaelic";
+		gOS = "AmigaOS 2.1";
+		gGrid = "mysim";
+		subresult = LLViewerHelpUtil::buildHelpURL(topic);
+		ensure_equals("complex substitution", subresult, "http://Second Life Test/2.0/gaelic/AmigaOS 2.1/mysim/[XXX]");
 	}
-    
 }
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 3543558adacfb5f476988b00f1b38eb8549fe8d8..16a83de108c75ebdfddd85e44e79e807b973e2f9 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -40,67 +40,73 @@ sys.path.append(os.path.join(viewer_dir, '../lib/python/indra/util'))
 from llmanifest import LLManifest, main, proper_windows_path, path_ancestors
 
 class ViewerManifest(LLManifest):
+    def is_packaging_viewer(self):
+        # This is overridden by the WindowsManifest sub-class,
+        # which has different behavior if it is not packaging the viewer.
+        return True
+    
     def construct(self):
         super(ViewerManifest, self).construct()
         self.exclude("*.svn*")
         self.path(src="../../scripts/messages/message_template.msg", dst="app_settings/message_template.msg")
         self.path(src="../../etc/message.xml", dst="app_settings/message.xml")
 
-        if self.prefix(src="app_settings"):
-            self.exclude("logcontrol.xml")
-            self.exclude("logcontrol-dev.xml")
-            self.path("*.pem")
-            self.path("*.ini")
-            self.path("*.xml")
-            self.path("*.db2")
-
-            # include the entire shaders directory recursively
-            self.path("shaders")
-            # ... and the entire windlight directory
-            self.path("windlight")
-            self.end_prefix("app_settings")
-
-        if self.prefix(src="character"):
-            self.path("*.llm")
-            self.path("*.xml")
-            self.path("*.tga")
-            self.end_prefix("character")
-
-        # Include our fonts
-        if self.prefix(src="fonts"):
-            self.path("*.ttf")
-            self.path("*.txt")
-            self.end_prefix("fonts")
-
-        # skins
-        if self.prefix(src="skins"):
-                self.path("paths.xml")
-                # include the entire textures directory recursively
-                if self.prefix(src="*/textures"):
-                        self.path("*/*.tga")
-                        self.path("*/*.j2c")
-                        self.path("*/*.jpg")
-                        self.path("*/*.png")
-                        self.path("*.tga")
-                        self.path("*.j2c")
-                        self.path("*.jpg")
-                        self.path("*.png")
-                        self.path("textures.xml")
-                        self.end_prefix("*/textures")
-                self.path("*/xui/*/*.xml")
-                self.path("*/xui/*/widgets/*.xml")
-                self.path("*/*.xml")
-                
-                # Local HTML files (e.g. loading screen)
-                if self.prefix(src="*/html"):
-                        self.path("*.png")
-                        self.path("*/*/*.html")
-                        self.path("*/*/*.gif")
-                        self.end_prefix("*/html")
-                self.end_prefix("skins")
-        
-        # Files in the newview/ directory
-        self.path("gpu_table.txt")
+        if self.is_packaging_viewer():
+            if self.prefix(src="app_settings"):
+                self.exclude("logcontrol.xml")
+                self.exclude("logcontrol-dev.xml")
+                self.path("*.pem")
+                self.path("*.ini")
+                self.path("*.xml")
+                self.path("*.db2")
+
+                # include the entire shaders directory recursively
+                self.path("shaders")
+                # ... and the entire windlight directory
+                self.path("windlight")
+                self.end_prefix("app_settings")
+
+            if self.prefix(src="character"):
+                self.path("*.llm")
+                self.path("*.xml")
+                self.path("*.tga")
+                self.end_prefix("character")
+
+            # Include our fonts
+            if self.prefix(src="fonts"):
+                self.path("*.ttf")
+                self.path("*.txt")
+                self.end_prefix("fonts")
+
+            # skins
+            if self.prefix(src="skins"):
+                    self.path("paths.xml")
+                    # include the entire textures directory recursively
+                    if self.prefix(src="*/textures"):
+                            self.path("*/*.tga")
+                            self.path("*/*.j2c")
+                            self.path("*/*.jpg")
+                            self.path("*/*.png")
+                            self.path("*.tga")
+                            self.path("*.j2c")
+                            self.path("*.jpg")
+                            self.path("*.png")
+                            self.path("textures.xml")
+                            self.end_prefix("*/textures")
+                    self.path("*/xui/*/*.xml")
+                    self.path("*/xui/*/widgets/*.xml")
+                    self.path("*/*.xml")
+
+                    # Local HTML files (e.g. loading screen)
+                    if self.prefix(src="*/html"):
+                            self.path("*.png")
+                            self.path("*/*/*.html")
+                            self.path("*/*/*.gif")
+                            self.end_prefix("*/html")
+                    self.end_prefix("skins")
+
+            # Files in the newview/ directory
+            self.path("gpu_table.txt")
 
     def login_channel(self):
         """Channel reported for login and upgrade purposes ONLY;
@@ -163,6 +169,12 @@ class WindowsManifest(ViewerManifest):
         else:
             return ''.join(self.channel().split()) + '.exe'
 
+    def is_packaging_viewer(self):
+        # Some commands, files will only be included
+        # if we are packaging the viewer on windows.
+        # This manifest is also used to copy
+        # files during the build.
+        return 'package' in self.args['actions']
 
     def test_msvcrt_and_copy_action(self, src, dst):
         # This is used to test a dll manifest.
@@ -211,22 +223,25 @@ class WindowsManifest(ViewerManifest):
             print "Doesn't exist:", src
         
     def enable_crt_manifest_check(self):
-        WindowsManifest.copy_action = WindowsManifest.test_msvcrt_and_copy_action
+        if self.is_packaging_viewer():
+           WindowsManifest.copy_action = WindowsManifest.test_msvcrt_and_copy_action
 
     def enable_no_crt_manifest_check(self):
-        WindowsManifest.copy_action = WindowsManifest.test_for_no_msvcrt_manifest_and_copy_action
+        if self.is_packaging_viewer():
+            WindowsManifest.copy_action = WindowsManifest.test_for_no_msvcrt_manifest_and_copy_action
 
     def disable_manifest_check(self):
-        del WindowsManifest.copy_action
+        if self.is_packaging_viewer():
+            del WindowsManifest.copy_action
 
     def construct(self):
         super(WindowsManifest, self).construct()
 
         self.enable_crt_manifest_check()
 
-        # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe.
-        self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe())
-
+        if self.is_packaging_viewer():
+            # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe.
+            self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe())
 
         # Plugin host application
         self.path(os.path.join(os.pardir,
@@ -322,26 +337,53 @@ class WindowsManifest(ViewerManifest):
         if self.prefix(src='../media_plugins/webkit/%s' % self.args['configuration'], dst="llplugin"):
             self.path("media_plugin_webkit.dll")
             self.end_prefix()
-            
-        if self.prefix(src="../../libraries/i686-win32/lib/release", dst="llplugin"):
-            self.path("libeay32.dll")
-            self.path("qtcore4.dll")
-            self.path("qtgui4.dll")
-            self.path("qtnetwork4.dll")
-            self.path("qtopengl4.dll")
-            self.path("qtwebkit4.dll")
-            self.path("ssleay32.dll")
-            self.end_prefix()
 
-        # For WebKit/Qt plugin runtimes (image format plugins)
-        if self.prefix(src="../../libraries/i686-win32/lib/release/imageformats", dst="llplugin/imageformats"):
-            self.path("qgif4.dll")
-            self.path("qico4.dll")
-            self.path("qjpeg4.dll")
-            self.path("qmng4.dll")
-            self.path("qsvg4.dll")
-            self.path("qtiff4.dll")
-            self.end_prefix()
+        if self.args['configuration'].lower() == 'debug':
+            if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'debug'),
+                           dst="llplugin"):
+                self.path("libeay32.dll")
+                self.path("qtcored4.dll")
+                self.path("qtguid4.dll")
+                self.path("qtnetworkd4.dll")
+                self.path("qtopengld4.dll")
+                self.path("qtwebkitd4.dll")
+                self.path("qtxmlpatternsd4.dll")
+                self.path("ssleay32.dll")
+
+                # For WebKit/Qt plugin runtimes (image format plugins)
+                if self.prefix(src="imageformats", dst="llplugin/imageformats"):
+                    self.path("qgifd4.dll")
+                    self.path("qicod4.dll")
+                    self.path("qjpegd4.dll")
+                    self.path("qmngd4.dll")
+                    self.path("qsvgd4.dll")
+                    self.path("qtiffd4.dll")
+                    self.end_prefix()
+
+                self.end_prefix()
+        else:
+            if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'release'),
+                           dst="llplugin"):
+                self.path("libeay32.dll")
+                self.path("qtcore4.dll")
+                self.path("qtgui4.dll")
+                self.path("qtnetwork4.dll")
+                self.path("qtopengl4.dll")
+                self.path("qtwebkit4.dll")
+                self.path("qtxmlpatterns4.dll")
+                self.path("ssleay32.dll")
+
+                # For WebKit/Qt plugin runtimes (image format plugins)
+                if self.prefix(src="imageformats", dst="llplugin/imageformats"):
+                    self.path("qgif4.dll")
+                    self.path("qico4.dll")
+                    self.path("qjpeg4.dll")
+                    self.path("qmng4.dll")
+                    self.path("qsvg4.dll")
+                    self.path("qtiff4.dll")
+                    self.end_prefix()
+
+                self.end_prefix()
 
         self.disable_manifest_check()
 
@@ -352,6 +394,9 @@ class WindowsManifest(ViewerManifest):
         self.path(src='../win_updater/%s/windows-updater.exe' % self.args['configuration'],
                   dst="updater.exe")
 
+        if not self.is_packaging_viewer():
+            self.package_file = "copied_deps"    
+
     def nsi_file_commands(self, install=True):
         def wpath(path):
             if path.endswith('/') or path.endswith(os.path.sep):
@@ -828,6 +873,7 @@ class Linux_i686Manifest(LinuxManifest):
             self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3")
             self.path("libalut.so")
             self.path("libopenal.so", "libopenal.so.1")
+            self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname
             try:
                     self.path("libkdu_v42R.so", "libkdu.so")
                     pass
@@ -849,7 +895,7 @@ class Linux_i686Manifest(LinuxManifest):
             if self.prefix(src="vivox-runtime/i686-linux", dst="lib"):
                     self.path("libortp.so")
                     self.path("libsndfile.so.1")
-                    self.path("libvivoxoal.so.1")
+                    #self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OAL lib
                     self.path("libvivoxsdk.so")
                     self.path("libvivoxplatform.so")
                     self.end_prefix("lib")
diff --git a/indra/test_apps/llplugintest/CMakeLists.txt b/indra/test_apps/llplugintest/CMakeLists.txt
index 0011daaec6e9b36f36e579690000cb5364d6bd05..89e2d8582d01d39df5e62e9d30338f66e2b8e256 100644
--- a/indra/test_apps/llplugintest/CMakeLists.txt
+++ b/indra/test_apps/llplugintest/CMakeLists.txt
@@ -338,6 +338,13 @@ add_custom_command(TARGET llmediaplugintest POST_BUILD
   DEPENDS ${BUILT_SLPLUGIN}
 )
 
+get_target_property(BUILT_LLCOMMON llcommon LOCATION)
+add_custom_command(TARGET llmediaplugintest POST_BUILD
+  COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_LLCOMMON}  ${PLUGINS_DESTINATION_DIR}
+  DEPENDS ${BUILT_LLCOMMON}
+)
+
+
 if (DARWIN OR WINDOWS)
   get_target_property(BUILT_WEBKIT_PLUGIN media_plugin_webkit LOCATION)
   add_custom_command(TARGET llmediaplugintest POST_BUILD
@@ -435,6 +442,7 @@ if(WINDOWS)
     qtnetwork4.dll
     qtopengl4.dll
     qtwebkit4.dll
+    qtxmlpatterns4.dll
     ssleay32.dll
     )
   copy_if_different(
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index 02c13716eddae0e5a037359968351f8e905f5e3a..018f6916720ef72746e3c0150474e056d9bdc642 100644
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -222,13 +222,15 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
                 // Still Downloading -- send progress update.
                 sendProgressEvent("offline", "downloading");
             }
+				 
+			LL_DEBUGS("LLLogin") << "Auth Response: " << mAuthResponse << LL_ENDL;
             status = mAuthResponse["status"].asString();
 
             // Okay, we've received our final status event for this
             // request. Unless we got a redirect response, break the retry
             // loop for the current rewrittenURIs entry.
-            if (! (status == "Complete" &&
-                   mAuthResponse["responses"]["login"].asString() == "indeterminate"))
+            if (!(status == "Complete" &&
+                  mAuthResponse["responses"]["login"].asString() == "indeterminate"))
             {
                 break;
             }
@@ -237,8 +239,8 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
             // to some other URI ("indeterminate" -- why not "redirect"?).
             // The response should contain another uri to try, with its
             // own auth method.
-            request["uri"] = mAuthResponse["next_url"];
-            request["method"] = mAuthResponse["next_method"];
+            request["uri"] = mAuthResponse["responses"]["next_url"].asString();
+            request["method"] = mAuthResponse["responses"]["next_method"].asString();
         } // loop back to try the redirected URI
 
         // Here we're done with redirects for the current rewrittenURIs
diff --git a/indra/viewer_components/login/tests/lllogin_test.cpp b/indra/viewer_components/login/tests/lllogin_test.cpp
index 69a8424e8729a38364ecfabe7421698f1e638cbc..7159959a4f7dda4d47bf753dfb0c61e633a4843f 100644
--- a/indra/viewer_components/login/tests/lllogin_test.cpp
+++ b/indra/viewer_components/login/tests/lllogin_test.cpp
@@ -311,14 +311,15 @@ namespace tut
 		data["error"] = "dummy response";
 		data["transfer_rate"] = 0;
 		data["responses"]["login"] = "indeterminate";
-		data["next_url"] = "login.indeterminate.com";			
-		data["next_method"] = "test_login_method"; 			
+		data["responses"]["next_url"] = "login.indeterminate.com";			
+		data["responses"]["next_method"] = "test_login_method"; 			
 		dummyXMLRPC.setResponse(data);
 		dummyXMLRPC.sendReply();
 
 		ensure_equals("Fail back to authenticate 2", listener.lastEvent()["change"].asString(), "authenticating"); 
 		ensure_equals("Attempt 3", listener.lastEvent()["data"]["attempt"].asInteger(), 3); 
 		ensure_equals("URI 3", listener.lastEvent()["data"]["request"]["uri"].asString(), "login.indeterminate.com"); 
+		ensure_equals("Method 3", listener.lastEvent()["data"]["request"]["method"].asString(), "test_login_method"); 
 
 		// Finally let the auth succeed.
 		data.clear();
diff --git a/install.xml b/install.xml
index 15b92e8f10768f1cc248fdcecbd4cc5523fe491a..3a59cb9311cca935b0611a511d26a0d3edf4e986 100644
--- a/install.xml
+++ b/install.xml
@@ -1014,23 +1014,23 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>7f818f13faf7c02838fe66f7d27e1913</string>
+            <string>1631831b63310d85ad272b4dca3c1fbf</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-darwin-20091124.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6-darwin-20091217.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>ffede2775355676096b1085cbb9d0da7</string>
+            <string>09674cbae982e7e7f6ebc7e1d06580e8</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20091117.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20091216.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>92cff05661b5547caae7cc6c66d09870</string>
+            <string>3846354e2e20a98c0401317eb114ff5e</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-windows-20091123.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-windows-qt4.6-20091215.tar.bz2</uri>
           </map>
         </map>
       </map>
@@ -1225,9 +1225,9 @@ anguage Infrstructure (CLI) international standard</string>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>f0d9a8d1318b519cffe6c40c9cac4e21</string>
+            <string>c8223e9454223e3d519fe40d71c3ddd2</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-linux-20081010c-59a71b14-plughw.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-linux-20091216-56cc0386.tar.bz2</uri>
           </map>
           <key>linux64</key>
           <map>