diff --git a/indra/llcommon/lleventapi.h b/indra/llcommon/lleventapi.h
index 2cd3b5bf8975abbe52c0375e91eb27820ae28657..96d1b03be85e259403e61fc24cf41abce2f5cbb9 100644
--- a/indra/llcommon/lleventapi.h
+++ b/indra/llcommon/lleventapi.h
@@ -46,6 +46,19 @@ class LL_COMMON_API LLEventAPI: public LLDispatchListener,
     /// Get the documentation string
     std::string getDesc() const { return mDesc; }
 
+    /**
+     * Publish only selected add() methods from LLEventDispatcher.
+     * Every LLEventAPI add() @em must have a description string.
+     */
+    template <typename CALLABLE>
+    void add(const std::string& name,
+             const std::string& desc,
+             CALLABLE callable,
+             const LLSD& required=LLSD())
+    {
+        LLEventDispatcher::add(name, desc, callable, required);
+    }
+
 private:
     std::string mDesc;
 };
diff --git a/indra/llcommon/lleventdispatcher.cpp b/indra/llcommon/lleventdispatcher.cpp
index 017bf3a52194ae8d1b5878738918aaeffc7d7614..5fa6059718ce2c9d2993c177b35c6e04c20f9af6 100644
--- a/indra/llcommon/lleventdispatcher.cpp
+++ b/indra/llcommon/lleventdispatcher.cpp
@@ -121,6 +121,20 @@ LLEventDispatcher::Callable LLEventDispatcher::get(const std::string& name) cons
     return found->second.mFunc;
 }
 
+LLSD LLEventDispatcher::getMetadata(const std::string& name) const
+{
+    DispatchMap::const_iterator found = mDispatch.find(name);
+    if (found == mDispatch.end())
+    {
+        return LLSD();
+    }
+    LLSD meta;
+    meta["name"] = name;
+    meta["desc"] = found->second.mDesc;
+    meta["required"] = found->second.mRequired;
+    return meta;
+}
+
 LLDispatchListener::LLDispatchListener(const std::string& pumpname, const std::string& key):
     LLEventDispatcher(pumpname, key),
     mPump(pumpname, true),          // allow tweaking for uniqueness
diff --git a/indra/llcommon/lleventdispatcher.h b/indra/llcommon/lleventdispatcher.h
index eba7b607f18eb25b1694aee4db0c2a1ba6677087..c8c4fe0c3ca38935be3e6ebd8ad44889602f420e 100644
--- a/indra/llcommon/lleventdispatcher.h
+++ b/indra/llcommon/lleventdispatcher.h
@@ -19,6 +19,7 @@
 #include <map>
 #include <boost/function.hpp>
 #include <boost/bind.hpp>
+#include <boost/iterator/transform_iterator.hpp>
 #include <typeinfo>
 #include "llevents.h"
 
@@ -73,6 +74,16 @@ class LL_COMMON_API LLEventDispatcher
         addMethod<CLASS>(name, desc, method, required);
     }
 
+    /// Convenience: for LLEventDispatcher, not every callable needs a
+    /// documentation string.
+    template <typename CALLABLE>
+    void add(const std::string& name,
+             CALLABLE callable,
+             const LLSD& required=LLSD())
+    {
+        add(name, "", callable, required);
+    }
+
     /// Unregister a callable
     bool remove(const std::string& name);
 
@@ -87,10 +98,47 @@ class LL_COMMON_API LLEventDispatcher
     /// @a required prototype specified at add() time, die with LL_ERRS.
     void operator()(const LLSD& event) const;
 
+    /// @name Iterate over defined names
+    //@{
+    typedef std::pair<std::string, std::string> NameDesc;
+
+private:
+    struct DispatchEntry
+    {
+        DispatchEntry(const Callable& func, const std::string& desc, const LLSD& required):
+            mFunc(func),
+            mDesc(desc),
+            mRequired(required)
+        {}
+        Callable mFunc;
+        std::string mDesc;
+        LLSD mRequired;
+    };
+    typedef std::map<std::string, DispatchEntry> DispatchMap;
+
+public:
+    /// We want the flexibility to redefine what data we store per name,
+    /// therefore our public interface doesn't expose DispatchMap iterators,
+    /// or DispatchMap itself, or DispatchEntry. Instead we explicitly
+    /// transform each DispatchMap item to NameDesc on dereferencing.
+    typedef boost::transform_iterator<NameDesc(*)(const DispatchMap::value_type&), DispatchMap::const_iterator> const_iterator;
+    const_iterator begin() const
+    {
+        return boost::make_transform_iterator(mDispatch.begin(), makeNameDesc);
+    }
+    const_iterator end() const
+    {
+        return boost::make_transform_iterator(mDispatch.end(), makeNameDesc);
+    }
+    //@}
+
     /// Fetch the Callable for the specified name. If no such name was
     /// registered, return an empty() Callable.
     Callable get(const std::string& name) const;
 
+    /// Get information about a specific Callable
+    LLSD getMetadata(const std::string& name) const;
+
 private:
     template <class CLASS, typename METHOD>
     void addMethod(const std::string& name, const std::string& desc,
@@ -111,19 +159,12 @@ class LL_COMMON_API LLEventDispatcher
     bool attemptCall(const std::string& name, const LLSD& event) const;
 
     std::string mDesc, mKey;
-    struct DispatchEntry
-    {
-        DispatchEntry(const Callable& func, const std::string& desc, const LLSD& required):
-            mFunc(func),
-            mDesc(desc),
-            mRequired(required)
-        {}
-        Callable mFunc;
-        std::string mDesc;
-        LLSD mRequired;
-    };
-    typedef std::map<std::string, DispatchEntry> DispatchMap;
     DispatchMap mDispatch;
+
+    static NameDesc makeNameDesc(const DispatchMap::value_type& item)
+    {
+        return NameDesc(item.first, item.second.mDesc);
+    }
 };
 
 /**
diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h
index 48baa50edbe809cd5a8c4f850966f281ea5f7955..dda9a95597a03edbbec0cefc8bfe124a70958c98 100644
--- a/indra/llcommon/llpreprocessor.h
+++ b/indra/llcommon/llpreprocessor.h
@@ -122,6 +122,7 @@
 #pragma warning( 3      :  4264 )	// "'virtual_function' : no override available for virtual member function from base 'class'; function is hidden"
 #pragma warning( 3       : 4265 )	// "class has virtual functions, but destructor is not virtual"
 #pragma warning( 3      :  4266 )	// 'function' : no override available for virtual member function from base 'type'; function is hidden
+#pragma warning (disable : 4180)	// qualifier applied to function type has no meaning; ignored
 #pragma warning( disable : 4284 )	// silly MS warning deep inside their <map> include file
 #pragma warning( disable : 4503 )	// 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.
 #pragma warning( disable : 4800 )	// 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
diff --git a/indra/llcommon/tests/lltreeiterators_test.cpp b/indra/llcommon/tests/lltreeiterators_test.cpp
index d6d9f681103d31956f1488e880336657be8a6327..31c70b4daa7c8bb61935ca3f80bacd22b2682fbb 100644
--- a/indra/llcommon/tests/lltreeiterators_test.cpp
+++ b/indra/llcommon/tests/lltreeiterators_test.cpp
@@ -35,9 +35,6 @@
 // Precompiled header
 #include "linden_common.h"
 
-#if LL_WINDOWS
-#pragma warning (disable : 4180) // qualifier applied to function type has no meaning; ignored
-#endif
 
 // STL headers
 // std headers
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index f2cdad8854a431a6a888054cb0911fa4f785f9a7..2a0dcaf333655e367d1c300914ac44b76f78bd7f 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -1888,41 +1888,50 @@ void LLFloaterView::reshapeFloater(S32 width, S32 height, BOOL called_from_paren
 			// dependents use same follow flags as their "dependee"
 			continue;
 		}
-		LLRect r = floaterp->getRect();
-
-		// Compute absolute distance from each edge of screen
-		S32 left_offset = llabs(r.mLeft - 0);
-		S32 right_offset = llabs(old_width - r.mRight);
-
-		S32 top_offset = llabs(old_height - r.mTop);
-		S32 bottom_offset = llabs(r.mBottom - 0);
 
 		// Make if follow the edge it is closest to
 		U32 follow_flags = 0x0;
 
-		if (left_offset < right_offset)
+		if (floaterp->isMinimized())
 		{
-			follow_flags |= FOLLOWS_LEFT;
+			follow_flags |= (FOLLOWS_LEFT | FOLLOWS_TOP);
 		}
 		else
 		{
-			follow_flags |= FOLLOWS_RIGHT;
-		}
+			LLRect r = floaterp->getRect();
 
-		// "No vertical adjustment" usually means that the bottom of the view
-		// has been pushed up or down.  Hence we want the floaters to follow
-		// the top.
-		if (!adjust_vertical)
-		{
-			follow_flags |= FOLLOWS_TOP;
-		}
-		else if (top_offset < bottom_offset)
-		{
-			follow_flags |= FOLLOWS_TOP;
-		}
-		else
-		{
-			follow_flags |= FOLLOWS_BOTTOM;
+			// Compute absolute distance from each edge of screen
+			S32 left_offset = llabs(r.mLeft - 0);
+			S32 right_offset = llabs(old_width - r.mRight);
+
+			S32 top_offset = llabs(old_height - r.mTop);
+			S32 bottom_offset = llabs(r.mBottom - 0);
+
+
+			if (left_offset < right_offset)
+			{
+				follow_flags |= FOLLOWS_LEFT;
+			}
+			else
+			{
+				follow_flags |= FOLLOWS_RIGHT;
+			}
+
+			// "No vertical adjustment" usually means that the bottom of the view
+			// has been pushed up or down.  Hence we want the floaters to follow
+			// the top.
+			if (!adjust_vertical)
+			{
+				follow_flags |= FOLLOWS_TOP;
+			}
+			else if (top_offset < bottom_offset)
+			{
+				follow_flags |= FOLLOWS_TOP;
+			}
+			else
+			{
+				follow_flags |= FOLLOWS_BOTTOM;
+			}
 		}
 
 		floaterp->setFollows(follow_flags);
@@ -2172,16 +2181,16 @@ void LLFloaterView::getMinimizePosition(S32 *left, S32 *bottom)
 	const LLFloater::Params& default_params = LLFloater::getDefaultParams();
 	S32 floater_header_size = default_params.header_height;
 	static LLUICachedControl<S32> minimized_width ("UIMinimizedWidth", 0);
-	S32 col = 0;
 	LLRect snap_rect_local = getLocalSnapRect();
-	for(S32 row = snap_rect_local.mBottom;
-		row < snap_rect_local.getHeight() - floater_header_size;
-		row += floater_header_size ) //loop rows
-	{
-		for(col = snap_rect_local.mLeft;
-			col < snap_rect_local.getWidth() - minimized_width;
-			col += minimized_width)
+	for(S32 col = snap_rect_local.mLeft;
+		col < snap_rect_local.getWidth() - minimized_width;
+		col += minimized_width)
+	{	
+		for(S32 row = snap_rect_local.mTop - floater_header_size;
+		row > floater_header_size;
+		row -= floater_header_size ) //loop rows
 		{
+
 			bool foundGap = TRUE;
 			for(child_list_const_iter_t child_it = getChildList()->begin();
 				child_it != getChildList()->end();
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index 3a073fa1b28b08209346c6f834d3e78ab90cd37e..9cbcb285dcaa813cd9ae5808357f1b809c9d401a 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -81,8 +81,8 @@ class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
 	S32 getNumPanels() { return mPanels.size(); }
 
 	void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize);
-
-
+	
+	void updateLayout(BOOL force_resize = FALSE);
 	static void updateClass();
 
 protected:
@@ -92,7 +92,6 @@ class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
 private:
 	struct LayoutPanel;
 
-	void updateLayout(BOOL force_resize = FALSE);
 	void calcMinExtents();
 	S32 getDefaultHeight(S32 cur_height);
 	S32 getDefaultWidth(S32 cur_width);
diff --git a/indra/llui/llslider.cpp b/indra/llui/llslider.cpp
index f86776384ada0dae375bdc0b913b226a4e4f20af..da2fc7c68b2fb5209536d87456183f0514bf9720 100644
--- a/indra/llui/llslider.cpp
+++ b/indra/llui/llslider.cpp
@@ -47,14 +47,17 @@ static LLDefaultChildRegistry::Register<LLSlider> r1("slider_bar");
 // have ambigious template lookup problem
 
 LLSlider::Params::Params()
-:	track_color("track_color"),
+:	orientation ("orientation", std::string ("horizontal")),
+	track_color("track_color"),
 	thumb_outline_color("thumb_outline_color"),
 	thumb_center_color("thumb_center_color"),
 	thumb_image("thumb_image"),
 	thumb_image_pressed("thumb_image_pressed"),
 	thumb_image_disabled("thumb_image_disabled"),
-	track_image("track_image"),
-	track_highlight_image("track_highlight_image"),
+	track_image_horizontal("track_image_horizontal"),
+	track_image_vertical("track_image_vertical"),
+	track_highlight_horizontal_image("track_highlight_horizontal_image"),
+	track_highlight_vertical_image("track_highlight_vertical_image"),
 	mouse_down_callback("mouse_down_callback"),
 	mouse_up_callback("mouse_up_callback")
 {
@@ -64,14 +67,17 @@ LLSlider::Params::Params()
 LLSlider::LLSlider(const LLSlider::Params& p)
 :	LLF32UICtrl(p),
 	mMouseOffset( 0 ),
+	mOrientation ((p.orientation() == "horizontal") ? HORIZONTAL : VERTICAL),
 	mTrackColor(p.track_color()),
 	mThumbOutlineColor(p.thumb_outline_color()),
 	mThumbCenterColor(p.thumb_center_color()),
 	mThumbImage(p.thumb_image),
 	mThumbImagePressed(p.thumb_image_pressed),
 	mThumbImageDisabled(p.thumb_image_disabled),
-	mTrackImage(p.track_image),
-	mTrackHighlightImage(p.track_highlight_image)
+	mTrackImageHorizontal(p.track_image_horizontal),
+	mTrackImageVertical(p.track_image_vertical),
+	mTrackHighlightHorizontalImage(p.track_highlight_horizontal_image),
+	mTrackHighlightVerticalImage(p.track_highlight_vertical_image)
 {
     mViewModel->setValue(p.initial_value);
 	updateThumbRect();
@@ -111,14 +117,29 @@ void LLSlider::updateThumbRect()
 
 	S32 thumb_width = mThumbImage ? mThumbImage->getWidth() : DEFAULT_THUMB_SIZE;
 	S32 thumb_height = mThumbImage ? mThumbImage->getHeight() : DEFAULT_THUMB_SIZE;
-	S32 left_edge = (thumb_width / 2);
-	S32 right_edge = getRect().getWidth() - (thumb_width / 2);
-
-	S32 x = left_edge + S32( t * (right_edge - left_edge) );
-	mThumbRect.mLeft = x - (thumb_width / 2);
-	mThumbRect.mRight = mThumbRect.mLeft + thumb_width;
-	mThumbRect.mBottom = getLocalRect().getCenterY() - (thumb_height / 2);
-	mThumbRect.mTop = mThumbRect.mBottom + thumb_height;
+
+	if ( mOrientation == HORIZONTAL )
+	{
+		S32 left_edge = (thumb_width / 2);
+		S32 right_edge = getRect().getWidth() - (thumb_width / 2);
+
+		S32 x = left_edge + S32( t * (right_edge - left_edge) );
+		mThumbRect.mLeft = x - (thumb_width / 2);
+		mThumbRect.mRight = mThumbRect.mLeft + thumb_width;
+		mThumbRect.mBottom = getLocalRect().getCenterY() - (thumb_height / 2);
+		mThumbRect.mTop = mThumbRect.mBottom + thumb_height;
+	}
+	else
+	{
+		S32 top_edge = (thumb_height / 2);
+		S32 bottom_edge = getRect().getHeight() - (thumb_height / 2);
+
+		S32 y = top_edge + S32( t * (bottom_edge - top_edge) );
+		mThumbRect.mLeft = getLocalRect().getCenterX() - (thumb_width / 2);
+		mThumbRect.mRight = mThumbRect.mLeft + thumb_width;
+		mThumbRect.mBottom = y  - (thumb_height / 2);
+		mThumbRect.mTop = mThumbRect.mBottom + thumb_height;
+	}
 }
 
 
@@ -138,18 +159,32 @@ BOOL LLSlider::handleHover(S32 x, S32 y, MASK mask)
 {
 	if( hasMouseCapture() )
 	{
-		S32 thumb_half_width = mThumbImage->getWidth()/2;
-		S32 left_edge = thumb_half_width;
-		S32 right_edge = getRect().getWidth() - (thumb_half_width);
+		if ( mOrientation == HORIZONTAL )
+		{
+			S32 thumb_half_width = mThumbImage->getWidth()/2;
+			S32 left_edge = thumb_half_width;
+			S32 right_edge = getRect().getWidth() - (thumb_half_width);
 
-		x += mMouseOffset;
-		x = llclamp( x, left_edge, right_edge );
+			x += mMouseOffset;
+			x = llclamp( x, left_edge, right_edge );
 
-		F32 t = F32(x - left_edge) / (right_edge - left_edge);
-		setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue );
+			F32 t = F32(x - left_edge) / (right_edge - left_edge);
+			setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue );
+		}
+		else // mOrientation == VERTICAL
+		{
+			S32 thumb_half_height = mThumbImage->getHeight()/2;
+			S32 top_edge = thumb_half_height;
+			S32 bottom_edge = getRect().getHeight() - (thumb_half_height);
+
+			y += mMouseOffset;
+			y = llclamp(y, top_edge, bottom_edge);
 
+			F32 t = F32(y - top_edge) / (bottom_edge - top_edge);
+			setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue );
+		}
 		getWindow()->setCursor(UI_CURSOR_ARROW);
-		lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl;		
+		lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl;
 	}
 	else
 	{
@@ -198,7 +233,9 @@ BOOL LLSlider::handleMouseDown(S32 x, S32 y, MASK mask)
 		// Find the offset of the actual mouse location from the center of the thumb.
 		if (mThumbRect.pointInRect(x,y))
 		{
-			mMouseOffset = (mThumbRect.mLeft + mThumbImage->getWidth()/2) - x;
+			mMouseOffset = (mOrientation == HORIZONTAL)
+				? (mThumbRect.mLeft + mThumbImage->getWidth()/2) - x
+				: (mThumbRect.mBottom + mThumbImage->getHeight()/2) - y;
 		}
 		else
 		{
@@ -220,15 +257,12 @@ BOOL LLSlider::handleKeyHere(KEY key, MASK mask)
 	BOOL handled = FALSE;
 	switch(key)
 	{
-	case KEY_UP:
 	case KEY_DOWN:
-		// eat up and down keys to be consistent
-		handled = TRUE;
-		break;
 	case KEY_LEFT:
 		setValueAndCommit(getValueF32() - getIncrement());
 		handled = TRUE;
 		break;
+	case KEY_UP:
 	case KEY_RIGHT:
 		setValueAndCommit(getValueF32() + getIncrement());
 		handled = TRUE;
@@ -239,6 +273,17 @@ BOOL LLSlider::handleKeyHere(KEY key, MASK mask)
 	return handled;
 }
 
+BOOL LLSlider::handleScrollWheel(S32 x, S32 y, S32 clicks)
+{
+	if ( mOrientation == VERTICAL )
+	{
+		F32 new_val = getValueF32() - clicks * getIncrement();
+		setValueAndCommit(new_val);
+		return TRUE;
+	}
+	return LLF32UICtrl::handleScrollWheel(x,y,clicks);
+}
+
 void LLSlider::draw()
 {
 	F32 alpha = getDrawContext().mAlpha;
@@ -252,13 +297,36 @@ void LLSlider::draw()
 	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	// Track
-	LLRect track_rect(mThumbImage->getWidth() / 2, 
-						getLocalRect().getCenterY() + (mTrackImage->getHeight() / 2), 
-						getRect().getWidth() - mThumbImage->getWidth() / 2, 
-						getLocalRect().getCenterY() - (mTrackImage->getHeight() / 2) );
-	LLRect highlight_rect(track_rect.mLeft, track_rect.mTop, mThumbRect.getCenterX(), track_rect.mBottom);
-	mTrackImage->draw(track_rect, LLColor4::white % alpha);
-	mTrackHighlightImage->draw(highlight_rect, LLColor4::white % alpha);
+	LLPointer<LLUIImage>& trackImage = ( mOrientation == HORIZONTAL )
+		? mTrackImageHorizontal
+		: mTrackImageVertical;
+
+	LLPointer<LLUIImage>& trackHighlightImage = ( mOrientation == HORIZONTAL )
+		? mTrackHighlightHorizontalImage
+		: mTrackHighlightVerticalImage;
+
+	LLRect track_rect;
+	LLRect highlight_rect;
+
+	if ( mOrientation == HORIZONTAL )
+	{
+		track_rect.set(mThumbImage->getWidth() / 2,
+					   getLocalRect().getCenterY() + (trackImage->getHeight() / 2), 
+					   getRect().getWidth() - mThumbImage->getWidth() / 2,
+					   getLocalRect().getCenterY() - (trackImage->getHeight() / 2) );
+		highlight_rect.set(track_rect.mLeft, track_rect.mTop, mThumbRect.getCenterX(), track_rect.mBottom);
+	}
+	else
+	{
+		track_rect.set(getLocalRect().getCenterX() - (trackImage->getWidth() / 2),
+					   getRect().getHeight(),
+					   getLocalRect().getCenterX() + (trackImage->getWidth() / 2),
+					   0);
+		highlight_rect.set(track_rect.mLeft, track_rect.mTop, track_rect.mRight, track_rect.mBottom);
+	}
+
+	trackImage->draw(track_rect, LLColor4::white % alpha);
+	trackHighlightImage->draw(highlight_rect, LLColor4::white % alpha);
 
 	// Thumb
 	if (hasFocus())
diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h
index e2a94e4d8cf3f0a2bf5533ed8a8f9a56e6cbbb04..6ab0ed79220f8bc9228040944e4ec25a25b6f19c 100644
--- a/indra/llui/llslider.h
+++ b/indra/llui/llslider.h
@@ -39,8 +39,12 @@
 class LLSlider : public LLF32UICtrl
 {
 public:
+	enum ORIENTATION { HORIZONTAL, VERTICAL };
+
 	struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params>
 	{
+		Optional<std::string> orientation;
+
 		Optional<LLUIColor>	track_color,
 							thumb_outline_color,
 							thumb_center_color;
@@ -48,8 +52,10 @@ class LLSlider : public LLF32UICtrl
 		Optional<LLUIImage*>	thumb_image,
 								thumb_image_pressed,
 								thumb_image_disabled,
-								track_image,
-								track_highlight_image;
+								track_image_horizontal,
+								track_image_vertical,
+								track_highlight_horizontal_image,
+								track_highlight_vertical_image;
 
 		Optional<CommitCallbackParam>	mouse_down_callback,
 										mouse_up_callback;
@@ -77,6 +83,7 @@ class LLSlider : public LLF32UICtrl
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleKeyHere(KEY key, MASK mask);
+	virtual BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks);
 	virtual void	draw();
 
 private:
@@ -90,10 +97,14 @@ class LLSlider : public LLF32UICtrl
 	LLPointer<LLUIImage>	mThumbImage;
 	LLPointer<LLUIImage>	mThumbImagePressed;
 	LLPointer<LLUIImage>	mThumbImageDisabled;
-	LLPointer<LLUIImage>	mTrackImage;
-	LLPointer<LLUIImage>	mTrackHighlightImage;
+	LLPointer<LLUIImage>	mTrackImageHorizontal;
+	LLPointer<LLUIImage>	mTrackImageVertical;
+	LLPointer<LLUIImage>	mTrackHighlightHorizontalImage;
+	LLPointer<LLUIImage>	mTrackHighlightVerticalImage;
+
+	const ORIENTATION	mOrientation;
 
-	LLRect			mThumbRect;
+	LLRect		mThumbRect;
 	LLUIColor	mTrackColor;
 	LLUIColor	mThumbOutlineColor;
 	LLUIColor	mThumbCenterColor;
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 9706878a579476d835950b0f19436caa32fe6b39..7b1aaac35cbc42e1986a50e61d4782259524eeb5 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1451,7 +1451,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
 	}
 }
 
-void LLTextBase::setText(const LLStringExplicit &utf8str)
+void LLTextBase::setText(const LLStringExplicit &utf8str ,const LLStyle::Params& input_params)
 {
 	// clear out the existing text and segments
 	getViewModel()->setDisplay(LLWStringUtil::null);
@@ -1466,7 +1466,7 @@ void LLTextBase::setText(const LLStringExplicit &utf8str)
 	std::string text(utf8str);
 	LLStringUtil::removeCRLF(text);
 
-	appendText(text, false);
+	appendText(text, false, input_params);
 
 	onValueChange(0, getLength());
 }
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index fb01cd1e7cc5c389966b3283464b74bd760cd32f..70d78c77cdebffbe15c1425d75f46a80ffd8f96e 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -137,7 +137,7 @@ class LLTextBase
 
 	// Text accessors
 	// TODO: add optional style parameter
-	virtual void			setText(const LLStringExplicit &utf8str); // uses default style
+	virtual void			setText(const LLStringExplicit &utf8str , const LLStyle::Params& input_params = LLStyle::Params()); // uses default style
 	virtual std::string		getText() const;
 
 	// wide-char versions
diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp
index 00f1d833a30a4c264ca8f21269214cd3d462b69e..4c4123cf45213f7a805587e23fca5df9c580c12b 100644
--- a/indra/llui/lltextbox.cpp
+++ b/indra/llui/lltextbox.cpp
@@ -112,12 +112,12 @@ BOOL LLTextBox::handleHover(S32 x, S32 y, MASK mask)
 	return handled;
 }
 
-void LLTextBox::setText(const LLStringExplicit& text)
+void LLTextBox::setText(const LLStringExplicit& text , const LLStyle::Params& input_params )
 {
 	// does string argument insertion
 	mText.assign(text);
 	
-	LLTextBase::setText(mText.getString());
+	LLTextBase::setText(mText.getString(), input_params );
 }
 
 void LLTextBox::setClickedCallback( boost::function<void (void*)> cb, void* userdata /*= NULL */ )
diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h
index 73f8a7c299ed7cdbb3662923505a2adb79deacd3..01b4bfa5ed68725d1e29e22af7b09ee4293b1277 100644
--- a/indra/llui/lltextbox.h
+++ b/indra/llui/lltextbox.h
@@ -58,7 +58,7 @@ class LLTextBox :
 	/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
 
-	/*virtual*/ void setText( const LLStringExplicit& text );
+	/*virtual*/ void setText( const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params() );
 	
 	void			setRightAlign()							{ mHAlign = LLFontGL::RIGHT; }
 	void			setHAlign( LLFontGL::HAlign align )		{ mHAlign = align; }
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index d136c6b49d6dd9d1d9879a3330456912da1ee867..224f066968e61e83ade164b98fcb18e8a08fadf7 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -311,12 +311,12 @@ LLTextEditor::~LLTextEditor()
 // LLTextEditor
 // Public methods
 
-void LLTextEditor::setText(const LLStringExplicit &utf8str)
+void LLTextEditor::setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params)
 {
 	blockUndo();
 	deselect();
 
-	LLTextBase::setText(utf8str);
+	LLTextBase::setText(utf8str, input_params);
 
 	resetDirty();
 }
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index 10fc94dedc1e4810785ec474947932efd72df17a..fb014b86bf873abcca1a88a72963d5bb0265c24a 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -168,7 +168,7 @@ class LLTextEditor :
 
 	void			appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);
 	// Non-undoable
-	void			setText(const LLStringExplicit &utf8str);
+	void			setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params = LLStyle::Params());
 
 
 	// Removes text from the end of document
diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp
index f1e3000547d3be73c37d4240e66cb2a8e8687ba7..9be33483d0b0762d660122963057214d3f54941b 100644
--- a/indra/llui/lluicolortable.cpp
+++ b/indra/llui/lluicolortable.cpp
@@ -192,19 +192,27 @@ void LLUIColorTable::clear()
 LLUIColor LLUIColorTable::getColor(const std::string& name, const LLColor4& default_color) const
 {
 	string_color_map_t::const_iterator iter = mUserSetColors.find(name);
+	
 	if(iter != mUserSetColors.end())
 	{
 		return LLUIColor(&iter->second);
 	}
 
 	iter = mLoadedColors.find(name);
-	return (iter != mLoadedColors.end() ? LLUIColor(&iter->second) : LLUIColor(default_color));
+	
+	if(iter != mLoadedColors.end())
+	{
+		return LLUIColor(&iter->second);
+	}
+	
+	return  LLUIColor(default_color);
 }
 
 // update user color, loaded colors are parsed on initialization
 void LLUIColorTable::setColor(const std::string& name, const LLColor4& color)
 {
 	setColor(name, color, mUserSetColors);
+	setColor(name, color, mLoadedColors);
 }
 
 bool LLUIColorTable::loadFromSettings()
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index aaadc1b58da969858e4a825a532db630ca547366..08fc8fb7849203697e2e183446b80ba4709356bb 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -38,10 +38,6 @@
 #include "llpanel.h"
 #include "lluictrlfactory.h"
 
-// This breaks the ability to construct dummy LLUICtrls for calls like
-// getChild<LLUICtrl>("not-there")
-//static LLWidgetNameRegistry::StaticRegistrar r(&typeid(LLUICtrl::Params), "ui_ctrl");
-// This doesn't appear to read/apply ui_ctrl.xml
 static LLDefaultChildRegistry::Register<LLUICtrl> r("ui_ctrl");
 
 LLUICtrl::Params::Params()
diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index adfbb41feb56d9ab924356c169791a4717668180..1c1450d7e9ff479001f4f9f9ffbf48687d60f855 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -433,8 +433,8 @@ void LLUICtrlFactory::registerWidget(const std::type_info* widget_type, const st
 	LLWidgetNameRegistry ::instance().defaultRegistrar().add(param_block_type, tag);
 	// associate widget type with factory function
 	LLDefaultWidgetRegistry::instance().defaultRegistrar().add(widget_type, creator_func);
-	LLWidgetTypeRegistry::instance().defaultRegistrar().add(tag, widget_type);
 	//FIXME: comment this in when working on schema generation
+	//LLWidgetTypeRegistry::instance().defaultRegistrar().add(tag, widget_type);
 	//LLDefaultParamBlockRegistry::instance().defaultRegistrar().add(widget_type, &getEmptyParamBlock<T>);
 }
 
diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index fb6d5b29054ce58dd61177322d236c9add308e69..26f38ca59b25978039ca1f4fc694492f9b3b5be3 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -528,11 +528,17 @@ class MediaPluginQuickTime : public MediaPluginBase
 		if ( ! mMovieController )
 			return;
 
-		// service QuickTime
-		// Calling it this way doesn't have good behavior on Windows...
-//		MoviesTask( mMovieHandle, milliseconds );
-		// This was the original, but I think using both MoviesTask and MCIdle is redundant.  Trying with only MCIdle.
-//		MoviesTask( mMovieHandle, 0 );
+		// this wasn't required in 1.xx viewer but we have to manually 
+		// work the Windows message pump now
+		#if defined( LL_WINDOWS )
+		MSG msg;
+		while ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) 
+		{
+			GetMessage( &msg, NULL, 0, 0 );
+			TranslateMessage( &msg );
+			DispatchMessage( &msg );
+		};
+		#endif
 
 		MCIdle( mMovieController );
 
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 3ce8ff3deb826ed775d623fc2a187ac058e0725f..1e79720f43f88bcd6d0cd9993ae705f96761a262 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -74,8 +74,17 @@ class MediaPluginWebKit :
 
 private:
 
+	enum
+	{
+		INIT_STATE_UNINITIALIZED,		// Browser instance hasn't been set up yet
+		INIT_STATE_NAVIGATING,			// Browser instance has been set up and initial navigate to about:blank has been issued
+		INIT_STATE_NAVIGATE_COMPLETE,	// initial navigate to about:blank has completed
+		INIT_STATE_WAIT_REDRAW,			// First real navigate begin has been received, waiting for page changed event to start handling redraws
+		INIT_STATE_RUNNING				// All initialization gymnastics are complete.
+	};
 	int mBrowserWindowId;
-	bool mBrowserInitialized;
+	int mInitState;
+	std::string mInitialNavigateURL;
 	bool mNeedsUpdate;
 
 	bool	mCanCut;
@@ -93,7 +102,17 @@ class MediaPluginWebKit :
 		
 		checkEditState();
 		
-		if ( mNeedsUpdate )
+		if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			if(!mInitialNavigateURL.empty())
+			{
+				// We already have the initial navigate URL -- kick off the navigate.
+				LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, mInitialNavigateURL );
+				mInitialNavigateURL.clear();
+			}
+		}
+		
+		if ( (mInitState == INIT_STATE_RUNNING) && mNeedsUpdate )
 		{
 			const unsigned char* browser_pixels = LLQtWebKit::getInstance()->grabBrowserWindow( mBrowserWindowId );
 
@@ -123,7 +142,7 @@ class MediaPluginWebKit :
 	bool initBrowser()
 	{
 		// already initialized
-		if ( mBrowserInitialized )
+		if ( mInitState > INIT_STATE_UNINITIALIZED )
 			return true;
 
 		// not enough information to initialize the browser yet.
@@ -210,20 +229,21 @@ class MediaPluginWebKit :
 			// set background color to be black - mostly for initial login page
 			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;
+
 			// 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
 			// for the HTTP AUTH dialog issues (DEV-41731). Will fix at a later date.
 			LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" );
 
-			// set flag so we don't do this again
-			mBrowserInitialized = true;
-
 			return true;
 		};
 
 		return false;
 	};
 
+
 	////////////////////////////////////////////////////////////////////////////////
 	// virtual
 	void onCursorChanged(const EventType& event)
@@ -263,6 +283,11 @@ class MediaPluginWebKit :
 	// virtual
 	void onPageChanged( const EventType& event )
 	{
+		if(mInitState == INIT_STATE_WAIT_REDRAW)
+		{
+			mInitState = INIT_STATE_RUNNING;
+		}
+		
 		// flag that an update is required
 		mNeedsUpdate = true;
 	};
@@ -271,62 +296,90 @@ class MediaPluginWebKit :
 	// virtual
 	void onNavigateBegin(const EventType& event)
 	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
-		message.setValue("uri", event.getEventUri());
-		sendMessage(message);
-
-		setStatus(STATUS_LOADING);
+		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
+			message.setValue("uri", event.getEventUri());
+			sendMessage(message);
+		
+			setStatus(STATUS_LOADING);
+		}
+		else if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			mInitState = INIT_STATE_WAIT_REDRAW;
+		}
+		
 	}
 
 	////////////////////////////////////////////////////////////////////////////////
 	// virtual
 	void onNavigateComplete(const EventType& event)
 	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
-		message.setValue("uri", event.getEventUri());
-		message.setValueS32("result_code", event.getIntValue());
-		message.setValue("result_string", event.getStringValue());
-		message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK));
-		message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD));
-		sendMessage(message);
-		
-		setStatus(STATUS_LOADED);
+		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
+			message.setValue("uri", event.getEventUri());
+			message.setValueS32("result_code", event.getIntValue());
+			message.setValue("result_string", event.getStringValue());
+			message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK));
+			message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD));
+			sendMessage(message);
+			
+			setStatus(STATUS_LOADED);
+		}
+		else if(mInitState == INIT_STATE_NAVIGATING)
+		{
+			mInitState = INIT_STATE_NAVIGATE_COMPLETE;
+		}
+
 	}
 
 	////////////////////////////////////////////////////////////////////////////////
 	// virtual
 	void onUpdateProgress(const EventType& event)
 	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "progress");
-		message.setValueS32("percent", event.getIntValue());
-		sendMessage(message);
+		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "progress");
+			message.setValueS32("percent", event.getIntValue());
+			sendMessage(message);
+		}
 	}
 	
 	////////////////////////////////////////////////////////////////////////////////
 	// virtual
 	void onStatusTextChange(const EventType& event)
 	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "status_text");
-		message.setValue("status", event.getStringValue());
-		sendMessage(message);
+		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "status_text");
+			message.setValue("status", event.getStringValue());
+			sendMessage(message);
+		}
 	}
 
 	////////////////////////////////////////////////////////////////////////////////
 	// virtual
 	void onTitleChange(const EventType& event)
 	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
-		message.setValue("name", event.getStringValue());
-		sendMessage(message);
+		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
+			message.setValue("name", event.getStringValue());
+			sendMessage(message);
+		}
 	}
 
 	////////////////////////////////////////////////////////////////////////////////
 	// virtual
 	void onLocationChange(const EventType& event)
 	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "location_changed");
-		message.setValue("uri", event.getEventUri());
-		sendMessage(message);
+		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "location_changed");
+			message.setValue("uri", event.getEventUri());
+			sendMessage(message);
+		}
 	}
 	
 	////////////////////////////////////////////////////////////////////////////////
@@ -488,7 +541,7 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_
 //	std::cerr << "MediaPluginWebKit constructor" << std::endl;
 
 	mBrowserWindowId = 0;
-	mBrowserInitialized = false;
+	mInitState = INIT_STATE_UNINITIALIZED;
 	mNeedsUpdate = true;
 	mCanCut = false;
 	mCanCopy = false;
@@ -674,7 +727,14 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
 				
 				if(!uri.empty())
 				{
-					LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, uri );
+					if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+					{
+						LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, uri );
+					}
+					else
+					{
+						mInitialNavigateURL = uri;
+					}
 				}
 			}
 			else if(message_name == "mouse_event")
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 9d44f34ea8b0ff451789db792c9fc3fe30d74f4b..4adef84cd3997d044429eae09c89d619764013a2 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -447,6 +447,7 @@ set(viewer_SOURCE_FILES
     llviewerassettype.cpp
     llvieweraudio.cpp
     llviewercamera.cpp
+	llviewerchat.cpp
     llviewercontrol.cpp
     llviewercontrollistener.cpp
     llviewerdisplay.cpp
@@ -946,6 +947,7 @@ set(viewer_HEADER_FILES
     llvieweraudio.h
     llviewerbuild.h
     llviewercamera.h
+	llviewerchat.h
     llviewercontrol.h
     llviewercontrollistener.h
     llviewerdisplay.h
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index eb4148f92f74e70052fcd084985b3dc74021ca05..8ad52784d33bafdc1f987362e9964a49a7180fae 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3563,7 +3563,7 @@
       <key>Type</key>
       <string>S32</string>
       <key>Value</key>
-      <integer>400</integer>
+      <integer>305</integer>
     </map>
     <key>HelpUseLocal</key>
     <map>
@@ -4917,7 +4917,7 @@
       <key>Type</key>
       <string>S32</string>
       <key>Value</key>
-      <integer>350</integer>
+      <integer>305</integer>
     </map>
     <key>NotificationToastLifeTime</key>
     <map>
diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh
index 3209654498c49792d0c8e2ed5454467e4316f510..f84102e1fbe1a3af090a4339e4e65875e771d7e0 100755
--- a/indra/newview/linux_tools/wrapper.sh
+++ b/indra/newview/linux_tools/wrapper.sh
@@ -118,7 +118,7 @@ if [ -n "$LL_TCMALLOC" ]; then
     fi
 fi
 
-export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"`pwd`"/app_settings/mozilla-runtime-linux-i686:"${LD_LIBRARY_PATH}"'
+export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}"'
 export SL_CMD='$LL_WRAPPER bin/do-not-directly-run-secondlife-bin'
 export SL_OPT="`cat etc/gridargs.dat` $@"
 
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index d2c8558f0b2da2da3ae3460c4bf4ddd39340b982..ca1688ad1f7a463bac899dc3ed437ec6ae408d12 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -3080,10 +3080,6 @@ void LLAgent::updateCamera()
 		mOrbitLeftKey > 0.f,	// right
 		mOrbitDownKey > 0.f);	// bottom
 
-		camera_floater->mZoom->setToggleState( 
-		mOrbitInKey > 0.f,		// top
-		mOrbitOutKey > 0.f);	// bottom
-
 		camera_floater->mTrack->setToggleState(
 		mPanLeftKey > 0.f,		// left
 		mPanUpKey > 0.f,		// top
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 7df278d887bf6815d3a17926c3af569eef3a464a..c670a65bcc0e968909ac12dab1fbe1c9ab6d9b62 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -311,3 +311,18 @@ void LLAvatarListItem::onNameCache(const std::string& first_name, const std::str
 	mAvatarName->setValue(name);
 	mAvatarName->setToolTip(name);
 }
+
+void LLAvatarListItem::reshapeAvatarName()
+{
+	S32 width_delta = 0;
+	width_delta += mShowProfileBtn ? mProfileBtnWidth : 0;
+	width_delta += mSpeakingIndicator->getVisible() ? mSpeakingIndicatorWidth : 0;
+	width_delta += mAvatarIcon->getVisible() ? mIconWidth : 0;
+	width_delta += mShowInfoBtn ? mInfoBtnWidth : 0;
+	width_delta += mLastInteractionTime->getVisible() ? mLastInteractionTime->getRect().getWidth() : 0;
+
+	S32 height = mAvatarName->getRect().getHeight();
+	S32 width  = getRect().getWidth() - width_delta;
+
+	mAvatarName->reshape(width, height);
+}
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index d379797a464b8c47206709640e39863d76ca086f..9d48101a44caa63d9dc04ce9ff96f05f6ad75573 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -82,6 +82,8 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 
 	void setContextMenu(ContextMenu* menu) { mContextMenu = menu; }
 
+	void reshapeAvatarName();
+
 private:
 
 	typedef enum e_online_status {
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index ab685b69ade99b417b2d0b2a62670225191273e2..fd711b72b0e9c06883b7f677e589705403f538f8 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -52,6 +52,7 @@ LLBottomTray::LLBottomTray(const LLSD&)
 	mNearbyChatBar(NULL),
 	mToolbarStack(NULL)
 ,	mMovementButton(NULL)
+,	mResizeState(RS_NORESIZE)
 // Add more members
 {
 	mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);
@@ -261,22 +262,22 @@ void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)
 
 void LLBottomTray::showGestureButton(BOOL visible)
 {
-	mGesturePanel->setVisible(visible);
+	setTrayButtonVisibleIfPossible(RS_BUTTON_GESTURES, visible);
 }
 
 void LLBottomTray::showMoveButton(BOOL visible)
 {
-	mMovementPanel->setVisible(visible);
+	setTrayButtonVisibleIfPossible(RS_BUTTON_MOVEMENT, visible);
 }
 
 void LLBottomTray::showCameraButton(BOOL visible)
 {
-	mCamPanel->setVisible(visible);
+	setTrayButtonVisibleIfPossible(RS_BUTTON_CAMERA, visible);
 }
 
 void LLBottomTray::showSnapshotButton(BOOL visible)
 {
-	mSnapshotPanel->setVisible(visible);
+	setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);
 }
 
 namespace
@@ -367,212 +368,186 @@ void LLBottomTray::verifyChildControlsSizes()
 		mNearbyChatBar->setRect(rect);
 	}
 }
-#define __FEATURE_EXT_991
+
 void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
-	lldebugs << "****************************************" << llendl;
+	static S32 debug_calling_number = 0;
+	lldebugs << "**************************************** " << ++debug_calling_number << llendl;
 
 	S32 current_width = getRect().getWidth();
+	S32 delta_width = width - current_width;
 	lldebugs << "Reshaping: " 
 		<< ", width: " << width
-		<< ", height: " << height
-		<< ", called_from_parent: " << called_from_parent
 		<< ", cur width: " << current_width
-		<< ", cur height: " << getRect().getHeight()
+		<< ", delta_width: " << delta_width
+		<< ", called_from_parent: " << called_from_parent
 		<< llendl;
 
 	if (mNearbyChatBar)			log(mNearbyChatBar, "before");
 	if (mChicletPanel)			log(mChicletPanel, "before");
 
+	// stores width size on which bottom tray is less than width required by its children. EXT-991
+	static S32 extra_shrink_width = 0;
+	bool should_be_reshaped = true;
+
 	if (mChicletPanel && mToolbarStack && mNearbyChatBar)
 	{
 		mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
  		verifyChildControlsSizes();
- 		updateResizeState(width, current_width);
-	}
 
-	LLPanel::reshape(width, height, called_from_parent);
+		// bottom tray is narrowed
+		if (delta_width < 0)
+		{
+			if (extra_shrink_width > 0)
+			{
+				// is world rect was extra shrunk and decreasing again only update this value
+				// to delta_width negative
+				extra_shrink_width -= delta_width; // use "-=" because delta_width is negative
+				should_be_reshaped = false;
+			}
+			else
+			{
+				extra_shrink_width = processWidthDecreased(delta_width);
+
+				// increase new width to extra_shrink_width value to not reshape less than bottom tray minimum
+				width += extra_shrink_width;
+			}
+		}
+		// bottom tray is widen
+		else
+		{
+			if (extra_shrink_width > delta_width)
+			{
+				// Less than minimum width is more than increasing (delta_width) 
+				// only reduce it value and make no reshape
+				extra_shrink_width -= delta_width;
+				should_be_reshaped = false;
+			}
+			else 
+			{
+				if (extra_shrink_width > 0)
+				{
+					// If we have some extra shrink width let's reduce delta_width & width
+					delta_width -= extra_shrink_width;
+					width -= extra_shrink_width;
+					extra_shrink_width = 0;
+				}
+				processWidthIncreased(delta_width);
+			}
+		}
+	}
 
+	lldebugs << "There is no enough width to reshape all children: " << extra_shrink_width << llendl;
+	if (should_be_reshaped)
+	{
+		lldebugs << "Reshape all children with width: " << width << llendl;
+		LLPanel::reshape(width, height, called_from_parent);
+	}
 
 	if (mNearbyChatBar)			log(mNearbyChatBar, "after");
 	if (mChicletPanel)			log(mChicletPanel, "after");
 }
 
-void LLBottomTray::updateResizeState(S32 new_width, S32 cur_width)
+S32 LLBottomTray::processWidthDecreased(S32 delta_width)
 {
-	mResizeState = RS_NORESIZE;
-	MASK compensative_view_item_mask = RS_CHATBAR_INPUT;
-	LLPanel* compansative_view = mNearbyChatBar;
-
-	S32 delta_width = new_width - cur_width;
-//	if (delta_width == 0) return;
-	bool shrink = new_width < cur_width;
+	bool still_should_be_processed = true;
 
 	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
 	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
 
-	const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
-	const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
-	const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth();
-
-	lldebugs << "chatbar_panel_width: " << chatbar_panel_width
-		<< ", chatbar_panel_min_width: " << chatbar_panel_min_width
-		<< ", chatbar_panel_max_width: " << chatbar_panel_max_width
-		<< ", chiclet_panel_width: " << chiclet_panel_width
-		<< ", chiclet_panel_min_width: " << chiclet_panel_min_width
-		<< llendl;
-
-	bool still_should_be_processed = true;
-	// bottom tray is narrowed
-	if (shrink)
+	if (chiclet_panel_width > chiclet_panel_min_width)
 	{
-		S32 compensative_delta_width = 0;
-		if (chiclet_panel_width > chiclet_panel_min_width)
-		{
-			// we have some space to decrease chiclet panel
-			S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width;
-			mResizeState |= RS_CHICLET_PANEL;
+		// we have some space to decrease chiclet panel
+		S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width;
 
-			S32 delta_panel = llmin(-delta_width, panel_delta_min);
+		S32 delta_panel = llmin(-delta_width, panel_delta_min);
 
-			lldebugs << "delta_width: " << delta_width
-				<< ", panel_delta_min: " << panel_delta_min
-				<< ", delta_panel: " << delta_panel
-				<< llendl;
+		lldebugs << "delta_width: " << delta_width
+			<< ", panel_delta_min: " << panel_delta_min
+			<< ", delta_panel: " << delta_panel
+			<< llendl;
 
-			// is chiclet panel width enough to process resizing?
-			delta_width += panel_delta_min;
+		// is chiclet panel width enough to process resizing?
+		delta_width += panel_delta_min;
 
-			still_should_be_processed = delta_width < 0;
+		still_should_be_processed = delta_width < 0;
 
-			mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight());
-			log(mChicletPanel, "after processing panel decreasing via chiclet panel");
+		mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight());
+		log(mChicletPanel, "after processing panel decreasing via chiclet panel");
 
-			lldebugs << "RS_CHICLET_PANEL" 
-				<< ", delta_width: " << delta_width
-				<< llendl;
-		}
-		
-		if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width)
-		{
-			// we have some space to decrease chatbar panel
-			S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width;
-			mResizeState |= RS_CHATBAR_INPUT;
-
-			S32 delta_panel = llmin(-delta_width, panel_delta_min);
-
-			// is chatbar panel width enough to process resizing?
-			delta_width += panel_delta_min;
-			
+		lldebugs << "RS_CHICLET_PANEL" 
+			<< ", delta_width: " << delta_width
+			<< llendl;
+	}
 
-			still_should_be_processed = delta_width < 0;
+	const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
+	const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
+	if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width)
+	{
+		// we have some space to decrease chatbar panel
+		S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width;
 
-			mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight());
+		S32 delta_panel = llmin(-delta_width, panel_delta_min);
 
-			lldebugs << "RS_CHATBAR_INPUT"
-				<< ", delta_panel: " << delta_panel
-				<< ", delta_width: " << delta_width
-				<< llendl;
+		// whether chatbar panel width is enough to process resizing?
+		delta_width += panel_delta_min;
 
-			log(mChicletPanel, "after nearby was processed");
+		still_should_be_processed = delta_width < 0;
 
-		}
-		if (still_should_be_processed)
-		{
-			mResizeState |= compensative_view_item_mask;
+		mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight());
 
-			if (mSnapshotPanel->getVisible())
-			{
-				mResizeState |= RS_BUTTON_SNAPSHOT;
-				delta_width += mSnapshotPanel->getRect().getWidth();
+		log(mChicletPanel, "after processing panel decreasing via nearby chatbar panel");
 
-				if (delta_width > 0)
-				{
-					compensative_delta_width += delta_width;
-				}
-				lldebugs << "RS_BUTTON_SNAPSHOT" 
-					<< ", compensative_delta_width: " << compensative_delta_width
-					<< ", delta_width: " << delta_width
-					<< llendl;
-				showSnapshotButton(false);
-			}
+		lldebugs << "RS_CHATBAR_INPUT"
+			<< ", delta_panel: " << delta_panel
+			<< ", delta_width: " << delta_width
+			<< llendl;
+	}
 
-			if (delta_width < 0 && mCamPanel->getVisible())
-			{
-				mResizeState |= RS_BUTTON_CAMERA;
-				delta_width += mCamPanel->getRect().getWidth();
-				if (delta_width > 0)
-				{
-					compensative_delta_width += delta_width;
-				}
-				lldebugs << "RS_BUTTON_CAMERA"
-					<< ", compensative_delta_width: " << compensative_delta_width
-					<< ", delta_width: " << delta_width
-					<< llendl;
-				showCameraButton(false);
-			}
+	S32 extra_shrink_width = 0;
+	S32 buttons_freed_width = 0;
+	if (still_should_be_processed)
+	{
+		processHideButton(RS_BUTTON_SNAPSHOT, &delta_width, &buttons_freed_width);
 
-			if (delta_width < 0 && mMovementPanel->getVisible())
-			{
-				mResizeState |= RS_BUTTON_MOVEMENT;
-				delta_width += mMovementPanel->getRect().getWidth();
-				if (delta_width > 0)
-				{
-					compensative_delta_width += delta_width;
-				}
-				lldebugs << "RS_BUTTON_MOVEMENT"
-					<< ", compensative_delta_width: " << compensative_delta_width
-					<< ", delta_width: " << delta_width
-					<< llendl;
-				showMoveButton(false);
-			}
+		if (delta_width < 0)
+		{
+			processHideButton(RS_BUTTON_CAMERA, &delta_width, &buttons_freed_width);
+		}
 
-			if (delta_width < 0 && mGesturePanel->getVisible())
-			{
-				mResizeState |= RS_BUTTON_GESTURES;
-				delta_width += mGesturePanel->getRect().getWidth();
-				if (delta_width > 0)
-				{
-					compensative_delta_width += delta_width;
-				}
-				lldebugs << "RS_BUTTON_GESTURES"
-					<< ", compensative_delta_width: " << compensative_delta_width
-					<< ", delta_width: " << delta_width
-					<< llendl;
-				showGestureButton(false);
-			}
+		if (delta_width < 0)
+		{
+			processHideButton(RS_BUTTON_MOVEMENT, &delta_width, &buttons_freed_width);
+		}
 
-			if (delta_width < 0)
-			{
-				llwarns << "WARNING: there is no enough room for bottom tray, resizing still should be processed" << llendl;
-			}
+		if (delta_width < 0)
+		{
+			processHideButton(RS_BUTTON_GESTURES, &delta_width, &buttons_freed_width);
+		}
 
-			if (compensative_delta_width != 0)
-			{
-				if (compansative_view)			log(compansative_view, "before applying compensative width: ");
-				compansative_view->reshape(compansative_view->getRect().getWidth() + compensative_delta_width, compansative_view->getRect().getHeight() );
-				if (compansative_view)			log(compansative_view, "after applying compensative width: ");
-				lldebugs << compensative_delta_width << llendl;
+		if (delta_width < 0)
+		{
+			extra_shrink_width = -delta_width;
+			lldebugs << "There is no enough room for bottom tray, resizing still should be processed: " 
+				<< extra_shrink_width << llendl;
+		}
 
-			}
+		if (buttons_freed_width > 0)
+		{
+			log(mNearbyChatBar, "before applying compensative width");
+			mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() + buttons_freed_width, mNearbyChatBar->getRect().getHeight() );
+			log(mNearbyChatBar, "after applying compensative width");
+			lldebugs << buttons_freed_width << llendl;
 		}
 	}
-	// bottom tray is widen
-	else
-	{
-		processWidthIncreased(delta_width);
-	}
-
-	lldebugs << "New resize state: " << mResizeState << llendl;
-}
-
-void LLBottomTray::processWidthDecreased(S32 delta_width)
-{
 
+	return extra_shrink_width;
 }
 
 void LLBottomTray::processWidthIncreased(S32 delta_width)
 {
+	if (delta_width <= 0) return;
+
 	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
 	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
 
@@ -627,9 +602,9 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 			chatbar_shrink_width = chatbar_available_shrink_width;
 		}
 
-		log(mNearbyChatBar, "increase width: before applying compensative width: ");
+		log(mNearbyChatBar, "increase width: before applying compensative width");
 		mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - chatbar_shrink_width, mNearbyChatBar->getRect().getHeight() );
-		if (mNearbyChatBar)			log(mNearbyChatBar, "after applying compensative width: ");
+		if (mNearbyChatBar)			log(mNearbyChatBar, "after applying compensative width");
 		lldebugs << chatbar_shrink_width << llendl;
 
 		// 3. use width available via decreasing of chiclet panel
@@ -651,7 +626,6 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 	S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
 	if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width)
 	{
-		mResizeState |= RS_CHATBAR_INPUT;
 		S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_;
 		S32 delta_panel = llmin(delta_width, delta_panel_max);
 		delta_width -= delta_panel_max;
@@ -667,7 +641,7 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
 		lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
 		return false;
 	}
-	bool can_be_shown = canButtonBeShown(panel);
+	bool can_be_shown = canButtonBeShown(shown_object_type);
 	if (can_be_shown)
 	{
 		//validate if we have enough room to show this button
@@ -678,30 +652,70 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
 			*available_width -= required_width;
 			*buttons_required_width += required_width;
 
-			switch (shown_object_type)
-			{
-			case RS_BUTTON_GESTURES:	showGestureButton(true);				break;
-			case RS_BUTTON_MOVEMENT:	showMoveButton(true);					break;
-			case RS_BUTTON_CAMERA:		showCameraButton(true);					break;
-			case RS_BUTTON_SNAPSHOT:	showSnapshotButton(true);				break;
-			default:
-				llwarns << "Unexpected type of button to be shown: " << shown_object_type << llendl;
-			}
+			setTrayButtonVisible(shown_object_type, true);
 
 			lldebugs << "processing object type: " << shown_object_type
-				<< ", buttons_required_width: " << buttons_required_width
+				<< ", buttons_required_width: " << *buttons_required_width
 				<< llendl;
+			mResizeState &= ~shown_object_type;
 		}
 	}
 	return can_be_shown;
 }
 
-bool LLBottomTray::canButtonBeShown(LLPanel* panel) const
+void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width)
+{
+	LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
+	if (NULL == panel)
+	{
+		lldebugs << "There is no object to process for state: " << processed_object_type << llendl;
+		return;
+	}
+
+	if (panel->getVisible())
+	{
+		*required_width += panel->getRect().getWidth();
+
+		if (*required_width > 0)
+		{
+			*buttons_freed_width += *required_width;
+		}
+
+		setTrayButtonVisible(processed_object_type, false);
+
+		mResizeState |= processed_object_type;
+
+		lldebugs << "processing object type: " << processed_object_type
+			<< ", buttons_freed_width: " << *buttons_freed_width
+			<< llendl;
+	}
+}
+
+bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
 {
-	bool can_be_shown = !panel->getVisible();
+	bool can_be_shown = mResizeState & processed_object_type;
 	if (can_be_shown)
 	{
-		// *TODO: mantipov: synchronize with situation when button was hidden via context menu;
+		static MASK MOVEMENT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES;
+		static MASK CAMERA_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT;
+		static MASK SNAPSHOT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT | RS_BUTTON_CAMERA;
+
+		switch(processed_object_type)
+		{
+		case RS_BUTTON_GESTURES: // Gestures should be shown first
+			break;
+		case RS_BUTTON_MOVEMENT: // Move only if gesture is shown
+			can_be_shown = !(MOVEMENT_PREVIOUS_BUTTONS_MASK & mResizeState);
+			break;
+		case RS_BUTTON_CAMERA:
+			can_be_shown = !(CAMERA_PREVIOUS_BUTTONS_MASK & mResizeState);
+			break;
+		case RS_BUTTON_SNAPSHOT:
+			can_be_shown = !(SNAPSHOT_PREVIOUS_BUTTONS_MASK & mResizeState);
+			break;
+		default: // nothing to do here
+			break;
+		}
 	}
 	return can_be_shown;
 }
@@ -713,4 +727,61 @@ void LLBottomTray::initStateProcessedObjectMap()
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel));
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel));
 }
+
+void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
+{
+	LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+	if (NULL == panel)
+	{
+		lldebugs << "There is no object to show for state: " << shown_object_type << llendl;
+		return;
+	}
+
+	panel->setVisible(visible);
+}
+
+void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible)
+{
+	bool can_be_set = true;
+
+	if (visible)
+	{
+		LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+		if (NULL == panel)
+		{
+			lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
+			return;
+		}
+
+		const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
+		const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
+
+		const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
+		const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
+
+		const S32 available_width = (chatbar_panel_width - chatbar_panel_min_width)
+			+ (chiclet_panel_width - chiclet_panel_min_width);
+
+		const S32 required_width = panel->getRect().getWidth();
+		can_be_set = available_width >= required_width;
+	}
+
+	if (can_be_set)
+	{
+		setTrayButtonVisible(shown_object_type, visible);
+
+		// if we hide the button mark it NOT to show while future bottom tray extending
+		if (!visible)
+		{
+			mResizeState &= ~shown_object_type;
+		}
+	}
+	else
+	{
+		// mark this button to show it while future bottom tray extending
+		mResizeState |= shown_object_type;
+		LLNotifications::instance().add("BottomTrayButtonCanNotBeShown");
+	}
+}
+
 //EOF
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index c88bdeda1c266894375c03f66ade419ed04f2c46..974289d5e0f290baf5c7b54667bdabe2a942bfe1 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -103,13 +103,40 @@ class LLBottomTray
 
 	void updateResizeState(S32 new_width, S32 cur_width);
 	void verifyChildControlsSizes();
-	void processWidthDecreased(S32 delta_width);
+	S32 processWidthDecreased(S32 delta_width);
 	void processWidthIncreased(S32 delta_width);
 	void log(LLView* panel, const std::string& descr);
 	bool processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width);
-	bool canButtonBeShown(LLPanel* panel) const;
+	void processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width);
+
+	/**
+	 * Determines if specified by type object can be shown. It should be hidden by shrink before.
+	 *
+	 * Processes buttons a such way to show buttons in constant order:
+	 *   - Gestures, Move, View, Snapshot
+	 */
+	bool canButtonBeShown(EResizeState processed_object_type) const;
 	void initStateProcessedObjectMap();
 
+	/**
+	 * Sets passed visibility to object specified by resize type.
+	 */
+	void setTrayButtonVisible(EResizeState shown_object_type, bool visible);
+
+	/**
+	 * Sets passed visibility to object specified by resize type if it is possible.
+	 *
+	 * If it is impossible to show required button due to there is no enough room in bottom tray
+	 * it will no be shown. Is called via context menu commands.
+	 * In this case Alert Dialog will be shown to notify user about that.
+	 *
+	 * Method also stores resize state to be processed while future bottom tray extending:
+	 *  - if hidden while resizing button should be hidden it will not be shown while extending;
+	 *  - if hidden via context menu button should be shown but there is no enough room for now
+	 *    it will be shown while extending.
+	 */
+	void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible);
+
 	MASK mResizeState;
 
 	typedef std::map<EResizeState, LLPanel*> state_object_map_t;
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index 4523267eddbaa6342b2af0365850f0d82d2f1b91..442dc660cdb22da74eef0982dc1d13835ec486b6 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -210,8 +210,9 @@ void LLChatBar::refreshGestures()
 
 		// collect list of unique gestures
 		std::map <std::string, BOOL> unique;
-		LLGestureManager::item_map_t::iterator it;
-		for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it)
+		LLGestureManager::item_map_t::const_iterator it;
+		const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
+		for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
 		{
 			LLMultiGesture* gesture = (*it).second;
 			if (gesture)
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index d1922cfd6ecaf6cfb7aa9731e1f0f262812c2ef9..028bb7a384870427e7de8486ffbcd32ca6ae2e8f 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -53,7 +53,7 @@ std::string formatCurrentTime()
 	time_t utc_time;
 	utc_time = time_corrected();
 	std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
-		+LLTrans::getString("TimeMin")+"] ";
+		+LLTrans::getString("TimeMin")+"]";
 
 	LLSD substitution;
 
@@ -84,6 +84,10 @@ class LLChatHistoryHeader: public LLPanel
 
 		if (level == "profile")
 		{
+			LLSD params;
+			params["object_id"] = getAvatarId();
+
+			LLFloaterReg::showInstance("inspect_object", params);
 		}
 		else if (level == "block")
 		{
@@ -131,7 +135,7 @@ class LLChatHistoryHeader: public LLPanel
 		menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 		mPopupMenuHandleObject = menu->getHandle();
 
-		setMouseDownCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4));
+		setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4));
 
 		return LLPanel::postBuild();
 	}
@@ -167,7 +171,15 @@ class LLChatHistoryHeader: public LLPanel
 
 	void onHeaderPanelClick(S32 x, S32 y, MASK mask)
 	{
-		LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID));
+		if (mSourceType == CHAT_SOURCE_OBJECT)
+		{
+			LLFloaterReg::showInstance("inspect_object", LLSD().insert("object_id", mAvatarID));
+		}
+		else if (mSourceType == CHAT_SOURCE_AGENT)
+		{
+			LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID));
+		}
+		//if chat source is system, you may add "else" here to define behaviour.
 	}
 
 	const LLUUID&		getAvatarId () const { return mAvatarID;}
@@ -333,16 +345,30 @@ LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style
 	return header;
 }
 
-void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params)
+void LLChatHistory::appendWidgetMessage(const LLChat& chat)
 {
 	LLView* view = NULL;
-	std::string view_text = "\n[" + formatCurrentTime() + "] " + chat.mFromName + ": ";
+	std::string view_text = "\n[" + formatCurrentTime() + "] ";
+	if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
+		view_text += chat.mFromName + ": ";
+
 
 	LLInlineViewSegment::Params p;
 	p.force_newline = true;
 	p.left_pad = mLeftWidgetPad;
 	p.right_pad = mRightWidgetPad;
 
+	
+	LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
+	LLViewerChat::getChatColor(chat,txt_color);
+	LLFontGL* fontp = LLViewerChat::getChatFont();
+	
+	LLStyle::Params style_params;
+	style_params.color(txt_color);
+	style_params.readonly_color(txt_color);
+	style_params.font(fontp);
+
+	
 	if (mLastFromName == chat.mFromName)
 	{
 		view = getSeparator();
@@ -357,6 +383,7 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& sty
 		else
 			p.top_pad = mTopHeaderPad;
 		p.bottom_pad = mBottomHeaderPad;
+		
 	}
 	p.view = view;
 
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index f0944042afbb3243fd2f14c4746e7291810995e1..f689a225fe334ca4dc09f6e17a94593495982926 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -34,7 +34,7 @@
 #define LLCHATHISTORY_H_
 
 #include "lltexteditor.h"
-#include "llchat.h"
+#include "llviewerchat.h"
 
 //Chat log widget allowing addition of a message as a widget 
 class LLChatHistory : public LLTextEditor
@@ -109,7 +109,7 @@ class LLChatHistory : public LLTextEditor
 		 * @param time time of a message.
 		 * @param message message itself.
 		 */
-		void appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params);
+		void appendWidgetMessage(const LLChat& chat);
 
 	private:
 		std::string mLastFromName;
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 63b9fd8e66c54c70e78ad822b7f9bf5488156869..d2e3247250bc15a100c9f973483bc4ddcd95858d 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -120,10 +120,10 @@ std::string LLNearbyChatToastPanel::appendTime()
 
 
 
-void	LLNearbyChatToastPanel::addText		(const std::string& message)
+void	LLNearbyChatToastPanel::addText	(const std::string& message , const LLStyle::Params& input_params)
 {
 	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
-	msg_text->addText(message);
+	msg_text->addText(message , input_params);
 	mMessages.push_back(message);
 }
 
@@ -134,9 +134,34 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 	mText = notification["message"].asString();		// UTF-8 line of text
 	mFromName = notification["from"].asString();	// agent or object name
 	mFromID = notification["from_id"].asUUID();		// agent id or object id
+	
 	int sType = notification["source"].asInteger();
     mSourceType = (EChatSourceType)sType;
-
+	
+	std::string color_name = notification["text_color"].asString();
+	
+	mTextColor = LLUIColorTable::instance().getColor(color_name);
+	mTextColor.mV[VALPHA] =notification["color_alpha"].asReal();
+	
+	S32 font_size = notification["font_size"].asInteger();
+	switch(font_size)
+	{
+		case 0:
+			mFont = LLFontGL::getFontSansSerifSmall();
+			break;
+		default:
+		case 1:
+			mFont = LLFontGL::getFontSansSerif();
+			break;
+		case 2:
+			mFont = LLFontGL::getFontSansSerifBig();
+			break;
+	}
+	
+	LLStyle::Params style_params;
+	style_params.color(mTextColor);
+	style_params.font(mFont);
+	
 	std::string str_sender;
 
 	if(gAgentID != mFromID)
@@ -144,13 +169,13 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 	else
 		str_sender = LLTrans::getString("You");;
 
-	caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender);
+	caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender , style_params);
 	
-	caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime());
+	caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime() , style_params );
 
 
 	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
-	msg_text->setText(mText);
+	msg_text->setText(mText, style_params);
 
 	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
 	if(mSourceType != CHAT_SOURCE_AGENT)
@@ -171,7 +196,15 @@ void	LLNearbyChatToastPanel::setMessage	(const LLChat& chat_msg)
 	notification["from_id"] = chat_msg.mFromID;
 	notification["time"] = chat_msg.mTime;
 	notification["source"] = (S32)chat_msg.mSourceType;
-
+	
+	std::string r_color_name="White";
+	F32 r_color_alpha = 1.0f; 
+	LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha);
+	
+	notification["text_color"] = r_color_name;
+	notification["color_alpha"] = r_color_alpha;
+	
+	notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
 	init(notification);
 
 }
@@ -201,11 +234,17 @@ void	LLNearbyChatToastPanel::setWidth(S32 width)
 	text_box->reshape(width - msg_left_offset - msg_right_offset,100/*its not magic number, we just need any number*/);
 
 	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
+	
+	LLStyle::Params style_params;
+	style_params.color(mTextColor);
+	style_params.font(mFont);
+	
+	
 	if(mText.length())
-		msg_text->setText(mText);
+		msg_text->setText(mText, style_params);
 	
 	for(size_t i=0;i<mMessages.size();++i)
-		msg_text->addText(mMessages[i]);
+		msg_text->addText(mMessages[i] , style_params);
 
 	setRect(LLRect(getRect().mLeft, getRect().mTop, getRect().mLeft + width	, getRect().mBottom));
 	snapToMessageHeight	();
diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h
index 8fb045b6d912f7bac2c2eeba3513093219730977..a65bfedd0964f61786e2a2539d4beeaab7e672ee 100644
--- a/indra/newview/llchatitemscontainerctrl.h
+++ b/indra/newview/llchatitemscontainerctrl.h
@@ -36,7 +36,7 @@
 #include "llpanel.h"
 #include "llscrollbar.h"
 #include "string"
-#include "llchat.h"
+#include "llviewerchat.h"
 #include "lltoastpanel.h"
 
 typedef enum e_show_item_header
@@ -59,7 +59,7 @@ class LLNearbyChatToastPanel: public LLToastPanelBase
 
 	const LLUUID& getFromID() const { return mFromID;}
 	
-	void	addText		(const std::string& message);
+	void	addText		(const std::string& message ,  const LLStyle::Params& input_params = LLStyle::Params());
 	void	setMessage	(const LLChat& msg);
 	void	setWidth		(S32 width);
 	void	snapToMessageHeight	();
@@ -89,6 +89,8 @@ class LLNearbyChatToastPanel: public LLToastPanelBase
 	std::string		mFromName;	// agent or object name
 	LLUUID			mFromID;	// agent id or object id
 	EChatSourceType	mSourceType;
+	LLColor4        mTextColor;
+	LLFontGL*       mFont;
 
 
 	std::vector<std::string> mMessages;
diff --git a/indra/newview/llchatmsgbox.cpp b/indra/newview/llchatmsgbox.cpp
index 12626e3b43b60254c0dfacd22bb32819a83c233c..bb0ec2db27ee8c5f9ced894da3fcfe2a9971ed05 100644
--- a/indra/newview/llchatmsgbox.cpp
+++ b/indra/newview/llchatmsgbox.cpp
@@ -84,7 +84,7 @@ LLChatMsgBox::LLChatMsgBox(const Params& p) :
 	mBlockSpacing(p.block_spacing)
 {}
 
-void LLChatMsgBox::addText( const LLStringExplicit& text )
+void LLChatMsgBox::addText( const LLStringExplicit& text , const LLStyle::Params& input_params )
 {
 	S32 length = getLength();
 	// if there is existing text, add a separator
@@ -94,5 +94,5 @@ void LLChatMsgBox::addText( const LLStringExplicit& text )
 		insertSegment(new ChatSeparator(length - 1, length - 1));
 	}
 	// prepend newline only if there is some existing text
-	appendText(text, length > 0);
+	appendText(text, length > 0, input_params);
 }
diff --git a/indra/newview/llchatmsgbox.h b/indra/newview/llchatmsgbox.h
index df29db58c320891f00373cb6b12b8d62661ea05d..9e1661672925d32749f5dcfbef53665902216b02 100644
--- a/indra/newview/llchatmsgbox.h
+++ b/indra/newview/llchatmsgbox.h
@@ -61,7 +61,7 @@ class LLChatMsgBox :
 	friend class LLUICtrlFactory;
 
 public:
-	void				addText(const LLStringExplicit &text);
+	void				addText(const LLStringExplicit &text, const LLStyle::Params& input_params = LLStyle::Params());
 	
 private:
 	S32					mBlockSpacing;
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index b919195fb2180ef3b984f6f47f393dec8625bed5..9e290c8c046fcd5d0ff4509deee34c27b7b20de6 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -54,10 +54,12 @@ static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel");
 static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notification");
 static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p");
 static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group");
+static LLDefaultChildRegistry::Register<LLAdHocChiclet> t5("chiclet_im_adhoc");
 
 static const LLRect CHICLET_RECT(0, 25, 25, 0);
-static const LLRect CHICLET_ICON_RECT(0, 24, 24, 0);
+static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0);
 static const LLRect VOICE_INDICATOR_RECT(25, 25, 45, 0);
+static const S32	OVERLAY_ICON_SHIFT = 2;	// used for shifting of an overlay icon for new massages in a chiclet
 
 // static
 const S32 LLChicletPanel::s_scroll_ratio = 10;
@@ -217,13 +219,15 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
 	icon_params.visible = false;
 	icon_params.image = LLUI::getUIImage(p.new_messages_icon_name);
 	mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
+	addChild(mNewMessagesIcon);
+
 	// adjust size and position of an icon
 	LLRect chiclet_rect = p.rect;
-	LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.mTop, chiclet_rect.mRight, chiclet_rect.getHeight()/2); 
-	// shift an icon a little bit to the right and up corner of a chiclet
-	overlay_icon_rect.translate(overlay_icon_rect.getWidth()/5, overlay_icon_rect.getHeight()/5);
+	LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.getHeight(), chiclet_rect.getWidth(), chiclet_rect.getHeight()/2); 
 	mNewMessagesIcon->setRect(overlay_icon_rect);
-	addChild(mNewMessagesIcon);
+	
+	// shift an icon a little bit to the right and up corner of a chiclet
+	overlay_icon_rect.translate(OVERLAY_ICON_SHIFT, OVERLAY_ICON_SHIFT);
 
 	setShowCounter(false);
 }
@@ -423,7 +427,6 @@ void LLIMP2PChiclet::updateMenuItems()
 	bool is_friend = LLAvatarActions::isFriend(getOtherParticipantId());
 
 	mPopupMenu->getChild<LLUICtrl>("Add Friend")->setEnabled(!is_friend);
-	mPopupMenu->getChild<LLUICtrl>("Remove Friend")->setEnabled(is_friend);
 }
 
 BOOL LLIMP2PChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
@@ -602,6 +605,9 @@ BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
 
 LLIMGroupChiclet::Params::Params()
 : group_icon("group_icon")
+, unread_notifications("unread_notifications")
+, speaker("speaker")
+, show_speaker("show_speaker")
 {
 	rect(CHICLET_RECT);
 
@@ -830,8 +836,17 @@ LLChicletPanel::~LLChicletPanel()
 void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
 	
 	LLUUID session_id = data["session_id"].asUUID();
+	LLUUID from_id = data["from_id"].asUUID();
+	const std::string from = data["from"].asString();
 	S32 unread = data["num_unread"].asInteger();
 
+	// if new message came
+	if(unread != 0)
+	{
+		//we do not show balloon (indicator of new messages) for system messages and our own messages
+		if (from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from) return;
+	}
+
 	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
 	if (im_floater && im_floater->getVisible())
 	{
@@ -851,7 +866,6 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
 	    	llwarns << "Unable to set counter for chiclet " << session_id << llendl;
 	    }
 	}
-
 }
 
 
@@ -880,19 +894,34 @@ BOOL LLChicletPanel::postBuild()
 
 void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)
 {
-	for(chiclet_list_t::iterator it = mChicletList.begin(); it != mChicletList.end(); ++it)
+	static LLUUID s_previous_active_voice_session_id;
+
+	std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(session_id);
+
+	for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it)
 	{
 		LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
 		if(chiclet)
 		{
-			if(chiclet->getSessionId() == session_id)
+			chiclet->setShowSpeaker(true);
+		}
+	}
+
+	if(!s_previous_active_voice_session_id.isNull() && s_previous_active_voice_session_id != session_id)
+	{
+		chiclets = LLIMChiclet::sFindChicletsSignal(s_previous_active_voice_session_id);
+
+		for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it)
+		{
+			LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
+			if(chiclet)
 			{
-				chiclet->setShowSpeaker(true);
-				continue;
+				chiclet->setShowSpeaker(false);
 			}
-			chiclet->setShowSpeaker(false);
-		}
+		}		
 	}
+
+	s_previous_active_voice_session_id = session_id;
 }
 
 S32 LLChicletPanel::calcChickletPanleWidth()
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 424d6353211bfec0ad579835ce488ac20e979bdd..6d7da107ac1bce832adb3cefbc0db8b9ada5d24b 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -129,12 +129,12 @@ void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL calle
 	}
 }
 
-void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text)
+void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params)
 {
 	// LLTextBox::setText will obliterate the expander segment, so make sure
 	// we generate it again by clearing mExpanderVisible
 	mExpanderVisible = false;
-	LLTextBox::setText(text);
+	LLTextBox::setText(text, input_params);
 
 	// text contents have changed, segments are cleared out
 	// so hide the expander and determine if we need it
diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h
index 3fe646c29c6b7765dfbb875b6a6a939748ed58ee..7c989cfa50ec4fa595fe4660045b2178a1bda398 100644
--- a/indra/newview/llexpandabletextbox.h
+++ b/indra/newview/llexpandabletextbox.h
@@ -60,7 +60,7 @@ class LLExpandableTextBox : public LLUICtrl
 
 		// 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);
+		/*virtual*/ void setText(const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params());
 
 		/**
 		 * Returns difference between text box height and text height.
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index d1317f7c3681b84f3ca09b1583ed7b004b195bc6..92e958b32de901891afb156bce19b5d79e2d86d5 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -40,10 +40,12 @@
 // Viewer includes
 #include "lljoystickbutton.h"
 #include "llviewercontrol.h"
+#include "llviewercamera.h"
 #include "llbottomtray.h"
 #include "llagent.h"
 #include "lltoolmgr.h"
 #include "lltoolfocus.h"
+#include "llslider.h"
 
 // Constants
 const F32 CAMERA_BUTTON_DELAY = 0.0f;
@@ -54,6 +56,93 @@ const F32 CAMERA_BUTTON_DELAY = 0.0f;
 #define PRESETS "camera_presets"
 #define CONTROLS "controls"
 
+// Zoom the camera in and out
+class LLPanelCameraZoom
+:	public LLPanel
+{
+	LOG_CLASS(LLPanelCameraZoom);
+public:
+	LLPanelCameraZoom();
+
+	/* virtual */ BOOL	postBuild();
+	/* virtual */ void	onOpen(const LLSD& key);
+
+protected:
+	void	onZoomPlusHeldDown();
+	void	onZoomMinusHeldDown();
+	void	onSliderValueChanged();
+
+private:
+	F32			mSavedSliderVal;
+	LLButton*	mPlusBtn;
+	LLButton*	mMinusBtn;
+	LLSlider*	mSlider;
+};
+
+static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel");
+
+//-------------------------------------------------------------------------------
+// LLPanelCameraZoom
+//-------------------------------------------------------------------------------
+
+LLPanelCameraZoom::LLPanelCameraZoom()
+:	mPlusBtn( NULL ),
+	mMinusBtn( NULL ),
+	mSlider( NULL ),
+	mSavedSliderVal(0.f)
+{
+	mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this));
+	mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this));
+	mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this));
+}
+
+BOOL LLPanelCameraZoom::postBuild()
+{
+	mPlusBtn  = getChild <LLButton> ("zoom_plus_btn");
+	mMinusBtn = getChild <LLButton> ("zoom_minus_btn");
+	mSlider   = getChild <LLSlider> ("zoom_slider");
+	mSlider->setMinValue(.0f);
+	mSlider->setMaxValue(8.f);
+	return LLPanel::postBuild();
+}
+
+void LLPanelCameraZoom::onOpen(const LLSD& key)
+{
+	LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - gAgent.calcFocusPositionTargetGlobal();
+	mSavedSliderVal = 8.f - (F32)to_focus.magVec(); // maximum minus current
+	mSlider->setValue( mSavedSliderVal );
+}
+
+void LLPanelCameraZoom::onZoomPlusHeldDown()
+{
+	F32 val = mSlider->getValueF32();
+	F32 inc = mSlider->getIncrement();
+	mSlider->setValue(val - inc);
+	// commit only if value changed
+	if (val != mSlider->getValueF32())
+		mSlider->onCommit();
+}
+
+void LLPanelCameraZoom::onZoomMinusHeldDown()
+{
+	F32 val = mSlider->getValueF32();
+	F32 inc = mSlider->getIncrement();
+	mSlider->setValue(val + inc);
+	// commit only if value changed
+	if (val != mSlider->getValueF32())
+		mSlider->onCommit();
+}
+
+void  LLPanelCameraZoom::onSliderValueChanged()
+{
+	F32 val	 = mSlider->getValueF32();
+	F32 rate = val - mSavedSliderVal;
+
+	gAgent.unlockView();
+	gAgent.cameraOrbitIn(rate);
+
+	mSavedSliderVal = val;
+}
 
 //
 // Member functions
@@ -125,6 +214,7 @@ void LLFloaterCamera::onOpen(const LLSD& key)
 		anchor_panel, this,
 		getDockTongue(), LLDockControl::TOP));
 
+	mZoom->onOpen(key);
 }
 
 void LLFloaterCamera::onClose(bool app_quitting)
@@ -147,7 +237,7 @@ BOOL LLFloaterCamera::postBuild()
 	setIsChrome(TRUE);
 
 	mRotate = getChild<LLJoystickCameraRotate>(ORBIT);
-	mZoom = getChild<LLJoystickCameraZoom>(ZOOM);
+	mZoom = getChild<LLPanelCameraZoom>(ZOOM);
 	mTrack = getChild<LLJoystickCameraTrack>(PAN);
 
 	assignButton2Mode(CAMERA_CTRL_MODE_ORBIT,			"orbit_btn");
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 583f279e6276c70d181d9a864f22eee54d10dfa4..4873a34e00ba9672d7407cb71d6e2defffcecf8a 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -39,6 +39,7 @@ class LLJoystickCameraRotate;
 class LLJoystickCameraZoom;
 class LLJoystickCameraTrack;
 class LLFloaterReg;
+class LLPanelCameraZoom;
 
 enum ECameraControlMode
 {
@@ -74,7 +75,7 @@ class LLFloaterCamera
 	virtual void onClose(bool app_quitting);
 
 	LLJoystickCameraRotate* mRotate;
-	LLJoystickCameraZoom*	mZoom;
+	LLPanelCameraZoom*	mZoom;
 	LLJoystickCameraTrack*	mTrack;
 
 private:
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index c114eed4a2485f043893be704ecde429cb3bb16c..854d02873a7aeaf537a2ea94b545b51121c19eaa 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -89,6 +89,52 @@ LLFloaterGesture::LLFloaterGesture(const LLSD& key)
 	//LLUICtrlFactory::getInstance()->buildFloater(this, "floater_gesture.xml");
 }
 
+void LLFloaterGesture::done()
+{
+	//this method can be called twice: for GestureFolder and once after loading all sudir of GestureFolder
+	if (gInventory.isCategoryComplete(mGestureFolderID))
+	{
+		LL_DEBUGS("Gesture")<< "mGestureFolderID loaded" << LL_ENDL;
+		// we load only gesture folder without childred.
+		LLInventoryModel::cat_array_t* categories;
+		LLInventoryModel::item_array_t* items;
+		LLInventoryFetchDescendentsObserver::folder_ref_t unloaded_folders;
+		LL_DEBUGS("Gesture")<< "Get subdirs of Gesture Folder...." << LL_ENDL;
+		gInventory.getDirectDescendentsOf(mGestureFolderID, categories, items);
+		if (categories->empty())
+		{
+			gInventory.removeObserver(this);
+			LL_INFOS("Gesture")<< "Gesture dos NOT contains sub-directories."<< LL_ENDL;
+			return;
+		}
+		LL_DEBUGS("Gesture")<< "There are " << categories->size() << " Folders "<< LL_ENDL;
+		for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); it != categories->end(); it++)
+		{
+			if (!gInventory.isCategoryComplete(it->get()->getUUID()))
+			{
+				unloaded_folders.push_back(it->get()->getUUID());
+				LL_DEBUGS("Gesture")<< it->get()->getName()<< " Folder added to fetchlist"<< LL_ENDL;
+			}
+
+		}
+		if (!unloaded_folders.empty())
+		{
+			LL_DEBUGS("Gesture")<< "Fetching subdirectories....." << LL_ENDL;
+			fetchDescendents(unloaded_folders);
+		}
+		else
+		{
+			LL_DEBUGS("Gesture")<< "All Gesture subdirectories have been loaded."<< LL_ENDL;
+			gInventory.removeObserver(this);
+			buildGestureList();
+		}
+	}
+	else
+	{
+		LL_WARNS("Gesture")<< "Gesture list was NOT loaded"<< LL_ENDL;
+	}
+}
+
 // virtual
 LLFloaterGesture::~LLFloaterGesture()
 {
@@ -121,7 +167,14 @@ BOOL LLFloaterGesture::postBuild()
 	childSetVisible("play_btn", true);
 	childSetVisible("stop_btn", false);
 	setDefaultBtn("play_btn");
-	
+	mGestureFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE, false);
+
+	folder_ref_t folders;
+	folders.push_back(mGestureFolderID);
+	//perform loading Gesture directory anyway to make sure that all subdirectory are loaded too. See method done() for details.
+	gInventory.addObserver(this);
+	fetchDescendents(folders);
+
 	buildGestureList();
 	
 	childSetFocus("gesture_list");
@@ -171,101 +224,125 @@ void LLFloaterGesture::buildGestureList()
 
 	if (! (list && scroll)) return;
 
-	// attempt to preserve scroll position through re-builds
-	// since we do re-build any time anything dirties
-	S32 current_scroll_pos = scroll->getScrollPos();
-	
+	LLUUID selected_item = list->getCurrentID();
+	LL_DEBUGS("Gesture")<< "Rebuilding gesture list "<< LL_ENDL;
 	list->operateOnAll(LLCtrlListInterface::OP_DELETE);
 
-	LLGestureManager::item_map_t::iterator it;
-	for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it)
+	LLGestureManager::item_map_t::const_iterator it;
+	const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
+	for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
 	{
-		const LLUUID& item_id = (*it).first;
-		LLMultiGesture* gesture = (*it).second;
+		addGesture(it->first,it->second, list);
+	}
+	if (gInventory.isCategoryComplete(mGestureFolderID))
+	{
+		LLIsType is_gesture(LLAssetType::AT_GESTURE);
+		LLInventoryModel::cat_array_t categories;
+		LLInventoryModel::item_array_t items;
+		gInventory.collectDescendentsIf(mGestureFolderID, categories, items,
+				LLInventoryModel::EXCLUDE_TRASH, is_gesture);
 
-		// Note: Can have NULL item if inventory hasn't arrived yet.
-		std::string item_name = getString("loading");
-		LLInventoryItem* item = gInventory.getItem(item_id);
-		if (item)
+		for (LLInventoryModel::item_array_t::iterator it = items.begin(); it!= items.end(); ++it)
 		{
-			item_name = item->getName();
+			LLInventoryItem* item = it->get();
+			if (active_gestures.find(item->getUUID()) == active_gestures.end())
+			{
+				// if gesture wasn't loaded yet, we can display only name
+				addGesture(item->getUUID(), NULL, list);
+			}
 		}
+	}
+	// attempt to preserve scroll position through re-builds
+	// since we do re-build any time anything dirties
+	if(list->selectByValue(LLSD(selected_item)))
+	{
+		scroll->scrollToShowSelected();
+	}
+}
 
-		std::string font_style = "NORMAL";
-		// If gesture is playing, bold it
+void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gesture,LLCtrlListInterface * list )
+{
+	// Note: Can have NULL item if inventory hasn't arrived yet.
+	static std::string item_name = getString("loading");
+	LLInventoryItem* item = gInventory.getItem(item_id);
+	if (item)
+	{
+		item_name = item->getName();
+	}
+
+	static std::string font_style = "NORMAL";
+	// If gesture is playing, bold it
 
-		LLSD element;
-		element["id"] = item_id;
+	LLSD element;
+	element["id"] = item_id;
 
-		if (gesture)
+	if (gesture)
+	{
+		if (gesture->mPlaying)
 		{
-			if (gesture->mPlaying)
-			{
-				font_style = "BOLD";
-			}
+			font_style = "BOLD";
+		}
 
-			element["columns"][0]["column"] = "trigger";
-			element["columns"][0]["value"] = gesture->mTrigger;
-			element["columns"][0]["font"]["name"] = "SANSSERIF";
-			element["columns"][0]["font"]["style"] = font_style;
+		element["columns"][0]["column"] = "trigger";
+		element["columns"][0]["value"] = gesture->mTrigger;
+		element["columns"][0]["font"]["name"] = "SANSSERIF";
+		element["columns"][0]["font"]["style"] = font_style;
 
-			std::string key_string = LLKeyboard::stringFromKey(gesture->mKey);
-			std::string buffer;
+		std::string key_string = LLKeyboard::stringFromKey(gesture->mKey);
+		std::string buffer;
 
-			if (gesture->mKey == KEY_NONE)
-			{
-				buffer = "---";
-				key_string = "~~~";		// alphabetize to end
-			}
-			else
-			{
-				buffer = LLKeyboard::stringFromAccelerator( gesture->mMask, gesture->mKey );
-			}
+		if (gesture->mKey == KEY_NONE)
+		{
+			buffer = "---";
+			key_string = "~~~"; // alphabetize to end
+		}
+		else
+		{
+			buffer = LLKeyboard::stringFromAccelerator(gesture->mMask,
+					gesture->mKey);
+		}
 
-			element["columns"][1]["column"] = "shortcut";
-			element["columns"][1]["value"] = buffer;
-			element["columns"][1]["font"]["name"] = "SANSSERIF";
-			element["columns"][1]["font"]["style"] = font_style;
+		element["columns"][1]["column"] = "shortcut";
+		element["columns"][1]["value"] = buffer;
+		element["columns"][1]["font"]["name"] = "SANSSERIF";
+		element["columns"][1]["font"]["style"] = font_style;
 
-			// hidden column for sorting
-			element["columns"][2]["column"] = "key";
-			element["columns"][2]["value"] = key_string;
-			element["columns"][2]["font"]["name"] = "SANSSERIF";
-			element["columns"][2]["font"]["style"] = font_style;
+		// hidden column for sorting
+		element["columns"][2]["column"] = "key";
+		element["columns"][2]["value"] = key_string;
+		element["columns"][2]["font"]["name"] = "SANSSERIF";
+		element["columns"][2]["font"]["style"] = font_style;
 
-			// Only add "playing" if we've got the name, less confusing. JC
-			if (item && gesture->mPlaying)
-			{
-				item_name += " " + getString("playing");
-			}
-			element["columns"][3]["column"] = "name";
-			element["columns"][3]["value"] = item_name;
-			element["columns"][3]["font"]["name"] = "SANSSERIF";
-			element["columns"][3]["font"]["style"] = font_style;
-		}
-		else
+		// Only add "playing" if we've got the name, less confusing. JC
+		if (item && gesture->mPlaying)
 		{
-			element["columns"][0]["column"] = "trigger";
-			element["columns"][0]["value"] = "";
-			element["columns"][0]["font"]["name"] = "SANSSERIF";
-			element["columns"][0]["font"]["style"] = font_style;
-			element["columns"][0]["column"] = "trigger";
-			element["columns"][0]["value"] = "---";
-			element["columns"][0]["font"]["name"] = "SANSSERIF";
-			element["columns"][0]["font"]["style"] = font_style;
-			element["columns"][2]["column"] = "key";
-			element["columns"][2]["value"] = "~~~";
-			element["columns"][2]["font"]["name"] = "SANSSERIF";
-			element["columns"][2]["font"]["style"] = font_style;
-			element["columns"][3]["column"] = "name";
-			element["columns"][3]["value"] = item_name;
-			element["columns"][3]["font"]["name"] = "SANSSERIF";
-			element["columns"][3]["font"]["style"] = font_style;
+			item_name += " " + getString("playing");
 		}
-		list->addElement(element, ADD_BOTTOM);
+		element["columns"][3]["column"] = "name";
+		element["columns"][3]["value"] = item_name;
+		element["columns"][3]["font"]["name"] = "SANSSERIF";
+		element["columns"][3]["font"]["style"] = font_style;
 	}
-	
-	scroll->setScrollPos(current_scroll_pos);
+	else
+	{
+		element["columns"][0]["column"] = "trigger";
+		element["columns"][0]["value"] = "";
+		element["columns"][0]["font"]["name"] = "SANSSERIF";
+		element["columns"][0]["font"]["style"] = font_style;
+		element["columns"][0]["column"] = "trigger";
+		element["columns"][0]["value"] = "---";
+		element["columns"][0]["font"]["name"] = "SANSSERIF";
+		element["columns"][0]["font"]["style"] = font_style;
+		element["columns"][2]["column"] = "key";
+		element["columns"][2]["value"] = "~~~";
+		element["columns"][2]["font"]["name"] = "SANSSERIF";
+		element["columns"][2]["font"]["style"] = font_style;
+		element["columns"][3]["column"] = "name";
+		element["columns"][3]["value"] = item_name;
+		element["columns"][3]["font"]["name"] = "SANSSERIF";
+		element["columns"][3]["font"]["style"] = font_style;
+	}
+	list->addElement(element, ADD_BOTTOM);
 }
 
 void LLFloaterGesture::onClickInventory()
@@ -284,14 +361,21 @@ void LLFloaterGesture::onClickPlay()
 	LLCtrlListInterface *list = childGetListInterface("gesture_list");
 	if (!list) return;
 	const LLUUID& item_id = list->getCurrentID();
+	if(item_id.isNull()) return;
 
-	if (LLGestureManager::instance().isGesturePlaying(item_id))
+	LL_DEBUGS("Gesture")<<" Trying to play gesture id: "<< item_id <<LL_ENDL;
+	if(!LLGestureManager::instance().isGestureActive(item_id))
 	{
-		LLGestureManager::instance().stopGesture(item_id);
+		// we need to inform server about gesture activating to be consistent with LLPreviewGesture.
+		BOOL inform_server = TRUE;
+		BOOL deactivate_similar = FALSE;
+		LLGestureManager::instance().activateGestureWithAsset(item_id, gInventory.getItem(item_id)->getAssetUUID(), inform_server, deactivate_similar);
+		LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
+		LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
 	}
 	else
 	{
-		LLGestureManager::instance().playGesture(item_id);
+		playGesture(item_id);
 	}
 }
 
@@ -345,3 +429,14 @@ void LLFloaterGesture::onCommitList()
 		childSetVisible("stop_btn", false);
 	}
 }
+void LLFloaterGesture::playGesture(LLUUID item_id)
+{
+	if (LLGestureManager::instance().isGesturePlaying(item_id))
+	{
+		LLGestureManager::instance().stopGesture(item_id);
+	}
+	else
+	{
+		LLGestureManager::instance().playGesture(item_id);
+	}
+}
diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h
index 9c1ab27cb0c7389491cb6027fa95a23db61bb4b6..e7819d2a032323f429079b1a61b3d85f3bb795f7 100644
--- a/indra/newview/llfloatergesture.h
+++ b/indra/newview/llfloatergesture.h
@@ -38,7 +38,8 @@
 #define LL_LLFLOATERGESTURE_H
 
 #include "llfloater.h"
-
+#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
 #include "lldarray.h"
 
 class LLScrollContainer;
@@ -51,31 +52,35 @@ class LLGestureOptions;
 class LLScrollListCtrl;
 class LLFloaterGestureObserver;
 class LLFloaterGestureInventoryObserver;
+class LLMultiGesture;
 
 class LLFloaterGesture
-:	public LLFloater
+:	public LLFloater, LLInventoryFetchDescendentsObserver
 {
+	LOG_CLASS(LLFloaterGesture);
 public:
 	LLFloaterGesture(const LLSD& key);
 	virtual ~LLFloaterGesture();
 
 	virtual BOOL postBuild();
-
+	virtual void done ();
 	void refreshAll();
 
 protected:
 	// Reads from the gesture manager's list of active gestures
 	// and puts them in this list.
 	void buildGestureList();
-
+	void addGesture(const LLUUID& item_id, LLMultiGesture* gesture, LLCtrlListInterface * list);
 	void onClickInventory();
 	void onClickEdit();
 	void onClickPlay();
 	void onClickNew();
 	void onCommitList();
+	void playGesture(LLUUID item_id);
 
 protected:
 	LLUUID mSelectedID;
+	LLUUID mGestureFolderID;
 
 	LLFloaterGestureObserver* mObserver;
 };
diff --git a/indra/newview/llfloatertestinspectors.cpp b/indra/newview/llfloatertestinspectors.cpp
index 8af011c17a9a582f80d17ee6b16c2c6a49833d83..09996b0b92cd5271fd5d8a84fb29f63bc7899a0f 100644
--- a/indra/newview/llfloatertestinspectors.cpp
+++ b/indra/newview/llfloatertestinspectors.cpp
@@ -53,6 +53,9 @@ LLFloaterTestInspectors::~LLFloaterTestInspectors()
 
 BOOL LLFloaterTestInspectors::postBuild()
 {
+	// Test the dummy widget construction code
+	getChild<LLUICtrl>("intentionally-not-found")->setEnabled(true);
+
 //	getChild<LLUICtrl>("avatar_2d_btn")->setCommitCallback(
 //		boost::bind(&LLFloaterTestInspectors::onClickAvatar2D, this));
 	getChild<LLUICtrl>("avatar_3d_btn")->setCommitCallback(
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 102651f43201a42eb55647d5cd1d7bcb4f4f298a..d39a17ca3b2b8ec8162641393aa4ddb52eff4d20 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -387,7 +387,9 @@ BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* roo
 // makes sure that this view and it's children are the right size.
 S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
 {
-	mIndentation = mParentFolder ? mParentFolder->getIndentation() + LEFT_INDENTATION : 0;
+	mIndentation = getParentFolder() && getParentFolder()->getParentFolder() 
+		? mParentFolder->getIndentation() + LEFT_INDENTATION 
+		: 0;
 	if (mLabelWidthDirty)
 	{
 		mLabelWidth = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + getLabelFontForStyle(mLabelStyle)->getWidth(mSearchableLabel); 
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 62a4b9a18756e40aae08e8bf26333d548be6c2cd..7c429fc76ef7cccf2ad3f2ace9b77c9cf7a3dc2c 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -110,7 +110,7 @@ class LLFolderViewItem : public LLView
 
 	// layout constants
 	static const S32 LEFT_PAD = 5;
-	static const S32 LEFT_INDENTATION = 13;
+	static const S32 LEFT_INDENTATION = 8;
 	static const S32 ICON_PAD = 2;
 	static const S32 ICON_WIDTH = 16;
 	static const S32 TEXT_PAD = 1;
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index 1ff2566dca235c17fff0b3b7fb726ee0ab60dafd..23d9436fa610d39f4116a4816400e845e671928b 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -33,6 +33,7 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "llinventory.h"
+#include "llinventoryobserver.h"
 #include "lltrans.h"
 
 #include "llfriendcard.h"
@@ -91,44 +92,39 @@ const LLUUID& get_folder_uuid(const LLUUID& parentFolderUUID, LLInventoryCollect
 	return LLUUID::null;
 }
 
-
-// LLViewerInventoryCategory::fetchDescendents has it own period of fetching.
-// for now it is FETCH_TIMER_EXPIRY = 10.0f; So made our period a bit more.
-const F32 FETCH_FRIENDS_DESCENDENTS_PERIOD = 11.0f;
-
-
 /**
- * Intended to call passed callback after the specified period of time.
+ * Class for fetching initial friend cards data
  *
- * Implemented to fix an issue when Inventory folders are in incomplete state. See EXT-2061, EXT-1935, EXT-813.
- * For now it uses to periodically sync Inventory Friends/All folder with a Agent's Friends List
- * until it is complete.
- */ 
-class FriendListUpdater : public LLEventTimer
+ * Implemented to fix an issue when Inventory folders are in incomplete state.
+ * See EXT-2320, EXT-2061, EXT-1935, EXT-813.
+ * Uses a callback to sync Inventory Friends/All folder with agent's Friends List.
+ */
+class LLInitialFriendCardsFetch : public LLInventoryFetchDescendentsObserver
 {
 public:
-	typedef boost::function<bool()> callback_t;
+	typedef boost::function<void()> callback_t;
 
-	FriendListUpdater(callback_t cb, F32 period)
-		:	LLEventTimer(period)
-		,	mCallback(cb)
-	{
-		mEventTimer.start();
-	}
+	LLInitialFriendCardsFetch(callback_t cb)
+		:	mCheckFolderCallback(cb)	{}
 
-	virtual BOOL tick() // from LLEventTimer
-	{
-		return mCallback();
-	}
+	/* virtual */ void done();
 
 private:
-	callback_t		mCallback;
+	callback_t		mCheckFolderCallback;
 };
 
+void LLInitialFriendCardsFetch::done()
+{
+	// This observer is no longer needed.
+	gInventory.removeObserver(this);
+
+	mCheckFolderCallback();
+
+	delete this;
+}
 
 // LLFriendCardsManager Constructor / Destructor
 LLFriendCardsManager::LLFriendCardsManager()
-: mFriendsAllFolderCompleted(true)
 {
 	LLAvatarTracker::instance().addObserver(this);
 }
@@ -167,30 +163,6 @@ const LLUUID LLFriendCardsManager::extractAvatarID(const LLUUID& avatarID)
 	return rv;
 }
 
-// be sure LLInventoryModel::buildParentChildMap() has been called before it.
-// and this method must be called before any actions with friend list
-void LLFriendCardsManager::ensureFriendFoldersExist()
-{
-	const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
-
-	LLUUID friendFolderUUID = findFriendFolderUUIDImpl();
-
-	if (friendFolderUUID.isNull())
-	{
-		friendFolderUUID = gInventory.createNewCategory(callingCardsFolderID,
-			LLFolderType::FT_CALLINGCARD, get_friend_folder_name());
-	}
-
-	LLUUID friendAllSubfolderUUID = findFriendAllSubfolderUUIDImpl();
-
-	if (friendAllSubfolderUUID.isNull())
-	{
-		friendAllSubfolderUUID = gInventory.createNewCategory(friendFolderUUID,
-			LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
-	}
-}
-
-
 bool LLFriendCardsManager::isItemInAnyFriendsList(const LLViewerInventoryItem* item)
 {
 	if (item->getType() != LLAssetType::AT_CALLINGCARD)
@@ -305,63 +277,12 @@ bool LLFriendCardsManager::isAnyFriendCategory(const LLUUID& catID) const
 	return TRUE == gInventory.isObjectDescendentOf(catID, friendFolderID);
 }
 
-bool LLFriendCardsManager::syncFriendsFolder()
+void LLFriendCardsManager::syncFriendCardsFolders()
 {
-	//lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" if they are absent
-	LLFriendCardsManager::instance().ensureFriendFoldersExist();
-
-	LLAvatarTracker::buddy_map_t all_buddies;
-	LLAvatarTracker::instance().copyBuddyList(all_buddies);
-
-	// 1. Remove Friend Cards for non-friends
-	LLInventoryModel::cat_array_t cats;
-	LLInventoryModel::item_array_t items;
-
-	gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
-	
-	LLInventoryModel::item_array_t::const_iterator it;
-	for (it = items.begin(); it != items.end(); ++it)
-	{
-		lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl;
-		if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID()))
-		{
-			lldebugs << "NONEXISTS, so remove it" << llendl;
-			removeFriendCardFromInventory((*it)->getCreatorUUID());
-		}
-	}
-
-	// 2. Add missing Friend Cards for friends
-	LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
-	llinfos << "try to build friends, count: " << all_buddies.size() << llendl; 
-	mFriendsAllFolderCompleted = true;
-	for(; buddy_it != all_buddies.end(); ++buddy_it)
-	{
-		const LLUUID& buddy_id = (*buddy_it).first;
-		addFriendCardToInventory(buddy_id);
-	}
-
-	if (!mFriendsAllFolderCompleted)
-	{
-		forceFriendListIsLoaded(findFriendAllSubfolderUUIDImpl());
-
-		static bool timer_started = false;
-		if (!timer_started)
-		{
-			lldebugs << "Create and start timer to sync Inventory Friends All folder with Friends list" << llendl;
-
-			// do not worry about destruction of the FriendListUpdater. 
-			// It will be deleted by LLEventTimer::updateClass when FriendListUpdater::tick() returns true.
-			new FriendListUpdater(boost::bind(&LLFriendCardsManager::syncFriendsFolder, this),
-				FETCH_FRIENDS_DESCENDENTS_PERIOD);
-		}
-		timer_started = true;
-	}
-	else
-	{
-		lldebugs << "Friends/All Inventory folder is synchronized with the Agent's Friends List" << llendl;
-	}
+	const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
 
-	return mFriendsAllFolderCompleted;
+	fetchAndCheckFolderDescendents(callingCardsFolderID,
+			boost::bind(&LLFriendCardsManager::ensureFriendsFolderExists, this));
 }
 
 void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const
@@ -482,6 +403,122 @@ void LLFriendCardsManager::findMatchedFriendCards(const LLUUID& avatarID, LLInve
 	}
 }
 
+void LLFriendCardsManager::fetchAndCheckFolderDescendents(const LLUUID& folder_id,  callback_t cb)
+{
+	// This instance will be deleted in LLInitialFriendCardsFetch::done().
+	LLInitialFriendCardsFetch* fetch = new LLInitialFriendCardsFetch(cb);
+
+	LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+	folders.push_back(folder_id);
+
+	fetch->fetchDescendents(folders);
+	if(fetch->isEverythingComplete())
+	{
+		// everything is already here - call done.
+		fetch->done();
+	}
+	else
+	{
+		// it's all on it's way - add an observer, and the inventory
+		// will call done for us when everything is here.
+		gInventory.addObserver(fetch);
+	}
+}
+
+// Make sure LLInventoryModel::buildParentChildMap() has been called before it.
+// This method must be called before any actions with friends list.
+void LLFriendCardsManager::ensureFriendsFolderExists()
+{
+	const LLUUID calling_cards_folder_ID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
+
+	// If "Friends" folder exists in "Calling Cards" we should check if "All" sub-folder
+	// exists in "Friends", otherwise we create it.
+	LLUUID friends_folder_ID = findFriendFolderUUIDImpl();
+	if (friends_folder_ID.notNull())
+	{
+		fetchAndCheckFolderDescendents(friends_folder_ID,
+				boost::bind(&LLFriendCardsManager::ensureFriendsAllFolderExists, this));
+	}
+	else
+	{
+		if (!gInventory.isCategoryComplete(calling_cards_folder_ID))
+		{
+			LLViewerInventoryCategory* cat = gInventory.getCategory(calling_cards_folder_ID);
+			std::string cat_name = cat ? cat->getName() : "unknown";
+			llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl;
+		}
+
+		friends_folder_ID = gInventory.createNewCategory(calling_cards_folder_ID,
+			LLFolderType::FT_CALLINGCARD, get_friend_folder_name());
+
+		gInventory.createNewCategory(friends_folder_ID,
+			LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
+
+		// Now when we have all needed folders we can sync their contents with buddies list.
+		syncFriendsFolder();
+	}
+}
+
+// Make sure LLFriendCardsManager::ensureFriendsFolderExists() has been called before it.
+void LLFriendCardsManager::ensureFriendsAllFolderExists()
+{
+	LLUUID friends_all_folder_ID = findFriendAllSubfolderUUIDImpl();
+	if (friends_all_folder_ID.notNull())
+	{
+		fetchAndCheckFolderDescendents(friends_all_folder_ID,
+				boost::bind(&LLFriendCardsManager::syncFriendsFolder, this));
+	}
+	else
+	{
+		LLUUID friends_folder_ID = findFriendFolderUUIDImpl();
+
+		if (!gInventory.isCategoryComplete(friends_folder_ID))
+		{
+			LLViewerInventoryCategory* cat = gInventory.getCategory(friends_folder_ID);
+			std::string cat_name = cat ? cat->getName() : "unknown";
+			llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl;
+		}
+
+		friends_all_folder_ID = gInventory.createNewCategory(friends_folder_ID,
+			LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
+
+		// Now when we have all needed folders we can sync their contents with buddies list.
+		syncFriendsFolder();
+	}
+}
+
+void LLFriendCardsManager::syncFriendsFolder()
+{
+	LLAvatarTracker::buddy_map_t all_buddies;
+	LLAvatarTracker::instance().copyBuddyList(all_buddies);
+
+	// 1. Remove Friend Cards for non-friends
+	LLInventoryModel::cat_array_t cats;
+	LLInventoryModel::item_array_t items;
+
+	gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
+
+	LLInventoryModel::item_array_t::const_iterator it;
+	for (it = items.begin(); it != items.end(); ++it)
+	{
+		lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl;
+		if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID()))
+		{
+			lldebugs << "NONEXISTS, so remove it" << llendl;
+			removeFriendCardFromInventory((*it)->getCreatorUUID());
+		}
+	}
+
+	// 2. Add missing Friend Cards for friends
+	LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
+	llinfos << "try to build friends, count: " << all_buddies.size() << llendl;
+	for(; buddy_it != all_buddies.end(); ++buddy_it)
+	{
+		const LLUUID& buddy_id = (*buddy_it).first;
+		addFriendCardToInventory(buddy_id);
+	}
+}
+
 class CreateFriendCardCallback : public LLInventoryCallback
 {
 public:
@@ -494,9 +531,8 @@ class CreateFriendCardCallback : public LLInventoryCallback
 	}
 };
 
-bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
+void LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
 {
-	LLInventoryModel* invModel = &gInventory;
 
 	bool shouldBeAdded = true;
 	std::string name;
@@ -518,13 +554,6 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
 		lldebugs << "is found in sentRequests: " << name << llendl; 
 	}
 
-	LLUUID friendListFolderID = findFriendAllSubfolderUUIDImpl();
-	if (friendListFolderID.notNull() && shouldBeAdded && !invModel->isCategoryComplete(friendListFolderID))
-	{
-		mFriendsAllFolderCompleted = false;
-		shouldBeAdded = false;
-		lldebugs << "Friends/All category is not completed" << llendl; 
-	}
 	if (shouldBeAdded)
 	{
 		putAvatarData(avatarID);
@@ -533,10 +562,8 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
 		// TODO: mantipov: Is CreateFriendCardCallback really needed? Probably not
 		LLPointer<LLInventoryCallback> cb = new CreateFriendCardCallback();
 
-		create_inventory_callingcard(avatarID, friendListFolderID, cb);
+		create_inventory_callingcard(avatarID, findFriendAllSubfolderUUIDImpl(), cb);
 	}
-
-	return shouldBeAdded;
 }
 
 void LLFriendCardsManager::removeFriendCardFromInventory(const LLUUID& avatarID)
@@ -582,11 +609,4 @@ void LLFriendCardsManager::onFriendListUpdate(U32 changed_mask)
 	}
 }
 
-void LLFriendCardsManager::forceFriendListIsLoaded(const LLUUID& folder_id) const
-{
-	bool fetching_inventory = gInventory.fetchDescendentsOf(folder_id);
-	lldebugs << "Trying to fetch descendants of Friends/All Inventory folder, fetched: "
-		<< fetching_inventory << llendl;
-}
-
 // EOF
diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h
index feea05bc1dcc8cc3df219590686a48c344d2aee4..98dc3153d0de47d2efae46e146a6f46754de1800 100644
--- a/indra/newview/llfriendcard.h
+++ b/indra/newview/llfriendcard.h
@@ -57,14 +57,6 @@ class LLFriendCardsManager
 		onFriendListUpdate(mask);
 	}
 
-	/**
-	 *	Ensures that all necessary folders are created in Inventory.
-	 * 
-	 *	For now it processes Calling Card, Calling Card/Friends & Calling Card/Friends/All folders
-	 */
-	void ensureFriendFoldersExist();
-
-
 	/**
 	 *	Determines if specified Inventory Calling Card exists in any of lists 
 	 *	in the Calling Card/Friends/ folder (Default, or Custom)
@@ -88,11 +80,10 @@ class LLFriendCardsManager
 	bool isAnyFriendCategory(const LLUUID& catID) const;
 
 	/**
-	 *	Synchronizes content of the Calling Card/Friends/All Global Inventory folder with Agent's Friend List
-	 *
-	 *	@return true - if folder is already synchronized, false otherwise.
+	 *	Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" category
+	 *	(creates them otherwise) and fetches their contents to synchronize with Agent's Friends List.
 	 */
-	bool syncFriendsFolder();
+	void syncFriendCardsFolders();
 
 	/*!
 	 * \brief
@@ -108,6 +99,8 @@ class LLFriendCardsManager
 	void collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const;
 
 private:
+	typedef boost::function<void()> callback_t;
+
 	LLFriendCardsManager();
 	~LLFriendCardsManager();
 
@@ -133,10 +126,29 @@ class LLFriendCardsManager
 	const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID);
 	void findMatchedFriendCards(const LLUUID& avatarID, LLInventoryModel::item_array_t& items) const;
 
+	void fetchAndCheckFolderDescendents(const LLUUID& folder_id, callback_t cb);
+
+	/**
+	 *	Checks whether "Calling Cards/Friends" folder exists. If not, creates it with "All"
+	 *	sub-folder and synchronizes its contents with buddies list.
+	 */
+	void ensureFriendsFolderExists();
+
+	/**
+	 *	Checks whether "Calling Cards/Friends/All" folder exists. If not, creates it and
+	 *	synchronizes its contents with buddies list.
+	 */
+	void ensureFriendsAllFolderExists();
+
+	/**
+	 *	Synchronizes content of the Calling Card/Friends/All Global Inventory folder with Agent's Friend List
+	 */
+	void syncFriendsFolder();
+
 	/**
 	 *	Adds avatar specified by its UUID into the Calling Card/Friends/All Global Inventory folder
 	 */
-	bool addFriendCardToInventory(const LLUUID& avatarID);
+	void addFriendCardToInventory(const LLUUID& avatarID);
 
 	/**
 	 *	Removes an avatar specified by its UUID from the Calling Card/Friends/All Global Inventory folder
@@ -146,20 +158,11 @@ class LLFriendCardsManager
 
 	void onFriendListUpdate(U32 changed_mask);
 
-	/**
-	 * Force fetching of the Inventory folder specified by passed folder's LLUUID.
-	 *
-	 * It only sends request to server, server reply should be processed in other place.
-	 * Because request can be sent via UDP we need to periodically check if request was completed with success.
-	 */
-	void forceFriendListIsLoaded(const LLUUID& folder_id) const;
-
 
 private:
 	typedef std::set<LLUUID> avatar_uuid_set_t;
 
 	avatar_uuid_set_t mBuddyIDSet;
-	bool mFriendsAllFolderCompleted;
 };
 
 #endif // LL_LLFRIENDCARD_H
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 59274c8638cff9b395f1a8d1b0f2f981015f393a..8e774dc199bb591b3120e28660168627aec95530 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -37,7 +37,6 @@
 // system
 #include <functional>
 #include <algorithm>
-#include <boost/tokenizer.hpp>
 
 // library
 #include "lldatapacker.h"
@@ -206,6 +205,9 @@ struct LLLoadInfo
 
 // If inform_server is true, will send a message upstream to update
 // the user_gesture_active table.
+/**
+ * It will load a gesture from remote storage
+ */
 void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id,
 												const LLUUID& asset_id,
 												BOOL inform_server,
@@ -921,8 +923,8 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
 
 	delete info;
 	info = NULL;
-
-	LLGestureManager::instance().mLoadingCount--;
+	LLGestureManager& self = LLGestureManager::instance();
+	self.mLoadingCount--;
 
 	if (0 == status)
 	{
@@ -944,15 +946,15 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
 		{
 			if (deactivate_similar)
 			{
-				LLGestureManager::instance().deactivateSimilarGestures(gesture, item_id);
+				self.deactivateSimilarGestures(gesture, item_id);
 
 				// Display deactivation message if this was the last of the bunch.
-				if (LLGestureManager::instance().mLoadingCount == 0
-					&& LLGestureManager::instance().mDeactivateSimilarNames.length() > 0)
+				if (self.mLoadingCount == 0
+					&& self.mDeactivateSimilarNames.length() > 0)
 				{
 					// we're done with this set of deactivations
 					LLSD args;
-					args["NAMES"] = LLGestureManager::instance().mDeactivateSimilarNames;
+					args["NAMES"] = self.mDeactivateSimilarNames;
 					LLNotifications::instance().add("DeactivatedGesturesTrigger", args);
 				}
 			}
@@ -965,9 +967,9 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
 			else
 			{
 				// Watch this item and set gesture name when item exists in inventory
-				LLGestureManager::instance().watchItem(item_id);
+				self.watchItem(item_id);
 			}
-			LLGestureManager::instance().mActive[item_id] = gesture;
+			self.mActive[item_id] = gesture;
 
 			// Everything has been successful.  Add to the active list.
 			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
@@ -989,14 +991,21 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
 
 				gAgent.sendReliableMessage();
 			}
+			callback_map_t::iterator i_cb = self.mCallbackMap.find(item_id);
+			
+			if(i_cb != self.mCallbackMap.end())
+			{
+				i_cb->second(gesture);
+				self.mCallbackMap.erase(i_cb);
+			}
 
-			LLGestureManager::instance().notifyObservers();
+			self.notifyObservers();
 		}
 		else
 		{
 			llwarns << "Unable to load gesture" << llendl;
 
-			LLGestureManager::instance().mActive.erase(item_id);
+			self.mActive.erase(item_id);
 			
 			delete gesture;
 			gesture = NULL;
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index c8b26f7309c62462c8eefb0720d34b4887afaf7a..094ca1379843e4a9f6e258c5e46860cb5dcd5f8e 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -57,6 +57,12 @@ class LLGestureManagerObserver
 class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryCompletionObserver
 {
 public:
+
+	typedef boost::function<void (LLMultiGesture* loaded_gesture)> gesture_loaded_callback_t;
+	// Maps inventory item_id to gesture
+	typedef std::map<LLUUID, LLMultiGesture*> item_map_t;
+	typedef std::map<LLUUID, gesture_loaded_callback_t> callback_map_t;
+
 	LLGestureManager();
 	~LLGestureManager();
 
@@ -97,6 +103,7 @@ class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventor
 
 	BOOL isGesturePlaying(const LLUUID& item_id);
 
+	const item_map_t& getActiveGestures() const { return mActive; }
 	// Force a gesture to be played, for example, if it is being
 	// previewed.
 	void playGesture(LLMultiGesture* gesture);
@@ -106,7 +113,15 @@ class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventor
 	// Also remove from playing list
 	void stopGesture(LLMultiGesture* gesture);
 	void stopGesture(const LLUUID& item_id);
-
+	/**
+	 * Add cb into callbackMap.
+	 * Note:
+	 * Manager will call cb after gesture will be loaded and will remove cb automatically. 
+	 */
+	void setGestureLoadedCallback(LLUUID inv_item_id, gesture_loaded_callback_t cb)
+	{
+		mCallbackMap[inv_item_id] = cb;
+	}
 	// Trigger the first gesture that matches this key.
 	// Returns TRUE if it finds a gesture bound to that key.
 	BOOL triggerGesture(KEY key, MASK mask);
@@ -144,13 +159,7 @@ class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventor
 						   LLAssetType::EType type,
 						   void* user_data, S32 status, LLExtStat ext_status);
 
-public:
-	BOOL mValid;
-	std::vector<LLMultiGesture*> mPlaying;
-
-	// Maps inventory item_id to gesture
-	typedef std::map<LLUUID, LLMultiGesture*> item_map_t;
-
+private:
 	// Active gestures.
 	// NOTE: The gesture pointer CAN BE NULL.  This means that
 	// there is a gesture with that item_id, but the asset data
@@ -159,8 +168,11 @@ class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventor
 
 	S32 mLoadingCount;
 	std::string mDeactivateSimilarNames;
-
+	
 	std::vector<LLGestureManagerObserver*> mObservers;
+	callback_map_t mCallbackMap;
+	std::vector<LLMultiGesture*> mPlaying;	
+	BOOL mValid;
 };
 
 #endif
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 54fc6f02fb08af4f0f0c5af812d03eb59bc99770..e3121fbc7a5c9d06fdb427e1020acd3dc337f0bf 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -120,11 +120,7 @@ void LLIMFloater::newIMCallback(const LLSD& data){
 		LLUUID session_id = data["session_id"].asUUID();
 
 		LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
-		if (floater == NULL)
-		{
-			llwarns << "new_im_callback for non-existent session_id " << session_id << llendl;
-			return;
-		}
+		if (floater == NULL) return;
 
         // update if visible, otherwise will be updated when opened
 		if (floater->getVisible())
@@ -211,6 +207,7 @@ BOOL LLIMFloater::postBuild()
 	}
 
 	mControlPanel->setSessionId(mSessionID);
+	mControlPanel->setVisible(gSavedSettings.getBOOL("IMShowControlPanel"));
 
 	LLButton* slide_left = getChild<LLButton>("slide_left_btn");
 	slide_left->setVisible(mControlPanel->getVisible());
@@ -356,8 +353,6 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 				LLDockControl::TOP,  boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));
 	}
 
-	floater->childSetVisible("panel_im_control_panel", gSavedSettings.getBOOL("IMShowControlPanel"));
-
 	return floater;
 }
 
@@ -463,7 +458,7 @@ void LLIMFloater::updateMessages()
 
 	if (messages.size())
 	{
-		LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor");
+//		LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor");
 
 		std::ostringstream message;
 		std::list<LLSD>::const_reverse_iterator iter = messages.rbegin();
@@ -476,32 +471,13 @@ void LLIMFloater::updateMessages()
 			LLUUID from_id = msg["from_id"].asUUID();
 			std::string from = from_id != gAgentID ? msg["from"].asString() : LLTrans::getString("You");
 			std::string message = msg["message"].asString();
-			LLStyle::Params style_params;
-			style_params.color(chat_color);
 
 			LLChat chat;
 			chat.mFromID = from_id;
 			chat.mFromName = from;
+			chat.mText = message;
 
-			//Handle IRC styled /me messages.
-			std::string prefix = message.substr(0, 4);
-			if (prefix == "/me " || prefix == "/me'")
-			{
-				if (from.size() > 0)
-				{
-					style_params.font.style = "ITALIC";
-					chat.mText = from + " ";
-					mChatHistory->appendWidgetMessage(chat, style_params);
-				}
-				message = message.substr(3);
-				style_params.font.style = "UNDERLINE";
-				mChatHistory->appendText(message, FALSE, style_params);
-			}
-			else
-			{
-				chat.mText = message;
-				mChatHistory->appendWidgetMessage(chat, style_params);
-			}
+			mChatHistory->appendWidgetMessage(chat);
 
 			mLastMessageIndex = msg["index"].asInteger();
 		}
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 0b8b5935f874000a0a7f1b3afc31979c830fa917..87b801d73b6b707ccf0f194a31591bbc67e26fd3 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -848,8 +848,11 @@ void LLFloaterIMPanel::processSessionUpdate(const LLSD& session_update)
 		}
 
 
-		//update the speakers dropdown too
-		mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
+		//update the speakers dropdown too, if it's available
+		if (mSpeakerPanel)
+		{
+			mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
+		}
 	}
 }
 
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index a94254e17ee478106c6f7925e470a6a0758bb48d..dc32291714bd626372b10fd2b8dd978a295a9183 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -441,11 +441,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
 	addToHistory(session_id, from, from_id, utf8_text);
 	if (log2file) logToFile(session_id, from, from_id, utf8_text);
 
-	//we do not count system messages and our messages
-	if (from_id.notNull() && from_id != gAgentID && SYSTEM_FROM != from)
-	{
-		session->mNumUnread++;
-	}
+	session->mNumUnread++;
 
 	// notify listeners
 	LLSD arg;
@@ -1128,13 +1124,9 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)
 
 	LLSD callee_id = mPayload["other_user_id"];
 	childSetTextArg("calling", "[CALLEE_NAME]", callee_name);
+	childSetTextArg("connecting", "[CALLEE_NAME]", callee_name);
 	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
 	icon->setValue(callee_id);
-
-	// dock the dialog to the sys well, where other sys messages appear
-	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
-					 this, getDockTongue(), LLDockControl::TOP,
-					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
 }
 
 
@@ -1159,6 +1151,11 @@ BOOL LLOutgoingCallDialog::postBuild()
 
 	childSetAction("Cancel", onCancel, this);
 
+	// dock the dialog to the sys well, where other sys messages appear
+	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+					 this, getDockTongue(), LLDockControl::TOP,
+					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
+
 	return success;
 }
 
@@ -1195,6 +1192,11 @@ BOOL LLIncomingCallDialog::postBuild()
 		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
+
 	LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");
 	caller_name_widget->setValue(caller_name + " " + call_type);
 	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
diff --git a/indra/newview/llinspectgroup.cpp b/indra/newview/llinspectgroup.cpp
index c78bcd6afe0b1886a30b08ebfe58f5fef97df99f..7fd7b69021c3b66db3e4e2844ee8fba9b27a6d92 100644
--- a/indra/newview/llinspectgroup.cpp
+++ b/indra/newview/llinspectgroup.cpp
@@ -216,7 +216,8 @@ void LLInspectGroup::requestUpdate()
 	getChild<LLUICtrl>("group_details")->setValue("");
 	getChild<LLUICtrl>("group_cost")->setValue("");
 	// Must have a visible button so the inspector can take focus
-	getChild<LLUICtrl>("leave_btn")->setVisible(true);
+	getChild<LLUICtrl>("view_profile_btn")->setVisible(true);
+	getChild<LLUICtrl>("leave_btn")->setVisible(false);
 	getChild<LLUICtrl>("join_btn")->setVisible(false);
 	
 	// Make a new request for properties
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index dc704f2b82c76c8ef07bf98b15cda0f224add52a..129178e42e844234593926ee264f5c6811d1dfac 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -114,6 +114,7 @@ BOOL LLInventoryPanel::postBuild()
 		p.name = getName();
 		p.rect = folder_rect;
 		p.parent_panel = this;
+		p.tool_tip = p.name;
 		mFolders = LLUICtrlFactory::create<LLFolderView>(p);
 		mFolders->setAllowMultiSelect(mAllowMultiSelect);
 	}
@@ -455,6 +456,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
 					p.icon = new_listener->getIcon();
 					p.root = mFolders;
 					p.listener = new_listener;
+					p.tool_tip = p.name;
 					LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p);
 				
 					folderp->setItemSortOrder(mFolders->getSortOrder());
@@ -481,6 +483,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
 					params.root(mFolders);
 					params.listener(new_listener);
 					params.rect(LLRect (0, 0, 0, 0));
+					params.tool_tip = params.name;
 					itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
 				}
 			}
diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp
index bd6702a0b2f6f9dabafca900cf460caf658fdb9d..d7eaad94f017a8524d935b4f49d9e2ea8d0aa8a1 100644
--- a/indra/newview/lljoystickbutton.cpp
+++ b/indra/newview/lljoystickbutton.cpp
@@ -134,16 +134,31 @@ void LLJoystick::updateSlop()
 	return;
 }
 
+BOOL LLJoystick::pointInCircle(S32 x, S32 y) const 
+{ 
+	//cnt is x and y coordinates of center of joystick circle, and also its radius,
+	//because area is not just rectangular, it's a square!
+	//Make sure to change method if this changes.
+	int cnt = this->getLocalRect().mTop/2;
+	if((x-cnt)*(x-cnt)+(y-cnt)*(y-cnt)<=cnt*cnt)
+		return TRUE;
+	return FALSE;
+}
 
 BOOL LLJoystick::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	//llinfos << "joystick mouse down " << x << ", " << y << llendl;
+	bool handles = false;
 
-	mLastMouse.set(x, y);
-	mFirstMouse.set(x, y);
+	if(handles = pointInCircle(x, y))
+	{
+		mLastMouse.set(x, y);
+		mFirstMouse.set(x, y);
+		mMouseDownTimer.reset();
+		handles = LLButton::handleMouseDown(x, y, mask);
+	}
 
-	mMouseDownTimer.reset();
-	return LLButton::handleMouseDown(x, y, mask);
+	return handles;
 }
 
 
diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h
index 4c657913b8c3a6fadc782182b3f43fcaec7f3643..0465f78031fdd8d6f5c081aef1ffd2788d3ce852 100644
--- a/indra/newview/lljoystickbutton.h
+++ b/indra/newview/lljoystickbutton.h
@@ -78,6 +78,8 @@ class LLJoystick
 
 	static void		onBtnHeldDown(void *userdata);		// called by llbutton callback handler
 	void            setInitialQuadrant(EJoystickQuadrant initial) { mInitialQuadrant = initial; };
+
+	BOOL			pointInCircle(S32 x, S32 y) const;
 	
 	static std::string nameFromQuadrant(const EJoystickQuadrant quadrant);
 	static EJoystickQuadrant quadrantFromName(const std::string& name);
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index a01426ea8794e46d5f6bccd1784a0a1f8718ed4a..955347bce2d27db40322126997fb8cdf11ee5755 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -73,9 +73,9 @@ LLLoginInstance::LLLoginInstance() :
 {
 	mLoginModule->getEventPump().listen("lllogininstance", 
 		boost::bind(&LLLoginInstance::handleLoginEvent, this, _1));
-	mDispatcher.add("fail.login", "", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));
-	mDispatcher.add("connect",    "", boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));
-	mDispatcher.add("disconnect", "", boost::bind(&LLLoginInstance::handleDisconnect, this, _1));
+	mDispatcher.add("fail.login", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));
+	mDispatcher.add("connect",    boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));
+	mDispatcher.add("disconnect", boost::bind(&LLLoginInstance::handleDisconnect, this, _1));
 }
 
 LLLoginInstance::~LLLoginInstance()
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index ac806d7106a7aaa01d4422d0dc16d357d99f8130..85db69174d9a97edace9e453bed0b1730eebd5b0 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -132,120 +132,31 @@ void    LLNearbyChat::applySavedVariables()
 	}
 }
 
-LLColor4 nearbychat_get_text_color(const LLChat& chat)
-{
-	LLColor4 text_color;
-
-	if(chat.mMuted)
-	{
-		text_color.setVec(0.8f, 0.8f, 0.8f, 1.f);
-	}
-	else
-	{
-		switch(chat.mSourceType)
-		{
-		case CHAT_SOURCE_SYSTEM:
-			text_color = LLUIColorTable::instance().getColor("SystemChatColor"); 
-			break;
-		case CHAT_SOURCE_AGENT:
-		    if (chat.mFromID.isNull())
-			{
-				text_color = LLUIColorTable::instance().getColor("SystemChatColor");
-			}
-			else
-			{
-				if(gAgentID == chat.mFromID)
-				{
-					text_color = LLUIColorTable::instance().getColor("UserChatColor");
-				}
-				else
-				{
-					text_color = LLUIColorTable::instance().getColor("AgentChatColor");
-				}
-			}
-			break;
-		case CHAT_SOURCE_OBJECT:
-			if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
-			{
-				text_color = LLUIColorTable::instance().getColor("ScriptErrorColor");
-			}
-			else if ( chat.mChatType == CHAT_TYPE_OWNER )
-			{
-				text_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
-			}
-			else
-			{
-				text_color = LLUIColorTable::instance().getColor("ObjectChatColor");
-			}
-			break;
-		default:
-			text_color.setToWhite();
-		}
-
-		if (!chat.mPosAgent.isExactlyZero())
-		{
-			LLVector3 pos_agent = gAgent.getPositionAgent();
-			F32 distance = dist_vec(pos_agent, chat.mPosAgent);
-			if (distance > gAgent.getNearChatRadius())
-			{
-				// diminish far-off chat
-				text_color.mV[VALPHA] = 0.8f;
-			}
-		}
-	}
-
-	return text_color;
-}
-
-void LLNearbyChat::add_timestamped_line(const LLChat& chat, const LLColor4& color)
-{
-	S32 font_size = gSavedSettings.getS32("ChatFontSize");
-
-	const LLFontGL* fontp = NULL;
-	switch(font_size)
-	{
-	case 0:
-		fontp = LLFontGL::getFontSansSerifSmall();
-		break;
-	default:
-	case 1:
-		fontp = LLFontGL::getFontSansSerif();
-		break;
-	case 2:
-		fontp = LLFontGL::getFontSansSerifBig();
-		break;
-	}
-
-	LLStyle::Params style_params;
-	style_params.color(color);
-	style_params.font(fontp);
-	LLUUID uuid = chat.mFromID;
-	std::string from = chat.mFromName;
-	std::string message = chat.mText;
-	mChatHistory->appendWidgetMessage(chat, style_params);
-}
-
 void	LLNearbyChat::addMessage(const LLChat& chat)
 {
-	LLColor4 color = nearbychat_get_text_color(chat);
-	
 	if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
 	{
 		if(gSavedSettings.getBOOL("ShowScriptErrors") == FALSE)
 			return;
 		if (gSavedSettings.getS32("ShowScriptErrorsLocation")== 1)// show error in window //("ScriptErrorsAsChat"))
 		{
+
+			LLColor4 txt_color;
+
+			LLViewerChat::getChatColor(chat,txt_color);
+			
 			LLFloaterScriptDebug::addScriptLine(chat.mText,
 												chat.mFromName, 
-												color, 
+												txt_color, 
 												chat.mFromID);
 			return;
 		}
 	}
 	
-	// could flash the chat button in the status bar here. JC
 	if (!chat.mMuted)
-		add_timestamped_line(chat, color);
+	{
+		mChatHistory->appendWidgetMessage(chat);
+	}
 }
 
 void LLNearbyChat::onNearbySpeakers()
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index cb4654654a952562b21b252153de284759ad3516..3303c388afe631b72ee2774848ac9557b3c7ebb5 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -35,7 +35,7 @@
 
 #include "lldockablefloater.h"
 #include "llscrollbar.h"
-#include "llchat.h"
+#include "llviewerchat.h"
 
 class LLResizeBar;
 class LLChatHistory;
@@ -47,8 +47,7 @@ class LLNearbyChat: public LLDockableFloater
 	~LLNearbyChat();
 
 	BOOL	postBuild			();
-	void	addMessage			(const LLChat& message);
-	
+	void	addMessage			(const LLChat& message);	
 	void	onNearbyChatContextMenuItemClicked(const LLSD& userdata);
 	bool	onNearbyChatCheckContextMenuItem(const LLSD& userdata);
 
@@ -64,7 +63,6 @@ class LLNearbyChat: public LLDockableFloater
 	void	getAllowedRect		(LLRect& rect);
 
 	void	onNearbySpeakers	();
-	void	add_timestamped_line(const LLChat& chat, const LLColor4& color);
 	
 
 private:
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 94b879114750249b064aff92b20fb31c31ab4491..333646d2c5e2b2cb45cb28ad179f057f28bdb9a6 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -97,9 +97,10 @@ void LLGestureComboBox::refreshGestures()
 	clearRows();
 	mGestures.clear();
 
-	LLGestureManager::item_map_t::iterator it;
+	LLGestureManager::item_map_t::const_iterator it;
+	const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
 	LLSD::Integer idx(0);
-	for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it)
+	for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
 	{
 		LLMultiGesture* gesture = (*it).second;
 		if (gesture)
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index e10c506f0866a3f4185d0d3de8c10a782f99108e..458845fff3fa54e8688a93786fba2b20c9cafc0c 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -63,8 +63,6 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase
 public:
 	LLNearbyChatScreenChannel(const LLUUID& id):LLScreenChannelBase(id) { mStopProcessing = false;};
 
-	void init				(S32 channel_left, S32 channel_right);
-
 	void addNotification	(LLSD& notification);
 	void arrangeToasts		();
 	void showToastsBottom	();
@@ -120,15 +118,6 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase
 	bool	mStopProcessing;
 };
 
-void LLNearbyChatScreenChannel::init(S32 channel_left, S32 channel_right)
-{
-	S32 channel_top = gViewerWindow->getWorldViewRectRaw().getHeight();
-	S32 channel_bottom = gViewerWindow->getWorldViewRectRaw().mBottom;
-	setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom));
-	setVisible(TRUE);
-}
-
-
 void	LLNearbyChatScreenChannel::createOverflowToast(S32 bottom, F32 timer)
 {
 	//we don't need overflow toast in nearby chat
@@ -223,7 +212,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
 
 void LLNearbyChatScreenChannel::arrangeToasts()
 {
-	if(m_active_toasts.size() == 0 || mIsHovering)
+	if(m_active_toasts.size() == 0 || isHovering())
 		return;
 
 	hideToastsFromScreen();
@@ -332,7 +321,8 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)
 	//only messages from AGENTS
 	if(CHAT_SOURCE_OBJECT == chat_msg.mSourceType)
 	{
-		return;//dn't show toast for messages from objects
+		if(chat_msg.mChatType == CHAT_TYPE_DEBUG_MSG)
+			return;//ok for now we don't skip messeges from object, so skip only debug messages
 	}
 
 	LLUUID id;
@@ -351,7 +341,14 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)
 		notification["time"] = chat_msg.mTime;
 		notification["source"] = (S32)chat_msg.mSourceType;
 		notification["chat_type"] = (S32)chat_msg.mChatType;
-
+		
+		std::string r_color_name = "White";
+		F32 r_color_alpha = 1.0f; 
+		LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha);
+		
+		notification["text_color"] = r_color_name;
+		notification["color_alpha"] = r_color_alpha;
+		notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
 		channel->addNotification(notification);	
 	}
 	
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 471dd284265f48c2e0bdfd7a8d6e5ba46012da77..94e733913d4acaf41f2965ea5dfbdfa947243d5e 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -96,11 +96,11 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
 		if (!LLIMMgr::instance().hasSession(session_id))
 		{
 			session_id = LLIMMgr::instance().addSession(
-					notification->getSubstitutions()["NAME"], IM_NOTHING_SPECIAL,
+					notification->getSubstitutions()["OBJECTFROMNAME"], IM_NOTHING_SPECIAL,
 					notification->getPayload()["from_id"]);
 		}
 		LLIMMgr::instance().addMessage(session_id, LLUUID(),
-				notification->getSubstitutions()["NAME"],
+				notification->getSubstitutions()["OBJECTFROMNAME"],
 				notification->getMessage());
 
 		LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 823c92a94e377f8813dd28868b8b7f86462d1f29..60a27d51544dff805a151b0d6f29eaf923915f82 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -91,6 +91,7 @@ bool LLTipHandler::processNotification(const LLSD& notify)
 		if(nearby_chat)
 		{
 			LLChat chat_msg(notification->getMessage());
+			chat_msg.mSourceType = CHAT_SOURCE_SYSTEM;
 			nearby_chat->addMessage(chat_msg);
 
 			// don't show toast if Nearby Chat is opened
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index b2e05ccead387c7ab884487a7b6d737f6a47a84a..00502341fcf8db20bb53df191f2e8bef80957997 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -176,10 +176,8 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
 
 	getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID);
 
-	// Fetch the currect name
-	gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4));
-
-	// Disable profile button if participant is not realy SL avatar
+	// Disable most profile buttons if the participant is
+	// not really an SL avatar (e.g., an Avaline caller).
 	LLIMModel::LLIMSession* im_session =
 		im_model.findIMSession(session_id);
 	if( im_session && !im_session->mOtherParticipantIsAvatar )
@@ -190,6 +188,13 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
 		childSetEnabled("share_btn", FALSE);
 		childSetEnabled("teleport_btn", FALSE);
 		childSetEnabled("pay_btn", FALSE);
+
+        getChild<LLTextBox>("avatar_name")->setValue(im_session->mName);
+	}
+	else
+	{
+		// If the participant is an avatar, fetch the currect name
+		gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4));
 	}
 }
 
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index 2cf56d557117d29d95b611d18c79a22d62be6a6c..ad8a379cc1dd66bd5cd88af833196518db2d285c 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -322,13 +322,19 @@ void LLPanelMediaSettingsGeneral::updateMediaPreview()
 {
 	if ( mHomeURL->getValue().asString().length() > 0 )
 	{
-		mPreviewMedia->navigateTo( mHomeURL->getValue().asString() );
+		if(mPreviewMedia->getCurrentNavUrl() != mHomeURL->getValue().asString())
+		{
+			mPreviewMedia->navigateTo( mHomeURL->getValue().asString() );
+		}
 	}
 	else
 	// new home URL will be empty if media is deleted so display a 
 	// "preview goes here" data url page
 	{
-		mPreviewMedia->navigateTo( CHECKERBOARD_DATA_URL );
+		if(mPreviewMedia->getCurrentNavUrl() != CHECKERBOARD_DATA_URL)
+		{
+			mPreviewMedia->navigateTo( CHECKERBOARD_DATA_URL );
+		}
 	};
 }
 
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index a5e9407a41f05b9cfcf81f9820ed5bbdd7811c70..b1fbf789c692cca7e49137231e65baa6de63dffd 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1570,6 +1570,7 @@ void LLPanelObjectInventory::reset()
 	p.name = "task inventory";
 	p.task_id = getTaskUUID();
 	p.parent_panel = this;
+	p.tool_tip= p.name;
 	mFolders = LLUICtrlFactory::create<LLFolderView>(p);
 	// this ensures that we never say "searching..." or "no items found"
 	mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
@@ -1711,6 +1712,7 @@ void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root
 		p.icon_open = LLUI::getUIImage("Inv_FolderOpen");
 		p.root = mFolders;
 		p.listener = bridge;
+		p.tool_tip = p.name;
 		new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p);
 		new_folder->addToFolder(mFolders, mFolders);
 		new_folder->toggleOpen();
@@ -1751,6 +1753,7 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento
 				p.icon_open = LLUI::getUIImage("Inv_FolderOpen");
 				p.root = mFolders;
 				p.listener = bridge;
+				p.tool_tip = p.name;
 				view = LLUICtrlFactory::create<LLFolderViewFolder>(p);
 				child_categories.put(new obj_folder_pair(obj,
 														 (LLFolderViewFolder*)view));
@@ -1764,6 +1767,7 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento
 				params.root(mFolders);
 				params.listener(bridge);
 				params.rect(LLRect());
+				params.tool_tip = params.name;
 				view = LLUICtrlFactory::create<LLFolderViewItem> (params);
 			}
 			view->addToFolder(folder, mFolders);
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 69edccf09fe21c940cfd830c8d4b28c4c756ff27..1f5ffb7335be46db1157767451ba47e62d174544 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -520,7 +520,6 @@ BOOL LLPanelPeople::postBuild()
 	LLPanel* groups_panel = getChild<LLPanel>(GROUP_TAB_NAME);
 	groups_panel->childSetAction("activate_btn", boost::bind(&LLPanelPeople::onActivateButtonClicked,	this));
 	groups_panel->childSetAction("plus_btn",	boost::bind(&LLPanelPeople::onGroupPlusButtonClicked,	this));
-	groups_panel->childSetAction("minus_btn",	boost::bind(&LLPanelPeople::onGroupMinusButtonClicked,	this));
 
 	LLPanel* friends_panel = getChild<LLPanel>(FRIENDS_TAB_NAME);
 	friends_panel->childSetAction("add_btn",	boost::bind(&LLPanelPeople::onAddFriendWizButtonClicked,	this));
@@ -569,6 +568,7 @@ BOOL LLPanelPeople::postBuild()
 	LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
 	
 	registrar.add("People.Group.Plus.Action",  boost::bind(&LLPanelPeople::onGroupPlusMenuItemClicked,  this, _2));
+	registrar.add("People.Group.Minus.Action", boost::bind(&LLPanelPeople::onGroupMinusButtonClicked,  this));
 	registrar.add("People.Friends.ViewSort.Action",  boost::bind(&LLPanelPeople::onFriendsViewSortMenuItemClicked,  this, _2));
 	registrar.add("People.Nearby.ViewSort.Action",  boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemClicked,  this, _2));
 	registrar.add("People.Groups.ViewSort.Action",  boost::bind(&LLPanelPeople::onGroupsViewSortMenuItemClicked,  this, _2));
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 24de2dcdfc58f763f9cc49b64eb5f9e8bcbef912..12ad070efd54abea3dc0ac4618258fd37d0dedeb 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -44,6 +44,7 @@
 #include "llbutton.h"
 #include "llface.h"
 #include "llcombobox.h"
+#include "lllayoutstack.h"
 #include "llslider.h"
 #include "llhudview.h"
 #include "lliconctrl.h"
@@ -84,8 +85,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mUpdateSlider(true),
 	mClearFaceOnFade(false),
 	mCurrentRate(0.0),
-	mMovieDuration(0.0),
-	mUpdatePercent(0)
+	mMovieDuration(0.0)
 {
 	mCommitCallbackRegistrar.add("MediaCtrl.Close",		boost::bind(&LLPanelPrimMediaControls::onClickClose, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Back",		boost::bind(&LLPanelPrimMediaControls::onClickBack, this));
@@ -117,37 +117,69 @@ LLPanelPrimMediaControls::~LLPanelPrimMediaControls()
 
 BOOL LLPanelPrimMediaControls::postBuild()
 {
-	LLButton* scroll_up_ctrl = getChild<LLButton>("scrollup");
-	if (scroll_up_ctrl)
+	mMediaRegion			= getChild<LLView>("media_region");
+	mBackCtrl				= getChild<LLUICtrl>("back");
+	mFwdCtrl				= getChild<LLUICtrl>("fwd");
+	mReloadCtrl				= getChild<LLUICtrl>("reload");
+	mPlayCtrl				= getChild<LLUICtrl>("play");
+	mPauseCtrl				= getChild<LLUICtrl>("pause");
+	mStopCtrl				= getChild<LLUICtrl>("stop");
+	mMediaStopCtrl			= getChild<LLUICtrl>("media_stop");
+	mHomeCtrl				= getChild<LLUICtrl>("home");
+	mUnzoomCtrl				= getChild<LLUICtrl>("close"); // This is actually "unzoom" 
+	mOpenCtrl				= getChild<LLUICtrl>("new_window");
+	mZoomCtrl				= getChild<LLUICtrl>("zoom_frame");
+	mMediaProgressPanel		= getChild<LLPanel>("media_progress_indicator");
+	mMediaProgressBar		= getChild<LLProgressBar>("media_progress_bar");
+	mMediaAddressCtrl		= getChild<LLUICtrl>("media_address");
+	mMediaAddress			= getChild<LLUICtrl>("media_address_url");
+	mMediaPlaySliderPanel	= getChild<LLUICtrl>("media_play_position");
+	mMediaPlaySliderCtrl	= getChild<LLUICtrl>("media_play_slider");
+	mVolumeCtrl				= getChild<LLUICtrl>("media_volume");
+	mVolumeBtn				= getChild<LLButton>("media_volume_button");
+	mVolumeUpCtrl			= getChild<LLUICtrl>("volume_up");
+	mVolumeDownCtrl			= getChild<LLUICtrl>("volume_down");
+	mWhitelistIcon			= getChild<LLIconCtrl>("media_whitelist_flag");
+	mSecureLockIcon			= getChild<LLIconCtrl>("media_secure_lock_flag");
+	mMediaControlsStack		= getChild<LLLayoutStack>("media_controls");
+	mLeftBookend			= getChild<LLUICtrl>("left_bookend");
+	mRightBookend			= getChild<LLUICtrl>("right_bookend");
+	mBackgroundImage		= LLUI::getUIImage(getString("control_background_image_name"));
+
+	// These are currently removed...but getChild creates a "dummy" widget.
+	// This class handles them missing.
+	mMediaPanelScroll		= findChild<LLUICtrl>("media_panel_scroll");
+	mScrollUpCtrl			= findChild<LLButton>("scrollup");
+	mScrollLeftCtrl			= findChild<LLButton>("scrollleft");
+	mScrollRightCtrl		= findChild<LLButton>("scrollright");
+	mScrollDownCtrl			= findChild<LLButton>("scrolldown");	
+	
+	if (mScrollUpCtrl)
 	{
-		scroll_up_ctrl->setClickedCallback(onScrollUp, this);
-		scroll_up_ctrl->setHeldDownCallback(onScrollUpHeld, this);
-		scroll_up_ctrl->setMouseUpCallback(onScrollStop, this);
+		mScrollUpCtrl->setClickedCallback(onScrollUp, this);
+		mScrollUpCtrl->setHeldDownCallback(onScrollUpHeld, this);
+		mScrollUpCtrl->setMouseUpCallback(onScrollStop, this);
 	}
-	LLButton* scroll_left_ctrl = getChild<LLButton>("scrollleft");
-	if (scroll_left_ctrl)
+	if (mScrollLeftCtrl)
 	{
-		scroll_left_ctrl->setClickedCallback(onScrollLeft, this);
-		scroll_left_ctrl->setHeldDownCallback(onScrollLeftHeld, this);
-		scroll_left_ctrl->setMouseUpCallback(onScrollStop, this);
+		mScrollLeftCtrl->setClickedCallback(onScrollLeft, this);
+		mScrollLeftCtrl->setHeldDownCallback(onScrollLeftHeld, this);
+		mScrollLeftCtrl->setMouseUpCallback(onScrollStop, this);
 	}
-	LLButton* scroll_right_ctrl = getChild<LLButton>("scrollright");
-	if (scroll_right_ctrl)
+	if (mScrollRightCtrl)
 	{
-		scroll_right_ctrl->setClickedCallback(onScrollRight, this);
-		scroll_right_ctrl->setHeldDownCallback(onScrollRightHeld, this);
-		scroll_right_ctrl->setMouseUpCallback(onScrollStop, this);
+		mScrollRightCtrl->setClickedCallback(onScrollRight, this);
+		mScrollRightCtrl->setHeldDownCallback(onScrollRightHeld, this);
+		mScrollRightCtrl->setMouseUpCallback(onScrollStop, this);
 	}
-	LLButton* scroll_down_ctrl = getChild<LLButton>("scrolldown");
-	if (scroll_down_ctrl)
+	if (mScrollDownCtrl)
 	{
-		scroll_down_ctrl->setClickedCallback(onScrollDown, this);
-		scroll_down_ctrl->setHeldDownCallback(onScrollDownHeld, this);
-		scroll_down_ctrl->setMouseUpCallback(onScrollStop, this);
+		mScrollDownCtrl->setClickedCallback(onScrollDown, this);
+		mScrollDownCtrl->setHeldDownCallback(onScrollDownHeld, this);
+		mScrollDownCtrl->setMouseUpCallback(onScrollStop, this);
 	}
 	
-	LLUICtrl* media_address	= getChild<LLUICtrl>("media_address");
-	media_address->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this ));
+	mMediaAddress->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this ));
 	mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout");
 	mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime");
 
@@ -261,90 +293,63 @@ void LLPanelPrimMediaControls::updateShape()
 		//
 		// Set the state of the buttons
 		//
-		LLUICtrl* back_ctrl					= getChild<LLUICtrl>("back");
-		LLUICtrl* fwd_ctrl					= getChild<LLUICtrl>("fwd");
-		LLUICtrl* reload_ctrl				= getChild<LLUICtrl>("reload");
-		LLUICtrl* play_ctrl					= getChild<LLUICtrl>("play");
-		LLUICtrl* pause_ctrl				= getChild<LLUICtrl>("pause");
-		LLUICtrl* stop_ctrl					= getChild<LLUICtrl>("stop");
-		LLUICtrl* media_stop_ctrl			= getChild<LLUICtrl>("media_stop");
-		LLUICtrl* home_ctrl					= getChild<LLUICtrl>("home");
-		LLUICtrl* unzoom_ctrl				= getChild<LLUICtrl>("close"); // This is actually "unzoom"
-		LLUICtrl* open_ctrl					= getChild<LLUICtrl>("new_window");
-        LLUICtrl* zoom_ctrl					= getChild<LLUICtrl>("zoom_frame");
-		LLPanel* media_loading_panel		= getChild<LLPanel>("media_progress_indicator");
-		LLUICtrl* media_address_ctrl		= getChild<LLUICtrl>("media_address");
-		LLUICtrl* media_play_slider_panel	= getChild<LLUICtrl>("media_play_position");
-		LLUICtrl* media_play_slider_ctrl	= getChild<LLUICtrl>("media_play_slider");
-		LLUICtrl* volume_ctrl				= getChild<LLUICtrl>("media_volume");
-		LLButton* volume_btn				= getChild<LLButton>("media_volume_button");
-		LLUICtrl* volume_up_ctrl			= getChild<LLUICtrl>("volume_up");
-		LLUICtrl* volume_down_ctrl			= getChild<LLUICtrl>("volume_down");
-		LLIconCtrl* whitelist_icon			= getChild<LLIconCtrl>("media_whitelist_flag");
-		LLIconCtrl* secure_lock_icon		= getChild<LLIconCtrl>("media_secure_lock_flag");
-		
-		LLUICtrl* media_panel_scroll		= getChild<LLUICtrl>("media_panel_scroll");
-		LLUICtrl* scroll_up_ctrl			= getChild<LLUICtrl>("scrollup");
-		LLUICtrl* scroll_left_ctrl			= getChild<LLUICtrl>("scrollleft");
-		LLUICtrl* scroll_right_ctrl			= getChild<LLUICtrl>("scrollright");
-		LLUICtrl* scroll_down_ctrl			= getChild<LLUICtrl>("scrolldown");		
 				
 		// XXX RSP: TODO: FIXME: clean this up so that it is clearer what mode we are in,
 		// and that only the proper controls get made visible/enabled according to that mode. 
-		back_ctrl->setVisible(has_focus);
-		fwd_ctrl->setVisible(has_focus);
-		reload_ctrl->setVisible(has_focus);
-		stop_ctrl->setVisible(false);
-		home_ctrl->setVisible(has_focus);
-		zoom_ctrl->setVisible(!is_zoomed);
-		unzoom_ctrl->setVisible(has_focus && is_zoomed);
-		open_ctrl->setVisible(true);
-		media_address_ctrl->setVisible(has_focus && !mini_controls);
-		media_play_slider_panel->setVisible(has_focus && !mini_controls);
-		volume_ctrl->setVisible(false);
-		volume_up_ctrl->setVisible(false);
-		volume_down_ctrl->setVisible(false);
+		mBackCtrl->setVisible(has_focus);
+		mFwdCtrl->setVisible(has_focus);
+		mReloadCtrl->setVisible(has_focus);
+		mStopCtrl->setVisible(false);
+		mHomeCtrl->setVisible(has_focus);
+		mZoomCtrl->setVisible(!is_zoomed);
+		mUnzoomCtrl->setVisible(has_focus && is_zoomed);
+		mOpenCtrl->setVisible(true);
+		mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
+		mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
+		mVolumeCtrl->setVisible(false);
+		mVolumeUpCtrl->setVisible(false);
+		mVolumeDownCtrl->setVisible(false);
 		
-		whitelist_icon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false);
+		mWhitelistIcon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false);
 		// Disable zoom if HUD
-		zoom_ctrl->setEnabled(!objectp->isHUDAttachment());
-		unzoom_ctrl->setEnabled(!objectp->isHUDAttachment());
-		secure_lock_icon->setVisible(false);
+		mZoomCtrl->setEnabled(!objectp->isHUDAttachment());
+		mUnzoomCtrl->setEnabled(!objectp->isHUDAttachment());
+		mSecureLockIcon->setVisible(false);
 		mCurrentURL = media_impl->getCurrentMediaURL();
 		
-		back_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate);
-		fwd_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate);
-		stop_ctrl->setEnabled(has_focus && can_navigate);
-		home_ctrl->setEnabled(has_focus && can_navigate);
+		mBackCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate);
+		mFwdCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate);
+		mStopCtrl->setEnabled(has_focus && can_navigate);
+		mHomeCtrl->setEnabled(has_focus && can_navigate);
 		LLPluginClassMediaOwner::EMediaStatus result = ((media_impl != NULL) && media_impl->hasMedia()) ? media_plugin->getStatus() : LLPluginClassMediaOwner::MEDIA_NONE;
 
 		if(media_plugin && media_plugin->pluginSupportsMediaTime())
 		{
-			reload_ctrl->setEnabled(FALSE);
-			reload_ctrl->setVisible(FALSE);
-			media_stop_ctrl->setVisible(has_focus);
-			home_ctrl->setVisible(FALSE);
-			back_ctrl->setEnabled(has_focus);
-			fwd_ctrl->setEnabled(has_focus);
-			media_address_ctrl->setVisible(false);
-			media_address_ctrl->setEnabled(false);
-			media_play_slider_panel->setVisible(has_focus && !mini_controls);
-			media_play_slider_panel->setEnabled(has_focus && !mini_controls);
+			mReloadCtrl->setEnabled(FALSE);
+			mReloadCtrl->setVisible(FALSE);
+			mMediaStopCtrl->setVisible(has_focus);
+			mHomeCtrl->setVisible(FALSE);
+			mBackCtrl->setEnabled(has_focus);
+			mFwdCtrl->setEnabled(has_focus);
+			mMediaAddressCtrl->setVisible(false);
+			mMediaAddressCtrl->setEnabled(false);
+			mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
+			mMediaPlaySliderPanel->setEnabled(has_focus && !mini_controls);
 				
-			volume_ctrl->setVisible(has_focus);
-			volume_up_ctrl->setVisible(has_focus);
-			volume_down_ctrl->setVisible(has_focus);
-			volume_ctrl->setEnabled(has_focus);
-
-			whitelist_icon->setVisible(false);
-			secure_lock_icon->setVisible(false);
-			if (media_panel_scroll)
+			mVolumeCtrl->setVisible(has_focus);
+			mVolumeUpCtrl->setVisible(has_focus);
+			mVolumeDownCtrl->setVisible(has_focus);
+			mVolumeCtrl->setEnabled(has_focus);
+
+			mWhitelistIcon->setVisible(false);
+			mSecureLockIcon->setVisible(false);
+			if (mMediaPanelScroll)
 			{
-				media_panel_scroll->setVisible(false);
-				scroll_up_ctrl->setVisible(false);
-				scroll_left_ctrl->setVisible(false);
-				scroll_right_ctrl->setVisible(false);
-				scroll_down_ctrl->setVisible(false);
+				mMediaPanelScroll->setVisible(false);
+				mScrollUpCtrl->setVisible(false);
+				mScrollDownCtrl->setVisible(false);
+				mScrollRightCtrl->setVisible(false);
+				mScrollDownCtrl->setVisible(false);
 			}
 				
 			F32 volume = media_impl->getVolume();
@@ -358,8 +363,8 @@ void LLPanelPrimMediaControls::updateShape()
 			if(mMovieDuration == 0) 
 			{
 				mMovieDuration = media_plugin->getDuration();
-				media_play_slider_ctrl->setValue(0);
-				media_play_slider_ctrl->setEnabled(false);
+				mMediaPlaySliderCtrl->setValue(0);
+				mMediaPlaySliderCtrl->setEnabled(false);
 			}
 			// TODO: What if it's not fully loaded
 					
@@ -367,48 +372,48 @@ void LLPanelPrimMediaControls::updateShape()
 			{
 				F64 current_time =  media_plugin->getCurrentTime();
 				F32 percent = current_time / mMovieDuration;
-				media_play_slider_ctrl->setValue(percent);
-				media_play_slider_ctrl->setEnabled(true);
+				mMediaPlaySliderCtrl->setValue(percent);
+				mMediaPlaySliderCtrl->setEnabled(true);
 			}
 				
 			// video vloume
 			if(volume <= 0.0)
 			{
-				volume_up_ctrl->setEnabled(TRUE);
-				volume_down_ctrl->setEnabled(FALSE);
+				mVolumeUpCtrl->setEnabled(TRUE);
+				mVolumeDownCtrl->setEnabled(FALSE);
 				media_impl->setVolume(0.0);
-				volume_btn->setToggleState(true);
+				mVolumeBtn->setToggleState(true);
 			}
 			else if (volume >= 1.0)
 			{
-				volume_up_ctrl->setEnabled(FALSE);
-				volume_down_ctrl->setEnabled(TRUE);
+				mVolumeUpCtrl->setEnabled(FALSE);
+				mVolumeDownCtrl->setEnabled(TRUE);
 				media_impl->setVolume(1.0);
-				volume_btn->setToggleState(false);
+				mVolumeBtn->setToggleState(false);
 			}
 			else
 			{
-				volume_up_ctrl->setEnabled(TRUE);
-				volume_down_ctrl->setEnabled(TRUE);
+				mVolumeUpCtrl->setEnabled(TRUE);
+				mVolumeDownCtrl->setEnabled(TRUE);
 			}
 				
 			switch(result)
 			{
 				case LLPluginClassMediaOwner::MEDIA_PLAYING:
-					play_ctrl->setEnabled(FALSE);
-					play_ctrl->setVisible(FALSE);
-					pause_ctrl->setEnabled(TRUE);
-					pause_ctrl->setVisible(has_focus);
-					media_stop_ctrl->setEnabled(TRUE);
+					mPlayCtrl->setEnabled(FALSE);
+					mPlayCtrl->setVisible(FALSE);
+					mPauseCtrl->setEnabled(TRUE);
+					mPauseCtrl->setVisible(has_focus);
+					mMediaStopCtrl->setEnabled(TRUE);
 					
 					break;
 				case LLPluginClassMediaOwner::MEDIA_PAUSED:
 				default:
-					pause_ctrl->setEnabled(FALSE);
-					pause_ctrl->setVisible(FALSE);
-					play_ctrl->setEnabled(TRUE);
-					play_ctrl->setVisible(has_focus);
-					media_stop_ctrl->setEnabled(FALSE);
+					mPauseCtrl->setEnabled(FALSE);
+					mPauseCtrl->setVisible(FALSE);
+					mPlayCtrl->setEnabled(TRUE);
+					mPlayCtrl->setVisible(has_focus);
+					mMediaStopCtrl->setEnabled(FALSE);
 					break;
 			}
 		}
@@ -423,28 +428,28 @@ void LLPanelPrimMediaControls::updateShape()
 				mCurrentURL.clear();
 			}
 				
-			play_ctrl->setVisible(FALSE);
-			pause_ctrl->setVisible(FALSE);
-			media_stop_ctrl->setVisible(FALSE);
-			media_address_ctrl->setVisible(has_focus && !mini_controls);
-			media_address_ctrl->setEnabled(has_focus && !mini_controls);
-			media_play_slider_panel->setVisible(FALSE);
-			media_play_slider_panel->setEnabled(FALSE);
+			mPlayCtrl->setVisible(FALSE);
+			mPauseCtrl->setVisible(FALSE);
+			mMediaStopCtrl->setVisible(FALSE);
+			mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
+			mMediaAddressCtrl->setEnabled(has_focus && !mini_controls);
+			mMediaPlaySliderPanel->setVisible(FALSE);
+			mMediaPlaySliderPanel->setEnabled(FALSE);
 				
-			volume_ctrl->setVisible(FALSE);
-			volume_up_ctrl->setVisible(FALSE);
-			volume_down_ctrl->setVisible(FALSE);
-			volume_ctrl->setEnabled(FALSE);
-			volume_up_ctrl->setEnabled(FALSE);
-			volume_down_ctrl->setEnabled(FALSE);
+			mVolumeCtrl->setVisible(FALSE);
+			mVolumeUpCtrl->setVisible(FALSE);
+			mVolumeDownCtrl->setVisible(FALSE);
+			mVolumeCtrl->setEnabled(FALSE);
+			mVolumeUpCtrl->setEnabled(FALSE);
+			mVolumeDownCtrl->setEnabled(FALSE);
 			
-			if (media_panel_scroll)
+			if (mMediaPanelScroll)
 			{
-				media_panel_scroll->setVisible(has_focus);
-				scroll_up_ctrl->setVisible(has_focus);
-				scroll_left_ctrl->setVisible(has_focus);
-				scroll_right_ctrl->setVisible(has_focus);
-				scroll_down_ctrl->setVisible(has_focus);
+				mMediaPanelScroll->setVisible(has_focus);
+				mScrollUpCtrl->setVisible(has_focus);
+				mScrollDownCtrl->setVisible(has_focus);
+				mScrollRightCtrl->setVisible(has_focus);
+				mScrollDownCtrl->setVisible(has_focus);
 			}
 			// TODO: get the secure lock bool from media plug in
 			std::string prefix =  std::string("https://");
@@ -452,7 +457,7 @@ void LLPanelPrimMediaControls::updateShape()
 			LLStringUtil::toLower(test_prefix);
 			if(test_prefix == prefix)
 			{
-				secure_lock_icon->setVisible(has_focus);
+				mSecureLockIcon->setVisible(has_focus);
 			}
 				
 			if(mCurrentURL!=mPreviousURL)
@@ -463,17 +468,17 @@ void LLPanelPrimMediaControls::updateShape()
 
 			if(result == LLPluginClassMediaOwner::MEDIA_LOADING)
 			{
-				reload_ctrl->setEnabled(FALSE);
-				reload_ctrl->setVisible(FALSE);
-				stop_ctrl->setEnabled(TRUE);
-				stop_ctrl->setVisible(has_focus);
+				mReloadCtrl->setEnabled(FALSE);
+				mReloadCtrl->setVisible(FALSE);
+				mStopCtrl->setEnabled(TRUE);
+				mStopCtrl->setVisible(has_focus);
 			}
 			else
 			{
-				reload_ctrl->setEnabled(TRUE);
-				reload_ctrl->setVisible(has_focus);
-				stop_ctrl->setEnabled(FALSE);
-				stop_ctrl->setVisible(FALSE);
+				mReloadCtrl->setEnabled(TRUE);
+				mReloadCtrl->setVisible(has_focus);
+				mStopCtrl->setEnabled(FALSE);
+				mStopCtrl->setVisible(FALSE);
 			}
 		}
 
@@ -483,16 +488,15 @@ void LLPanelPrimMediaControls::updateShape()
 			//
 			// Handle progress bar
 			//
-			mUpdatePercent = media_plugin->getProgressPercent();
-			if(mUpdatePercent<100.0f)
-			{
-				media_loading_panel->setVisible(true);
-				getChild<LLProgressBar>("media_progress_bar")->setPercent(mUpdatePercent);
-				gFocusMgr.setTopCtrl(media_loading_panel);
+			if(LLPluginClassMediaOwner::MEDIA_LOADING == media_plugin->getStatus())
+			{	
+				mMediaProgressPanel->setVisible(true);
+				mMediaProgressBar->setPercent(media_plugin->getProgressPercent());
+				gFocusMgr.setTopCtrl(mMediaProgressPanel);
 			}
 			else
 			{
-				media_loading_panel->setVisible(false);
+				mMediaProgressPanel->setVisible(false);
 				gFocusMgr.setTopCtrl(NULL);
 			}
 		}
@@ -589,11 +593,10 @@ void LLPanelPrimMediaControls::updateShape()
 		// grow panel so that screenspace bounding box fits inside "media_region" element of HUD
 		LLRect media_controls_rect;
 		getParent()->screenRectToLocal(LLRect(screen_min.mX, screen_max.mY, screen_max.mX, screen_min.mY), &media_controls_rect);
-		LLView* media_region = getChild<LLView>("media_region");
-		media_controls_rect.mLeft -= media_region->getRect().mLeft;
-		media_controls_rect.mBottom -= media_region->getRect().mBottom;
-		media_controls_rect.mTop += getRect().getHeight() - media_region->getRect().mTop;
-		media_controls_rect.mRight += getRect().getWidth() - media_region->getRect().mRight;
+		media_controls_rect.mLeft -= mMediaRegion->getRect().mLeft;
+		media_controls_rect.mBottom -= mMediaRegion->getRect().mBottom;
+		media_controls_rect.mTop += getRect().getHeight() - mMediaRegion->getRect().mTop;
+		media_controls_rect.mRight += getRect().getWidth() - mMediaRegion->getRect().mRight;
 
 		LLRect old_hud_rect = media_controls_rect;
 		// keep all parts of HUD on-screen
@@ -669,6 +672,20 @@ void LLPanelPrimMediaControls::draw()
 		}
 	}
 	
+	// Build rect for icon area in coord system of this panel
+	// Assumes layout_stack is a direct child of this panel
+	mMediaControlsStack->updateLayout();
+	LLRect icon_area = mMediaControlsStack->getRect();
+	
+	// adjust to ignore space from left bookend padding
+	icon_area.mLeft += mLeftBookend->getRect().getWidth();
+	
+	// ignore space from right bookend padding
+	icon_area.mRight -= mRightBookend->getRect().getWidth();
+	
+	// get UI image
+	mBackgroundImage->draw( icon_area, UI_VERTEX_COLOR % alpha);
+	
 	{
 		LLViewDrawContext context(alpha);
 		LLPanel::draw();
@@ -711,16 +728,12 @@ bool LLPanelPrimMediaControls::isMouseOver()
 		S32 x, y;
 		getWindow()->getCursorPosition(&cursor_pos_window);
 		getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl);
-		
-		LLView* controls_view = NULL;
-		controls_view = getChild<LLView>("media_controls");
-		
-		//FIXME: rewrite as LLViewQuery or get hover set from LLViewerWindow?
-		if(controls_view && controls_view->getVisible())
+				
+		if(mMediaControlsStack->getVisible())
 		{
-			controls_view->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
+			mMediaControlsStack->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
 
-			LLView *hit_child = controls_view->childFromPoint(x, y);
+			LLView *hit_child = mMediaControlsStack->childFromPoint(x, y);
 			if(hit_child && hit_child->getVisible())
 			{
 				// This was useful for debugging both coordinate translation and view hieararchy problems...
@@ -1002,8 +1015,7 @@ void LLPanelPrimMediaControls::onCommitURL()
 {
 	focusOnTarget();
 
-	LLUICtrl *media_address_ctrl = getChild<LLUICtrl>("media_address_url");
-	std::string url = media_address_ctrl->getValue().asString();
+	std::string url = mMediaAddress->getValue().asString();
 	if(getTargetMediaImpl() && !url.empty())
 	{
 		getTargetMediaImpl()->navigateTo( url, "", true);
@@ -1032,19 +1044,18 @@ void LLPanelPrimMediaControls::onInputURL(LLFocusableElement* caller, void *user
 void LLPanelPrimMediaControls::setCurrentURL()
 {	
 #ifdef USE_COMBO_BOX_FOR_MEDIA_URL
-	LLComboBox* media_address_combo	= getChild<LLComboBox>("media_address_combo");
-	// redirects will navigate momentarily to about:blank, don't add to history
-	if (media_address_combo && mCurrentURL != "about:blank")
-	{
-		media_address_combo->remove(mCurrentURL);
-		media_address_combo->add(mCurrentURL, ADD_SORTED);
-		media_address_combo->selectByValue(mCurrentURL);
-	}
+//	LLComboBox* media_address_combo	= getChild<LLComboBox>("media_address_combo");
+//	// redirects will navigate momentarily to about:blank, don't add to history
+//	if (media_address_combo && mCurrentURL != "about:blank")
+//	{
+//		media_address_combo->remove(mCurrentURL);
+//		media_address_combo->add(mCurrentURL, ADD_SORTED);
+//		media_address_combo->selectByValue(mCurrentURL);
+//	}
 #else   // USE_COMBO_BOX_FOR_MEDIA_URL
-	LLLineEditor* media_address_url = getChild<LLLineEditor>("media_address_url");
-	if (media_address_url && mCurrentURL != "about:blank")
+	if (mMediaAddress && mCurrentURL != "about:blank")
 	{
-		media_address_url->setValue(mCurrentURL);
+		mMediaAddress->setValue(mCurrentURL);
 	}
 #endif	// USE_COMBO_BOX_FOR_MEDIA_URL
 }
@@ -1053,12 +1064,11 @@ void LLPanelPrimMediaControls::onCommitSlider()
 {
 	focusOnTarget();
 
-	LLSlider* media_play_slider_ctrl	= getChild<LLSlider>("media_play_slider");
 	LLViewerMediaImpl* media_impl = getTargetMediaImpl();
 	if (media_impl) 
 	{
 		// get slider value
-		F64 slider_value = media_play_slider_ctrl->getValue().asReal();
+		F64 slider_value = mMediaPlaySliderCtrl->getValue().asReal();
 		if(slider_value <= 0.0)
 		{	
 			media_impl->stop();
@@ -1087,7 +1097,7 @@ void LLPanelPrimMediaControls::onCommitVolumeUp()
 		}
 		
 		media_impl->setVolume(volume);
-		getChild<LLButton>("media_volume")->setToggleState(false);
+		mVolumeBtn->setToggleState(false);
 	}
 }		
 
@@ -1107,7 +1117,7 @@ void LLPanelPrimMediaControls::onCommitVolumeDown()
 		}
 
 		media_impl->setVolume(volume);
-		getChild<LLButton>("media_volume")->setToggleState(false);
+		mVolumeBtn->setToggleState(false);
 	}
 }		
 
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 3ec7aa2356c14614ce919050ba8b1b9da5970580..124fa9cce487046ab659d989beccfe5e2a119641 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -35,7 +35,11 @@
 #include "llpanel.h"
 #include "llviewermedia.h"
 
+class LLButton;
 class LLCoordWindow;
+class LLIconCtrl;
+class LLLayoutStack;
+class LLProgressBar;
 class LLViewerMediaImpl;
 
 class LLPanelPrimMediaControls : public LLPanel
@@ -119,6 +123,44 @@ class LLPanelPrimMediaControls : public LLPanel
 	LLViewerMediaImpl* getTargetMediaImpl();
 	LLViewerObject* getTargetObject();
 	LLPluginClassMedia* getTargetMediaPlugin();
+	
+private:
+	
+	LLView *mMediaRegion;
+	LLUICtrl *mBackCtrl;
+	LLUICtrl *mFwdCtrl;
+	LLUICtrl *mReloadCtrl;
+	LLUICtrl *mPlayCtrl;
+	LLUICtrl *mPauseCtrl;
+	LLUICtrl *mStopCtrl;
+	LLUICtrl *mMediaStopCtrl;
+	LLUICtrl *mHomeCtrl;
+	LLUICtrl *mUnzoomCtrl;
+	LLUICtrl *mOpenCtrl;
+	LLUICtrl *mZoomCtrl;
+	LLPanel  *mMediaProgressPanel;
+	LLProgressBar *mMediaProgressBar;
+	LLUICtrl *mMediaAddressCtrl;
+	LLUICtrl *mMediaAddress;
+	LLUICtrl *mMediaPlaySliderPanel;
+	LLUICtrl *mMediaPlaySliderCtrl;
+	LLUICtrl *mVolumeCtrl;
+	LLButton *mVolumeBtn;
+	LLUICtrl *mVolumeUpCtrl;
+	LLUICtrl *mVolumeDownCtrl;
+	LLIconCtrl *mWhitelistIcon;
+	LLIconCtrl *mSecureLockIcon;
+	LLLayoutStack *mMediaControlsStack;
+	LLUICtrl *mLeftBookend;
+	LLUICtrl *mRightBookend;
+	LLUIImage* mBackgroundImage;
+	
+	LLUICtrl *mMediaPanelScroll;
+	LLButton *mScrollUpCtrl;
+	LLButton *mScrollLeftCtrl;
+	LLButton *mScrollRightCtrl;
+	LLButton *mScrollDownCtrl;
+	
 	bool mPauseFadeout;
 	bool mUpdateSlider;
 	bool mClearFaceOnFade;
@@ -137,8 +179,7 @@ class LLPanelPrimMediaControls : public LLPanel
 	std::string mPreviousURL;
 	F64 mCurrentRate;
 	F64 mMovieDuration;
-	int mUpdatePercent;
-
+	
 	LLUUID mTargetObjectID;
 	S32 mTargetObjectFace;
 	LLUUID mTargetImplID;
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index f5367c04772fe15dd79a81acc001bb07e0f4a82b..13bd059d45eeb4adc6db5f1321e1d872a2dd9973 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -130,6 +130,7 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
 				{
 					name.erase(found, moderator_indicator_len);
 					item->setName(name);
+					item->reshapeAvatarName();
 				}
 			}
 		}
@@ -151,6 +152,7 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
 					name += " ";
 					name += moderator_indicator;
 					item->setName(name);
+					item->reshapeAvatarName();
 				}
 			}
 		}
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index b667fbf5fd2df09addf62b2b7893b376e15cf9d4..81eb133b07fcfc6875190c4d8fa8e8ad27ed9fdc 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -63,7 +63,7 @@ LLScreenChannelBase::LLScreenChannelBase(const LLUUID& id) :
 												,mCanStoreToasts(true)
 												,mHiddenToastsNum(0)
 												,mOverflowToastHidden(false)
-												,mIsHovering(false)
+												,mHoveredToast(NULL)
 												,mControlHovering(false)
 												,mShowToasts(true)
 {	
@@ -216,8 +216,10 @@ void LLScreenChannel::deleteToast(LLToast* toast)
 	
 	// update channel's Hovering state
 	// turning hovering off manually because onMouseLeave won't happen if a toast was closed using a keyboard
-	if(toast->hasFocus())
-		setHovering(false);
+	if(mHoveredToast == toast)
+	{
+		mHoveredToast  = NULL;
+	}
 
 	// close the toast
 	toast->closeFloater();
@@ -352,7 +354,7 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)
 //--------------------------------------------------------------------------
 void LLScreenChannel::redrawToasts()
 {
-	if(mToastList.size() == 0 || mIsHovering)
+	if(mToastList.size() == 0 || isHovering())
 		return;
 
 	hideToastsFromScreen();
@@ -453,10 +455,9 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
 	if(!mOverflowToastPanel)
 		return;
 
-	mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::closeOverflowToastPanel, this));
+	mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onOverflowToastHide, this));
 
 	LLTextBox* text_box = mOverflowToastPanel->getChild<LLTextBox>("toast_text");
-	LLIconCtrl* icon = mOverflowToastPanel->getChild<LLIconCtrl>("icon");
 	std::string	text = llformat(mOverflowFormatString.c_str(),mHiddenToastsNum);
 	if(mHiddenToastsNum == 1)
 	{
@@ -474,7 +475,6 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
 
 	text_box->setValue(text);
 	text_box->setVisible(TRUE);
-	icon->setVisible(TRUE);
 
 	mOverflowToastPanel->setVisible(TRUE);
 }
@@ -532,7 +532,6 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
 	mStartUpToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onStartUpToastHide, this));
 
 	LLTextBox* text_box = mStartUpToastPanel->getChild<LLTextBox>("toast_text");
-	LLIconCtrl* icon = mStartUpToastPanel->getChild<LLIconCtrl>("icon");
 
 	std::string mStartUpFormatString;
 
@@ -555,8 +554,6 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
 
 	text_box->setValue(text);
 	text_box->setVisible(TRUE);
-	icon->setVisible(TRUE);
-
 	addChild(mStartUpToastPanel);
 	
 	mStartUpToastPanel->setVisible(TRUE);
@@ -654,7 +651,14 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
 	// we must check this to prevent incorrect setting for hovering in a channel
 	std::map<LLToast*, bool>::iterator it_first, it_second;
 	S32 stack_size = mToastEventStack.size();
-	mIsHovering = mouse_enter;
+	if(mouse_enter)
+	{
+		mHoveredToast = toast;
+	}
+	else
+	{
+		mHoveredToast = NULL;
+	}
 
 	switch(stack_size)
 	{
@@ -666,7 +670,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
 		if((*it_first).second && !mouse_enter && ((*it_first).first != toast) )
 		{
 			mToastEventStack.clear();
-			mIsHovering = true;
+			mHoveredToast = toast;
 		}
 		else
 		{
@@ -678,7 +682,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
 		LL_ERRS ("LLScreenChannel::onToastHover: stack size error " ) << stack_size << llendl;
 	}
 
-	if(!mIsHovering)
+	if(!isHovering())
 		redrawToasts();
 }
 
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index fd31690622f8b65ad63a16c7de08f5bb7d184b04..f39b94b89df3b722602e6606312453b83964fd07 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -93,9 +93,10 @@ class LLScreenChannelBase : public LLUICtrl
 	// Channel's behavior-functions
 	// set whether a channel will control hovering inside itself or not
 	virtual void setControlHovering(bool control) { mControlHovering = control; }
-	// set Hovering flag for a channel
-	virtual void setHovering(bool hovering) { mIsHovering = hovering; }
 	
+
+	bool isHovering() { return mHoveredToast != NULL; }
+
 	void setCanStoreToasts(bool store) { mCanStoreToasts = store; }
 
 	void setDisplayToastsAlways(bool display_toasts) { mDisplayToastsAlways = display_toasts; }
@@ -117,7 +118,7 @@ class LLScreenChannelBase : public LLUICtrl
 protected:
 	// Channel's flags
 	bool		mControlHovering;
-	bool		mIsHovering;
+	LLToast*		mHoveredToast;
 	bool		mCanStoreToasts;
 	bool		mDisplayToastsAlways;
 	bool		mOverflowToastHidden;
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 8c5439d47ea624916188f0304e545abbc7b44f98..6ca67345984c475b8b87bbc08f859718604b44f6 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -435,7 +435,7 @@ void LLSpatialGroup::clearDrawMap()
 
 BOOL LLSpatialGroup::isRecentlyVisible() const
 {
-	return (LLDrawable::getCurrentFrame() - (S32)mVisible) < LLDrawable::getMinVisFrameRange() ;
+	return (LLDrawable::getCurrentFrame() - mVisible[LLViewerCamera::sCurCameraID]) < LLDrawable::getMinVisFrameRange() ;
 }
 
 BOOL LLSpatialGroup::isVisible() const
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 2ed82b7d621c1b8be82159dee900538fd2f0c226..261bdbcfc05833b57611c03bc3c829583b619562 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -359,6 +359,9 @@ void LLSpeakerMgr::updateSpeakerList()
 
 LLPointer<LLSpeaker> LLSpeakerMgr::findSpeaker(const LLUUID& speaker_id)
 {
+	//In some conditions map causes crash if it is empty(Windows only), adding check (EK)
+	if (mSpeakers.size() == 0)
+		return NULL;
 	speaker_map_t::iterator found_it = mSpeakers.find(speaker_id);
 	if (found_it == mSpeakers.end())
 	{
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 84371b75cd892f7d826ecc9ab83551f7d33e4d09..d36ff1605e98bdde8174ee136c1e1734ee281786 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -873,6 +873,9 @@ bool idle_startup()
 		gViewerWindow->getWindow()->show();
 		display_startup();
 
+		//DEV-10530.  do cleanup.  remove at some later date.  jan-2009
+		LLFloaterPreference::cleanupBadSetting();
+
 		// DEV-16927.  The following code removes errant keystrokes that happen while the window is being 
 		// first made visible.
 #ifdef _WIN32
@@ -1688,8 +1691,11 @@ bool idle_startup()
 		//all categories loaded. lets create "My Favorites" category
 		gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);
 
-		// lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" and fill it with buddies
-		LLFriendCardsManager::instance().syncFriendsFolder();
+		// Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
+		// fetches their contents if needed and synchronizes it with buddies list.
+		// If the folders are not found they are created.
+		LLFriendCardsManager::instance().syncFriendCardsFolders();
+
 
 		// set up callbacks
 		llinfos << "Registering Callbacks" << llendl;
@@ -1900,9 +1906,6 @@ bool idle_startup()
         //DEV-17797.  get null folder.  Any items found here moved to Lost and Found
         LLInventoryModel::findLostItems();
 
-		//DEV-10530.  do cleanup.  remove at some later date.  jan-2009
-		LLFloaterPreference::cleanupBadSetting();
-
 		LLStartUp::setStartupState( STATE_PRECACHE );
 		timeout.reset();
 		return FALSE;
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 4dccdfd7e6c275ec535a8448e3e16de9f42847e7..b649a0c38ebd45243f9dea3073b3d1f534dfec43 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -109,6 +109,7 @@ const S32 TEXT_HEIGHT = 18;
 static void onClickBuyCurrency(void*);
 static void onClickHealth(void*);
 static void onClickScriptDebug(void*);
+static void onClickVolume(void*);
 
 std::vector<std::string> LLStatusBar::sDays;
 std::vector<std::string> LLStatusBar::sMonths;
@@ -116,6 +117,12 @@ const U32 LLStatusBar::MAX_DATE_STRING_LENGTH = 2000;
 
 LLStatusBar::LLStatusBar(const LLRect& rect)
 :	LLPanel(),
+	mTextHealth(NULL),
+	mTextTime(NULL),
+	mSGBandwidth(NULL),
+	mSGPacketLoss(NULL),
+	mBtnBuyCurrency(NULL),
+	mBtnVolume(NULL),
 	mBalance(0),
 	mHealth(100),
 	mSquareMetersCredit(0),
@@ -148,6 +155,11 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
 	mBtnBuyCurrency = getChild<LLButton>( "buycurrency" );
 	mBtnBuyCurrency->setClickedCallback( onClickBuyCurrency, this );
 
+	mBtnVolume = getChild<LLButton>( "volume_btn" );
+	mBtnVolume->setClickedCallback( onClickVolume, this );
+
+	gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2));
+
 	childSetAction("scriptout", onClickScriptDebug, this);
 	childSetAction("health", onClickHealth, this);
 
@@ -333,6 +345,10 @@ void LLStatusBar::refresh()
 	mSGBandwidth->setVisible(net_stats_visible);
 	mSGPacketLoss->setVisible(net_stats_visible);
 	childSetEnabled("stat_btn", net_stats_visible);
+
+	// update the master volume button state
+	BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio");
+	mBtnVolume->setToggleState(mute_audio);
 }
 
 void LLStatusBar::setVisibleForMouselook(bool visible)
@@ -488,6 +504,13 @@ static void onClickScriptDebug(void*)
 	LLFloaterScriptDebug::show(LLUUID::null);
 }
 
+static void onClickVolume(void* data)
+{
+	// toggle the master mute setting
+	BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio");
+	gSavedSettings.setBOOL("MuteAudio", !mute_audio);
+}
+
 // sets the static variables necessary for the date
 void LLStatusBar::setupDate()
 {
@@ -562,6 +585,10 @@ BOOL can_afford_transaction(S32 cost)
 	return((cost <= 0)||((gStatusBar) && (gStatusBar->getBalance() >=cost)));
 }
 
+void LLStatusBar::onVolumeChanged(const LLSD& newvalue)
+{
+	refresh();
+}
 
 // Implements secondlife:///app/balance/request to request a L$ balance
 // update via UDP message system. JC
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index d5629e6f1ebd7bb35ea4899636fd4ab4a4bef1b4..3ce35499615a99c6ee942ba73ccd93dfea05bf8f 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -91,9 +91,10 @@ class LLStatusBar
 	// simple method to setup the part that holds the date
 	void setupDate();
 
-	static void onCommitSearch(LLUICtrl*, void* data);
-	static void onClickSearch(void* data);
+	void onVolumeChanged(const LLSD& newvalue);
+
 	static void onClickStatGraph(void* data);
+	
 
 private:
 	LLTextBox	*mTextHealth;
@@ -103,6 +104,7 @@ class LLStatusBar
 	LLStatGraph *mSGPacketLoss;
 
 	LLButton	*mBtnBuyCurrency;
+	LLButton	*mBtnVolume;
 
 	S32				mBalance;
 	S32				mHealth;
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 4422c4b67227c626da838b181182c737ba700390..2fb6550107a40c19ac772d83f4428dbe5b6e7793 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -501,14 +501,14 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&
 	switch (im_chiclet_type)
 	{
 	case LLIMChiclet::TYPE_GROUP:
+		mChiclet = getChild<LLIMGroupChiclet>("group_chiclet");
+		break;
 	case LLIMChiclet::TYPE_AD_HOC:
-		mChiclet = getChild<LLIMChiclet>("group_chiclet");
-		childSetVisible("p2p_chiclet", false);
+		mChiclet = getChild<LLAdHocChiclet>("adhoc_chiclet");		
 		break;
 	case LLIMChiclet::TYPE_UNKNOWN: // assign mChiclet a non-null value anyway
 	case LLIMChiclet::TYPE_IM:
-		mChiclet = getChild<LLIMChiclet>("p2p_chiclet");
-		childSetVisible("group_chiclet", false);
+		mChiclet = getChild<LLIMP2PChiclet>("p2p_chiclet");
 		break;
 	}
 
@@ -517,6 +517,7 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&
 	mChiclet->setSessionId(sessionId);
 	mChiclet->setIMSessionName(name);
 	mChiclet->setOtherParticipantId(otherParticipantId);
+	mChiclet->setVisible(true);
 
 	LLTextBox* contactName = getChild<LLTextBox>("contact_name");
 	contactName->setValue(name);
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index 9370e318cfbc5a87a692830c890a02600fc8076a..1ea5f515b76e277e647698c5dbab32ac9cb70d41 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -69,7 +69,7 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) :	LLToastPanel(p.notif
 	mNotification = p.notification;
 
 	// if message comes from the system - there shouldn't be a reply btn
-	if(p.from == "Second Life")
+	if(p.from == SYSTEM_FROM)
 	{
 		mAvatar->setVisible(FALSE);
 		sys_msg_icon->setVisible(TRUE);
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d65a060bbc12b0a79350a37388d0b7130d26f540
--- /dev/null
+++ b/indra/newview/llviewerchat.cpp
@@ -0,0 +1,203 @@
+/** 
+ * @file llviewerchat.cpp
+ * @brief Builds menus out of items.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llviewerchat.h" 
+
+// newview includes
+#include "llagent.h" 	// gAgent		
+#include "lluicolortable.h"
+#include "llviewercontrol.h" // gSavedSettings
+
+// LLViewerChat
+
+//static 
+void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
+{
+	if(chat.mMuted)
+	{
+		r_color= LLUIColorTable::instance().getColor("LtGray");
+	}
+	else
+	{
+		switch(chat.mSourceType)
+		{
+			case CHAT_SOURCE_SYSTEM:
+				r_color = LLUIColorTable::instance().getColor("SystemChatColor"); 
+				break;
+			case CHAT_SOURCE_AGENT:
+				if (chat.mFromID.isNull())
+				{
+					r_color = LLUIColorTable::instance().getColor("SystemChatColor");
+				}
+				else
+				{
+					if(gAgentID == chat.mFromID)
+					{
+						r_color = LLUIColorTable::instance().getColor("UserChatColor");
+					}
+					else
+					{
+						r_color = LLUIColorTable::instance().getColor("AgentChatColor");
+					}
+				}
+				break;
+			case CHAT_SOURCE_OBJECT:
+				if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
+				{
+					r_color = LLUIColorTable::instance().getColor("ScriptErrorColor");
+				}
+				else if ( chat.mChatType == CHAT_TYPE_OWNER )
+				{
+					r_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
+				}
+				else
+				{
+					r_color = LLUIColorTable::instance().getColor("ObjectChatColor");
+				}
+				break;
+			default:
+				r_color.setToWhite();
+		}
+		
+		if (!chat.mPosAgent.isExactlyZero())
+		{
+			LLVector3 pos_agent = gAgent.getPositionAgent();
+			F32 distance = dist_vec(pos_agent, chat.mPosAgent);
+			if (distance > gAgent.getNearChatRadius())
+			{
+				// diminish far-off chat
+				r_color.mV[VALPHA] = 0.8f;
+			}
+		}
+	}
+}
+
+
+//static 
+void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha)
+{
+	if(chat.mMuted)
+	{
+		r_color_name = "LtGray";
+	}
+	else
+	{
+		switch(chat.mSourceType)
+		{
+			case CHAT_SOURCE_SYSTEM:
+				r_color_name = "SystemChatColor";
+				break;
+				
+			case CHAT_SOURCE_AGENT:
+				if (chat.mFromID.isNull())
+				{
+					r_color_name = "SystemChatColor";
+				}
+				else
+				{
+					if(gAgentID == chat.mFromID)
+					{
+						r_color_name = "UserChatColor";
+					}
+					else
+					{
+						r_color_name = "AgentChatColor";
+					}
+				}
+				break;
+				
+			case CHAT_SOURCE_OBJECT:
+				if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
+				{
+					r_color_name = "ScriptErrorColor";
+				}
+				else if ( chat.mChatType == CHAT_TYPE_OWNER )
+				{
+					r_color_name = "llOwnerSayChatColor";
+				}
+				else
+				{
+					r_color_name = "ObjectChatColor";
+				}
+				break;
+			default:
+				r_color_name = "White";
+		}
+		
+		if (!chat.mPosAgent.isExactlyZero())
+		{
+			LLVector3 pos_agent = gAgent.getPositionAgent();
+			F32 distance = dist_vec(pos_agent, chat.mPosAgent);
+			if (distance > gAgent.getNearChatRadius())
+			{
+				// diminish far-off chat
+				r_color_alpha = 0.8f; 
+			}
+			else
+			{
+				r_color_alpha = 1.0f;
+			}
+		}
+	}
+	
+}
+
+
+//static 
+LLFontGL* LLViewerChat::getChatFont()
+{
+	S32 font_size = gSavedSettings.getS32("ChatFontSize");
+	LLFontGL* fontp = NULL;
+	switch(font_size)
+	{
+		case 0:
+			fontp = LLFontGL::getFontSansSerifSmall();
+			break;
+		default:
+		case 1:
+			fontp = LLFontGL::getFontSansSerif();
+			break;
+		case 2:
+			fontp = LLFontGL::getFontSansSerifBig();
+			break;
+	}
+	
+	return fontp;
+	
+}
+
+//static
+S32 LLViewerChat::getChatFontSize()
+{
+	return gSavedSettings.getS32("ChatFontSize");
+}
diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h
new file mode 100644
index 0000000000000000000000000000000000000000..d8840d5dd2466d9727602dc9de6c27db2a59177e
--- /dev/null
+++ b/indra/newview/llviewerchat.h
@@ -0,0 +1,53 @@
+/** 
+ * @file llviewerchat.h
+ * @brief wrapper of LLChat in viewer
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVIEWERCHAT_H
+#define LL_LLVIEWERCHAT_H
+
+#include "llchat.h"
+#include "llfontgl.h"
+#include "v4color.h"
+
+
+class LLViewerChat 
+{
+public:
+	static void getChatColor(const LLChat& chat, LLColor4& r_color);
+	static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha);
+	static LLFontGL* getChatFont();
+	static S32 getChatFontSize();
+	
+
+
+};
+
+#endif
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 493457704bbdcb96864790d355e1536bf9555a66..251d7d4a133655c2421f6d01394181a636edee38 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -54,6 +54,8 @@
 #include <boost/bind.hpp>	// for SkinFolder listener
 #include <boost/signals2.hpp>
 
+/*static*/ const char* LLViewerMedia::AUTO_PLAY_MEDIA_SETTING = "AutoPlayMedia";
+
 // Move this to its own file.
 
 LLViewerMediaEventEmitter::~LLViewerMediaEventEmitter()
@@ -135,9 +137,19 @@ LOG_CLASS(LLMimeDiscoveryResponder);
 	LLMimeDiscoveryResponder( viewer_media_t media_impl)
 		: mMediaImpl(media_impl),
 		  mInitialized(false)
-	{}
-
+	{
+		if(mMediaImpl->mMimeTypeProbe != NULL)
+		{
+			llerrs << "impl already has an outstanding responder" << llendl;
+		}
+		
+		mMediaImpl->mMimeTypeProbe = this;
+	}
 
+	~LLMimeDiscoveryResponder()
+	{
+		disconnectOwner();
+	}
 
 	virtual void completedHeader(U32 status, const std::string& reason, const LLSD& content)
 	{
@@ -149,23 +161,63 @@ LOG_CLASS(LLMimeDiscoveryResponder);
 
 	virtual void error( U32 status, const std::string& reason )
 	{
-		// completeAny(status, "none/none");
+		if(status == 401)
+		{
+			// This is the "you need to authenticate" status.  
+			// Treat this like an html page.
+			completeAny(status, "text/html");
+		}
+		else
+		{
+			llwarns << "responder failed with status " << status << ", reason " << reason << llendl;
+		
+			if(mMediaImpl)
+			{
+				mMediaImpl->mMediaSourceFailed = true;
+			}
+		}
 	}
 
 	void completeAny(U32 status, const std::string& mime_type)
 	{
-		if(!mInitialized && ! mime_type.empty())
+		// the call to initializeMedia may disconnect the responder, which will clear mMediaImpl.
+		// Make a local copy so we can call loadURI() afterwards.
+		LLViewerMediaImpl *impl = mMediaImpl;
+		
+		if(impl && !mInitialized && ! mime_type.empty())
 		{
-			if(mMediaImpl->initializeMedia(mime_type))
+			if(impl->initializeMedia(mime_type))
 			{
 				mInitialized = true;
-				mMediaImpl->loadURI();
+				impl->loadURI();
+				disconnectOwner();
 			}
 		}
 	}
+	
+	void cancelRequest()
+	{
+		disconnectOwner();
+	}
+	
+private:
+	void disconnectOwner()
+	{
+		if(mMediaImpl)
+		{
+			if(mMediaImpl->mMimeTypeProbe != this)
+			{
+				llerrs << "internal error: mMediaImpl->mMimeTypeProbe != this" << llendl;
+			}
 
-	public:
-		viewer_media_t mMediaImpl;
+			mMediaImpl->mMimeTypeProbe = NULL;
+		}
+		mMediaImpl = NULL;
+	}
+	
+	
+public:
+		LLViewerMediaImpl *mMediaImpl;
 		bool mInitialized;
 };
 static LLViewerMedia::impl_list sViewerMediaImplList;
@@ -272,7 +324,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 			// If (the media was already loaded OR the media was set to autoplay) AND this update didn't come from this agent,
 			// do a navigate.
 			
-			if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))) && !update_from_self)
+			if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING))) && !update_from_self)
 			{
 				needs_navigate = (media_entry->getCurrentURL() != previous_url);
 			}
@@ -289,7 +341,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 		
 		media_impl->setHomeURL(media_entry->getHomeURL());
 		
-		if(media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))
+		if(media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING))
 		{
 			needs_navigate = true;
 		}
@@ -708,6 +760,7 @@ LLViewerMediaImpl::LLViewerMediaImpl(	  const LLUUID& texture_id,
 	mIsDisabled(false),
 	mIsParcelMedia(false),
 	mProximity(-1),
+	mMimeTypeProbe(NULL),
 	mIsUpdated(false)
 { 
 
@@ -811,7 +864,9 @@ void LLViewerMediaImpl::destroyMediaSource()
 	{
 		oldImage->setPlaying(FALSE) ;
 	}
-
+	
+	cancelMimeTypeProbe();
+	
 	if(mMediaSource)
 	{
 		delete mMediaSource;
@@ -1316,6 +1371,8 @@ void LLViewerMediaImpl::unload()
 //////////////////////////////////////////////////////////////////////////////////////////
 void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mime_type,  bool rediscover_type, bool server_request)
 {
+	cancelMimeTypeProbe();
+
 	if(mMediaURL != url)
 	{
 		// Don't carry media play state across distinct URLs.
@@ -1358,6 +1415,12 @@ void LLViewerMediaImpl::navigateInternal()
 	// Helpful to have media urls in log file. Shouldn't be spammy.
 	llinfos << "media id= " << mTextureId << " url=" << mMediaURL << " mime_type=" << mMimeType << llendl;
 
+	if(mMimeTypeProbe != NULL)
+	{
+		llwarns << "MIME type probe already in progress -- bailing out." << llendl;
+		return;
+	}
+	
 	if(mNavigateServerRequest)
 	{
 		setNavState(MEDIANAVSTATE_SERVER_SENT);
@@ -1390,7 +1453,7 @@ void LLViewerMediaImpl::navigateInternal()
 
 		if(scheme.empty() || "http" == scheme || "https" == scheme)
 		{
-			LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this));
+			LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this), 10.0f);
 		}
 		else if("data" == scheme || "file" == scheme || "about" == scheme)
 		{
@@ -1521,7 +1584,15 @@ void LLViewerMediaImpl::update()
 {
 	if(mMediaSource == NULL)
 	{
-		if(mPriority != LLPluginClassMedia::PRIORITY_UNLOADED)
+		if(mPriority == LLPluginClassMedia::PRIORITY_UNLOADED)
+		{
+			// This media source should not be loaded.
+		}
+		else if(mMimeTypeProbe != NULL)
+		{
+			// this media source is doing a MIME type probe -- don't try loading it again.
+		}
+		else
 		{
 			// This media may need to be loaded.
 			if(sMediaCreateTimer.hasExpired())
@@ -1644,7 +1715,7 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage()
 		// MEDIAOPT: seems insane that we actually have to make an imageraw then
 		// immediately discard it
 		LLPointer<LLImageRaw> raw = new LLImageRaw(texture_width, texture_height, texture_depth);
-		raw->clear(0x0f, 0x0f, 0x0f, 0xff);
+		raw->clear(0x00, 0x00, 0x00, 0xff);
 		int discard_level = 0;
 
 		// ask media source for correct GL image format constants
@@ -2120,6 +2191,21 @@ void LLViewerMediaImpl::setNavState(EMediaNavState state)
 	}
 }
 
+void LLViewerMediaImpl::cancelMimeTypeProbe()
+{
+	if(mMimeTypeProbe != NULL)
+	{
+		// There doesn't seem to be a way to actually cancel an outstanding request.
+		// Simulate it by telling the LLMimeDiscoveryResponder not to write back any results.
+		mMimeTypeProbe->cancelRequest();
+		
+		// The above should already have set mMimeTypeProbe to NULL.
+		if(mMimeTypeProbe != NULL)
+		{
+			llerrs << "internal error: mMimeTypeProbe is not NULL after cancelling request." << llendl;
+		}
+	}
+}
 
 void LLViewerMediaImpl::addObject(LLVOVolume* obj) 
 {
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 3f5f3ca746c1a0979f2a961f66c775237505ab97..639aed4b8a2a27a11f86952d424bf25a79dcb1cd 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -48,6 +48,7 @@ class LLUUID;
 class LLViewerMediaTexture;
 class LLMediaEntry;
 class LLVOVolume ;
+class LLMimeDiscoveryResponder;
 
 typedef LLPointer<LLViewerMediaImpl> viewer_media_t;
 ///////////////////////////////////////////////////////////////////////////////
@@ -73,6 +74,9 @@ class LLViewerMedia
 	LOG_CLASS(LLViewerMedia);
 	public:
 
+		// String to get/set media autoplay in gSavedSettings
+		static const char *AUTO_PLAY_MEDIA_SETTING;
+	
 		typedef std::vector<LLViewerMediaImpl*> impl_list;
 
 		// Special case early init for just web browser component
@@ -294,6 +298,7 @@ class LLViewerMediaImpl
 	EMediaNavState getNavState() { return mMediaNavState; }
 	void setNavState(EMediaNavState state);
 	
+	void cancelMimeTypeProbe();
 public:
 	// a single media url with some data and an impl.
 	LLPluginClassMedia* mMediaSource;
@@ -331,7 +336,8 @@ class LLViewerMediaImpl
 	bool mIsDisabled;
 	bool mIsParcelMedia;
 	S32 mProximity;
-
+	LLMimeDiscoveryResponder *mMimeTypeProbe;
+	
 private:
 	BOOL mIsUpdated ;
 	std::list< LLVOVolume* > mObjectList ;
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 7f25e567d03be190638c2b98a2b49a09138ba1f0..01531168870e840f536f7acc3fc6175ca778029a 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -43,7 +43,7 @@
 #include "llfloaterbump.h"
 #include "llassetstorage.h"
 #include "llcachename.h"
-#include "llchat.h"
+
 #include "lldbstrings.h"
 #include "lleconomy.h"
 #include "llfilepicker.h"
@@ -116,6 +116,7 @@
 #include "llui.h"			// for make_ui_sound
 #include "lluploaddialog.h"
 #include "llviewercamera.h"
+#include "llviewerchat.h"
 #include "llviewergenericmessage.h"
 #include "llviewerinventory.h"
 #include "llviewermenu.h"
@@ -1366,7 +1367,9 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
 
 	payload["from_id"] = info->mFromID;
 	args["OBJECTFROMNAME"] = info->mFromName;
-	args["NAME"] = info->mFromName;
+	args["NAME"] = LLSLURL::buildCommand("agent", info->mFromID, "about");
+	std::string verb = "highlight?name=" + msg;
+	args["ITEM_SLURL"] = LLSLURL::buildCommand("inventory", info->mObjectID, verb.c_str());
 
 	LLNotification::Params p("ObjectGiveItem");
 	p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2));
@@ -2249,7 +2252,7 @@ void process_decline_callingcard(LLMessageSystem* msg, void**)
 
 void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
 {
-	LLChat		chat;
+	LLChat	chat;
 	std::string		mesg;
 	std::string		from_name;
 	U8			source_temp;
@@ -2849,7 +2852,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
 			// Chat the "back" SLURL. (DEV-4907)
 			LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL());
 			chat.mSourceType = CHAT_SOURCE_SYSTEM;
- 			LLFloaterChat::addChatHistory(chat);
+ 		    LLFloaterChat::addChatHistory(chat);
 
 			// Set the new position
 			avatarp->setPositionAgent(agent_pos);
@@ -4621,7 +4624,7 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp
 		if (caution)
 		{
 			LLChat chat(notice.getString());
-			LLFloaterChat::addChat(chat, FALSE, FALSE);
+	//		LLFloaterChat::addChat(chat, FALSE, FALSE);
 		}
 	}
 }
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 336d7f684e6f9731a7bf2ad06b7cfbb7738ad24f..7559fd8e72c0bdc4c84c86182d7fcd0d5f385ea2 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -324,10 +324,36 @@ std::string LLViewerParcelMedia::getMimeType()
 {
 	return sMediaImpl.notNull() ? sMediaImpl->getMimeType() : "none/none";
 }
+
+//static 
+std::string LLViewerParcelMedia::getURL()
+{
+	std::string url;
+	if(sMediaImpl.notNull())
+		url = sMediaImpl->getMediaURL();
+	
+	if (url.empty())
+		url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaCurrentURL();
+	
+	if (url.empty())
+		url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaURL();
+	
+	return url;
+}
+
+//static 
+std::string LLViewerParcelMedia::getName()
+{
+	if(sMediaImpl.notNull())
+		return sMediaImpl->getName();
+	return "";
+}
+
 viewer_media_t LLViewerParcelMedia::getParcelMedia()
 {
 	return sMediaImpl;
 }
+
 //////////////////////////////////////////////////////////////////////////////////////////
 // static
 void LLViewerParcelMedia::processParcelMediaCommandMessage( LLMessageSystem *msg, void ** )
diff --git a/indra/newview/llviewerparcelmedia.h b/indra/newview/llviewerparcelmedia.h
index 3f7f8983569a888b9ba2c4437d7f48cdf229061b..19e1ef78d43c30db888061415c6f7c50dd8bcbf1 100644
--- a/indra/newview/llviewerparcelmedia.h
+++ b/indra/newview/llviewerparcelmedia.h
@@ -71,6 +71,8 @@ class LLViewerParcelMedia : public LLViewerMediaObserver
 
 		static LLPluginClassMediaOwner::EMediaStatus getStatus();
 		static std::string getMimeType();
+		static std::string getURL();
+		static std::string getName();
 		static viewer_media_t getParcelMedia();
 
 		static void processParcelMediaCommandMessage( LLMessageSystem *msg, void ** );
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 9923c9ac74fcc1e35182848bb0237346f7614ced..85bc26c9c0e69637859e30e5e254a70bdc48a3e9 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -206,33 +206,31 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 wid
 LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(
 	                                               const LLUUID &image_id,											       
 												   BOOL usemipmaps,
-												   S32 boost_priority,
+												   LLViewerTexture::EBoostLevel boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format,
 												   LLHost request_from_host)
 {
-	llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ;
 	return gTextureList.getImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ;
 }
 	
 LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile(
 	                                               const std::string& filename,												   
 												   BOOL usemipmaps,
-												   S32 boost_priority,
+												   LLViewerTexture::EBoostLevel boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format, 
 												   const LLUUID& force_id)
 {
-	llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ;
 	return gTextureList.getImageFromFile(filename, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ;
 }
 
 //static 
 LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string& url,									 
 									 BOOL usemipmaps,
-									 S32 boost_priority,
+									 LLViewerTexture::EBoostLevel boost_priority,
 									 S8 texture_type,
 									 LLGLint internal_format,
 									 LLGLenum primary_format,
@@ -1485,9 +1483,8 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
 		if ( mBoostLevel > BOOST_HIGH)
 		{
 			priority += 10000000.f;
-		}
-		
-		if(mAdditionalDecodePriority > 0.0f)
+		}		
+		else if(mAdditionalDecodePriority > 0.0f)
 		{
 			// 1-9
 			S32 additional_priority = (S32)(1.0f + mAdditionalDecodePriority*8.0f + .5f); // round
@@ -3147,8 +3144,7 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()
 
 	if(mNeedsResetMaxVirtualSize)
 	{
-		mMaxVirtualSize = 0.f ;//reset
-		mNeedsResetMaxVirtualSize = FALSE ;
+		addTextureStats(0.f, FALSE) ;//reset
 	}
 
 	if(mIsPlaying) //media is playing
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index bde87d1dd5726d7105a15669bc2ce634a8743723..141979052d7636ca1d48cb28f0a0df3fbb8f65b4 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -107,12 +107,11 @@ class LLViewerTexture : public LLTexture
 
 	enum EBoostLevel
 	{
-		//skip 0 and 1 to avoid mistakenly mixing boost level with boolean numbers.
-		BOOST_NONE 			= 2,
-		BOOST_AVATAR_BAKED	= 3,
-		BOOST_AVATAR		= 4,
-		BOOST_CLOUDS		= 5,
-		BOOST_SCULPTED      = 6,
+		BOOST_NONE 			= 0,
+		BOOST_AVATAR_BAKED	= 1,
+		BOOST_AVATAR		= 2,
+		BOOST_CLOUDS		= 3,
+		BOOST_SCULPTED      = 4,
 		
 		BOOST_HIGH 			= 10,
 		BOOST_TERRAIN		= 11, // has to be high priority for minimap / low detail
@@ -668,7 +667,7 @@ class LLViewerTextureManager
 
 	static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id,									 
 									 BOOL usemipmap = TRUE,
-									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -677,7 +676,7 @@ class LLViewerTextureManager
 	
 	static LLViewerFetchedTexture* getFetchedTextureFromFile(const std::string& filename,									 
 									 BOOL usemipmap = TRUE,
-									 S32 boost_priority = LLViewerTexture::BOOST_NONE,
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -686,7 +685,7 @@ class LLViewerTextureManager
 
 	static LLViewerFetchedTexture* getFetchedTextureFromUrl(const std::string& url,									 
 									 BOOL usemipmap = TRUE,
-									 S32 boost_priority = LLViewerTexture::BOOST_NONE,
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 081b7cc4831e0676803a8d2a0a04b80faf41dd5b..703a13976cfc7aa080e39a590532785a12603347 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -325,7 +325,7 @@ void LLViewerTextureList::restoreGL()
 
 LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& filename,												   
 												   BOOL usemipmaps,
-												   S32 boost_priority,
+												   LLViewerTexture::EBoostLevel boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format, 
@@ -345,7 +345,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&
 
 LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& url,
 												   BOOL usemipmaps,
-												   S32 boost_priority,
+												   LLViewerTexture::EBoostLevel boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format, 
@@ -411,7 +411,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string&
 
 LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,											       
 												   BOOL usemipmaps,
-												   S32 boost_priority,
+												   LLViewerTexture::EBoostLevel boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format,
@@ -441,7 +441,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,
 //when this function is called, there is no such texture in the gTextureList with image_id.
 LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,											       
 												   BOOL usemipmaps,
-												   S32 boost_priority,
+												   LLViewerTexture::EBoostLevel boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format,
@@ -1346,7 +1346,7 @@ LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority)
 
 	const BOOL use_mips = FALSE;
 	const LLRect scale_rect = LLRect::null;
-	return loadUIImageByID(image_id, use_mips, scale_rect, priority);
+	return loadUIImageByID(image_id, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);
 }
 
 LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priority)
@@ -1360,21 +1360,27 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priori
 
 	const BOOL use_mips = FALSE;
 	const LLRect scale_rect = LLRect::null;
-	return loadUIImageByName(image_name, image_name, use_mips, scale_rect, priority);
+	return loadUIImageByName(image_name, image_name, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);
 }
 
 LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename,
-											  BOOL use_mips, const LLRect& scale_rect, S32 boost_priority )
+											  BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority )
 {
-	if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI;
+	if (boost_priority == LLViewerTexture::BOOST_NONE)
+	{
+		boost_priority = LLViewerTexture::BOOST_UI;
+	}
 	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority);
 	return loadUIImage(imagep, name, use_mips, scale_rect);
 }
 
 LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id,
-											BOOL use_mips, const LLRect& scale_rect, S32 boost_priority)
+											BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority)
 {
-	if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI;
+	if (boost_priority == LLViewerTexture::BOOST_NONE)
+	{
+		boost_priority = LLViewerTexture::BOOST_UI;
+	}
 	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority);
 	return loadUIImage(imagep, id.asString(), use_mips, scale_rect);
 }
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index 3c9c81a689a50f36191220c3024d9631027a982f..028f8441ab0a44f48dadbe2dd38f580ca8ad5018 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -130,7 +130,7 @@ class LLViewerTextureList
 
 	LLViewerFetchedTexture * getImage(const LLUUID &image_id,									 
 									 BOOL usemipmap = TRUE,
-									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -139,7 +139,7 @@ class LLViewerTextureList
 	
 	LLViewerFetchedTexture * getImageFromFile(const std::string& filename,									 
 									 BOOL usemipmap = TRUE,
-									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -148,7 +148,7 @@ class LLViewerTextureList
 	
 	LLViewerFetchedTexture* getImageFromUrl(const std::string& url,
 									 BOOL usemipmap = TRUE,
-									 BOOL level_immediate = FALSE,		// Get the requested level immediately upon creation.
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -157,7 +157,7 @@ class LLViewerTextureList
 
 	LLViewerFetchedTexture* createImage(const LLUUID &image_id,
 									 BOOL usemipmap = TRUE,
-									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -228,9 +228,11 @@ class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIIm
 	static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
 private:
 	LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename,
-								   BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0);
+		                           BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, 
+		                           LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
 	LLUIImagePtr loadUIImageByID(const LLUUID& id,
-								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0);
+								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, 
+								 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
 
 	LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);
 
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index d93913b9443849d73a2d47f86c33b6897f19958c..ae32ec7d117e41768f2035706b7ea7f72a0f1705 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -870,29 +870,60 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s
 
 void LLVoiceChannelP2P::setState(EState state)
 {
-	// HACK: Open/close the call window if needed.
+	// *HACK: Open/close the call window if needed.
 	toggleCallWindowIfNeeded(state);
 	
-	// *HACK: open outgoing call floater if needed, might be better done elsewhere.
-	mCallDialogPayload["session_id"] = mSessionID;
-	mCallDialogPayload["session_name"] = mSessionName;
-	mCallDialogPayload["other_user_id"] = mOtherUserID;
-	if (!mReceivedCall && state == STATE_RINGING)
-	{
-		llinfos << "RINGINGGGGGGGG " << mSessionName << llendl;
-		if (!mSessionName.empty())
+	if (mReceivedCall) // incoming call
+	{
+		// you only "answer" voice invites in p2p mode
+		// so provide a special purpose message here
+		if (mReceivedCall && state == STATE_RINGING)
 		{
-			LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE);
+			gIMMgr->addSystemMessage(mSessionID, "answering", mNotifyArgs);
+			doSetState(state);
+			return;
 		}
 	}
-
-	// you only "answer" voice invites in p2p mode
-	// so provide a special purpose message here
-	if (mReceivedCall && state == STATE_RINGING)
+	else // outgoing call
 	{
-		gIMMgr->addSystemMessage(mSessionID, "answering", mNotifyArgs);
-		doSetState(state);
-		return;
+		mCallDialogPayload["session_id"] = mSessionID;
+		mCallDialogPayload["session_name"] = mSessionName;
+		mCallDialogPayload["other_user_id"] = mOtherUserID;
+		if (state == STATE_RINGING)
+		{
+			// *HACK: open outgoing call floater if needed, might be better done elsewhere.
+			// *TODO: should move this squirrelly ui-fudging crap into LLOutgoingCallDialog itself
+			if (!mSessionName.empty())
+			{
+				LLOutgoingCallDialog *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);
+				}
+			}
+		}
+		/*else if (state == STATE_CONNECTED)
+		{
+				LLOutgoingCallDialog *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(true);
+				}			
+				}*/
+		else if (state == STATE_HUNG_UP ||
+			 state == STATE_CONNECTED)
+		{
+				LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
+				if (ocd)
+				{
+					ocd->closeFloater();
+				}			
+		}
 	}
+
 	LLVoiceChannel::setState(state);
 }
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index fe24c300228451676be20ee9494730e75cd82cb3..5fedfc943bfe9caf3a34e640d219ece4e65e97a7 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -1598,7 +1598,7 @@ void LLVoiceClient::stateMachine()
 				}
 				else
 				{
-					LL_WARNS("Voice") << "region doesn't have ParcelVoiceInfoRequest capability.  This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;
+					LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability.  This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;
 				}
 			}
 		}
diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp
index 8d3165b98c65eb47d8d91759aee9cef25571d7bc..9897f40c4e96afbaa2b382f2abeaefa2f51847e3 100644
--- a/indra/newview/llworldmipmap.cpp
+++ b/indra/newview/llworldmipmap.cpp
@@ -196,7 +196,7 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32
 	// END DEBUG
 	//LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL;
 
-	LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+	LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 	img->setBoostLevel(LLViewerTexture::BOOST_MAP);
 
 	// Return the smart pointer
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 4c4b6a3899a139d5693df32244de20e7a2ae0375..d5293bdbb510b170910bd4bb397918b6a28e252a 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -23,13 +23,13 @@
   <texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" />
   <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" />
 
-  <texture name="AudioMute_Off.png" file_name="icons/AudioMute_Off.png" preload="false" />
-  <texture name="AudioMute_Over.png" file_name="icons/AudioMute_Over.png" preload="false" />
-  <texture name="AudioMute_Press.png" file_name="icons/AudioMute_Press.png" preload="false" />
+  <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" />
+  <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" />
+  <texture name="AudioMute_Press" file_name="icons/AudioMute_Press.png" preload="false" />
 
-  <texture name="Audio_Off.png" file_name="icons/Audio_Off.png" preload="false" />
-  <texture name="Audio_Over.png" file_name="icons/Audio_Over.png" preload="false" />
-  <texture name="Audio_Press.png" file_name="icons/Audio_Press.png" preload="false" />
+  <texture name="Audio_Off" file_name="icons/Audio_Off.png" preload="false" />
+  <texture name="Audio_Over" file_name="icons/Audio_Over.png" preload="false" />
+  <texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" />
 
   <texture name="BackArrow_Disabled" file_name="icons/BackArrow_Disabled.png" preload="false" />
   <texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" />
@@ -109,9 +109,9 @@
 
   <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
 
-  <texture name="ExternalBrowser_Off.png" file_name="icons/ExternalBrowser_Off.png" preload="false" />
-  <texture name="ExternalBrowser_Over.png" file_name="icons/ExternalBrowser_Over.png" preload="false" />
-  <texture name="ExternalBrowser_Press.png" file_name="icons/ExternalBrowser_Press.png" preload="false" />
+  <texture name="ExternalBrowser_Off" file_name="icons/ExternalBrowser_Off.png" preload="false" />
+  <texture name="ExternalBrowser_Over" file_name="icons/ExternalBrowser_Over.png" preload="false" />
+  <texture name="ExternalBrowser_Press" file_name="icons/ExternalBrowser_Press.png" preload="false" />
 
   <texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" />
   <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" />
@@ -338,12 +338,12 @@
  <texture name="parcel_lght_Voice" file_name="icons/parcel_lght_Voice.png" preload="false" />
  <texture name="parcel_lght_VoiceNo" file_name="icons/parcel_lght_VoiceNo.png" preload="false" />
 
-  <texture name="Pause_Off.png" file_name="icons/Pause_Off.png" preload="false" />
-  <texture name="Pause_Over.png" file_name="icons/Pause_Over.png" preload="false" />
-  <texture name="Pause_Press.png" file_name="icons/Pause_Press.png" preload="false" />
-  <texture name="Play_Off.png" file_name="icons/Play_Off.png" preload="false" />
-  <texture name="Play_Over.png" file_name="icons/Play_Over.png" preload="false" />
-  <texture name="Play_Press.png" file_name="icons/Play_Press.png" preload="false" />
+  <texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" />
+  <texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" />
+  <texture name="Pause_Press" file_name="icons/Pause_Press.png" preload="false" />
+  <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" />
+  <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" />
+  <texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" />
 
   <texture name="Progress_1" file_name="icons/Progress_1.png" preload="false" />
   <texture name="Progress_2" file_name="icons/Progress_2.png" preload="false" />
@@ -425,12 +425,12 @@
   <texture name="SegmentedBtn_Right_Selected_Press" file_name="widgets/SegmentedBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Right_Selected_Disabled" file_name="widgets/SegmentedBtn_Right_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
 
-  <texture name="SkipBackward_Off.png" file_name="icons/SkipBackward_Off.png" preload="false" />
-  <texture name="SkipBackward_Over.png" file_name="icons/SkipBackward_Over.png" preload="false" />
-  <texture name="SkipBackward_Press.png" file_name="icons/SkipBackward_Press.png" preload="false" />
-  <texture name="SkipForward_Off.png" file_name="icons/SkipForward_Off.png" preload="false" />
-  <texture name="SkipForward_Over.png" file_name="icons/SkipForward_Over.png" preload="false" />
-  <texture name="SkipForward_Press.png" file_name="icons/SkipForward_Press.png" preload="false" />
+  <texture name="SkipBackward_Off" file_name="icons/SkipBackward_Off.png" preload="false" />
+  <texture name="SkipBackward_Over" file_name="icons/SkipBackward_Over.png" preload="false" />
+  <texture name="SkipBackward_Press" file_name="icons/SkipBackward_Press.png" preload="false" />
+  <texture name="SkipForward_Off" file_name="icons/SkipForward_Off.png" preload="false" />
+  <texture name="SkipForward_Over" file_name="icons/SkipForward_Over.png" preload="false" />
+  <texture name="SkipForward_Press" file_name="icons/SkipForward_Press.png" preload="false" />
 
   <texture name="SliderTrack_Horiz" file_name="widgets/SliderTrack_Horiz.png" scale.left="4" scale.top="4" scale.right="100" scale.bottom="2" />
   <texture name="SliderTrack_Vert" file_name="widgets/SliderTrack_Vert.png" scale.left="2" scale.top="100" scale.right="4" scale.bottom="4" />
@@ -449,9 +449,9 @@
   <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="true" />
   <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="true" />
 
-  <texture name="StopReload_Off.png" file_name="icons/StopReload_Off.png" preload="false" />
-  <texture name="StopReload_Over.png" file_name="icons/StopReload_Over.png" preload="false" />
-  <texture name="StopReload_Press.png" file_name="icons/StopReload_Press.png" preload="false" />
+  <texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" />
+  <texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" />
+  <texture name="StopReload_Press" file_name="icons/StopReload_Press.png" preload="false" />
 
   <texture name="TabIcon_Appearance_Large" file_name="taskpanel/TabIcon_Appearance_Large.png" preload="false" />
   <texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" />
@@ -531,8 +531,8 @@
   <texture name="Toolbar_Right_Off" file_name="containers/Toolbar_Right_Off.png" preload="false" />
   <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" />
   <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" />
-  
-  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="1" scale.right="99" scale.bottom="14" />
+
+  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" />
 
   <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />
   <texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" />
@@ -563,9 +563,9 @@
 
   <texture name="YouAreHere_Badge" file_name="icons/YouAreHere_Badge.png" preload="false" />
 
-  <texture name="Zoom_Off.png" file_name="icons/Zoom_Off.png" preload="false" />
-  <texture name="Zoom_Over.png" file_name="icons/Zoom_Over.png" preload="false" />
-  <texture name="Zoom_Press.png" file_name="icons/Zoom_Press.png" preload="false" />
+  <texture name="Zoom_Off" file_name="icons/Zoom_Off.png" preload="false" />
+  <texture name="Zoom_Over" file_name="icons/Zoom_Over.png" preload="false" />
+  <texture name="Zoom_Press" file_name="icons/Zoom_Press.png" preload="false" />
 
   <!--WARNING OLD ART *do not use*-->
 
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 5c09bc3a02b338eacc634d029fe4fc7c4ae4cb76..f553184c19a12fe6e374e0133467af32eb4791b2 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -49,22 +49,57 @@
          top="22"
          visible="false"
          width="78" />
-         <!--TODO: replace with slider, + - images -->
- <joystick_zoom
-         follows="top|left"
-         height="78"
-         image_unselected="ScrollThumb_Vert"
-         layout="topleft"
-         left="7"
-         minus_image="ScrollThumb_Vert"
-         name="zoom"
-         plus_image="ScrollThumb_Vert"
-         quadrant="left"
-         scale_image="false"
-         sound_flags="3"
-         tool_tip="Zoom camera toward focus"
-         top="22"
-         width="20" />
+         <!--TODO: replace + - images -->
+         <panel
+            border="false"
+            class="camera_zoom_panel"
+            height="94"
+            layout="topleft"
+            left="7"
+            mouse_opaque="false"
+            name="zoom"
+            top="22"
+            width="18">
+           <button
+              follows="top|left"
+              height="18"
+              image_disabled="AddItem_Disabled"
+              image_selected="AddItem_Press"
+              image_unselected="AddItem_Off"
+              layout="topleft"
+              name="zoom_plus_btn"
+              width="18">
+             <commit_callback
+                function="Zoom.plus" />
+             <mouse_held_callback
+                function="Zoom.plus" />
+           </button>
+           <slider_bar
+              height="48"
+              layout="topleft"
+              name="zoom_slider"
+              orientation="vertical"
+              tool_tip="Zoom camera toward focus"
+              top_pad="0"
+              width="18">
+             <commit_callback function="Slider.value_changed"/>
+           </slider_bar>
+           <button
+              follows="top|left"
+              height="18"
+              image_disabled="AddItem_Disabled"
+              image_selected="AddItem_Press"
+              image_unselected="AddItem_Off"
+              layout="topleft"
+              name="zoom_minus_btn"
+              top_pad="0"
+              width="18">
+             <commit_callback
+                function="Zoom.minus" />
+             <mouse_held_callback
+                function="Zoom.minus" />
+           </button>
+         </panel>
          <joystick_rotate
          follows="top|left"
          height="78"
@@ -72,6 +107,7 @@
          image_unselected="Cam_Rotate_Out"
          layout="topleft"
          left="45"
+         mouse_opaque="false" 
          name="cam_rotate_stick"
          quadrant="left"
          scale_image="false"
@@ -80,7 +116,7 @@
          tool_tip="Orbit camera around focus"
          top="22"
          width="78" />
-            <panel
+         <panel
          height="78"
          layout="topleft"
          left="36"
diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml
index b23482655cf524845464bf121cd5188e966d7b5b..a3ac87820280ff57f6d81090b227d5bfd62f7291 100644
--- a/indra/newview/skins/default/xui/en/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_gesture.xml
@@ -84,21 +84,21 @@
                  top_delta="0"
                  width="18" />
                 <button
-                 follows="bottom|left"
+                 follows="bottom|right"
                  font="SansSerifBigBold"
                  height="18"
                  image_selected="TrashItem_Press"
                  image_unselected="TrashItem_Off"
                  image_disabled="TrashItem_Disabled"
                  layout="topleft"
-                 left_pad="230"
                  name="del_btn"
+                 right="-5"
                  tool_tip="Delete this gesture"
                  top_delta="0"
                  width="18" />
             </panel>
     <button
-     follows="bottom|right"
+     follows="left|bottom"
      height="23"
      label="Edit"
      layout="topleft"
@@ -107,7 +107,7 @@
      top_pad="5"
      width="83" />
     <button
-     follows="bottom|right"
+     follows="left|bottom"
      height="23"
      label="Play"
      layout="topleft"
@@ -116,7 +116,7 @@
      top_delta="0"
      width="83" />
     <button
-     follows="bottom|right"
+     follows="left|bottom"
      height="23"
      label="Stop"
      layout="topleft"
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 9c2898945ba7b150fd703a130899d45df4e850b5..526fda90d1d2333945bd82640ff0488ccbc57411 100644
--- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
@@ -12,7 +12,7 @@
  width="410">
     <floater.string
      name="localchat">
-        Local Voice Chat
+        Nearby Voice Chat
     </floater.string>
     <floater.string
      name="anonymous">
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 67137003720d9240031e2ccf9647b39767d25219..82417de8a7dcfdb1dd490ad0abc428fa2fb79218 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -12,7 +12,7 @@
  width="410">
     <floater.string
      name="localchat">
-        Local Voice Chat
+        Nearby Voice Chat
     </floater.string>
     <floater.string
      name="anonymous">
@@ -35,6 +35,18 @@
      left_delta="19"
      top="35"
      width="36" />
+    <text
+     font="SansSerifLarge"
+     height="20"
+     layout="topleft"
+     left="77"
+     name="connecting"
+     top="27"
+     visible="false"
+     width="315"
+     word_wrap="true">
+Connecting to [CALLEE_NAME]
+    </text>
     <text
      font="SansSerifLarge"
      height="20"
@@ -60,6 +72,8 @@ Leaving [CURRENT_CHAT].
     <button
      height="24"
      label="Cancel"
+     label_selected="Cancel"
+     left="70"
      layout="topleft"
      name="Cancel"
      left_pad="10"
diff --git a/indra/newview/skins/default/xui/en/floater_test_slider.xml b/indra/newview/skins/default/xui/en/floater_test_slider.xml
index 57d8e686ce3d5235a2a9003a90d6d00b86c8071a..86ff82e01f2b244ef5b08cfbdcfc31ce7b2e3b47 100644
--- a/indra/newview/skins/default/xui/en/floater_test_slider.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_slider.xml
@@ -57,6 +57,13 @@
      width="200" />
     <slider_bar
      bottom="320"
+     height="100"
+     left="20"
+     name="slider_bar_vertical"
+     orientation="vertical"
+     width="20" />
+    <slider_bar
+     bottom="300"
      height="20"
      increment="1"
      initial_value="2.0"
@@ -64,6 +71,7 @@
      layout="topleft"
      max_val="5"
      min_val="1"
+     left_pad="20"
      name="slider_bar"
      width="300" />
     <slider
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index c33d7cf31d8e0c263af15d0687789ea5644c66f8..b2f46bc433959005105f0372a73c4995c9748d82 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -262,6 +262,18 @@
 		  <check_box.commit_callback
 			function="BuildTool.selectComponent"/>
 	</check_box>
+
+   <text
+   text_color="LtGray_50"
+   follows="top|left"
+   halign="left"
+   left="13"
+   name="RenderingCost"
+   top_pad="9"
+   type="string"
+   width="100">
+   þ: [COUNT]
+   </text>
 	<check_box
      control_name="ScaleUniform"
      height="19"
@@ -325,7 +337,7 @@
 	 <button.commit_callback
 	     function="BuildTool.gridOptions"/>
 	</button>
-    <button
+   <button
      follows="left|top"
      height="20"
      image_disabled="Object_Cube"
@@ -701,6 +713,7 @@
 	     function="BuildTool.applyToSelection"/>
     </button>
     <text
+    text_color="LtGray_50"
      type="string"
      length="1"
      height="12"
@@ -714,6 +727,7 @@
         Objects: [COUNT]
     </text>
     <text
+    text_color="LtGray_50"
      type="string"
      length="1"
      follows="left|top"
@@ -730,7 +744,7 @@
      halign="center"
      left="0"
      name="Object Info Tabs"
-     tab_max_width="55"
+     tab_max_width="54"
      tab_min_width="40"
      tab_position="top"
      tab_height="25"
diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml
index 4e2cce1428c392baeb908d6bcca5d8af31bdd722..1adb824e2a6ad6ff4956db4b9167488a13221699 100644
--- a/indra/newview/skins/default/xui/en/floater_tos.xml
+++ b/indra/newview/skins/default/xui/en/floater_tos.xml
@@ -53,22 +53,6 @@
         Please read the following Terms of Service carefully. To continue logging in to [SECOND_LIFE],
 you must accept the agreement.
     </text>
-    <text_editor
-     type="string"
-     length="1"
-     follows="left|top"
-     font="SansSerif"
-     height="283"
-     layout="topleft"
-     left_delta="0"
-     max_length="65536"
-     name="tos_text"
-     top_pad="43"
-     width="568"
-     handle_edit_keys_directly="true" 
-     word_wrap="true">
-        TOS_TEXT
-    </text_editor>
     <web_browser
      follows="left|top"
      height="340"
@@ -76,6 +60,6 @@ you must accept the agreement.
      left_delta="0"
      name="tos_html"
      start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E"
-     top_delta="-27"
+     top_delta="0"
      width="568" />
 </floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml
index e5e5007c5651af7cf5d4d0848b80b5d1d464537c..f48af2f97eb3e43be9c548dc9cb760ac2fe2adf3 100644
--- a/indra/newview/skins/default/xui/en/inspect_group.xml
+++ b/indra/newview/skins/default/xui/en/inspect_group.xml
@@ -31,7 +31,7 @@
      use_ellipses="true"
      width="240"
      word_wrap="false">
-    Grumpity's Grumpy Group of Moose
+    Grumpity&apos;s Grumpy Group of Moose
   </text>
   <text
    follows="all"
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 08f7ee456e4361b269bf0cb965bd6e3ef82ba9b4..9e35c95d45a8e76daa75d028d91f126e7def1e7f 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -51,6 +51,13 @@
                name="main_view"
                user_resize="true"
                width="500">
+          <view bottom="500"
+                follows="all"
+                height="500"
+                left="0"
+                mouse_opaque="false"
+                name="world_view_rect"
+                width="500"/>
           <layout_stack border_size="0"
                         bottom="500"
                         follows="all"
@@ -66,13 +73,6 @@
                    mouse_opaque="false"
                    name="hud container"
                    width="500">
-              <view bottom="500"
-                    follows="all"
-                    height="500"
-                    left="0"
-                    mouse_opaque="false"
-                    name="world_view_rect"
-                    width="500"/>
               <panel follows="right|top|bottom"
                      height="500"
                      mouse_opaque="false"
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index bd60574a9558e44ac23e58ba7b3ed2fb48d3c37a..07940e18b628a1fcdd750736b4215619b018ef79 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -193,6 +193,13 @@
              function="ShowFloater"
              parameter="test_widgets" />
         </menu_item_call>
+        <menu_item_call
+         label="Inspectors Test"
+         name="Inspectors Test">
+            <menu_item_call.on_click
+             function="ShowFloater"
+             parameter="test_inspectors" />
+        </menu_item_call>
       <menu_item_check
          label="Reg In Client Test (restart)"
          name="Reg In Client Test (restart)">
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 6dd44255bf30c2fcb9b8ad5851df2b39a1305174..304492bedb2c330abba093bc6d2d9a20b62ea7db 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
@@ -13,15 +13,11 @@
        function="CheckControl"
        parameter="GroupListShowIcons" />
   </menu_item_check>
-  <menu_item_check
+  <menu_item_call
    label="Leave Selected Group"
    layout="topleft"
    name="Leave Selected Group">
-      <menu_item_check.on_click
-       function="People.Groups.ViewSort.Action"
-       parameter="show_icons" />
-      <menu_item_check.on_check
-       function="CheckControl"
-       parameter="GroupListShowIcons" />
-  </menu_item_check>
+      <menu_item_call.on_click
+       function="People.Group.Minus.Action"/>
+  </menu_item_call>
 </menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index ff0cd7ffebe57e63c054380c22739992763137f1..9fe03859bb590329021f8e8cfad74ff69f38f30f 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4957,8 +4957,9 @@ No valid parcel could be found.
   <notification
    icon="notify.tga"
    name="ObjectGiveItem"
-   type="notify">
-An object named [OBJECTFROMNAME] owned by [FIRST] [LAST] has given you a [OBJECTTYPE] named [OBJECTNAME].
+   type="offer">
+An object named [OBJECTFROMNAME] owned by [NAME] has offered you [OBJECTTYPE]:
+[ITEM_SLURL]
     <form name="form">
       <button
        index="0"
@@ -5000,7 +5001,8 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
    icon="notify.tga"
    name="UserGiveItem"
    type="offer">
-[NAME] has given you a [OBJECTTYPE] named &apos;[OBJECTNAME]&apos;.
+[NAME] has offered you [OBJECTTYPE]:
+[ITEM_SLURL]
     <form name="form">
       <button
        index="0"
@@ -5585,7 +5587,7 @@ We&apos;re sorry.  This area has reached maximum capacity for voice conversation
    icon="notifytip.tga"
    name="VoiceChannelDisconnected"
    type="notifytip">
-You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnected to spatial voice chat.
+You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnected to Nearby Voice Chat.
     <unique>
       <context key="VOICE_CHANNEL_NAME"/>
     </unique>
@@ -5595,7 +5597,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnect
    icon="notifytip.tga"
    name="VoiceChannelDisconnectedP2P"
    type="notifytip">
-[VOICE_CHANNEL_NAME] has ended the call.  You will now be reconnected to spatial voice chat.
+[VOICE_CHANNEL_NAME] has ended the call.  You will now be reconnected to Nearby Voice Chat.
     <unique>
       <context key="VOICE_CHANNEL_NAME"/>
     </unique>
@@ -5605,7 +5607,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnect
    icon="notifytip.tga"
    name="P2PCallDeclined"
    type="notifytip">
-[VOICE_CHANNEL_NAME] has declined your call.  You will now be reconnected to spatial voice chat.
+[VOICE_CHANNEL_NAME] has declined your call.  You will now be reconnected to Nearby Voice Chat.
     <unique>
       <context key="VOICE_CHANNEL_NAME"/>
     </unique>
@@ -5615,7 +5617,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnect
    icon="notifytip.tga"
    name="P2PCallNoAnswer"
    type="notifytip">
-[VOICE_CHANNEL_NAME] is not available to take your call.  You will now be reconnected to spatial voice chat.
+[VOICE_CHANNEL_NAME] is not available to take your call.  You will now be reconnected to Nearby Voice Chat.
     <unique>
       <context key="VOICE_CHANNEL_NAME"/>
     </unique>
@@ -5625,7 +5627,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnect
    icon="notifytip.tga"
    name="VoiceChannelJoinFailed"
    type="notifytip">
-Failed to connect to [VOICE_CHANNEL_NAME], please try again later.  You will now be reconnected to spatial voice chat.
+Failed to connect to [VOICE_CHANNEL_NAME], please try again later.  You will now be reconnected to Nearby Voice Chat.
     <unique>
       <context key="VOICE_CHANNEL_NAME"/>
     </unique>
@@ -5739,6 +5741,15 @@ Are you sure you want to delete your teleport history?
      yestext="OK"/>
   </notification>
 
+  <notification
+   icon="alert.tga"
+   name="BottomTrayButtonCanNotBeShown"
+   type="alert">
+Selected button can not be shown right now.
+The button will be shown when there is enough space for it.
+  </notification>
+
+
   <global name="UnsupportedCPU">
 - Your CPU speed does not meet the minimum requirements.
   </global>
diff --git a/indra/newview/skins/default/xui/en/panel_activeim_row.xml b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
index 8b815b0f711cc1cde2702d8bf90f7670fe6bdba9..38294c907a3fab60aad946015d2c9812ffcc8a50 100644
--- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml
+++ b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
@@ -7,7 +7,9 @@
 	left="0"
 	height="35"
 	width="318"
-	background_visible="false">
+  background_opaque="false"
+  background_visible="true"
+  bg_alpha_color="0.0 0.0 0.0 0.0" >
   <chiclet_im_p2p
 		name="p2p_chiclet"
 		layout="topleft"
@@ -15,7 +17,16 @@
 		top="3"
 		left="5"
 		height="25"
-		width="25">
+		width="25"
+    visible="false"
+    speaker.name="speaker_p2p"
+    speaker.width="20"
+    speaker.height="25"
+    speaker.left="25"
+    speaker.top="25"
+    speaker.auto_update="true"
+    speaker.draw_border="false"
+    speaker.visible="false">
   </chiclet_im_p2p>
   <chiclet_im_group
 		name="group_chiclet"
@@ -24,14 +35,41 @@
 		top="3"
 		left="5"
 		height="25"
-		width="25">
+		width="25"
+    visible="false"
+    speaker.name="speaker_grp"
+    speaker.width="20"
+    speaker.height="25"
+    speaker.left="25"
+    speaker.top="25"
+    speaker.auto_update="true"
+    speaker.draw_border="false"
+    speaker.visible="false">
   </chiclet_im_group>
+  <chiclet_im_adhoc
+		name="adhoc_chiclet"
+		layout="topleft"
+		follows="left"
+		top="3"
+		left="5"
+		height="25"
+		width="25"
+    visible="false"
+    speaker.name="speaker_hoc"
+    speaker.width="20"
+    speaker.height="25"
+    speaker.left="25"
+    speaker.top="25"
+    speaker.auto_update="true"
+    speaker.draw_border="false"
+    speaker.visible="false">
+  </chiclet_im_adhoc>
 	<text
 		type="string"
 		name="contact_name"
 		layout="topleft"
 		top="10"
-		left_pad="0"
+		left_pad="20"
 		height="14"
 		width="245"
 		length="1"
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 3c16a439d9a998f04fbf5a4a667b329d7a1f07f2..a902f50582431ce571deb58fa79fdc83fb3bcd3b 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -333,6 +333,6 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
          min_width="4" 
          right="-1"
          top="0"
-         width="26"/>
+         width="4"/>
     </layout_stack>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml
index ef3120174e8cb3337ff91ac1366f13df3c75b6b9..984a799b41a8ac8991fc18ef477dd355c820040d 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml
@@ -1,77 +1,117 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel background_visible="true" bevel_style="in" bg_alpha_color="0 0 0 0"
-	height="155" label="instant_message" layout="topleft" left="0"
-	name="panel_group_notify" top="0" width="350">
-    <string
-     name="message_max_lines_count">
-        4
-    </string>
-	<panel follows="top" background_visible="true" bevel_style="in" bg_alpha_color="black"
-		height="30" label="header" layout="topleft" left="0" name="header"
-		top="0" width="350">
-		<icon follows="left|top|right|bottom" height="20"  width="20" layout="topleft"
-			top="5"  left="5" mouse_opaque="true" name="group_icon"/>
-		<text type="string" length="1" follows="left|top|right|bottom"
-			font="SansSerifBigBold" height="20" layout="topleft" left_pad="10" name="title"
-			text_color="GroupNotifyTextColor" top="5" width="275" use_ellipses="true">
-			Sender Name / Group Name
-        </text>
-	</panel>
-	<text
-     follows="top"
-     height="20"
-     layout="topleft"
-     left="25"
-     name="subject"
-     text_color="GroupNotifyTextColor"
-     font="SansSerifBig"
-     top="40"
-     use_ellipses="true"
-     value="subject"
-     width="300"
-     word_wrap="true">
-     subject 
-    </text>
-    <text
-     follows="top"
-     height="20"
-     layout="topleft"
-     left="25"
-     name="datetime"
-     text_color="GroupNotifyTextColor"
-     font="SansSerif"
-     top="80"
-     use_ellipses="true"
-     value="datetime"
-     width="300"
-     word_wrap="true">
-     datetime
-    </text>
-    <text
-     follows="left|top|bottom|right"
-     height="0"
-     layout="topleft"
-     left="25"
-     name="message"
-     text_color="GroupNotifyTextColor"
-     top="100"
-     use_ellipses="true"
-     value="message"
-     width="300"
-     word_wrap="true"
-     visible="true" >
-    </text>
-    <icon
-	  follows="left|bottom|right" height="15" width="15"
-		layout="topleft" bottom="122" left="25" mouse_opaque="true" name="attachment_icon" visible="true"
-	/>
-	<text font="SansSerif" font.style="UNDERLINE" font_shadow="none"
-		type="string" length="1" follows="left|bottom|right" layout="topleft"
-		left="45" bottom="122" height="15" width="280" name="attachment"
-		text_color="GroupNotifyTextColor" visible="true">
-		Attachment
-     </text>
-
-	<button label="OK" layout="topleft" bottom="145" left="140" height="20"
-		width="70" name="btn_ok" follows="bottom" />
-</panel>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bevel_style="in"
+ bg_alpha_color="0 0 0 0"
+ height="135"
+ label="instant_message"
+ layout="topleft"
+ left="0"
+ name="panel_group_notify"
+ top="0"
+ width="305">
+    <string
+     name="message_max_lines_count"
+     value="4" />
+    <panel
+     background_visible="true"
+     bevel_style="in"
+     bg_alpha_color="black"
+     follows="top"
+     height="30"
+     label="header"
+     layout="topleft"
+     left="0"
+     name="header"
+     top="0"
+     width="305">
+        <icon
+         follows="left|top|right|bottom"
+         height="20"
+         layout="topleft"
+         left="5"
+         mouse_opaque="true"
+         name="group_icon"
+         top="5"
+         width="20" />
+        <text
+         follows="left|top|right|bottom"
+         font="SansSerifBigBold"
+         height="20"
+         layout="topleft"
+         left_pad="10"
+         name="title"
+         text_color="GroupNotifyTextColor"
+         top="5"
+         use_ellipses="true"
+         value="Sender Name / Group Name"
+         width="230" />
+    </panel>
+    <text
+     follows="top"
+     font="SansSerifBig"
+     height="20"
+     layout="topleft"
+     left="25"
+     name="subject"
+     text_color="GroupNotifyTextColor"
+     top="40"
+     use_ellipses="true"
+     value="subject"
+     width="270"
+     wrap="true" />
+    <text
+     follows="top"
+     font="SansSerif"
+     height="20"
+     layout="topleft"
+     left="25"
+     name="datetime"
+     text_color="GroupNotifyTextColor"
+     top="80"
+     use_ellipses="true"
+     value="datetime"
+     width="270"
+     wrap="true" />
+    <text
+     follows="left|top|bottom|right"
+     height="0"
+     layout="topleft"
+     left="25"
+     name="message"
+     text_color="GroupNotifyTextColor"
+     top="100"
+     use_ellipses="true"
+     value="message"
+     width="270"
+     wrap="true" />
+    <icon
+     bottom="122"
+     follows="left|bottom|right"
+     height="15"
+     layout="topleft"
+     left="25"
+     mouse_opaque="true"
+     name="attachment_icon"
+     width="15" />
+    <text
+     bottom="122"
+     follows="left|bottom|right"
+     font="SansSerif"
+     height="15"
+     layout="topleft"
+     left="45"
+     name="attachment"
+     text_color="GroupNotifyTextColor"
+     value="Attachment"
+     width="280" />
+    <button
+     bottom="130"
+     follows="bottom"
+     height="20"
+     label="OK"
+     layout="topleft"
+     left="25"
+     name="btn_ok"
+     width="70" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index 1ef845b769f7b7c8852fe9caadfa3e9266f8381b..ecf35523cd863b862cabbd33cf79e0049d440287 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -23,11 +23,11 @@
      layout="topleft"
      left_delta="7"
      left="0"
-     max_length="254"
+     max_length="512"
      name="chat_box"
      tool_tip="Press Enter to say, Ctrl+Enter to shout"
      top="0"
-     width="250" />
+     width="279" />
     <output_monitor
      auto_update="true"
      follows="right"
diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 34a185fb44a23bb1e672f8ce58a8c3a4330a6f8b..462188ee24a84c572fea52248f018032c81caf32 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -10,7 +10,7 @@
   left="0"
   name="notification_panel"
   top="0"
-  	height="10"
+  	height="140"
   width="305">
   <!-- THIS PANEL CONTROLS TOAST HEIGHT? -->
   <panel
@@ -20,18 +20,18 @@
   bg_alpha_color="0.3 0.3 0.3 0"
   bg_opaque_color="0.3 0.3 0.3 0"
     follows="left|right|top"
-    height="10"
+    height="100"
     label="info_panel"
     layout="topleft"
     left="0"
     name="info_panel"
     top="0"
     width="305">
-  <!--  <text
+    <text
       border_visible="false"
       follows="left|right|top|bottom"
       font="SansSerif"
-      height="90"
+      height="85"
       layout="topleft"
       left="10"
       name="text_box"
@@ -39,21 +39,21 @@
       text_color="white"
       top="10"
       visible="false" 
-      width="300"
+      width="285"
       wrap="true"/>
     <text
       border_visible="false"
       follows="left|right|top|bottom"
       font="SansSerifBold"
-      height="90"
+      height="85"
       layout="topleft"
-      left="45"
+      left="10"
       name="caution_text_box"
       text_color="1 0.82 0.46 1"
-      top="5"
+      top="10"
       visible="false"
-      width="300"
-      wrap="true"/>  -->
+      width="285"
+      wrap="true"/>
     <text_editor
     	h_pad="0"
 	v_pad="0"
@@ -63,6 +63,7 @@
       enabled="false"
       follows="left|right|top|bottom"
       font="SansSerif"
+      height="85" 
       layout="topleft"
       left="10"
       mouse_opaque="false"
@@ -74,17 +75,20 @@
       top="10"
       visible="false"
       width="285"
-      wrap="true"/>
+      wrap="true"
+      parse_highlights="true"
+      allow_html="true"/>
   </panel>
   <panel
     background_visible="false"
     follows="left|right|bottom"
+    height="40" 
     label="control_panel"
     layout="topleft"
     left="0"
     left_delta="-38"
     name="control_panel"
-    top="20">
+    top_pad="0">
   </panel>
   <!--
   <icon
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 3bdd7114eedaba636a4f5c019979aee0ea0e2554..70c5d7b82392146fda33573df30b7c919c9def88 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
@@ -2,19 +2,18 @@
 <panel
 	follows="left|right|top|bottom"
 	name="MediaControls"
-	bg_alpha_color="1 1 1 0"
+	background_visible="false"
 	height="160"
 	layout="topleft"
 	mouse_opaque="false"
 	width="800">
+  <string name="control_background_image_name">Inspector_Background</string>
   <panel
 	  name="media_region"
 	  bottom="125"
 	  follows="left|right|top|bottom"
 	  layout="topleft"
-	  left="20"
 	  mouse_opaque="false"
-	  right="-20"
 	  top="20" />
   <layout_stack
 	  follows="left|right|bottom"
@@ -33,6 +32,7 @@
 		name="media_progress_indicator"
 		height="22"
 		layout="topleft"
+		visible="false"
 		left="0"
 		top="0"
 		auto_resize="false"
@@ -64,6 +64,7 @@
 	  top="128">
 	<!-- outer layout_panels center the inner one -->
 	<layout_panel
+		name="left_bookend"
 		width="0"
 		layout="topleft"
 		user_resize="false" />
@@ -83,6 +84,7 @@
 		  layout="topleft"
 		  tool_tip="Step back"
 		  width="22"
+		  left="0"
 		  top_delta="4">
 		<button.commit_callback
 			function="MediaCtrl.Back" />
@@ -109,22 +111,22 @@
 			function="MediaCtrl.Forward" />
 	  </button>
 	</layout_panel>
-<!--
-	<panel
+	<!--
+		<panel
 		height="22"
 		layout="topleft"
 		auto_resize="false"
 		min_width="3"
 		width="3">
-	  <icon
-		  height="22"
-		  image_name="media_panel_divider.png"
-		  layout="topleft"
-		  top="0"
-		  min_width="3"
-		  width="3" />
-	</panel>
--->
+		<icon
+		height="22"
+		image_name="media_panel_divider.png"
+		layout="topleft"
+		top="0"
+		min_width="3"
+		width="3" />
+		</panel>
+	-->
 	<layout_panel
 		name="home"
 		auto_resize="false"
@@ -165,22 +167,22 @@
 			function="MediaCtrl.Stop" />
 	  </button>
 	</layout_panel>
-<!--
-	<panel
+	<!--
+		<panel
 		height="22"
 		layout="topleft"
 		auto_resize="false"
 		min_width="3"
 		width="3">
-	  <icon
-		  height="22"
-		  image_name="media_panel_divider.png"
-		  layout="topleft"
-		  top="0"
-		  min_width="3"
-		  width="3" />
-	</panel>
--->
+		<icon
+		height="22"
+		image_name="media_panel_divider.png"
+		layout="topleft"
+		top="0"
+		min_width="3"
+		width="3" />
+		</panel>
+	-->
 	<layout_panel
 		name="reload"
 		auto_resize="false"
@@ -294,31 +296,43 @@ function="MediaCtrl.CommitURL" />
 			function="MediaCtrl.CommitURL"/>
 	  </line_editor>
 	  <layout_stack
+		  name="media_address_url_icons"
 		  animate="false"
 		  follows="right"
-		  width="32"
-		  min_width="32"
-		  height="16"
-		  top="3"
-		  orientation="horizontal"
-		  left_pad="-38">
-		<icon
-			name="media_whitelist_flag"
-			follows="top|right"
-			height="16"
-			image_name="smicon_warn.tga"
+		  height="20"
+		  width="38"
+		  right="-2"
+		  top="-1"
+		  orientation="horizontal">
+		<layout_panel
 			layout="topleft"
-			tool_tip="White List enabled"
-			min_width="16"
-			width="16" />
-		<icon
-			name="media_secure_lock_flag"
-			height="16"
-			image_name="inv_item_eyes.tga"
+			width="16"
+			auto_resize="false"
+			user_resize="false">
+		  <icon
+			  name="media_whitelist_flag"
+			  follows="top|right"
+			  height="16"
+			  image_name="smicon_warn.tga"
+			  layout="topleft"
+			  tool_tip="White List enabled"
+			  min_width="16"
+			  width="16" />
+		</layout_panel>
+		<layout_panel
 			layout="topleft"
-			tool_tip="Secured Browsing"
-			min_width="16"
-			width="16" />
+			width="16"
+			auto_resize="false"
+			user_resize="false">
+		  <icon
+			  name="media_secure_lock_flag"
+			  height="16"
+			  image_name="icon_lock.tga"
+			  layout="topleft"
+			  tool_tip="Secured Browsing"
+			  min_width="16"
+			  width="16" />
+		</layout_panel>
 	  </layout_stack>
 	</layout_panel>
 	<layout_panel
@@ -412,9 +426,9 @@ function="MediaCtrl.CommitURL" />
 	  </button>
 	</layout_panel>
 	<!-- Scroll pad -->
-<!--
-disabled
-	<layout_panel
+	<!--
+		disabled
+		<layout_panel
 		name="media_panel_scroll"
 		auto_resize="false"
 		user_resize="false"
@@ -423,64 +437,64 @@ disabled
 		layout="topleft"
 		min_width="32"
 		width="32">
-	  <icon
-		  height="32"
-		  image_name="media_panel_scrollbg.png"
-		  layout="topleft"
-		  top="0"
-		  min_width="32"
-		  width="32" />
-	  <button
-		  name="scrollup"
-		  height="8"
-		  image_selected="media_btn_scrollup.png"
-		  image_unselected="media_btn_scrollup.png"
-		  layout="topleft"
-		  tool_tip="Scroll up"
-		  scale_image="false"
-		  left="12"
-		  top_delta="4"
-		  min_width="8"
-		  width="8" />
-	  <button
-		  name="scrollleft"
-		  height="8"
-		  image_selected="media_btn_scrollleft.png"
-		  image_unselected="media_btn_scrollleft.png"
-		  layout="topleft"
-		  left="3"
-		  tool_tip="Scroll left"
-		  scale_image="false"
-		  top="12"
-		  min_width="8"
-		  width="8" />
-	  <button
-		  name="scrollright"
-		  height="8"
-		  image_selected="media_btn_scrollright.png"
-		  image_unselected="media_btn_scrollright.png"
-		  layout="topleft"
-		  left_pad="9"
-		  tool_tip="Scroll right"
-		  scale_image="false"
-		  top_delta="0"
-		  min_width="8"
-		  width="8" />
-	  <button
-		  name="scrolldown"
-		  height="8"
-		  image_selected="media_btn_scrolldown.png"
-		  image_unselected="media_btn_scrolldown.png"
-		  layout="topleft"
-		  left="12"
-		  tool_tip="Scroll down"
-		  scale_image="false"
-		  top="20"
-		  min_width="8"
-		  width="8" />
-	</layout_panel>
-disabled
--->
+		<icon
+		height="32"
+		image_name="media_panel_scrollbg.png"
+		layout="topleft"
+		top="0"
+		min_width="32"
+		width="32" />
+		<button
+		name="scrollup"
+		height="8"
+		image_selected="media_btn_scrollup.png"
+		image_unselected="media_btn_scrollup.png"
+		layout="topleft"
+		tool_tip="Scroll up"
+		scale_image="false"
+		left="12"
+		top_delta="4"
+		min_width="8"
+		width="8" />
+		<button
+		name="scrollleft"
+		height="8"
+		image_selected="media_btn_scrollleft.png"
+		image_unselected="media_btn_scrollleft.png"
+		layout="topleft"
+		left="3"
+		tool_tip="Scroll left"
+		scale_image="false"
+		top="12"
+		min_width="8"
+		width="8" />
+		<button
+		name="scrollright"
+		height="8"
+		image_selected="media_btn_scrollright.png"
+		image_unselected="media_btn_scrollright.png"
+		layout="topleft"
+		left_pad="9"
+		tool_tip="Scroll right"
+		scale_image="false"
+		top_delta="0"
+		min_width="8"
+		width="8" />
+		<button
+		name="scrolldown"
+		height="8"
+		image_selected="media_btn_scrolldown.png"
+		image_unselected="media_btn_scrolldown.png"
+		layout="topleft"
+		left="12"
+		tool_tip="Scroll down"
+		scale_image="false"
+		top="20"
+		min_width="8"
+		width="8" />
+		</layout_panel>
+		disabled
+	-->
 	<layout_panel
 		name="zoom_frame"
 		auto_resize="false"
@@ -520,22 +534,22 @@ disabled
 			function="MediaCtrl.Close" />
 	  </button>
 	</layout_panel>
-<!--
-	<panel
+	<!--
+		<panel
 		height="22"
 		layout="topleft"
 		auto_resize="false"
 		min_width="3"
 		width="3">
-	  <icon
-		  height="22"
-		  image_name="media_panel_divider.png"
-		  layout="topleft"
-		  top="0"
-		  min_width="3"
-		  width="3" />
-	</panel>
--->
+		<icon
+		height="22"
+		image_name="media_panel_divider.png"
+		layout="topleft"
+		top="0"
+		min_width="3"
+		width="3" />
+		</panel>
+	-->
 	<layout_panel
 		name="new_window"
 		auto_resize="false"
@@ -556,23 +570,25 @@ disabled
 			function="MediaCtrl.Open" />
 	  </button>
 	</layout_panel>
-<!--
-	<panel
+	<!--
+		<panel
 		height="22"
 		layout="topleft"
 		auto_resize="false"
 		min_width="3"
 		width="3">
-	  <icon
-		  height="22"
-		  image_name="media_panel_divider.png"
-		  layout="topleft"
-		  top="0"
-		  min_width="3"
-		  width="3" />
-	</panel>
--->
+		<icon
+		height="22"
+		image_name="media_panel_divider.png"
+		layout="topleft"
+		top="0"
+		min_width="3"
+		width="3" />
+		</panel>
+	-->
+	<!-- bookend panel -->
 	<layout_panel
+		name="right_bookend"
 		width="0"
 		layout="topleft"
 		user_resize="false" />
diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
index 9636e321870a9edab4944ca0df262dc0ba893e81..566fc95230b3a7cbd52aa00df9b1e64f00f793e8 100644
--- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
+++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
@@ -227,7 +227,7 @@
          right="-10"
          top="10"
          width="20"
-         image_name="TabIcon_Inventory_Selected"/>
+         image_name="TabIcon_Things_Selected"/>
         <text
          follows="all"
          height="90"
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 1171a8f0b5d8a20ae6630a11778e873c3d706d83..8fc78c670195d4b858b56db1d46c4c15b54a1852 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -46,14 +46,24 @@
      font="SansSerifSmall"
      image_selected="BuyArrow_Over"
      image_unselected="BuyArrow_Off"
-	image_pressed="BuyArrow_Press"
+     image_pressed="BuyArrow_Press"
      height="16"
-     left="-220"
+     left="-245"
      name="buycurrency"
      pad_right="22px"
      tool_tip="My Balance: Click to buy more L$"
      top="1"
      width="117" />
+    <button
+     follows="right|bottom"
+     height="16"
+     image_selected="parcel_drk_VoiceNo"
+     image_unselected="parcel_drk_Voice"
+     is_toggle="true"
+     left_pad="15"
+     top="1"
+     name="volume_btn"
+     width="16" />
     <text
      type="string"
      length="1"
@@ -61,9 +71,9 @@
      follows="right|bottom"
      halign="right"
      height="16"
-     top="3"
+     top="5"
      layout="topleft"
-     left_pad="15"
+     left_pad="7"
      name="TimeText"
      text_color="TimeTextColor"
      tool_tip="Current time (Pacific)"
diff --git a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
index 7722583ce21c59630836e11e5304f7dc928e3542..63e60aab784d7be42230dc9a429e8a0c5346567c 100644
--- a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
@@ -9,7 +9,10 @@
   width="300"
   height="35"
   layout="topleft"
-  follows="left|right">
+  follows="left|right"
+  background_opaque="false"
+  background_visible="true"
+  bg_alpha_color="0.0 0.0 0.0 0.0" >
   <text
     top="2"
     left="10"
diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml
index 7f7777586c21459c5de986ac9844f8297c7101c5..f16329f8d78a174fb58468abe9a3e798340e6937 100644
--- a/indra/newview/skins/default/xui/en/panel_toast.xml
+++ b/indra/newview/skins/default/xui/en/panel_toast.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <!-- All our XML is utf-8 encoded. -->
 
-<!-- All this does is establish the position of the "close" button on the toast. -->
+<!-- Don't remove floater's height! It is needed for Overflow and Start-Up toasts!-->
 
 <floater
  legacy_header_height="18"
@@ -9,6 +9,7 @@
 	title=""
   visible="false"
   layout="topleft"
+  height="40" 
 	width="305"
   left="0"
   top="0"
@@ -26,36 +27,21 @@
   drop_shadow_visible = "false"
   border = "false"
   >
-
-  <!--
+  <!-- Don't remove this wiget! It is needed for Overflow and Start-Up toasts!-->
   <text
    visible="false"
    follows="left|top|right|bottom"
    font="SansSerifBold"
-   height="40"
+   height="20"
    layout="topleft"
-   left="60"
+   left="20"
    name="toast_text"
    word_wrap="true"
    text_color="white"
-   top="20"
-   width="290">
+   top="5" 
+   width="260">
     Toast text;
   </text>
-  <icon
-    top="20"
-    left="10"
-    width="32"
-    height="32"
-    follows="top|left"
-    layout="topleft"
-    visible="false"
-    color="1 1 1 1"
-    enabled="true"
-    image_name="notify_tip_icon.tga"
-    mouse_opaque="true"
-    name="icon"
-  />-->
   <button
     layout="topleft"
     top="-6"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index ea66bfa197fbfa14bb0a338fa5088fbef93ca991..761c17cfd2819c3a8eb57f83f8a2bc55d77a2c27 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2863,7 +2863,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
     Connecting...
   </string>
   <string name="conference-title">
-    Friends Conference
+    Ad-hoc Conference
   </string>
   <string name="inventory_item_offered-im">
     Inventory item offered
diff --git a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
index bc1ca339a2054ce9953be12ea1deb66715694178..706c89f5ed155bcf438253d73f011d02e928edce 100644
--- a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
@@ -4,6 +4,8 @@
             thumb_center_color="SliderThumbCenterColor"
             thumb_image="SliderThumb_Off"
             thumb_image_pressed="SliderThumb_Press"
-            thumb_image_disabled="SliderThumb_Disabled" 
-            track_image="SliderTrack_Horiz"
-            track_highlight_image="SliderTrack_Horiz" />
+            thumb_image_disabled="SliderThumb_Disabled"
+            track_image_horizontal="SliderTrack_Horiz"
+            track_image_vertical="SliderTrack_Vert"
+            track_highlight_horizontal_image="SliderTrack_Horiz"
+            track_highlight_vertical_image="SliderTrack_Vert" />
diff --git a/indra/viewer_components/login/tests/lllogin_test.cpp b/indra/viewer_components/login/tests/lllogin_test.cpp
index 56c21016bd53a56b11b0ec2915709cadf4cefd6c..99ea796ad0103d74173fc40e11c120fbed5903e6 100644
--- a/indra/viewer_components/login/tests/lllogin_test.cpp
+++ b/indra/viewer_components/login/tests/lllogin_test.cpp
@@ -416,6 +416,7 @@ namespace tut
 		ensure_equals("Failed to offline", listener.lastEvent()["state"].asString(), "offline");
 	}
 
+/*
     template<> template<>
     void llviewerlogin_object::test<5>()
     {
@@ -451,4 +452,5 @@ namespace tut
 
 		ensure_equals("SRV Failure", listener.lastEvent()["change"].asString(), "fail.login"); 
 	}
+*/
 }