diff --git a/indra/llmath/llcoord.h b/indra/llmath/llcoord.h
index 9d46a8b45438fa14586dd0e9711b6be787251810..9e38fddbd7b0297bfc3b9c14ac146e3e7af01020 100644
--- a/indra/llmath/llcoord.h
+++ b/indra/llmath/llcoord.h
@@ -59,8 +59,11 @@ class LLCoordGL : public LLCoord
 	{}
 	LLCoordGL(S32 x, S32 y) : LLCoord(x, y)
 	{}
+	bool operator==(const LLCoordGL& other) const { return mX == other.mX && mY == other.mY; }
+	bool operator!=(const LLCoordGL& other) const { return !(*this == other); }
 };
 
+//bool operator ==(const LLCoordGL& a, const LLCoordGL& b);
 
 // Window coords include things like window borders,
 // menu regions, etc.
@@ -71,6 +74,8 @@ class LLCoordWindow : public LLCoord
 	{}
 	LLCoordWindow(S32 x, S32 y) : LLCoord(x, y)
 	{}
+	bool operator==(const LLCoordWindow& other) const { return mX == other.mX && mY == other.mY; }
+	bool operator!=(const LLCoordWindow& other) const { return !(*this == other); }
 };
 
 
@@ -82,6 +87,8 @@ class LLCoordScreen : public LLCoord
 	{}
 	LLCoordScreen(S32 x, S32 y) : LLCoord(x, y)
 	{}
+	bool operator==(const LLCoordScreen& other) const { return mX == other.mX && mY == other.mY; }
+	bool operator!=(const LLCoordScreen& other) const { return !(*this == other); }
 };
 
 class LLCoordFont : public LLCoord
@@ -96,6 +103,8 @@ class LLCoordFont : public LLCoord
 	
 	void set(S32 x, S32 y) { LLCoord::set(x,y); mZ = 0.f; }
 	void set(S32 x, S32 y, F32 z) { mX = x; mY = y; mZ = z; }
+	bool operator==(const LLCoordFont& other) const { return mX == other.mX && mY == other.mY; }
+	bool operator!=(const LLCoordFont& other) const { return !(*this == other); }
 };
 	
 
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 7a8586fe2ffe21dd1388bf334aad0f1a4700197d..665a423d0763c116238c836eccf99a02326f69d6 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -32,7 +32,7 @@
 #ifndef LL_LLPLUGINCLASSMEDIA_H
 #define LL_LLPLUGINCLASSMEDIA_H
 
-#include "llgl.h"
+#include "llgltypes.h"
 #include "llpluginprocessparent.h"
 #include "llrect.h"
 #include "llpluginclassmediaowner.h"
diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h
index 3ae176cbeb55c6e2af8f1cd65fbbab384b1d748a..df6de0925e8c27f3d8a91fdef4d0cfb646a5cd30 100644
--- a/indra/llplugin/llpluginclassmediaowner.h
+++ b/indra/llplugin/llpluginclassmediaowner.h
@@ -32,7 +32,6 @@
 #ifndef LL_LLPLUGINCLASSMEDIAOWNER_H
 #define LL_LLPLUGINCLASSMEDIAOWNER_H
 
-#include "llgl.h"
 #include "llpluginprocessparent.h"
 #include "llrect.h"
 #include <queue>
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index 95d693cdc429dbfe9fd8ad040bfbd7b88dfc08bf..cc9362a2525a80c8ebf23800c2b544d78db23741 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -50,6 +50,7 @@ set(llui_SOURCE_FILES
     lllayoutstack.cpp
     lllineeditor.cpp
     lllistctrl.cpp
+    lllocalcliprect.cpp
     llmenugl.cpp
     llmodaldialog.cpp
     llmultifloater.cpp 
@@ -85,6 +86,7 @@ set(llui_SOURCE_FILES
     lltexteditor.cpp
     lltextparser.cpp
     lltransutil.cpp
+    lltooltip.cpp
     llui.cpp
     lluicolortable.cpp
     lluictrl.cpp
@@ -133,6 +135,7 @@ set(llui_HEADER_FILES
     lllazyvalue.h
     lllineeditor.h
     lllistctrl.h
+    lllocalcliprect.h
     llmenugl.h
     llmodaldialog.h
     llmultifloater.h 
@@ -167,6 +170,7 @@ set(llui_HEADER_FILES
     lltextbox.h
     lltexteditor.h
     lltextparser.h
+    lltooltip.h
     lltransutil.h
     lluicolortable.h
     lluiconstants.h
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index bf58e199490609e12916c359329a1af0f368a06b..fa13ced0370110fb231ec756e852b8ffc5a3b499 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -514,6 +514,7 @@ BOOL LLButton::handleHover(S32 x, S32 y, MASK mask)
 // virtual
 void LLButton::draw()
 {
+	F32 alpha = getDrawContext().mAlpha;
 	bool flash = FALSE;
 	static LLUICachedControl<F32> button_flash_rate("ButtonFlashRate", 0);
 	static LLUICachedControl<S32> button_flash_count("ButtonFlashCount", 0);
@@ -535,7 +536,7 @@ void LLButton::draw()
 	// Unselected image assignments
 	S32 local_mouse_x;
 	S32 local_mouse_y;
-	LLUI::getCursorPositionLocal(this, &local_mouse_x, &local_mouse_y);
+	LLUI::getMousePositionLocal(this, &local_mouse_x, &local_mouse_y);
 
 	bool enabled = isInEnabledChain();
 
@@ -662,7 +663,7 @@ void LLButton::draw()
 	if (hasFocus())
 	{
 		F32 lerp_amt = gFocusMgr.getFocusFlashAmt();
-		drawBorder(imagep, gFocusMgr.getFocusColor(), llround(lerp(1.f, 3.f, lerp_amt)));
+		drawBorder(imagep, gFocusMgr.getFocusColor() % alpha, llround(lerp(1.f, 3.f, lerp_amt)));
 	}
 	
 	if (use_glow_effect)
@@ -685,21 +686,21 @@ void LLButton::draw()
 		LLColor4 disabled_color = mFadeWhenDisabled ? mDisabledImageColor.get() % 0.5f : mDisabledImageColor.get();
 		if ( mScaleImage)
 		{
-			imagep->draw(getLocalRect(), enabled ? mImageColor.get() : disabled_color  );
+			imagep->draw(getLocalRect(), (enabled ? mImageColor.get() : disabled_color) % alpha  );
 			if (mCurGlowStrength > 0.01f)
 			{
 				gGL.setSceneBlendType(glow_type);
-				imagep->drawSolid(0, 0, getRect().getWidth(), getRect().getHeight(), glow_color % mCurGlowStrength);
+				imagep->drawSolid(0, 0, getRect().getWidth(), getRect().getHeight(), glow_color % (mCurGlowStrength * alpha));
 				gGL.setSceneBlendType(LLRender::BT_ALPHA);
 			}
 		}
 		else
 		{
-			imagep->draw(0, 0, enabled ? mImageColor.get() : disabled_color );
+			imagep->draw(0, 0, (enabled ? mImageColor.get() : disabled_color) % alpha );
 			if (mCurGlowStrength > 0.01f)
 			{
 				gGL.setSceneBlendType(glow_type);
-				imagep->drawSolid(0, 0, glow_color % mCurGlowStrength);
+				imagep->drawSolid(0, 0, glow_color % (mCurGlowStrength * alpha));
 				gGL.setSceneBlendType(LLRender::BT_ALPHA);
 			}
 		}
@@ -709,7 +710,7 @@ void LLButton::draw()
 		// no image
 		lldebugs << "No image for button " << getName() << llendl;
 		// draw it in pink so we can find it
-		gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4::pink1, FALSE);
+		gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4::pink1 % alpha, FALSE);
 	}
 
 	// let overlay image and text play well together
@@ -744,6 +745,7 @@ void LLButton::draw()
 		{
 			overlay_color.mV[VALPHA] = 0.5f;
 		}
+		overlay_color.mV[VALPHA] *= alpha;
 
 		switch(mImageOverlayAlignment)
 		{
@@ -815,7 +817,7 @@ void LLButton::draw()
 		// Due to U32_MAX is equal to S32 -1 value I have rest this value for non-ellipses mode.
 		// Not sure if it is really needed. Probably S32_MAX should be always passed as max_chars.
 		mGLFont->render(label, 0, (F32)x, (F32)(LLBUTTON_V_PAD + y_offset), 
-			label_color,
+			label_color % alpha,
 			mHAlign, LLFontGL::BOTTOM,
 			LLFontGL::NORMAL,
 			mDropShadowedText ? LLFontGL::DROP_SHADOW_SOFT : LLFontGL::NO_SHADOW,
@@ -956,17 +958,6 @@ void LLButton::setColor(const LLColor4& color)
 	setImageColor(color);
 }
 
-void LLButton::setAlpha(F32 alpha)
-{
-	LLColor4 temp = mImageColor.get();
-	temp.setAlpha(alpha);
-	mImageColor.set(temp);
-	
-	temp = mDisabledImageColor.get();
-	temp.setAlpha(alpha * 0.5f);
-	mDisabledImageColor.set(temp);
-}
-
 void LLButton::setImageDisabled(LLPointer<LLUIImage> image)
 {
 	mImageDisabled = image;
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index e51cd443fa3f0860c21d742646fe5cd607f6a72c..06e1dac914b7a6e43813e42a2f21af36f8f780eb 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -191,7 +191,6 @@ class LLButton
 	void			setImageColor(const std::string& color_control);
 	void			setImageColor(const LLColor4& c);
 	/*virtual*/ void	setColor(const LLColor4& c);
-	/*virtual*/ void	setAlpha(F32 alpha);
 
 	void			setImages(const std::string &image_name, const std::string &selected_name);
 	
diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index ac56d15d1b823e8197783e9702ba1a6931a1c3a4..ef0d4c1c0347e21797e466ca366f07a68cb0747b 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -55,6 +55,7 @@
 #include "lllineeditor.h"
 #include "v2math.h"
 #include "lluictrlfactory.h"
+#include "lltooltip.h"
 
 // Globals
 S32 LLCOMBOBOX_HEIGHT = 0;
@@ -704,7 +705,7 @@ void LLComboBox::onItemSelected(const LLSD& data)
 	}
 }
 
-BOOL LLComboBox::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen)
+BOOL LLComboBox::handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen)
 {
     std::string tool_tip;
 
@@ -713,25 +714,17 @@ BOOL LLComboBox::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_re
 		return TRUE;
 	}
 	
-	if (LLUI::sShowXUINames)
+	tool_tip = getToolTip();
+	if (tool_tip.empty())
 	{
-		tool_tip = getShowNamesToolTip();
-	}
-	else
-	{
-		tool_tip = getToolTip();
-		if (tool_tip.empty())
-		{
-			tool_tip = getSelectedItemLabel();
-		}
+		tool_tip = getSelectedItemLabel();
 	}
 	
 	if( !tool_tip.empty() )
 	{
-		msg = tool_tip;
-
-		// Convert rect local to screen coordinates
-		*sticky_rect_screen = calcScreenRect();
+		LLToolTipMgr::instance().show(LLToolTipParams()
+			.message(tool_tip)
+			.sticky_rect(calcScreenRect()));
 	}
 	return TRUE;
 }
diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h
index 4becda195f709b69c51e6498b83defb4aa6fa30c..018d472d6236a2b3a729ae9183e246d1038de660 100644
--- a/indra/llui/llcombobox.h
+++ b/indra/llui/llcombobox.h
@@ -112,7 +112,7 @@ class LLComboBox
 	// LLView interface
 	virtual void	onFocusLost();
 
-	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect);
+	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect);
 	virtual BOOL	handleKeyHere(KEY key, MASK mask);
 	virtual BOOL	handleUnicodeCharHere(llwchar uni_char);
 
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index ca3829e1bdf4b28472229fbd79d9c4f2c1d56b80..c027b59c71dd75908cb07e29d6cc4546758456ec 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -218,9 +218,6 @@ LLFloater::Params::Params()
 	close_callback("close_callback"),
 	can_dock("can_dock", false)
 {
-	name = "floater";
-	// defaults that differ from LLPanel:
-	background_visible = true;
 	visible = false;
 }
 
@@ -241,41 +238,39 @@ void LLFloater::initClass()
 	}
 }
 
+// defaults for floater param block pulled from widgets/floater.xml
+static LLWidgetNameRegistry::StaticRegistrar sRegisterFloaterParams(&typeid(LLFloater::Params), "floater");
+
 LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
-	:	LLPanel(),
-		mDragHandle(NULL),
-		mTitle(p.title),
-		mShortTitle(p.short_title),
-		mSingleInstance(p.single_instance),
-		mKey(key),
-		mAutoTile(p.auto_tile),
-		mCanTearOff(p.can_tear_off),
-		mCanMinimize(p.can_minimize),
-		mCanClose(p.can_close),
-		mDragOnLeft(p.can_drag_on_left),
-		mResizable(p.can_resize),
-		mMinWidth(p.min_width),
-		mMinHeight(p.min_height),
-		mMinimized(FALSE),
-		mForeground(FALSE),
-		mFirstLook(TRUE),
-		mEditing(FALSE),
-		mButtonScale(1.0f),
-		mAutoFocus(TRUE), // automatically take focus when opened
-		mCanDock(false),
-		mDocked(false),
-		mHasBeenDraggedWhileMinimized(FALSE),
-		mPreviousMinimizedBottom(0),
-		mPreviousMinimizedLeft(0),
-		mNotificationContext(NULL)
-{
-	static LLUIColor default_background_color = LLUIColorTable::instance().getColor("FloaterDefaultBackgroundColor");
-	static LLUIColor focus_background_color = LLUIColorTable::instance().getColor("FloaterFocusBackgroundColor");
-	
+:	LLPanel(),
+	mDragHandle(NULL),
+	mTitle(p.title),
+	mShortTitle(p.short_title),
+	mSingleInstance(p.single_instance),
+	mKey(key),
+	mAutoTile(p.auto_tile),
+	mCanTearOff(p.can_tear_off),
+	mCanMinimize(p.can_minimize),
+	mCanClose(p.can_close),
+	mDragOnLeft(p.can_drag_on_left),
+	mResizable(p.can_resize),
+	mMinWidth(p.min_width),
+	mMinHeight(p.min_height),
+	mMinimized(FALSE),
+	mForeground(FALSE),
+	mFirstLook(TRUE),
+	mEditing(FALSE),
+	mButtonScale(1.0f),
+	mAutoFocus(TRUE), // automatically take focus when opened
+	mCanDock(false),
+	mDocked(false),
+	mHasBeenDraggedWhileMinimized(FALSE),
+	mPreviousMinimizedBottom(0),
+	mPreviousMinimizedLeft(0),
+	mNotificationContext(NULL)
+{
 	mHandle.bind(this);
 	mNotificationContext = new LLFloaterNotificationContext(getHandle());
-	mBgColorAlpha        = default_background_color;
-	mBgColorOpaque       = focus_background_color;
 
 	// Clicks stop here.
 	setMouseOpaque(TRUE);
@@ -779,11 +774,6 @@ void LLFloater::applyRectControl()
 
 void LLFloater::applyTitle()
 {
-	if (gNoRender)
-	{
-		return;
-	}
-
 	if (!mDragHandle)
 	{
 		return;
@@ -1546,6 +1536,7 @@ void LLFloater::onClickClose( LLFloater* self )
 // virtual
 void LLFloater::draw()
 {
+	F32 alpha = getDrawContext().mAlpha;
 	// draw background
 	if( isBackgroundVisible() )
 	{
@@ -1565,27 +1556,29 @@ void LLFloater::draw()
 			shadow_color.mV[VALPHA] *= 0.5f;
 		}
 		gl_drop_shadow(left, top, right, bottom, 
-			shadow_color, 
+			shadow_color % alpha, 
 			llround(shadow_offset));
 
 		// No transparent windows in simple UI
 		if (isBackgroundOpaque())
 		{
-			gl_rect_2d( left, top, right, bottom, mBgColorOpaque );
+			gl_rect_2d( left, top, right, bottom, getBackgroundColor() % alpha );
 		}
 		else
 		{
-			gl_rect_2d( left, top, right, bottom, mBgColorAlpha );
+			gl_rect_2d( left, top, right, bottom, getTransparentColor() % alpha );
 		}
 
-		if(gFocusMgr.childHasKeyboardFocus(this) && !getIsChrome() && !getCurrentTitle().empty())
+		if(hasFocus() 
+			&& !getIsChrome() 
+			&& !getCurrentTitle().empty())
 		{
 			static LLUIColor titlebar_focus_color = LLUIColorTable::instance().getColor("TitleBarFocusColor");
 			// draw highlight on title bar to indicate focus.  RDW
 			const LLFontGL* font = LLFontGL::getFontSansSerif();
 			LLRect r = getRect();
 			gl_rect_2d_offset_local(0, r.getHeight(), r.getWidth(), r.getHeight() - (S32)font->getLineHeight() - 1, 
-				titlebar_focus_color, 0, TRUE);
+				titlebar_focus_color % alpha, 0, TRUE);
 		}
 	}
 
@@ -1643,7 +1636,7 @@ void LLFloater::draw()
 		static LLUIColor unfocus_border_color = LLUIColorTable::instance().getColor("FloaterUnfocusBorderColor");
 		LLUI::setLineWidth(1.5f);
 		LLColor4 outlineColor = gFocusMgr.childHasKeyboardFocus(this) ? focus_border_color : unfocus_border_color;
-		gl_rect_2d_offset_local(0, getRect().getHeight() + 1, getRect().getWidth() + 1, 0, outlineColor, -LLPANEL_BORDER_WIDTH, FALSE);
+		gl_rect_2d_offset_local(0, getRect().getHeight() + 1, getRect().getWidth() + 1, 0, outlineColor % alpha, -LLPANEL_BORDER_WIDTH, FALSE);
 		LLUI::setLineWidth(1.f);
 	}
 
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index ee066317e049b23bae6fa6ac70837b191c5edb50..513f6a69180dd6f8bf6776ddf12e1ff9d30aed14 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -373,9 +373,6 @@ friend class LLMultiFloater;
 	S32				mPreviousMinimizedBottom;
 	S32				mPreviousMinimizedLeft;
 
-	LLColor4		mBgColorAlpha;
-	LLColor4		mBgColorOpaque;
-
 	LLFloaterNotificationContext* mNotificationContext;
 	LLRootHandle<LLFloater>		mHandle;	
 };
diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp
index 673c742e7a6cc45c72ff850ef036b99a97b7b2cc..0330a2b374c44498f6d6f253ad4ec482678fde26 100644
--- a/indra/llui/lliconctrl.cpp
+++ b/indra/llui/lliconctrl.cpp
@@ -74,20 +74,12 @@ void LLIconCtrl::draw()
 {
 	if( mImagep.notNull() )
 	{
-		mImagep->draw(getLocalRect(), mColor.get() );
+		mImagep->draw(getLocalRect(), mColor.get() % getDrawContext().mAlpha );
 	}
 
 	LLUICtrl::draw();
 }
 
-// virtual 
-void LLIconCtrl::setAlpha(F32 alpha)
-{
-	LLColor4 temp = mColor.get();
-	temp.setAlpha(alpha);
-	mColor.set(temp);
-}
-
 // virtual
 // value might be a string or a UUID
 void LLIconCtrl::setValue(const LLSD& value )
diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h
index aceb70b9d513af96fffc22e9b9714130252448e4..ff25b0d53eabe113c79928c24b3a3133e6483123 100644
--- a/indra/llui/lliconctrl.h
+++ b/indra/llui/lliconctrl.h
@@ -71,8 +71,6 @@ class LLIconCtrl
 
 	std::string	getImageName() const;
 
-	/*virtual*/ void	setAlpha(F32 alpha);
-
 	void			setColor(const LLColor4& color) { mColor = color; }
 
 private:
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index f98edec1f324c5719e3eeb177c61c023541e7526..2d582c056876c6f26284ee97f53502d523e73f52 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -35,6 +35,7 @@
 #include "linden_common.h"
 
 #include "lllayoutstack.h"
+#include "lllocalcliprect.h"
 #include "llresizebar.h"
 #include "llcriticaldamp.h"
 
@@ -297,6 +298,7 @@ LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
 				FALSE, output_child);
 
 			LLPanel::Params p;
+			p.mouse_opaque(false);
 			LLPanel* panelp = LLUICtrlFactory::create<LLPanel>(p);
 			LLView* new_child = LLUICtrlFactory::getInstance()->createFromXML(child_node, panelp, LLStringUtil::null, LLPanel::child_registry_t::instance(), output_child);
 			if (new_child)
diff --git a/indra/llui/lllocalcliprect.cpp b/indra/llui/lllocalcliprect.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..058b6ae1784e0521ce96d9f25f40c9a9ddadb09c
--- /dev/null
+++ b/indra/llui/lllocalcliprect.cpp
@@ -0,0 +1,143 @@
+/** 
+* @file lllocalcliprect.cpp
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+* 
+* Copyright (c) 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 "linden_common.h"
+
+#include "lllocalcliprect.h"
+
+#include "llfontgl.h"
+#include "llgl.h"
+#include "llui.h"
+
+#include <stack>
+
+//---------------------------------------------------------------------------
+// LLScreenClipRect
+// implementation class in screen space
+//---------------------------------------------------------------------------
+class LLScreenClipRect
+{
+public:
+	LLScreenClipRect(const LLRect& rect, BOOL enabled = TRUE);
+	virtual ~LLScreenClipRect();
+
+private:
+	static void pushClipRect(const LLRect& rect);
+	static void popClipRect();
+	static void updateScissorRegion();
+
+private:
+	LLGLState		mScissorState;
+	BOOL			mEnabled;
+
+	static std::stack<LLRect> sClipRectStack;
+};
+
+/*static*/ std::stack<LLRect> LLScreenClipRect::sClipRectStack;
+
+
+LLScreenClipRect::LLScreenClipRect(const LLRect& rect, BOOL enabled)
+:	mScissorState(GL_SCISSOR_TEST),
+	mEnabled(enabled)
+{
+	if (mEnabled)
+	{
+		pushClipRect(rect);
+	}
+	mScissorState.setEnabled(!sClipRectStack.empty());
+	updateScissorRegion();
+}
+
+LLScreenClipRect::~LLScreenClipRect()
+{
+	if (mEnabled)
+	{
+		popClipRect();
+	}
+	updateScissorRegion();
+}
+
+//static 
+void LLScreenClipRect::pushClipRect(const LLRect& rect)
+{
+	LLRect combined_clip_rect = rect;
+	if (!sClipRectStack.empty())
+	{
+		LLRect top = sClipRectStack.top();
+		combined_clip_rect.intersectWith(top);
+
+		if(combined_clip_rect.isEmpty())
+		{
+			// avoid artifacts where zero area rects show up as lines
+			combined_clip_rect = LLRect::null;
+		}
+	}
+	sClipRectStack.push(combined_clip_rect);
+}
+
+//static 
+void LLScreenClipRect::popClipRect()
+{
+	sClipRectStack.pop();
+}
+
+//static
+void LLScreenClipRect::updateScissorRegion()
+{
+	if (sClipRectStack.empty()) return;
+
+	LLRect rect = sClipRectStack.top();
+	stop_glerror();
+	S32 x,y,w,h;
+	x = llfloor(rect.mLeft * LLUI::sGLScaleFactor.mV[VX]);
+	y = llfloor(rect.mBottom * LLUI::sGLScaleFactor.mV[VY]);
+	w = llmax(0, llceil(rect.getWidth() * LLUI::sGLScaleFactor.mV[VX])) + 1;
+	h = llmax(0, llceil(rect.getHeight() * LLUI::sGLScaleFactor.mV[VY])) + 1;
+	glScissor( x,y,w,h );
+	stop_glerror();
+}
+
+//---------------------------------------------------------------------------
+// LLLocalClipRect
+//---------------------------------------------------------------------------
+LLLocalClipRect::LLLocalClipRect(const LLRect& rect, BOOL enabled /* = TRUE */)
+{
+	LLRect screen(rect.mLeft + LLFontGL::sCurOrigin.mX, 
+		rect.mTop + LLFontGL::sCurOrigin.mY, 
+		rect.mRight + LLFontGL::sCurOrigin.mX, 
+		rect.mBottom + LLFontGL::sCurOrigin.mY);
+	mScreenClipRect = new LLScreenClipRect(screen, enabled);
+}
+
+LLLocalClipRect::~LLLocalClipRect()
+{
+	delete mScreenClipRect;
+	mScreenClipRect = NULL;
+}
diff --git a/indra/llui/lllocalcliprect.h b/indra/llui/lllocalcliprect.h
new file mode 100644
index 0000000000000000000000000000000000000000..cd0c55ca72130c1069037bed436612c6b370831d
--- /dev/null
+++ b/indra/llui/lllocalcliprect.h
@@ -0,0 +1,53 @@
+/** 
+* @file lllocalcliprect.h
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+* 
+* Copyright (c) 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 LLLOCALCLIPRECT_H
+#define LLLOCALCLIPRECT_H
+
+#include "llrect.h"		// can't forward declare, it's templated
+
+// Clip rendering to a specific rectangle using GL scissor
+// Just create one of these on the stack:
+// {
+//     LLLocalClipRect(rect);
+//     draw();
+// }
+class LLLocalClipRect
+{
+public:
+	LLLocalClipRect(const LLRect& rect, BOOL enabled = TRUE);
+	~LLLocalClipRect();
+
+private:
+	// implementation class
+	class LLScreenClipRect* mScreenClipRect;
+};
+
+#endif
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index d6dfe6c198f7226bf0b74e0915eb0cbc2b88086a..2bc4f009ccfca06e222ef7fa314024567fd6cb3b 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -2929,7 +2929,7 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
 	// If the mouse doesn't move, the menu will stay open ala the Mac.
 	// See also LLContextMenu::show()
 	S32 mouse_x, mouse_y;
-	LLUI::getCursorPositionLocal(menu->getParent(), &mouse_x, &mouse_y);
+	LLUI::getMousePositionLocal(menu->getParent(), &mouse_x, &mouse_y);
 	LLMenuHolderGL::sContextMenuSpawnPos.set(mouse_x,mouse_y);
 
 	const LLRect menu_region_rect = LLMenuGL::sMenuContainer->getMenuRect();
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index c81be6086a1cbb04b905f8c122eba889232c864a..26136e0a231c8f6a7cbbe58289284afd1cb25e89 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -91,8 +91,8 @@ LLPanel::Params::Params()
 
 LLPanel::LLPanel(const LLPanel::Params& p)
 :	LLUICtrl(p),
-	mBgColorAlpha(p.bg_alpha_color().get()),
-	mBgColorOpaque(p.bg_opaque_color().get()),
+	mBgColorAlpha(p.bg_alpha_color()),
+	mBgColorOpaque(p.bg_opaque_color()),
 	mBgVisible(p.background_visible),
 	mBgOpaque(p.background_opaque),
 	mDefaultBtn(NULL),
@@ -100,7 +100,7 @@ LLPanel::LLPanel(const LLPanel::Params& p)
 	mLabel(p.label),
 	mCommitCallbackRegistrar(false),
 	mEnableCallbackRegistrar(false),
-	mXMLFilename("")
+	mXMLFilename(p.filename)
 {
 	setIsChrome(FALSE);
 
@@ -171,6 +171,8 @@ void LLPanel::setCtrlsEnabled( BOOL b )
 
 void LLPanel::draw()
 {
+	F32 alpha = getDrawContext().mAlpha;
+
 	// draw background
 	if( mBgVisible )
 	{
@@ -182,11 +184,11 @@ void LLPanel::draw()
 
 		if (mBgOpaque )
 		{
-			gl_rect_2d( left, top, right, bottom, mBgColorOpaque );
+			gl_rect_2d( left, top, right, bottom, mBgColorOpaque.get() % alpha);
 		}
 		else
 		{
-			gl_rect_2d( left, top, right, bottom, mBgColorAlpha );
+			gl_rect_2d( left, top, right, bottom, mBgColorAlpha.get() % alpha);
 		}
 	}
 
@@ -195,12 +197,6 @@ void LLPanel::draw()
 	LLView::draw();
 }
 
-/*virtual*/
-void LLPanel::setAlpha(F32 alpha)
-{
-	mBgColorOpaque.setAlpha(alpha);
-}
-
 void LLPanel::updateDefaultBtn()
 {
 	if( mDefaultBtn)
@@ -403,6 +399,8 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
 	setVisible(p.visible);
 	setEnabled(p.enabled);
 
+	setSoundFlags(p.sound_flags);
+
 	 // control_name, tab_stop, focus_lost_callback, initial_value, rect, enabled, visible
 	LLUICtrl::initFromParams(p);
 	
@@ -709,14 +707,6 @@ void LLPanel::childSetColor(const std::string& id, const LLColor4& color)
 		child->setColor(color);
 	}
 }
-void LLPanel::childSetAlpha(const std::string& id, F32 alpha)
-{
-	LLUICtrl* child = getChild<LLUICtrl>(id, true);
-	if (child)
-	{
-		child->setAlpha(alpha);
-	}
-}
 
 LLCtrlSelectionInterface* LLPanel::childGetSelectionInterface(const std::string& id) const
 {
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index 3f1d1fdc5d13a89b63b18c2122f5474370783ed4..81b5b68f05e9c471fed28840e80557dd32bfc702 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -114,8 +114,6 @@ class LLPanel : public LLUICtrl
 
 	// From LLFocusableElement
 	/*virtual*/ void	setFocus( BOOL b );
-	virtual void setAlpha(F32 alpha);
-
 	
 	// New virtuals
 	virtual 	void	refresh();	// called in setFocus()
@@ -190,7 +188,6 @@ class LLPanel : public LLUICtrl
 	void childSetValidate(const std::string& id, boost::function<bool (const LLSD& data)> cb );
 
 	void childSetColor(const std::string& id, const LLColor4& color);
-	void childSetAlpha(const std::string& id, F32 alpha);
 
 	LLCtrlSelectionInterface* childGetSelectionInterface(const std::string& id) const;
 	LLCtrlListInterface* childGetListInterface(const std::string& id) const;
@@ -236,6 +233,7 @@ class LLPanel : public LLUICtrl
 	virtual void	onOpen(const LLSD& key) {}
 
 	void setXMLFilename(std::string filename) { mXMLFilename = filename; };
+	std::string getXMLFilename() { return mXMLFilename; };
 	
 protected:
 	// Override to set not found list
@@ -247,13 +245,8 @@ class LLPanel : public LLUICtrl
 	commit_signal_t mVisibleSignal;		// Called when visibility changes, passes new visibility as LLSD()
 	
 private:
-	// Unified error reporting for the child* functions
-	typedef std::set<std::string> expected_members_list_t;
-	mutable expected_members_list_t mExpectedMembers;
-	mutable expected_members_list_t mNewExpectedMembers;
-
-	LLColor4		mBgColorAlpha;
-	LLColor4		mBgColorOpaque;
+	LLUIColor		mBgColorAlpha;
+	LLUIColor		mBgColorOpaque;
 	BOOL			mBgVisible;
 	BOOL			mBgOpaque;
 	LLViewBorder*	mBorder;
diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp
index b46915b379db21f1602c1229a7fe7c74ade2ca33..172c4a9c658c9ec363f8f605b3df5c4ef7e615de 100644
--- a/indra/llui/llscrollbar.cpp
+++ b/indra/llui/llscrollbar.cpp
@@ -484,7 +484,7 @@ void LLScrollbar::draw()
 
 	S32 local_mouse_x;
 	S32 local_mouse_y;
-	LLUI::getCursorPositionLocal(this, &local_mouse_x, &local_mouse_y);
+	LLUI::getMousePositionLocal(this, &local_mouse_x, &local_mouse_y);
 	BOOL other_captor = gFocusMgr.getMouseCapture() && gFocusMgr.getMouseCapture() != this;
 	BOOL hovered = getEnabled() && !other_captor && (hasMouseCapture() || mThumbRect.pointInRect(local_mouse_x, local_mouse_y));
 	if (hovered)
diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp
index 556ff8099118f1d997285c42de77cd3d694ab1cb..30a042cff1a0bf0d7be3a0922ad1b62b1ffd8094 100644
--- a/indra/llui/llscrollcontainer.cpp
+++ b/indra/llui/llscrollcontainer.cpp
@@ -37,6 +37,7 @@
 
 #include "llrender.h"
 #include "llcontainerview.h"
+#include "lllocalcliprect.h"
 // #include "llfolderview.h"
 #include "llscrollingpanellist.h"
 #include "llscrollbar.h"
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 36a3b007b620d9d8b3cd43887f08a656c556a2ae..483106e8574f276d3488643664b877a7612a2705 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -44,6 +44,8 @@
 #include "llcheckboxctrl.h"
 #include "llclipboard.h"
 #include "llfocusmgr.h"
+#include "llgl.h"				// LLGLSUIDefault()
+#include "lllocalcliprect.h"
 //#include "llrender.h"
 #include "llresmgr.h"
 #include "llscrollbar.h"
@@ -60,6 +62,7 @@
 #include "llcachename.h"
 #include "llmenugl.h"
 #include "llurlaction.h"
+#include "lltooltip.h"
 
 #include <boost/bind.hpp>
 
@@ -1522,7 +1525,7 @@ BOOL LLScrollListCtrl::handleScrollWheel(S32 x, S32 y, S32 clicks)
 	return handled;
 }
 
-BOOL LLScrollListCtrl::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen)
+BOOL LLScrollListCtrl::handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen)
 {
 	S32 column_index = getColumnIndexFromOffset(x);
 	LLScrollListColumn* columnp = getColumn(column_index);
@@ -1545,8 +1548,11 @@ BOOL LLScrollListCtrl::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sti
 			LLRect cell_rect;
 			cell_rect.setOriginAndSize(rect_left, rect_bottom, rect_left + columnp->getWidth(), mLineHeight);
 			// Convert rect local to screen coordinates
-			localRectToScreen(cell_rect, sticky_rect_screen);
-			msg = hit_cell->getValue().asString();
+			LLRect sticky_rect;
+			localRectToScreen(cell_rect, &sticky_rect);
+			LLToolTipMgr::instance().show(LLToolTipParams()
+				.message(hit_cell->getValue().asString())
+				.sticky_rect(sticky_rect));		
 		}
 		handled = TRUE;
 	}
@@ -1555,8 +1561,7 @@ BOOL LLScrollListCtrl::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sti
 	LLScrollColumnHeader* headerp = columnp->mHeader;
 	if (headerp && !handled)
 	{
-		headerp->handleToolTip(x, y, msg, sticky_rect_screen);
-		handled = !msg.empty();
+		handled = headerp->handleToolTip(x, y, msg, sticky_rect_screen);
 	}
 
 	return handled;
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 5c18f85160eb5e04771c7b05ced0bfe46d045b97..bbf8e866606b50858a1304493694a28b58d95abd 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -286,7 +286,7 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
 	/*virtual*/ BOOL	handleKeyHere(KEY key, MASK mask);
 	/*virtual*/ BOOL	handleUnicodeCharHere(llwchar uni_char);
 	/*virtual*/ BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks);
-	/*virtual*/ BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect);
+	/*virtual*/ BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect);
 	/*virtual*/ void	setEnabled(BOOL enabled);
 	/*virtual*/ void	setFocus( BOOL b );
 	/*virtual*/ void	onFocusReceived();
diff --git a/indra/llui/llsdparam.cpp b/indra/llui/llsdparam.cpp
index 1b0f3c9885bff1532a3cbf7d86572b7bfdf2fd04..4bb45a3065fc7c745f3579e737219514e59d7612 100644
--- a/indra/llui/llsdparam.cpp
+++ b/indra/llui/llsdparam.cpp
@@ -90,15 +90,7 @@ void LLParamSDParser::readSD(const LLSD& sd, LLInitParam::BaseBlock& block, bool
 	mNameStack.clear();
 	setParseSilently(silent);
 
-	// must have named elements at top level to submit for parsing
-	if (sd.isMap())
-	{
-		readSDValues(sd, block);
-	}
-	else
-	{
-		parserWarning("Top level map required for LLSD->Block conversion");
-	}
+	readSDValues(sd, block);
 }
 
 void LLParamSDParser::writeSD(LLSD& sd, const LLInitParam::BaseBlock& block)
diff --git a/indra/llui/llslider.cpp b/indra/llui/llslider.cpp
index 1c394a71dd751c24e10f9f697139b7c5e87b1012..07b68953789ab4f1bb45db8d8ef48685e099ad34 100644
--- a/indra/llui/llslider.cpp
+++ b/indra/llui/llslider.cpp
@@ -239,6 +239,8 @@ BOOL LLSlider::handleKeyHere(KEY key, MASK mask)
 
 void LLSlider::draw()
 {
+	F32 alpha = getDrawContext().mAlpha;
+
 	// since thumb image might still be decoding, need thumb to accomodate image size
 	updateThumbRect();
 
@@ -253,14 +255,14 @@ void LLSlider::draw()
 						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);
-	mTrackHighlightImage->draw(highlight_rect);
+	mTrackImage->draw(track_rect, LLColor4::white % alpha);
+	mTrackHighlightImage->draw(highlight_rect, LLColor4::white % alpha);
 
 	// Thumb
 	if (hasFocus())
 	{
 		// Draw focus highlighting.
-		mThumbImage->drawBorder(mThumbRect, gFocusMgr.getFocusColor(), gFocusMgr.getFocusFlashWidth());
+		mThumbImage->drawBorder(mThumbRect, gFocusMgr.getFocusColor() % alpha, gFocusMgr.getFocusFlashWidth());
 	}
 
 	if( hasMouseCapture() ) // currently clicking on slider
@@ -268,25 +270,25 @@ void LLSlider::draw()
 		// Show ghost where thumb was before dragging began.
 		if (mThumbImage.notNull())
 		{
-			mThumbImage->draw(mDragStartThumbRect, mThumbCenterColor.get() % 0.3f);
+			mThumbImage->draw(mDragStartThumbRect, mThumbCenterColor.get() % (0.3f * alpha));
 		}
 		if (mThumbImagePressed.notNull())
 		{
-			mThumbImagePressed->draw(mThumbRect, mThumbOutlineColor);
+			mThumbImagePressed->draw(mThumbRect, mThumbOutlineColor % alpha);
 		}
 	}
 	else if (!isInEnabledChain())
 	{
 		if (mThumbImageDisabled.notNull())
 		{
-			mThumbImageDisabled->draw(mThumbRect, mThumbCenterColor);
+			mThumbImageDisabled->draw(mThumbRect, mThumbCenterColor % alpha);
 		}
 	}
 	else
 	{
 		if (mThumbImage.notNull())
 		{
-			mThumbImage->draw(mThumbRect, mThumbCenterColor);
+			mThumbImage->draw(mThumbRect, mThumbCenterColor % alpha);
 		}
 	}
 	
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index e379954b4f0f8f9a19c8ea3096fb9e0ac2bafe60..cabd0be52232ed32983d4ad78eb9b0fb9ec8b25f 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -31,9 +31,12 @@
  */
 
 #include "linden_common.h"
+
 #include "lltabcontainer.h"
+
 #include "llfocusmgr.h"
 #include "llbutton.h"
+#include "lllocalcliprect.h"
 #include "llrect.h"
 #include "llresizehandle.h"
 #include "lltextbox.h"
@@ -590,7 +593,7 @@ BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask )
 }
 
 // virtual
-BOOL LLTabContainer::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rect )
+BOOL LLTabContainer::handleToolTip( S32 x, S32 y, std::string& msg, LLRect& sticky_rect )
 {
 	static LLUICachedControl<S32> tabcntrv_pad ("UITabCntrvPad", 0);
 	BOOL handled = LLPanel::handleToolTip( x, y, msg, sticky_rect );
@@ -731,7 +734,7 @@ BOOL LLTabContainer::handleDragAndDrop(S32 x, S32 y, MASK mask,	BOOL drop,	EDrag
 {
 	BOOL has_scroll_arrows = (getMaxScrollPos() > 0);
 
-	if( mDragAndDropDelayTimer.getElapsedTimeF32() > SCROLL_DELAY_TIME )
+	if( mDragAndDropDelayTimer.getStarted() && mDragAndDropDelayTimer.getElapsedTimeF32() > SCROLL_DELAY_TIME )
 	{
 		if (has_scroll_arrows)
 		{
diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h
index ebe76af9668e4e88542506dda9718b5b3fb0a83b..89a0346896d050c7d08581ada673ba65e3df33c0 100644
--- a/indra/llui/lltabcontainer.h
+++ b/indra/llui/lltabcontainer.h
@@ -99,7 +99,7 @@ class LLTabContainer : public LLPanel
 	/*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
 	/*virtual*/ BOOL handleHover( S32 x, S32 y, MASK mask );
 	/*virtual*/ BOOL handleMouseUp( S32 x, S32 y, MASK mask );
-	/*virtual*/ BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect );
+	/*virtual*/ BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect );
 	/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
 	/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,	BOOL drop,
 									   EDragAndDropType type, void* cargo_data,
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 038ea2188f3aca0ea13cfd9ea1399856c9a9ef5b..cb60b4fe3623a940db54e94bc2d78fde83ca35de 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -38,6 +38,7 @@
 #include "llview.h"
 #include "llwindow.h"
 #include "llmenugl.h"
+#include "lltooltip.h"
 #include "lluictrl.h"
 #include "llurlaction.h"
 #include "llurlregistry.h"
@@ -402,18 +403,23 @@ BOOL LLTextBase::handleRightMouseDownOverUrl(LLView *view, S32 x, S32 y)
 	return FALSE;
 }
 
-BOOL LLTextBase::handleToolTipForUrl(LLView *view, S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen)
+BOOL LLTextBase::handleToolTipForUrl(LLView *view, S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen)
 {
+	std::string tooltip_msg;
 	const LLTextSegment* cur_segment = getSegmentAtLocalPos( x, y );
-	if (cur_segment && cur_segment->getToolTip( msg ) && view)
+	if (cur_segment && cur_segment->getToolTip( tooltip_msg ) && view)
 	{
 		// Use a slop area around the cursor
 		const S32 SLOP = 8;
 		// Convert rect local to screen coordinates
-		view->localPointToScreen(x - SLOP, y - SLOP, &(sticky_rect_screen->mLeft),
-								 &(sticky_rect_screen->mBottom));
-		sticky_rect_screen->mRight = sticky_rect_screen->mLeft + 2 * SLOP;
-		sticky_rect_screen->mTop = sticky_rect_screen->mBottom + 2 * SLOP;
+		view->localPointToScreen(x - SLOP, y - SLOP, &(sticky_rect_screen.mLeft),
+								 &(sticky_rect_screen.mBottom));
+		sticky_rect_screen.mRight = sticky_rect_screen.mLeft + 2 * SLOP;
+		sticky_rect_screen.mTop = sticky_rect_screen.mBottom + 2 * SLOP;
+
+		LLToolTipMgr::instance().show(LLToolTipParams()
+			.message(tooltip_msg)
+			.sticky_rect(sticky_rect_screen));
 	}
 	return TRUE;
 }
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 27b88761a8bb1bd5b5a133239ef0bcfbd1b0c606..82b9f6a43faabab674efd2971e200a3ea69c0e07 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -90,7 +90,7 @@ class LLTextBase
 	BOOL                handleHoverOverUrl(S32 x, S32 y);
 	BOOL                handleMouseUpOverUrl(S32 x, S32 y);
 	BOOL                handleRightMouseDownOverUrl(LLView *view, S32 x, S32 y);
-	BOOL                handleToolTipForUrl(LLView *view, S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen);
+	BOOL                handleToolTipForUrl(LLView *view, S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen);
 
 	// pure virtuals that have to be implemented by any subclasses
 	virtual S32         getLineCount() const = 0;
diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp
index 30bf182deb36909bb26d2607be5c8ae614522f94..810626268fc5c1190f973d82a5b2c16c7a1a9196 100644
--- a/indra/llui/lltextbox.cpp
+++ b/indra/llui/lltextbox.cpp
@@ -52,7 +52,6 @@ LLTextBox::Params::Params()
 	drop_shadow_visible("drop_shadow_visible"),
 	disabled_color("disabled_color"),
 	background_color("background_color"),
-	border_color("border_color"),
 	v_pad("v_pad", 0),
 	h_pad("h_pad", 0),
 	line_spacing("line_spacing", 0),
@@ -75,7 +74,6 @@ LLTextBox::LLTextBox(const LLTextBox::Params& p)
 	mTextColor(p.text_color()),
 	mDisabledColor(p.disabled_color()),
 	mBackgroundColor(p.background_color()),
-	mBorderColor(p.border_color()),
 	mHAlign(p.font_halign),
 	mLineSpacing(p.line_spacing),
 	mDidWordWrap(FALSE)
@@ -161,7 +159,7 @@ BOOL LLTextBox::handleHover(S32 x, S32 y, MASK mask)
 	return LLView::handleHover(x,y,mask);
 }
 
-BOOL LLTextBox::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen)
+BOOL LLTextBox::handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen)
 {
 	return handleToolTipForUrl(this, x, y, msg, sticky_rect_screen);
 }
@@ -387,6 +385,8 @@ BOOL LLTextBox::setTextArg( const std::string& key, const LLStringExplicit& text
 
 void LLTextBox::draw()
 {
+	F32 alpha = getDrawContext().mAlpha;
+
 	if (mBorderVisible)
 	{
 		gl_rect_2d_offset_local(getLocalRect(), 2, FALSE);
@@ -397,13 +397,13 @@ void LLTextBox::draw()
 		static LLUIColor color_drop_shadow = LLUIColorTable::instance().getColor("ColorDropShadow");
 		static LLUICachedControl<S32> drop_shadow_tooltip ("DropShadowTooltip", 0);
 		gl_drop_shadow(0, getRect().getHeight(), getRect().getWidth(), 0,
-			color_drop_shadow, drop_shadow_tooltip);
+			color_drop_shadow % alpha, drop_shadow_tooltip);
 	}
 
 	if (mBackgroundVisible)
 	{
 		LLRect r( 0, getRect().getHeight(), getRect().getWidth(), 0 );
-		gl_rect_2d( r, mBackgroundColor.get() );
+		gl_rect_2d( r, mBackgroundColor.get() % alpha );
 	}
 
 	S32 text_x = 0;
@@ -453,6 +453,7 @@ void LLTextBox::reshape(S32 width, S32 height, BOOL called_from_parent)
 
 void LLTextBox::drawText( S32 x, S32 y, const LLWString &text, const LLColor4& color )
 {
+	F32 alpha = getDrawContext().mAlpha;
 	if (mSegments.size() > 1)
 	{
 		// we have Urls (or other multi-styled segments)
@@ -461,7 +462,7 @@ void LLTextBox::drawText( S32 x, S32 y, const LLWString &text, const LLColor4& c
 	else if( mLineLengthList.empty() )
 	{
 		// simple case of 1 line of text in one style
-		mDefaultFont->render(text, 0, (F32)x, (F32)y, color,
+		mDefaultFont->render(text, 0, (F32)x, (F32)y, color % alpha,
 							 mHAlign, mVAlign, 
 							 0,
 							 mShadowType,
@@ -475,7 +476,7 @@ void LLTextBox::drawText( S32 x, S32 y, const LLWString &text, const LLColor4& c
 			iter != mLineLengthList.end(); ++iter)
 		{
 			S32 line_length = *iter;
-			mDefaultFont->render(text, cur_pos, (F32)x, (F32)y, color,
+			mDefaultFont->render(text, cur_pos, (F32)x, (F32)y, color % alpha,
 								 mHAlign, mVAlign,
 								 0,
 								 mShadowType,
@@ -491,6 +492,9 @@ void LLTextBox::drawText( S32 x, S32 y, const LLWString &text, const LLColor4& c
 
 void LLTextBox::reshapeToFitText()
 {
+	// wrap remaining lines that did not fit on call to setWrappedText()
+	setLineLengths();
+
 	S32 width = getTextPixelWidth();
 	S32 height = getTextPixelHeight();
 	reshape( width + 2 * mHPad, height + 2 * mVPad );
@@ -665,6 +669,8 @@ bool LLTextBox::isClickable() const
 
 void LLTextBox::drawTextSegments(S32 init_x, S32 init_y, const LLWString &text)
 {
+	F32 alpha = getDrawContext().mAlpha;
+
 	const S32 text_len = text.length();
 	if (text_len <= 0)
 	{
@@ -729,6 +735,7 @@ void LLTextBox::drawTextSegments(S32 init_x, S32 init_y, const LLWString &text)
 					{
 						color = mDisabledColor.get();
 					}
+					color = color % alpha;
 
 					// render a single line worth for this segment
 					mDefaultFont->render(text, seg_start, text_x, text_y, color,
diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h
index 940b82000409be4ea77be955681e941316480954..291d1dc51797e7a58a2e88d9b262612f7f9d6072 100644
--- a/indra/llui/lltextbox.h
+++ b/indra/llui/lltextbox.h
@@ -66,8 +66,7 @@ class LLTextBox :
 
 		Optional<LLUIColor>	text_color,
 							disabled_color,
-							background_color,
-							border_color;
+							background_color;
 
 		Optional<S32>		v_pad,
 							h_pad,
@@ -90,12 +89,11 @@ class LLTextBox :
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleHover(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleRightMouseDown(S32 x, S32 y, MASK mask);
-	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen);
+	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen);
 
 	void			setColor( const LLColor4& c )			{ mTextColor = c; }
 	void			setDisabledColor( const LLColor4& c)	{ mDisabledColor = c; }
 	void			setBackgroundColor( const LLColor4& c)	{ mBackgroundColor = c; }	
-	void			setBorderColor( const LLColor4& c)		{ mBorderColor = c; }	
 
 	void			setText( const LLStringExplicit& text );
 	void			setWrappedText(const LLStringExplicit& text, F32 max_width = -1.f); // -1 means use existing control width
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 51c259ff536057fc067ded9bdfdfe85256f35795..983777b747b7d8e964391e0951444f3260187178 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -38,6 +38,8 @@
 
 #include "llfontfreetype.h" // for LLFontFreetype::FIRST_CHAR
 #include "llfontgl.h"
+#include "llgl.h"			// LLGLSUIDefault()
+#include "lllocalcliprect.h"
 #include "llrender.h"
 #include "llui.h"
 #include "lluictrlfactory.h"
@@ -60,6 +62,7 @@
 #include "llscrollcontainer.h"
 #include "llpanel.h"
 #include "llurlregistry.h"
+#include "lltooltip.h"
 
 #include <queue>
 #include "llcombobox.h"
@@ -1341,18 +1344,11 @@ void LLTextEditor::selectAll()
 }
 
 
-BOOL LLTextEditor::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen)
+BOOL LLTextEditor::handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen)
 {
-	for ( child_list_const_iter_t child_it = getChildList()->begin();
-		  child_it != getChildList()->end(); ++child_it)
+	if (childrenHandleToolTip(x, y, msg, sticky_rect_screen))
 	{
-		LLView* viewp = *child_it;
-		S32 local_x = x - viewp->getRect().mLeft;
-		S32 local_y = y - viewp->getRect().mBottom;
-		if( viewp->handleToolTip(local_x, local_y, msg, sticky_rect_screen ) )
-		{
-			return TRUE;
-		}
+		return TRUE;
 	}
 
 	return handleToolTipForUrl(this, x, y, msg, sticky_rect_screen);
@@ -3193,7 +3189,7 @@ void LLTextEditor::draw()
 
 	mDocumentPanel->setBackgroundColor(bg_color);
 
-	drawChildren();
+	LLView::draw();
 	drawBackground(); //overlays scrolling panel bg
 	drawLineNumbers();
 
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index d5377511308be488dcb75076ed31bf0ddf6498aa..68b8f2c3b1bb4009f7432137a82fb6063bcf3ae9 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -151,7 +151,7 @@ class LLTextEditor :
 	virtual BOOL	handleKeyHere(KEY key, MASK mask );
 	virtual BOOL	handleUnicodeCharHere(llwchar uni_char);
 
-	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect);
+	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect);
 	virtual BOOL	handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 									  EDragAndDropType cargo_type, void *cargo_data,
 									  EAcceptance *accept, std::string& tooltip_msg);
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5c017dabd7cfefdc40234c672db7370e38420b47
--- /dev/null
+++ b/indra/llui/lltooltip.cpp
@@ -0,0 +1,445 @@
+/** 
+ * @file lltooltip.cpp
+ * @brief LLToolTipMgr class implementation and related classes
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-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 "linden_common.h"
+
+// self include
+#include "lltooltip.h"
+
+// Library includes
+#include "llpanel.h"
+#include "lltextbox.h"
+#include "lliconctrl.h"
+#include "llui.h"			// positionViewNearMouse()
+#include "llwindow.h"
+
+//
+// Constants
+//
+const F32 DELAY_BEFORE_SHOW_TIP = 0.35f;
+
+//
+// Local globals
+//
+
+LLToolTipView *gToolTipView = NULL;
+
+//
+// Member functions
+//
+
+LLToolTipView::LLToolTipView(const LLToolTipView::Params& p)
+:	LLView(p)
+{
+}
+
+void LLToolTipView::draw()
+{
+	if (LLUI::getWindow()->isCursorHidden() )
+	{
+		LLToolTipMgr::instance().hideToolTips();
+	}
+
+	// do the usual thing
+	LLView::draw();
+}
+
+BOOL LLToolTipView::handleHover(S32 x, S32 y, MASK mask)
+{
+	static S32 last_x = x;
+	static S32 last_y = y;
+
+	LLToolTipMgr& tooltip_mgr = LLToolTipMgr::instance();
+
+	// hide existing tooltips when mouse moves out of sticky rect
+	if (tooltip_mgr.toolTipVisible() 
+		&& !tooltip_mgr.getStickyRect().pointInRect(x, y))
+	{
+		tooltip_mgr.hideToolTips();
+	}
+
+	// allow new tooltips whenever mouse moves
+	if (x != last_x && y != last_y)
+	{
+		tooltip_mgr.enableToolTips();
+	}
+
+	last_x = x;
+	last_y = y;
+	return LLView::handleHover(x, y, mask);
+}
+
+BOOL LLToolTipView::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+	LLToolTipMgr::instance().hideToolTips();
+	return LLView::handleMouseDown(x, y, mask);
+}
+
+BOOL LLToolTipView::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
+{
+	LLToolTipMgr::instance().hideToolTips();
+	return LLView::handleMiddleMouseDown(x, y, mask);
+}
+
+BOOL LLToolTipView::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+	LLToolTipMgr::instance().hideToolTips();
+	return LLView::handleRightMouseDown(x, y, mask);
+}
+
+
+BOOL LLToolTipView::handleScrollWheel( S32 x, S32 y, S32 clicks )
+{
+	LLToolTipMgr::instance().hideToolTips();
+	return FALSE;
+}
+
+void LLToolTipView::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+	LLToolTipMgr::instance().hideToolTips();
+}
+
+
+void LLToolTipView::drawStickyRect()
+{
+	gl_rect_2d(LLToolTipMgr::instance().getStickyRect(), LLColor4::white, false);
+}
+//
+// LLToolTip
+//
+class LLToolTip : public LLPanel
+{
+public:
+	struct Params : public LLInitParam::Block<Params, LLPanel::Params> 
+	{
+		Mandatory<F32>				visible_time;
+	
+		Optional<LLToolTipParams::click_callback_t>	click_callback;
+		Optional<LLUIImage*>						image;
+
+		Params()
+		{
+			//use_bounding_rect = true;
+		}
+	};
+	/*virtual*/ void draw();
+	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
+
+	/*virtual*/ void setValue(const LLSD& value);
+	/*virtual*/ void setVisible(BOOL visible);
+
+	bool isFading() { return mFadeTimer.getStarted(); }
+
+	LLToolTip(const Params& p);
+
+private:
+	LLTextBox*		mTextBox;
+	LLFrameTimer	mFadeTimer;
+	F32				mVisibleTime;
+	bool			mHasClickCallback;
+};
+
+static LLDefaultChildRegistry::Register<LLToolTip> r("tool_tip");
+
+const S32 TOOLTIP_PADDING = 4;
+
+LLToolTip::LLToolTip(const LLToolTip::Params& p)
+:	LLPanel(p),
+	mVisibleTime(p.visible_time),
+	mHasClickCallback(p.click_callback.isProvided())
+{
+	LLTextBox::Params params;
+	params.text = "tip_text";
+	params.name = params.text;
+	// bake textbox padding into initial rect
+	params.rect = LLRect (TOOLTIP_PADDING, TOOLTIP_PADDING + 1, TOOLTIP_PADDING + 1, TOOLTIP_PADDING);
+	params.follows.flags = FOLLOWS_ALL;
+	params.h_pad = 4;
+	params.v_pad = 2;
+	params.mouse_opaque = false;
+	params.text_color = LLUIColorTable::instance().getColor( "ToolTipTextColor" );
+	params.bg_visible = false;
+	params.font.style = "NORMAL";
+	//params.border_drop_shadow_visible = true;
+	mTextBox = LLUICtrlFactory::create<LLTextBox> (params);
+	addChild(mTextBox);
+
+	if (p.image.isProvided())
+	{
+		LLIconCtrl::Params icon_params;
+		icon_params.name = "tooltip_icon";
+		LLRect icon_rect;
+		const S32 TOOLTIP_ICON_SIZE = 18;
+		icon_rect.setOriginAndSize(TOOLTIP_PADDING, TOOLTIP_PADDING, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE);
+		icon_params.rect = icon_rect;
+		icon_params.follows.flags = FOLLOWS_LEFT | FOLLOWS_BOTTOM;
+		icon_params.image = p.image;
+		icon_params.mouse_opaque = false;
+		addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_params));
+
+		// move text over to fit image in
+		mTextBox->translate(TOOLTIP_ICON_SIZE,0);
+	}
+
+	if (p.click_callback.isProvided())
+	{
+		setMouseUpCallback(boost::bind(p.click_callback()));
+	}
+}
+
+void LLToolTip::setValue(const LLSD& value)
+{
+	mTextBox->setWrappedText(value.asString());
+	mTextBox->reshapeToFitText();
+
+	// reshape tooltip panel to fit text box
+	LLRect tooltip_rect = calcBoundingRect();
+	tooltip_rect.mTop += TOOLTIP_PADDING;
+	tooltip_rect.mRight += TOOLTIP_PADDING;
+	tooltip_rect.mBottom = 0;
+	tooltip_rect.mLeft = 0;
+
+	setRect(tooltip_rect);
+}
+
+void LLToolTip::setVisible(BOOL visible)
+{
+	// fade out tooltip over time
+	if (!visible)
+	{
+		// don't actually change mVisible state, start fade out transition instead
+		if (!mFadeTimer.getStarted())
+		{
+			mFadeTimer.start();
+		}
+	}
+	else
+	{
+		mFadeTimer.stop();
+		LLPanel::setVisible(TRUE);
+	}
+}
+
+BOOL LLToolTip::handleHover(S32 x, S32 y, MASK mask)
+{
+	LLPanel::handleHover(x, y, mask);
+	if (mHasClickCallback)
+	{
+		getWindow()->setCursor(UI_CURSOR_HAND);
+	}
+	return TRUE;
+}
+
+void LLToolTip::draw()
+{
+	F32 alpha = 1.f;
+
+	if (LLUI::getMouseIdleTime() > mVisibleTime)
+	{
+		LLToolTipMgr::instance().hideToolTips();
+	}
+
+	if (mFadeTimer.getStarted())
+	{
+		F32 tool_tip_fade_time = LLUI::sSettingGroups["config"]->getF32("ToolTipFadeTime");
+		alpha = clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, tool_tip_fade_time, 1.f, 0.f);
+		if (alpha == 0.f)
+		{
+			// finished fading out, so hide ourselves
+			mFadeTimer.stop();
+			LLPanel::setVisible(false);
+		}
+	}
+
+	// draw tooltip contents with appropriate alpha
+	{
+		LLViewDrawContext context(alpha);
+		LLPanel::draw();
+	}
+}
+
+
+
+//
+// LLToolTipMgr
+//
+LLToolTipParams::LLToolTipParams()
+:	pos("pos"),
+	message("message"),
+	delay_time("delay_time", LLUI::sSettingGroups["config"]->getF32( "ToolTipDelay" )),
+	visible_time("visible_time", LLUI::sSettingGroups["config"]->getF32( "ToolTipVisibleTime" )),
+	sticky_rect("sticky_rect"),
+	width("width", 200),
+	image("image")
+{}
+
+LLToolTipMgr::LLToolTipMgr()
+:	mToolTip(NULL)
+{
+}
+
+LLToolTip* LLToolTipMgr::createToolTip(const LLToolTipParams& params)
+{
+	S32 mouse_x;
+	S32 mouse_y;
+	LLUI::getMousePositionLocal(gToolTipView->getParent(), &mouse_x, &mouse_y);
+
+
+	LLToolTip::Params tooltip_params;
+	tooltip_params.name = "tooltip";
+	tooltip_params.mouse_opaque = true;
+	tooltip_params.rect = LLRect (0, 1, 1, 0);
+	tooltip_params.bg_opaque_color = LLUIColorTable::instance().getColor( "ToolTipBgColor" );
+	tooltip_params.background_visible = true;
+	tooltip_params.visible_time = params.visible_time;
+	if (params.image.isProvided())
+	{
+		tooltip_params.image = params.image;
+	}
+	if (params.click_callback.isProvided())
+	{
+		tooltip_params.click_callback = params.click_callback;
+	}
+
+	LLToolTip* tooltip = LLUICtrlFactory::create<LLToolTip> (tooltip_params);
+
+	// make tooltip fixed width and tall enough to fit text
+	tooltip->reshape(params.width, 2000);
+	tooltip->setValue(params.message());
+	gToolTipView->addChild(tooltip);
+
+	if (params.pos.isProvided())
+	{
+		// try to spawn at requested position
+		LLUI::positionViewNearMouse(tooltip, params.pos.x, params.pos.y);
+	}
+	else
+	{
+		// just spawn at mouse location
+		LLUI::positionViewNearMouse(tooltip);
+	}
+
+	//...update "sticky" rect and tooltip position
+	if (params.sticky_rect.isProvided())
+	{
+		mToolTipStickyRect = params.sticky_rect;
+	}
+	else
+	{
+		// otherwise just use one pixel rect around mouse cursor
+		mToolTipStickyRect.setOriginAndSize(mouse_x, mouse_y, 1, 1);
+	}
+	
+	if (params.click_callback.isProvided())
+	{
+		// keep tooltip up when we mouse over it
+		mToolTipStickyRect.unionWith(tooltip->getRect());
+	}
+
+	return tooltip;
+}
+
+
+void LLToolTipMgr::show(const std::string& msg)
+{
+	show(LLToolTipParams().message(msg));
+}
+
+void LLToolTipMgr::show(const LLToolTipParams& params)
+{
+	if (!params.validateBlock()) 
+	{
+		llwarns << "Could not display tooltip!" << llendl;
+		return;
+	}
+	
+	bool tooltip_shown =	mToolTip 
+							&& mToolTip->getVisible() 
+							&& !mToolTip->isFading();
+
+	// if tooltip contents change, hide existing tooltip
+	if (tooltip_shown && mLastToolTipMessage != params.message())
+	{
+		hideToolTips();
+	}
+
+	if (!mToolTipsBlocked									// we haven't hit a key, moved the mouse, etc.
+		&& LLUI::getMouseIdleTime() > params.delay_time		// the mouse has been still long enough
+		&& !tooltip_shown)									// tooltip not visible
+	{
+		// create new tooltip at mouse cursor position
+		delete mToolTip;
+		mToolTip = createToolTip(params);
+
+		// remember this tooltip so we know when it changes
+		mLastToolTipMessage = params.message();
+	}
+}
+
+// allow new tooltips to be created, e.g. after mouse has moved
+void LLToolTipMgr::enableToolTips()
+{
+	mToolTipsBlocked = false;
+}
+
+void LLToolTipMgr::hideToolTips() 
+{ 
+	mToolTipsBlocked = true; 
+	if (mToolTip)
+	{
+		mToolTip->setVisible(FALSE);
+	}
+}
+
+bool LLToolTipMgr::toolTipVisible()
+{
+	return mToolTip ? mToolTip->getVisible() : false;
+}
+
+LLRect LLToolTipMgr::getToolTipRect()
+{
+	if (mToolTip && mToolTip->getVisible())
+	{
+		return mToolTip->getRect();
+	}
+	return LLRect();
+}
+
+
+LLRect LLToolTipMgr::getStickyRect() 
+{ 
+	if (!mToolTip) return LLRect();
+
+	return mToolTip->isInVisibleChain() ? mToolTipStickyRect : LLRect(); 
+}
+
+// EOF
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
new file mode 100644
index 0000000000000000000000000000000000000000..fb7f9420994569fc9ca7a2e2aa908726a5edf7e8
--- /dev/null
+++ b/indra/llui/lltooltip.h
@@ -0,0 +1,127 @@
+/** 
+ * @file lltooltip.h
+ * @brief LLToolTipMgr class definition and related classes
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-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_LLTOOLTIP_H
+#define LL_LLTOOLTIP_H
+
+// Library includes
+#include "llsingleton.h"
+#include "llinitparam.h"
+#include "llview.h"
+
+//
+// Classes
+//
+class LLToolTipView : public LLView
+{
+public:
+	struct Params : public LLInitParam::Block<Params, LLView::Params>
+	{
+		Params()
+		{
+			mouse_opaque = false;
+		}
+	};
+	LLToolTipView(const LLToolTipView::Params&);
+	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
+	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+	/*virtual*/ BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask);
+	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+	/*virtual*/ BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
+
+	/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+
+	void drawStickyRect();
+
+	/*virtual*/ void draw();
+};
+
+struct LLToolTipPosParams : public LLInitParam::Block<LLToolTipPosParams>
+{
+	Mandatory<S32>		x, 
+						y;
+	LLToolTipPosParams()
+	:	x("x"),
+		y("y")
+	{}
+};
+
+struct LLToolTipParams : public LLInitParam::Block<LLToolTipParams>
+{
+	typedef boost::function<void(void)> click_callback_t;
+
+	Mandatory<std::string>		message;
+	
+	Optional<LLToolTipPosParams>	pos;
+	Optional<F32>					delay_time,
+									visible_time;
+	Optional<LLRect>				sticky_rect;
+	Optional<S32>					width;
+	Optional<LLUIImage*>			image;
+
+	Optional<click_callback_t>		click_callback;
+
+	LLToolTipParams();
+	LLToolTipParams(const std::string& message);
+};
+
+class LLToolTipMgr : public LLSingleton<LLToolTipMgr>
+{
+	LOG_CLASS(LLToolTipMgr);
+public:
+	LLToolTipMgr();
+	void show(const LLToolTipParams& params);
+	void show(const std::string& message);
+
+	void enableToolTips();
+	void hideToolTips();
+	bool toolTipVisible();
+	LLRect getToolTipRect();
+
+	LLRect getStickyRect();
+
+private:
+	class LLToolTip* createToolTip(const LLToolTipParams& params);
+
+	bool				mToolTipsBlocked;
+	class LLToolTip*	mToolTip;
+	std::string			mLastToolTipMessage;
+	LLRect				mToolTipStickyRect;
+};
+
+//
+// Globals
+//
+
+extern LLToolTipView *gToolTipView;
+
+#endif
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index 1d62ed93f999a9f4da1c035808098f32162d816d..950eaf2ea772cf99a92e4358c2b8232511fb67ee 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -44,6 +44,7 @@
 #include "llrect.h"
 #include "lldir.h"
 #include "llfontgl.h"
+#include "llgl.h"
 
 // Project includes
 #include "llcontrol.h"
@@ -80,10 +81,9 @@ std::list<std::string> gUntranslated;
 /*static*/ LLWindow*		LLUI::sWindow = NULL;
 /*static*/ LLHtmlHelp*		LLUI::sHtmlHelp = NULL;
 /*static*/ LLView*			LLUI::sRootView = NULL;
-/*static*/ BOOL            LLUI::sShowXUINames = FALSE;
-/*static*/ std::stack<LLRect> LLScreenClipRect::sClipRectStack;
 
 /*static*/ std::vector<std::string> LLUI::sXUIPaths;
+/*static*/ LLFrameTimer		LLUI::sMouseIdleTimer;
 
 // register filtereditor here
 static LLDefaultChildRegistry::Register<LLFilterEditor> register_filter_editor("filter_editor");
@@ -1561,12 +1561,6 @@ void gl_segmented_rect_3d_tex_top(const LLVector2& border_scale, const LLVector3
 	gl_segmented_rect_3d_tex(border_scale, border_width, border_height, width_vec, height_vec, ROUNDED_RECT_TOP);
 }
 
-bool handleShowXUINamesChanged(const LLSD& newvalue)
-{
-	LLUI::sShowXUINames = newvalue.asBoolean();
-	return true;
-}
-
 void LLUI::initClass(const settings_map_t& settings,
 					 LLImageProviderInterface* image_provider,
 					 LLUIAudioCallback audio_callback,
@@ -1588,10 +1582,6 @@ void LLUI::initClass(const settings_map_t& settings,
 	sWindow = NULL; // set later in startup
 	LLFontGL::sShadowColor = LLUIColorTable::instance().getColor("ColorDropShadow");
 
-	static LLUICachedControl<bool> show_xui_names ("ShowXUINames", false);
-	LLUI::sShowXUINames = show_xui_names;
-	LLUI::sSettingGroups["config"]->getControl("ShowXUINames")->getSignal()->connect(boost::bind(&handleShowXUINamesChanged, _2));
-	
 	// Callbacks for associating controls with floater visibilty:
 	LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Toggle", boost::bind(&LLFloaterReg::toggleFloaterInstance, _2));
 	LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Show", boost::bind(&LLFloaterReg::showFloaterInstance, _2));
@@ -1661,7 +1651,7 @@ void LLUI::setLineWidth(F32 width)
 }
 
 //static 
-void LLUI::setCursorPositionScreen(S32 x, S32 y)
+void LLUI::setMousePositionScreen(S32 x, S32 y)
 {
 	S32 screen_x, screen_y;
 	screen_x = llround((F32)x * sGLScaleFactor.mV[VX]);
@@ -1674,16 +1664,16 @@ void LLUI::setCursorPositionScreen(S32 x, S32 y)
 }
 
 //static 
-void LLUI::setCursorPositionLocal(const LLView* viewp, S32 x, S32 y)
+void LLUI::setMousePositionLocal(const LLView* viewp, S32 x, S32 y)
 {
 	S32 screen_x, screen_y;
 	viewp->localPointToScreen(x, y, &screen_x, &screen_y);
 
-	setCursorPositionScreen(screen_x, screen_y);
+	setMousePositionScreen(screen_x, screen_y);
 }
 
 //static 
-void LLUI::getCursorPositionLocal(const LLView* viewp, S32 *x, S32 *y)
+void LLUI::getMousePositionLocal(const LLView* viewp, S32 *x, S32 *y)
 {
 	LLCoordWindow cursor_pos_window;
 	LLView::getWindow()->getCursorPosition(&cursor_pos_window);
@@ -1867,74 +1857,46 @@ LLControlGroup& LLUI::getControlControlGroup (const std::string& controlname)
 	return *sSettingGroups["config"]; // default group
 }
 
-LLScreenClipRect::LLScreenClipRect(const LLRect& rect, BOOL enabled) : mScissorState(GL_SCISSOR_TEST), mEnabled(enabled)
+//static
+// spawn_x and spawn_y are top left corner of view in screen GL coordinates
+void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y)
 {
-	if (mEnabled)
-	{
-		pushClipRect(rect);
-	}
-	mScissorState.setEnabled(!sClipRectStack.empty());
-	updateScissorRegion();
-}
+	const S32 CURSOR_HEIGHT = 22;		// Approximate "normal" cursor size
+	const S32 CURSOR_WIDTH = 12;
 
-LLScreenClipRect::~LLScreenClipRect()
-{
-	if (mEnabled)
-	{
-		popClipRect();
-	}
-	updateScissorRegion();
-}
+	LLView* parent = view->getParent();
 
-//static 
-void LLScreenClipRect::pushClipRect(const LLRect& rect)
-{
-	LLRect combined_clip_rect = rect;
-	if (!sClipRectStack.empty())
-	{
-		LLRect top = sClipRectStack.top();
-		combined_clip_rect.intersectWith(top);
+	S32 mouse_x;
+	S32 mouse_y;
+	LLUI::getMousePositionLocal(parent, &mouse_x, &mouse_y);
 
-		if(combined_clip_rect.isEmpty())
-		{
-			// avoid artifacts where zero area rects show up as lines
-			combined_clip_rect = LLRect::null;
-		}
+	// If no spawn location provided, use mouse position
+	if (spawn_x == S32_MAX || spawn_y == S32_MAX)
+	{
+		spawn_x = mouse_x + CURSOR_WIDTH;
+		spawn_y = mouse_y - CURSOR_HEIGHT;
 	}
-	sClipRectStack.push(combined_clip_rect);
-}
 
-//static 
-void LLScreenClipRect::popClipRect()
-{
-	sClipRectStack.pop();
-}
+	LLRect virtual_window_rect = parent->getLocalRect();
 
-//static
-void LLScreenClipRect::updateScissorRegion()
-{
-	if (sClipRectStack.empty()) return;
+	LLRect mouse_rect;
+	const S32 MOUSE_CURSOR_PADDING = 5;
+	mouse_rect.setLeftTopAndSize(mouse_x - MOUSE_CURSOR_PADDING, 
+		mouse_y + MOUSE_CURSOR_PADDING, 
+		CURSOR_WIDTH + MOUSE_CURSOR_PADDING * 2, 
+		CURSOR_HEIGHT + MOUSE_CURSOR_PADDING * 2);
 
-	LLRect rect = sClipRectStack.top();
-	stop_glerror();
-	S32 x,y,w,h;
-	x = llfloor(rect.mLeft * LLUI::sGLScaleFactor.mV[VX]);
-	y = llfloor(rect.mBottom * LLUI::sGLScaleFactor.mV[VY]);
-	w = llmax(0, llceil(rect.getWidth() * LLUI::sGLScaleFactor.mV[VX])) + 1;
-	h = llmax(0, llceil(rect.getHeight() * LLUI::sGLScaleFactor.mV[VY])) + 1;
-	glScissor( x,y,w,h );
-	stop_glerror();
+	S32 local_x, local_y;
+	view->getParent()->screenPointToLocal(spawn_x, spawn_y, &local_x, &local_y);
+
+	// Start at spawn position (using left/top)
+	view->setOrigin( local_x, local_y - view->getRect().getHeight());
+	// Make sure we're onscreen and not overlapping the mouse
+	view->translateIntoRectWithExclusion( virtual_window_rect, mouse_rect, FALSE );
 }
 
 
-LLLocalClipRect::LLLocalClipRect(const LLRect &rect, BOOL enabled) 
-: LLScreenClipRect(LLRect(rect.mLeft + LLFontGL::sCurOrigin.mX, 
-						rect.mTop + LLFontGL::sCurOrigin.mY, 
-						rect.mRight + LLFontGL::sCurOrigin.mX, 
-						rect.mBottom + LLFontGL::sCurOrigin.mY),
-					enabled)
-{
-}
+// LLLocalClipRect and LLScreenClipRect moved to lllocalcliprect.h/cpp
 
 namespace LLInitParam
 {
@@ -2084,6 +2046,19 @@ namespace LLInitParam
 		return rect;
 	}
 
+	TypedParam<LLCoordGL>::TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
+	:	super_t(descriptor, name, value, func, min_count, max_count),
+		x("x"),
+		y("y")
+	{
+	}
+
+	LLCoordGL TypedParam<LLCoordGL>::getValueFromBlock() const
+	{
+		return LLCoordGL(x, y);
+	}
+
+
 	void TypeValues<LLFontGL::HAlign>::declareValues()
 	{
 		declare("left", LLFontGL::LEFT);
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index 1f9b0b2dbc0df6d8d55c89506c816ce947489028..33338f30f9dc96808cff750328b083d898ea1e18 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -39,8 +39,6 @@
 #include "llrect.h"
 #include "llcontrol.h"
 #include "llcoord.h"
-#include "llgl.h"			// *TODO: break this dependency
-#include <stack>
 #include "lluiimage.h"		// *TODO: break this dependency, need to add #include "lluiimage.h" to all widgets that hold an Optional<LLUIImage*> in their paramblocks
 #include "llinitparam.h"
 #include "llregistry.h"
@@ -50,6 +48,7 @@
 #include "lllazyvalue.h"
 #include "llhandle.h"		// *TODO: remove this dependency, added as a 
 							// convenience when LLHandle moved to llhandle.h
+#include "llframetimer.h"
 
 // LLUIFactory
 #include "llsd.h"
@@ -188,9 +187,9 @@ class LLUI
 	static LLView* getRootView() { return sRootView; }
 	static void setRootView(LLView* view) { sRootView = view; }
 	static std::string locateSkin(const std::string& filename);
-	static void setCursorPositionScreen(S32 x, S32 y);
-	static void setCursorPositionLocal(const LLView* viewp, S32 x, S32 y);
-	static void getCursorPositionLocal(const LLView* viewp, S32 *x, S32 *y);
+	static void setMousePositionScreen(S32 x, S32 y);
+	static void setMousePositionLocal(const LLView* viewp, S32 x, S32 y);
+	static void getMousePositionLocal(const LLView* viewp, S32 *x, S32 *y);
 	static void setScaleFactor(const LLVector2& scale_factor);
 	static void setLineWidth(F32 width);
 	static LLPointer<LLUIImage> getUIImageByID(const LLUUID& image_id);
@@ -203,7 +202,16 @@ class LLUI
 	static void setHtmlHelp(LLHtmlHelp* html_help);
 	// Returns the control group containing the control name, or the default group
 	static LLControlGroup& getControlControlGroup (const std::string& controlname);
-	
+	static F32 getMouseIdleTime() { return sMouseIdleTimer.getElapsedTimeF32(); }
+	static void resetMouseIdleTimer() { sMouseIdleTimer.reset(); }
+	static LLWindow* getWindow() { return sWindow; }
+
+	// Ensures view does not overlap mouse cursor, but is inside
+	// the view's parent rectangle.  Used for tooltips, inspectors.
+	// Optionally override the view's default X/Y, which are relative to the
+	// view's parent.
+	static void positionViewNearMouse(LLView* view,	S32 spawn_x = S32_MAX, S32 spawn_y = S32_MAX);
+
 	//
 	// Data
 	//
@@ -211,38 +219,16 @@ class LLUI
 	static LLUIAudioCallback sAudioCallback;
 	static LLVector2		sGLScaleFactor;
 	static LLWindow*		sWindow;
-	static BOOL             sShowXUINames;
 	static LLHtmlHelp*		sHtmlHelp;
 	static LLView*			sRootView;
 private:
 	static LLImageProviderInterface* sImageProvider;
 	static std::vector<std::string> sXUIPaths;
+	static LLFrameTimer		sMouseIdleTimer;
 };
 
 
-class LLScreenClipRect
-{
-public:
-	LLScreenClipRect(const LLRect& rect, BOOL enabled = TRUE);
-	virtual ~LLScreenClipRect();
-
-private:
-	static void pushClipRect(const LLRect& rect);
-	static void popClipRect();
-	static void updateScissorRegion();
-
-private:
-	LLGLState		mScissorState;
-	BOOL			mEnabled;
-
-	static std::stack<LLRect> sClipRectStack;
-};
-
-class LLLocalClipRect : public LLScreenClipRect
-{
-public:
-	LLLocalClipRect(const LLRect& rect, BOOL enabled = TRUE);
-};
+// Moved LLLocalClipRect to lllocalcliprect.h
 
 // Moved all LLHandle-related code to llhandle.h
 
@@ -406,10 +392,10 @@ namespace LLInitParam
 	{
         typedef BlockValue<LLUIColor> super_t;
 	public:
-		Optional<F32> red;
-		Optional<F32> green;
-		Optional<F32> blue;
-		Optional<F32> alpha;
+		Optional<F32>	red,
+						green,
+						blue,
+						alpha;
 		Optional<std::string> control;
 
 		TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
@@ -422,9 +408,9 @@ namespace LLInitParam
 	{
         typedef BlockValue<const LLFontGL*> super_t;
 	public:
-		Optional<std::string> name;
-		Optional<std::string> size;
-		Optional<std::string> style;
+		Optional<std::string>	name,
+								size,
+								style;
 
 		TypedParam(BlockDescriptor& descriptor, const char* name, const LLFontGL* const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
 		const LLFontGL* getValueFromBlock() const;
@@ -447,6 +433,19 @@ namespace LLInitParam
 	{
 		static void declareValues();
 	};
+
+	template<>
+	class TypedParam<LLCoordGL>
+	:	public BlockValue<LLCoordGL>
+	{
+		typedef BlockValue<LLCoordGL> super_t;
+	public:
+		Optional<S32>	x,
+						y;
+
+		TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
+		LLCoordGL getValueFromBlock() const;
+	};
 }
 
 #endif
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 1ab04054ff76420a069c1997fd7ba21915765b30..28cdb1ac2760b41853455f20cf4076f3409ae23e 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -839,10 +839,6 @@ BOOL LLUICtrl::getTentative() const
 void LLUICtrl::setColor(const LLColor4& color)							
 { }
 
-// virtual
-void LLUICtrl::setAlpha(F32 alpha)							
-{ }
-
 
 namespace LLInitParam
 {
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 5011adcfe9800b7aeef1ad0d40b513253b2d249b..40302306846640b4bcd4f2a8aa1c3c7c022bfae9 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -213,7 +213,6 @@ class LLUICtrl
 	virtual void	onTabInto();
 	virtual void	clear();
 	virtual void	setColor(const LLColor4& color);
-	virtual void	setAlpha(F32 alpha);
 
 	BOOL	focusNextItem(BOOL text_entry_only);
 	BOOL	focusPrevItem(BOOL text_entry_only);
diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index 1161101f90dc3506fa7363d8a2f7c544c7a9a6b7..538e1ec492c0bb1f39c6adbc9ef16f93f83f4d23 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -200,10 +200,7 @@ void LLUICtrlFactory::buildFloater(LLFloater* floaterp, const std::string& filen
 		
 		floaterp->initFloaterXML(root, floaterp->getParent(), output_node);
 
-		if (LLUI::sShowXUINames)
-		{
-			floaterp->setToolTip(filename);
-		}
+		floaterp->setXMLFilename(filename);
 		
 		floaterp->getCommitCallbackRegistrar().popScope();
 		floaterp->getEnableCallbackRegistrar().popScope();
@@ -276,10 +273,7 @@ BOOL LLUICtrlFactory::buildPanel(LLPanel* panelp, const std::string& filename, L
 		panelp->getCommitCallbackRegistrar().popScope();
 		panelp->getEnableCallbackRegistrar().popScope();
 		
-		if (LLUI::sShowXUINames)
-		{
-			panelp->setToolTip(filename);
-		}
+		panelp->setXMLFilename(filename);
 
 		if (!panelp->getFactoryMap().empty())
 		{
@@ -317,10 +311,6 @@ LLView *LLUICtrlFactory::createFromXML(LLXMLNodePtr node, LLView* parent, const
 		parent = mDummyPanel;
 	}
 	LLView *view = (*funcp)(node, parent, output_node);	
-	if (LLUI::sShowXUINames && view && !filename.empty())
-	{
-		view->setToolTip(filename);
-	}
 	
 	return view;
 }
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 55d94b325f1d950ba81e66ab2ac7215bde66af59..46510804f8704362c3c1c7ced14c190b1446166f 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -49,6 +49,7 @@
 #include "llwindow.h"
 #include "v3color.h"
 #include "lluictrlfactory.h"
+#include "lltooltip.h"
 
 // for ui edit hack
 #include "llbutton.h"
@@ -70,6 +71,8 @@ LLView* LLView::sPreviewClickedElement = NULL;
 BOOL	LLView::sDrawPreviewHighlights = FALSE;
 S32		LLView::sLastLeftXML = S32_MIN;
 S32		LLView::sLastBottomXML = S32_MIN;
+std::vector<LLViewDrawContext*> LLViewDrawContext::sDrawContextStack;
+
 
 #if LL_DEBUG
 BOOL LLView::sIsDrawing = FALSE;
@@ -662,86 +665,52 @@ void LLView::onMouseLeave(S32 x, S32 y, MASK mask)
 }
 
 
-std::string LLView::getShowNamesToolTip()
+LLView* LLView::childrenHandleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen)
 {
-	LLView* view = getParent();
-	std::string name;
-	std::string tool_tip = mName;
-
-	while (view)
+	LLView* handled_view = NULL;
+	for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
 	{
-		name = view->getName();
-
-		if (name == "root") break;
-
-		if (view->getToolTip().find(".xml") != std::string::npos)
+		LLView* viewp = *child_it;
+		S32 local_x = x - viewp->getRect().mLeft;
+		S32 local_y = y - viewp->getRect().mBottom;
+		if(viewp->pointInView(local_x, local_y) &&
+			viewp->getVisible() &&
+			viewp->handleToolTip(local_x, local_y, msg, sticky_rect_screen) )
 		{
-			tool_tip = view->getToolTip() + "/" +  tool_tip;
+			if (sDebugMouseHandling)
+			{
+				sMouseHandlerMessage = std::string("->") + viewp->mName + sMouseHandlerMessage;
+			}
+
+			handled_view = viewp;
 			break;
 		}
-		else
-		{
-			tool_tip = view->getName() + "/" +  tool_tip;
-		}
-
-		view = view->getParent();
 	}
-
-	return "/" + tool_tip;
+	return handled_view;
 }
 
-
-BOOL LLView::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen)
+BOOL LLView::handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen)
 {
-	BOOL handled = FALSE;
-
-	std::string tool_tip;
+	LLView* child_handler = childrenHandleToolTip(x, y, msg, sticky_rect_screen);
+	BOOL handled = child_handler != NULL;
 
-	for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+	// child widgets get priority on tooltips
+	if (!handled && !mToolTipMsg.empty())
 	{
-		LLView* viewp = *child_it;
-		S32 local_x = x - viewp->mRect.mLeft;
-		S32 local_y = y - viewp->mRect.mBottom;
-		// Allow tooltips for disabled views so we can explain to the user why
-		// the view is disabled. JC
-		if( viewp->pointInView(local_x, local_y) 
-			&& viewp->getVisible() 
-			// && viewp->getEnabled()
-			&& viewp->handleToolTip(local_x, local_y, msg, sticky_rect_screen ))
-		{
-			// child provided a tooltip, just return
-			if (!msg.empty()) return TRUE;
-
-			// otherwise, one of our children ate the event so don't traverse
-			// siblings however, our child did not actually provide a tooltip
-            // so we might want to
-			handled = TRUE;
-			break;
-		}
-	}
+		// allow "scrubbing" over ui by showing next tooltip immediately
+		// if previous one was still visible
+		F32 timeout = LLToolTipMgr::instance().toolTipVisible() 
+			? 0.f
+			: LLUI::sSettingGroups["config"]->getF32( "ToolTipDelay" );
+		LLToolTipMgr::instance().show(LLToolTipParams()
+			.message(mToolTipMsg)
+			.sticky_rect(calcScreenRect())
+			.delay_time(timeout));
 
-	// get our own tooltip
-	tool_tip = mToolTipMsg.getString();
-	
-	if (LLUI::sShowXUINames 
-		&& (tool_tip.find(".xml", 0) == std::string::npos) 
-		&& (mName.find("Drag", 0) == std::string::npos))
-	{
-		tool_tip = getShowNamesToolTip();
+		handled = TRUE;
 	}
 
-	if(!tool_tip.empty())
-	{
-		msg = tool_tip;
-
-		// Convert rect local to screen coordinates
-		*sticky_rect_screen = calcScreenRect();
-	}
-	// don't allow any siblings to handle this event
-	// even if we don't have a tooltip
-	if (getMouseOpaque() || 
-		(!tool_tip.empty() && 
-		 (!LLUI::sShowXUINames || dynamic_cast<LLTextBox*>(this))))
+	if( blockMouseEvent(x, y) )
 	{
 		handled = TRUE;
 	}
@@ -1518,45 +1487,51 @@ void LLView::reshape(S32 width, S32 height, BOOL called_from_parent)
 	updateBoundingRect();
 }
 
-void LLView::updateBoundingRect()
+LLRect LLView::calcBoundingRect()
 {
-	if (isDead()) return;
+	LLRect local_bounding_rect = LLRect::null;
 
-	if (mUseBoundingRect)
+	child_list_const_iter_t child_it;
+	for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
 	{
-		LLRect local_bounding_rect = LLRect::null;
-
-		child_list_const_iter_t child_it;
-		for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+		LLView* childp = *child_it;
+		// ignore invisible and "top" children when calculating bounding rect
+		// such as combobox popups
+		if (!childp->getVisible() || childp == gFocusMgr.getTopCtrl()) 
 		{
-			LLView* childp = *child_it;
-			// ignore invisible and "top" children when calculating bounding rect
-			// such as combobox popups
-			if (!childp->getVisible() || childp == gFocusMgr.getTopCtrl()) 
-			{
-				continue;
-			}
+			continue;
+		}
 
-			LLRect child_bounding_rect = childp->getBoundingRect();
+		LLRect child_bounding_rect = childp->getBoundingRect();
 
-			if (local_bounding_rect.isEmpty())
-			{
-				// start out with bounding rect equal to first visible child's bounding rect
-				local_bounding_rect = child_bounding_rect;
-			}
-			else
+		if (local_bounding_rect.isEmpty())
+		{
+			// start out with bounding rect equal to first visible child's bounding rect
+			local_bounding_rect = child_bounding_rect;
+		}
+		else
+		{
+			// accumulate non-null children rectangles
+			if (!child_bounding_rect.isEmpty())
 			{
-				// accumulate non-null children rectangles
-				if (!child_bounding_rect.isEmpty())
-				{
-					local_bounding_rect.unionWith(child_bounding_rect);
-				}
+				local_bounding_rect.unionWith(child_bounding_rect);
 			}
 		}
+	}
+
+	// convert to parent-relative coordinates
+	local_bounding_rect.translate(mRect.mLeft, mRect.mBottom);
+	return local_bounding_rect;
+}
+
+
+void LLView::updateBoundingRect()
+{
+	if (isDead()) return;
 
-		mBoundingRect = local_bounding_rect;
-		// translate into parent-relative coordinates
-		mBoundingRect.translate(mRect.mLeft, mRect.mBottom);
+	if (mUseBoundingRect)
+	{
+		mBoundingRect = calcBoundingRect();
 	}
 	else
 	{
@@ -1817,73 +1792,123 @@ void LLView::deleteViewByHandle(LLHandle<LLView> handle)
 }
 
 
-// Moves the view so that it is entirely inside of constraint.
-// If the view will not fit because it's too big, aligns with the top and left.
-// (Why top and left?  That's where the drag bars are for floaters.)
-BOOL LLView::translateIntoRect(const LLRect& constraint, BOOL allow_partial_outside )
+LLCoordGL getNeededTranslation(const LLRect& input, const LLRect& constraint, BOOL allow_partial_outside)
 {
-	S32 delta_x = 0;
-	S32 delta_y = 0;
+	LLCoordGL delta;
 
 	if (allow_partial_outside)
 	{
 		const S32 KEEP_ONSCREEN_PIXELS = 16;
 
-		if( getRect().mRight - KEEP_ONSCREEN_PIXELS < constraint.mLeft )
+		if( input.mRight - KEEP_ONSCREEN_PIXELS < constraint.mLeft )
 		{
-			delta_x = constraint.mLeft - (getRect().mRight - KEEP_ONSCREEN_PIXELS);
+			delta.mX = constraint.mLeft - (input.mRight - KEEP_ONSCREEN_PIXELS);
 		}
 		else
-		if( getRect().mLeft + KEEP_ONSCREEN_PIXELS > constraint.mRight )
+		if( input.mLeft + KEEP_ONSCREEN_PIXELS > constraint.mRight )
 		{
-			delta_x = constraint.mRight - (getRect().mLeft + KEEP_ONSCREEN_PIXELS);
+			delta.mX = constraint.mRight - (input.mLeft + KEEP_ONSCREEN_PIXELS);
 		}
 
-		if( getRect().mTop > constraint.mTop )
+		if( input.mTop > constraint.mTop )
 		{
-			delta_y = constraint.mTop - getRect().mTop;
+			delta.mY = constraint.mTop - input.mTop;
 		}
 		else
-		if( getRect().mTop - KEEP_ONSCREEN_PIXELS < constraint.mBottom )
+		if( input.mTop - KEEP_ONSCREEN_PIXELS < constraint.mBottom )
 		{
-			delta_y = constraint.mBottom - (getRect().mTop - KEEP_ONSCREEN_PIXELS);
+			delta.mY = constraint.mBottom - (input.mTop - KEEP_ONSCREEN_PIXELS);
 		}
 	}
 	else
 	{
-		if( getRect().mLeft < constraint.mLeft )
+		if( input.mLeft < constraint.mLeft )
 		{
-			delta_x = constraint.mLeft - getRect().mLeft;
+			delta.mX = constraint.mLeft - input.mLeft;
 		}
 		else
-		if( getRect().mRight > constraint.mRight )
+		if( input.mRight > constraint.mRight )
 		{
-			delta_x = constraint.mRight - getRect().mRight;
+			delta.mX = constraint.mRight - input.mRight;
 			// compensate for left edge possible going off screen
-			delta_x += llmax( 0, getRect().getWidth() - constraint.getWidth() );
+			delta.mX += llmax( 0, input.getWidth() - constraint.getWidth() );
 		}
 
-		if( getRect().mTop > constraint.mTop )
+		if( input.mTop > constraint.mTop )
 		{
-			delta_y = constraint.mTop - getRect().mTop;
+			delta.mY = constraint.mTop - input.mTop;
 		}
 		else
-		if( getRect().mBottom < constraint.mBottom )
+		if( input.mBottom < constraint.mBottom )
 		{
-			delta_y = constraint.mBottom - getRect().mBottom;
+			delta.mY = constraint.mBottom - input.mBottom;
 			// compensate for top edge possible going off screen
-			delta_y -= llmax( 0, getRect().getHeight() - constraint.getHeight() );
+			delta.mY -= llmax( 0, input.getHeight() - constraint.getHeight() );
 		}
 	}
 
-	if (delta_x != 0 || delta_y != 0)
+	return delta;
+}
+
+// Moves the view so that it is entirely inside of constraint.
+// If the view will not fit because it's too big, aligns with the top and left.
+// (Why top and left?  That's where the drag bars are for floaters.)
+BOOL LLView::translateIntoRect(const LLRect& constraint, BOOL allow_partial_outside )
+{
+	LLCoordGL translation = getNeededTranslation(getRect(), constraint, allow_partial_outside);
+
+	if (translation.mX != 0 || translation.mY != 0)
+	{
+		translate(translation.mX, translation.mY);
+		return TRUE;
+	}
+	return FALSE;
+}
+
+// move this view into "inside" but not onto "exclude"
+// NOTE: if this view is already contained in "inside", we ignore the "exclude" rect
+BOOL LLView::translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, BOOL allow_partial_outside )
+{
+	LLCoordGL translation = getNeededTranslation(getRect(), inside, allow_partial_outside);
+	
+	if (translation.mX != 0 || translation.mY != 0)
 	{
-		translate(delta_x, delta_y);
+		// translate ourselves into constraint rect
+		translate(translation.mX, translation.mY);
+	
+		// do we overlap with exclusion area?
+		// keep moving in the same direction to the other side of the exclusion rect
+		if (exclude.overlaps(getRect()))
+		{
+			// moving right
+			if (translation.mX > 0)
+			{
+				translate(exclude.mRight - getRect().mLeft, 0);
+			}
+			// moving left
+			else if (translation.mX < 0)
+			{
+				translate(exclude.mLeft - getRect().mRight, 0);
+			}
+
+			// moving up
+			if (translation.mY > 0)
+			{
+				translate(0, exclude.mTop - getRect().mBottom);
+			}
+			// moving down
+			else if (translation.mY < 0)
+			{
+				translate(0, exclude.mBottom - getRect().mTop);
+			}
+		}
+
 		return TRUE;
 	}
 	return FALSE;
 }
 
+
 void LLView::centerWithin(const LLRect& bounds)
 {
 	S32 left   = bounds.mLeft + (bounds.getWidth() - getRect().getWidth()) / 2;
@@ -2712,19 +2737,44 @@ void LLView::setupParamsForExport(Params& p, LLView* parent)
 	convert_coords_to_top_left(p, parent);
 }
 
-LLView::tree_iterator_t LLView::beginTree() 
+LLView::tree_iterator_t LLView::beginTreeDFS() 
 { 
 	return tree_iterator_t(this, 
 							boost::bind(boost::mem_fn(&LLView::beginChild), _1), 
 							boost::bind(boost::mem_fn(&LLView::endChild), _1)); 
 }
 
-LLView::tree_iterator_t LLView::endTree() 
+LLView::tree_iterator_t LLView::endTreeDFS() 
 { 
 	// an empty iterator is an "end" iterator
 	return tree_iterator_t();
 }
 
+LLView::tree_post_iterator_t LLView::beginTreeDFSPost() 
+{ 
+	return tree_post_iterator_t(this, 
+							boost::bind(boost::mem_fn(&LLView::beginChild), _1), 
+							boost::bind(boost::mem_fn(&LLView::endChild), _1)); 
+}
+
+LLView::tree_post_iterator_t LLView::endTreeDFSPost() 
+{ 
+	// an empty iterator is an "end" iterator
+	return tree_post_iterator_t();
+}
+
+
+LLView::root_to_view_iterator_t LLView::beginRootToView()
+{
+	return root_to_view_iterator_t(this, boost::bind(&LLView::getParent, _1));
+}
+
+LLView::root_to_view_iterator_t LLView::endRootToView()
+{
+	return root_to_view_iterator_t();
+}
+
+
 // only create maps on demand, as they incur heap allocation/deallocation cost
 // when a view is constructed/deconstructed
 LLView::default_widget_map_t& LLView::getDefaultWidgetMap() const
@@ -2735,6 +2785,7 @@ LLView::default_widget_map_t& LLView::getDefaultWidgetMap() const
 	}
 	return *mDefaultWidgets;
 }
+
 void	LLView::notifyParent(const LLSD& info)
 {
 	LLView* parent = getParent();
@@ -2749,3 +2800,18 @@ void	LLView::notifyChildren(const LLSD& info)
 	}
 }
 
+// convenient accessor for draw context
+const LLViewDrawContext& LLView::getDrawContext()
+{
+	return LLViewDrawContext::getCurrentContext();
+}
+
+const LLViewDrawContext& LLViewDrawContext::getCurrentContext()
+{
+	static LLViewDrawContext default_context;
+
+	if (sDrawContextStack.empty())
+		return default_context;
+		
+	return *sDrawContextStack.back();
+}
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 1d48378081faf03fc97ec3b5960174e171221bcd..d80c2af568486a4e0fd1217cb7dc425e05eb5a34 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -70,74 +70,35 @@ const BOOL	NOT_MOUSE_OPAQUE = FALSE;
 
 const U32 GL_NAME_UI_RESERVED = 2;
 
-/*
-// virtual functions defined in LLView:
-
-virtual BOOL isCtrl() const;
-		LLUICtrl
-virtual BOOL isPanel();
-		LLPanel
-virtual void setRect(const LLRect &rect);
-		LLLineEditor
-		LLPanel
-virtual BOOL canFocusChildren() const		{ return TRUE; }
-		LLFolderView
-virtual void deleteAllChildren();
-		LLFolderView, LLPanelInventory
-virtual void	setTentative(BOOL b)		{}
-		LLUICtrl, LLSliderCtrl, LLSpinCtrl
-virtual BOOL	getTentative() const		{ return FALSE; }
-		LLUICtrl, LLCheckBoxCtrl
-virtual void	setVisible(BOOL visible);
-		LLFloater, LLAlertDialog, LLMenuItemGL, LLModalDialog
-virtual void	setEnabled(BOOL enabled)	{ mEnabled = enabled; }
-		LLCheckBoxCtrl, LLComboBox, LLLineEditor, LLMenuGL, LLRadioGroup, etc
-virtual BOOL	setLabelArg( const std::string& key, const LLStringExplicit& text ) { return FALSE; }
-		LLUICtrl, LLButton, LLCheckBoxCtrl, LLLineEditor, LLMenuGL, LLSliderCtrl
-virtual void	handleVisibilityChange ( BOOL curVisibilityIn );
-		LLMenuGL
-virtual LLRect getSnapRect() const	{ return mRect; } *TODO: Make non virtual
-		LLFloater
-virtual LLRect getRequiredRect()			{ return mRect; }
-		LLScrolllistCtrl
-virtual void	reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
-		LLUICtrl, et. al.
-virtual void	translate( S32 x, S32 y );
-		LLMenuGL		
-virtual void	setShape(const LLRect& new_rect, bool by_user);
-		LLFloater, LLScrollLIstVtrl
-virtual LLView*	findSnapRect(LLRect& new_rect, const LLCoordGL& mouse_dir, LLView::ESnapType snap_type, S32 threshold, S32 padding = 0);
-virtual LLView*	findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding = 0);
-		LLScrollListCtrl
-virtual BOOL	canSnapTo(const LLView* other_view) { return other_view != this && other_view->getVisible(); }
-		LLFloater
-virtual void	snappedTo(const LLView* snap_view) {}
-		LLFloater
-virtual BOOL	handleKey(KEY key, MASK mask, BOOL called_from_parent);
-		*
-virtual BOOL	handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
-		*
-virtual BOOL	handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,EDragAndDropType cargo_type,void* cargo_data,EAcceptance* accept,std::string& tooltip_msg);
-		*
-virtual void	draw();
-		*
-
-		*
-virtual void onFocusLost() {}
-		LLUICtrl, LLScrollListCtrl, LLMenuGL, LLLineEditor, LLComboBox
-virtual void onFocusReceived() {}
-		LLUICtrl, LLTextEditor, LLScrollListVtrl, LLMenuGL, LLLineEditor
-virtual LLView* getChildView(const std::string& name, BOOL recurse = TRUE, BOOL create_if_missing = TRUE) const;
-		LLTabContainer, LLPanel, LLMenuGL
-virtual bool	handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);
-		LLMenuItem
 
-protected:
-virtual BOOL	handleKeyHere(KEY key, MASK mask);
-		*
-virtual BOOL	handleUnicodeCharHere(llwchar uni_char);
-		*
-*/
+// maintains render state during traversal of UI tree
+class LLViewDrawContext
+{
+public:
+	F32 mAlpha;
+
+	LLViewDrawContext(F32 alpha = 1.f)
+	:	mAlpha(alpha)
+	{
+		if (!sDrawContextStack.empty())
+		{
+			LLViewDrawContext* context_top = sDrawContextStack.back();
+			// merge with top of stack
+			mAlpha *= context_top->mAlpha;
+		}
+		sDrawContextStack.push_back(this);
+	}
+
+	~LLViewDrawContext()
+	{
+		sDrawContextStack.pop_back();
+	}
+
+	static const LLViewDrawContext& getCurrentContext();
+
+private:
+	static std::vector<LLViewDrawContext*> sDrawContextStack;
+};
 
 class LLViewWidgetRegistry : public LLChildRegistry<LLViewWidgetRegistry>
 {};
@@ -380,6 +341,7 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 
 	// Override and return required size for this object. 0 for width/height means don't care.
 	virtual LLRect getRequiredRect();
+	LLRect calcBoundingRect();
 	void updateBoundingRect();
 
 	LLView*		getRootView();
@@ -393,9 +355,19 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 	BOOL		hasChild(const std::string& childname, BOOL recurse = FALSE) const;
 	BOOL 		childHasKeyboardFocus( const std::string& childname ) const;
 	
+	// these iterators are used for collapsing various tree traversals into for loops
 	typedef LLTreeDFSIter<LLView, child_list_const_iter_t> tree_iterator_t;
-	tree_iterator_t beginTree();
-	tree_iterator_t endTree();
+	tree_iterator_t beginTreeDFS();
+	tree_iterator_t endTreeDFS();
+
+	typedef LLTreeDFSPostIter<LLView, child_list_const_iter_t> tree_post_iterator_t;
+	tree_post_iterator_t beginTreeDFSPost();
+	tree_post_iterator_t endTreeDFSPost();
+
+
+	typedef LLTreeDownIter<LLView> root_to_view_iterator_t;
+	root_to_view_iterator_t beginRootToView();
+	root_to_view_iterator_t endRootToView();
 
 	//
 	// UTILITIES
@@ -406,6 +378,7 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 	virtual void	translate( S32 x, S32 y );
 	void			setOrigin( S32 x, S32 y )	{ mRect.translate( x - mRect.mLeft, y - mRect.mBottom ); }
 	BOOL			translateIntoRect( const LLRect& constraint, BOOL allow_partial_outside );
+	BOOL			translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, BOOL allow_partial_outside );
 	void			centerWithin(const LLRect& bounds);
 
 	void	setShape(const LLRect& new_rect, bool by_user = false);
@@ -424,10 +397,7 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 									  EAcceptance* accept,
 									  std::string& tooltip_msg);
 
-	virtual std::string getShowNamesToolTip();
-
 	virtual void	draw();
-	void	drawChildren();
 
 	void parseFollowsFlags(const LLView::Params& params);
 
@@ -477,7 +447,8 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 	/*virtual*/ BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks);
 	/*virtual*/ BOOL	handleRightMouseDown(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL	handleRightMouseUp(S32 x, S32 y, MASK mask);	
-	/*virtual*/ BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect); // Display mToolTipMsg if no child handles it.
+	/*virtual*/ BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect); // Display mToolTipMsg if no child handles it.
+
 	/*virtual*/ const std::string&	getName() const;
 	/*virtual*/ void	onMouseCaptureLost();
 	/*virtual*/ BOOL	hasMouseCapture();
@@ -552,9 +523,12 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 	virtual void	notifyParent(const LLSD& info);
 	virtual void	notifyChildren(const LLSD& info);
 
+	static const LLViewDrawContext& getDrawContext();
+
 protected:
 	void			drawDebugRect();
 	void			drawChild(LLView* childp, S32 x_offset = 0, S32 y_offset = 0, BOOL force_draw = FALSE);
+	void			drawChildren();
 
 	LLView*	childrenHandleKey(KEY key, MASK mask);
 	LLView* childrenHandleUnicodeChar(llwchar uni_char);
@@ -574,10 +548,12 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 	LLView*	childrenHandleScrollWheel(S32 x, S32 y, S32 clicks);
 	LLView* childrenHandleRightMouseDown(S32 x, S32 y, MASK mask);
 	LLView* childrenHandleRightMouseUp(S32 x, S32 y, MASK mask);
+	LLView* childrenHandleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect);
 
 	ECursorType mHoverCursor;
 	
 private:
+
 	LLView*		mParentView;
 	child_list_t mChildList;
 
diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp
index f41c98f7b3d57d3260bdba3bf43ce3bb4a1375d7..30717f87def3caf41ff1ed4605bc479857b5a134 100644
--- a/indra/llui/llviewborder.cpp
+++ b/indra/llui/llviewborder.cpp
@@ -134,7 +134,7 @@ void LLViewBorder::draw()
 		}
 	}
 
-	drawChildren();
+	LLView::draw();
 }
 
 void LLViewBorder::drawOnePixelLines()
diff --git a/indra/llwindow/llmousehandler.h b/indra/llwindow/llmousehandler.h
index 7bd0f2eebf1ec802d719ffa5e2a591379e01b0be..b5dbbc53fbd447730ad49744d8350941c2f0b64e 100644
--- a/indra/llwindow/llmousehandler.h
+++ b/indra/llwindow/llmousehandler.h
@@ -45,17 +45,20 @@ class LLMouseHandler
 public:
 	LLMouseHandler() {}
 	virtual ~LLMouseHandler() {}
+
 	typedef enum {
 		SHOW_NEVER,
 		SHOW_IF_NOT_BLOCKED,
 		SHOW_ALWAYS,
 	} EShowToolTip;
+
 	typedef enum {
 		CLICK_LEFT,
 		CLICK_MIDDLE,
 		CLICK_RIGHT,
 		CLICK_DOUBLELEFT
 	} EClickType;
+
 	virtual BOOL	handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down);
 	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask) = 0;
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask) = 0;
@@ -67,8 +70,7 @@ class LLMouseHandler
 
 	virtual BOOL	handleHover(S32 x, S32 y, MASK mask) = 0;
 	virtual BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks) = 0;
-	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen) = 0;
-	virtual EShowToolTip getShowToolTip() { return SHOW_IF_NOT_BLOCKED; };
+	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen) = 0;
 	virtual const std::string& getName() const = 0;
 
 	virtual void	onMouseCaptureLost() = 0;
diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp
index d35e7b40f809e176d9d0bb4113aa77a2c6a65b14..1b867b79c975adcd12c28718901dedaac85ed5e3 100644
--- a/indra/llxuixml/llinitparam.cpp
+++ b/indra/llxuixml/llinitparam.cpp
@@ -516,6 +516,14 @@ namespace LLInitParam
 		return false;
 	}
 
+	template<>
+	bool ParamCompare<boost::function<void (void)> >::equals(
+		const boost::function<void (void)> &a,
+		const boost::function<void (void)> &b)
+	{
+		return false;
+	}
+
 	template<>
 	bool ParamCompare<LLSD>::equals(const LLSD &a, const LLSD &b)
 	{
diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h
index a1d0831939fdd246d8ce722b12602c8e67a77186..baa782916e6053c543799aa4151014c070f245bc 100644
--- a/indra/llxuixml/llinitparam.h
+++ b/indra/llxuixml/llinitparam.h
@@ -1815,7 +1815,13 @@ namespace LLInitParam
 	bool ParamCompare<boost::function<void (const LLSD &,const LLSD &)> >::equals(
 		const boost::function<void (const LLSD &,const LLSD &)> &a,
 		const boost::function<void (const LLSD &,const LLSD &)> &b);
-	
+
+	template<>
+	bool ParamCompare<boost::function<void (void)> >::equals(
+		const boost::function<void (void)> &a,
+		const boost::function<void (void)> &b);
+
+
 	template<>
 	bool ParamCompare<LLSD>::equals(const LLSD &a, const LLSD &b);
 }
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index f4194ed511597534e4eee94c4efc6842166b3376..321a238f704c02e850c3c35944481d3231a0ea43 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -196,6 +196,7 @@ set(viewer_SOURCE_FILES
     llfloatersettingsdebug.cpp
     llfloatersnapshot.cpp
     llfloatertelehub.cpp
+    llfloatertestinspectors.cpp
     llfloatertestlistview.cpp
     llfloatertools.cpp
     llfloatertopobjects.cpp
@@ -220,7 +221,6 @@ set(viewer_SOURCE_FILES
     llgroupmgr.cpp
     llgroupnotify.cpp
     llhomelocationresponder.cpp
-    llhoverview.cpp
     llhudeffectbeam.cpp
     llhudeffect.cpp
     llhudeffectlookat.cpp
@@ -652,6 +652,7 @@ set(viewer_HEADER_FILES
     llfloatersettingsdebug.h
     llfloatersnapshot.h
     llfloatertelehub.h
+    llfloatertestinspectors.h
     llfloatertestlistview.h
     llfloatertools.h
     llfloatertopobjects.h
@@ -676,7 +677,6 @@ set(viewer_HEADER_FILES
     llgroupmgr.h
     llgroupnotify.h
     llhomelocationresponder.h
-    llhoverview.h
     llhudeffect.h
     llhudeffectbeam.h
     llhudeffectlookat.h
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 32b1443157341cc97a5d9a961d3fe35dcb4a3355..bbe69531b428c4b0b2ff02b5be0a9d63c0211a0c 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1706,7 +1706,18 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
-    <key>DebugStatModeFPS</key>
+  <key>DebugShowXUINames</key>
+    <map>
+      <key>Comment</key>
+      <string>Show tooltips with XUI path to widget</string>
+      <key>Persist</key>
+      <integer>0</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+  <key>DebugStatModeFPS</key>
     <map>
       <key>Comment</key>
       <string>Mode of stat in Statistics floater</string>
@@ -3642,6 +3653,17 @@
       <key>Value</key>
       <real>0.0</real>
     </map>
+     <key>InspectorFadeTime</key>
+    <map>
+      <key>Comment</key>
+      <string>Fade out timing for inspectors</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>F32</string>
+      <key>Value</key>
+      <string>0.1</string>
+    </map> 
     <key>InstallLanguage</key>
     <map>
       <key>Comment</key>
@@ -6864,7 +6886,7 @@
       <key>Type</key>
       <string>Boolean</string>
       <key>Value</key>
-      <integer>0</integer>
+      <integer>1</integer>
     </map>    
     <key>ShowCameraAndMoveControls</key>                
     <map>
@@ -7309,17 +7331,6 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
-    <key>ShowXUINames</key>
-    <map>
-      <key>Comment</key>
-      <string>Display XUI Names as Tooltips</string>
-      <key>Persist</key>
-      <integer>0</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>0</integer>
-    </map>
     <key>SkinCurrent</key>
     <map>
       <key>Comment</key>
@@ -7713,7 +7724,18 @@
       <key>Value</key>
       <real>0.2</real>
     </map>
-    <key>ToolboxAutoMove</key>
+  <key>ToolTipVisibleTime</key>
+  <map>
+    <key>Comment</key>
+    <string>Fade tooltip after mouse is idle for this long</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>F32</string>
+    <key>Value</key>
+    <real>10.0</real>
+  </map>
+  <key>ToolboxAutoMove</key>
     <map>
       <key>Comment</key>
       <string>[NOT USED]</string>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 800c55511368e980f5416c622a541b5671681743..9fe02a8ead22fdb76032b5e537596e3a6000932b 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -128,7 +128,7 @@
 #include "lldebugview.h"
 #include "llconsole.h"
 #include "llcontainerview.h"
-#include "llhoverview.h"
+#include "lltooltip.h"
 
 #include "llsdserialize.h"
 
@@ -409,7 +409,6 @@ static void settings_to_globals()
 	gAllowTapTapHoldRun = gSavedSettings.getBOOL("AllowTapTapHoldRun");
 	gShowObjectUpdates = gSavedSettings.getBOOL("ShowObjectUpdates");
 	gMapScale = gSavedSettings.getF32("MapScale");
-	LLHoverView::sShowHoverTips = gSavedSettings.getBOOL("ShowHoverTips");
 
 	LLCubeMap::sUseCubeMaps = LLFeatureManager::getInstance()->isFeatureAvailable("RenderCubeMap");
 }
@@ -2353,7 +2352,7 @@ void LLAppViewer::cleanupSavedSettings()
 	}
 
 	gSavedSettings.setF32("MapScale", gMapScale );
-	gSavedSettings.setBOOL("ShowHoverTips", LLHoverView::sShowHoverTips);
+	gSavedSettings.setBOOL("ShowHoverTips", gToolTipView->getVisible());
 
 	// Some things are cached in LLAgent.
 	if (gAgent.mInitialized)
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 05addf3f3a238e7a3f2ad48416b71bf12512718a..a8b1ff6c92047b84024488b81e9664bd93085ace 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -147,7 +147,7 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)
 		if (mAvatarId != value.asUUID())
 		{
 			LLAvatarPropertiesProcessor::getInstance()->addObserver(value.asUUID(), this);
-			LLAvatarPropertiesProcessor::getInstance()->sendDataRequest(value.asUUID(),APT_PROPERTIES);
+			LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(value.asUUID());
 			mAvatarId = value.asUUID();
 
 			// Check if cache already contains image_id for that avatar
diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index ecd67e44ae417653cbaa22b24e6359ae0f1695cb..edf6e84b6827cd9c787c76e091f21f30fafd0057 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -34,10 +34,16 @@
 
 #include "llavatarpropertiesprocessor.h"
 
-#include "message.h"
+// Viewer includes
 #include "llagent.h"
 #include "llviewergenericmessage.h"
 
+// Linden library includes
+#include "llavatarconstants.h"	// AVATAR_TRANSACTED, etc.
+#include "lldate.h"
+#include "lltrans.h"
+#include "message.h"
+
 LLAvatarPropertiesProcessor::LLAvatarPropertiesProcessor()
 {
 }
@@ -87,35 +93,18 @@ void LLAvatarPropertiesProcessor::removeObserver(const LLUUID& avatar_id, LLAvat
 	}
 }
 
-void LLAvatarPropertiesProcessor::sendDataRequest(const LLUUID& avatar_id, EAvatarProcessorType type, 
-	const void * data)
+
+void LLAvatarPropertiesProcessor::sendGenericRequest(const LLUUID& avatar_id, EAvatarProcessorType type, const std::string method)
 {
-	switch(type)
+	// Suppress duplicate requests while waiting for a response from the network
+	if (isPendingRequest(avatar_id, type))
 	{
-	case APT_PROPERTIES:
-		sendAvatarPropertiesRequest(avatar_id);
-		break;
-	case APT_PICKS:
-		sendGenericRequest(avatar_id, "avatarpicksrequest");
-		break;
-	case APT_PICK_INFO:
-		if (data) {
-			sendPickInfoRequest(avatar_id, *static_cast<const LLUUID*>(data));
-		}
-		break;
-	case APT_NOTES:
-		sendGenericRequest(avatar_id, "avatarnotesrequest");
-		break;
-	case APT_GROUPS:
-		sendGenericRequest(avatar_id, "avatargroupsrequest");
-		break;
-	default:
-		break;
+		// waiting for a response, don't re-request
+		return;
 	}
-}
+	// indicate we're going to make a request
+	addPendingRequest(avatar_id, type);
 
-void LLAvatarPropertiesProcessor::sendGenericRequest(const LLUUID& avatar_id, const std::string method)
-{
 	std::vector<std::string> strings;
 	strings.push_back( avatar_id.asString() );
 	send_generic_message(method, strings);
@@ -123,6 +112,14 @@ void LLAvatarPropertiesProcessor::sendGenericRequest(const LLUUID& avatar_id, co
 
 void LLAvatarPropertiesProcessor::sendAvatarPropertiesRequest(const LLUUID& avatar_id)
 {
+	if (isPendingRequest(avatar_id, APT_PROPERTIES))
+	{
+		// waiting for a response, don't re-request
+		return;
+	}
+	// indicate we're going to make a request
+	addPendingRequest(avatar_id, APT_PROPERTIES);
+
 	LLMessageSystem *msg = gMessageSystem;
 
 	msg->newMessageFast(_PREHASH_AvatarPropertiesRequest);
@@ -133,40 +130,29 @@ void LLAvatarPropertiesProcessor::sendAvatarPropertiesRequest(const LLUUID& avat
 	gAgent.sendReliableMessage();
 }
 
-void LLAvatarPropertiesProcessor::sendDataUpdate(const void* data, EAvatarProcessorType type)
+void LLAvatarPropertiesProcessor::sendAvatarPicksRequest(const LLUUID& avatar_id)
 {
-	switch(type)
-	{
-	case APT_PROPERTIES:
-		sendAvatarPropertiesUpdate(data);
-		break;
-	case APT_PICK_INFO:
-		sendPicInfoUpdate(data);
-	case APT_PICKS:
-//		sendGenericRequest(avatar_id, "avatarpicksrequest");
-		break;
-	case APT_NOTES:
-//		sendGenericRequest(avatar_id, "avatarnotesrequest");
-		break;
-	case APT_GROUPS:
-//		sendGenericRequest(avatar_id, "avatargroupsrequest");
-		break;
-	default:
-		break;
-	}
+	sendGenericRequest(avatar_id, APT_PICKS, "avatarpicksrequest");
+}
 
+void LLAvatarPropertiesProcessor::sendAvatarNotesRequest(const LLUUID& avatar_id)
+{
+	sendGenericRequest(avatar_id, APT_NOTES, "avatarnotesrequest");
+}
+
+void LLAvatarPropertiesProcessor::sendAvatarGroupsRequest(const LLUUID& avatar_id)
+{
+	sendGenericRequest(avatar_id, APT_GROUPS, "avatargroupsrequest");
 }
-void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const void* data)
+
+void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props)
 {
 	llinfos << "Sending avatarinfo update" << llendl;
 
-	const LLAvatarData* avatar_props = static_cast<const LLAvatarData*>(data);
 	// This value is required by sendAvatarPropertiesUpdate method.
 	//A profile should never be mature. (From the original code)
 	BOOL mature = FALSE;
 
-
-
 	LLMessageSystem *msg = gMessageSystem;
 
 	msg->newMessageFast(_PREHASH_AvatarPropertiesUpdate);
@@ -186,6 +172,156 @@ void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const void* data)
 	gAgent.sendReliableMessage();
 }
 
+//static
+std::string LLAvatarPropertiesProcessor::ageFromDate(const std::string& date_string)
+{
+	// Convert string date to malleable representation
+	S32 month, day, year;
+	S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &month, &day, &year);
+	if (matched != 3) return "???";
+
+	// Create ISO-8601 date string
+	std::string iso8601_date_string =
+		llformat("%04d-%02d-%02dT00:00:00Z", year, month, day);
+	LLDate date(iso8601_date_string);
+
+	// Correct for the fact that account creation dates are in Pacific time,
+	// == UTC - 8
+	F64 date_secs_since_epoch = date.secondsSinceEpoch();
+	date_secs_since_epoch += 8.0 * 60.0 * 60.0;
+
+	// Convert seconds from epoch to seconds from now
+	F64 now_secs_since_epoch = LLDate::now().secondsSinceEpoch();
+	F64 age_secs = now_secs_since_epoch - date_secs_since_epoch;
+
+	// We don't care about sub-day times
+	const F64 SEC_PER_DAY = 24.0 * 60.0 * 60.0;
+	S32 age_days = lltrunc(age_secs / SEC_PER_DAY);
+
+	// Assume most values won't be used to fill in the format string:
+	// "[AGEYEARS][AGEMONTHS][AGEWEEKS][AGEDAYS]old"
+	LLStringUtil::format_map_t final_args;
+	final_args["[AGEYEARS]"] = "";
+	final_args["[AGEMONTHS]"] = "";
+	final_args["[AGEWEEKS]"] = "";
+	final_args["[AGEDAYS]"] = "";
+
+	// Try for age in round number of years
+	LLStringUtil::format_map_t args;
+	S32 age_years = age_days / 365;
+	age_days = age_days % 365;
+	if (age_years > 1)
+	{
+		args["[YEARS]"] = llformat("%d", age_years);
+		final_args["[AGEYEARS]"] = LLTrans::getString("AgeYears", args);
+	}
+	else if (age_years == 1)
+	{
+		final_args["[AGEYEARS]"] = LLTrans::getString("Age1Year");
+	}
+	// fall through because we show years + months for ages > 1 year
+
+	S32 age_months = age_days / 30;
+	age_days = age_days % 30;
+	if (age_months > 1)
+	{
+		args["[MONTHS]"] = llformat("%d", age_months);
+		final_args["[AGEMONTHS]"] = LLTrans::getString("AgeMonths", args);
+		// Either N years M months, or just M months,
+		// so we can exit.
+		return LLTrans::getString("YearsMonthsOld", final_args);
+	}
+	else if (age_months == 1)
+	{
+		final_args["[AGEMONTHS]"] = LLTrans::getString("Age1Month");
+		return LLTrans::getString("YearsMonthsOld", final_args);
+	}
+
+	// Now for age in weeks
+	S32 age_weeks = age_days / 7;
+	age_days = age_days % 7;
+	if (age_weeks > 1)
+	{
+		args["[WEEKS]"] = llformat("%d", age_weeks);
+		final_args["[AGEWEEKS]"] = LLTrans::getString("AgeWeeks", args);
+		return LLTrans::getString("WeeksOld", final_args);
+	}
+	else if (age_weeks == 1)
+	{
+		final_args["[AGEWEEKS]"] = LLTrans::getString("Age1Week");
+		return LLTrans::getString("WeeksOld", final_args);
+	}
+
+	// Down to days now
+	if (age_days > 1)
+	{
+		args["[DAYS]"] = llformat("%d", age_days);
+		final_args["[AGEDAYS]"] = LLTrans::getString("AgeDays", args);
+		return LLTrans::getString("DaysOld", final_args);
+	}
+	else if (age_days == 1)
+	{
+		final_args["[AGEDAYS]"] = LLTrans::getString("Age1Day");
+		return LLTrans::getString("DaysOld", final_args);
+	}
+	else
+	{
+		return LLTrans::getString("TodayOld");
+	}
+}
+
+
+//static
+std::string LLAvatarPropertiesProcessor::accountType(const LLAvatarData* avatar_data)
+{
+	// If you have a special account, like M Linden ("El Jefe!")
+	// return an untranslated "special" string
+	if (!avatar_data->caption_text.empty())
+	{
+		return avatar_data->caption_text;
+	}
+	const char* const ACCT_TYPE[] = {
+		"AcctTypeResident",
+		"AcctTypeTrial",
+		"AcctTypeCharterMember",
+		"AcctTypeEmployee"
+	};
+	U8 caption_max = (U8)LL_ARRAY_SIZE(ACCT_TYPE)-1;
+	U8 caption_index = llclamp(avatar_data->caption_index, (U8)0, caption_max);
+	return LLTrans::getString(ACCT_TYPE[caption_index]);
+}
+
+//static
+std::string LLAvatarPropertiesProcessor::paymentInfo(const LLAvatarData* avatar_data)
+{
+	// Special accounts like M Linden don't have payment info revealed.
+	if (!avatar_data->caption_text.empty()) return "";
+
+	// Linden employees don't have payment info revealed
+	const S32 LINDEN_EMPLOYEE_INDEX = 3;
+	if (avatar_data->caption_index == LINDEN_EMPLOYEE_INDEX) return "";
+
+	BOOL transacted = (avatar_data->flags & AVATAR_TRANSACTED);
+	BOOL identified = (avatar_data->flags & AVATAR_IDENTIFIED);
+	// Not currently getting set in dataserver/lldataavatar.cpp for privacy considerations
+	//BOOL age_verified = (avatar_data->flags & AVATAR_AGEVERIFIED); 
+
+	const char* payment_text;
+	if(transacted)
+	{
+		payment_text = "PaymentInfoUsed";
+	}
+	else if (identified)
+	{
+		payment_text = "PaymentInfoOnFile";
+	}
+	else
+	{
+		payment_text = "NoPaymentInfoOnFile";
+	}
+	return LLTrans::getString(payment_text);
+}
+
 void LLAvatarPropertiesProcessor::processAvatarPropertiesReply(LLMessageSystem* msg, void**)
 {
 	LLAvatarData avatar_data;
@@ -214,7 +350,10 @@ void LLAvatarPropertiesProcessor::processAvatarPropertiesReply(LLMessageSystem*
 	{
 		msg->getString(_PREHASH_PropertiesData, _PREHASH_CharterMember, avatar_data.caption_text);
 	}
-	notifyObservers(avatar_data.avatar_id,&avatar_data,APT_PROPERTIES);
+	LLAvatarPropertiesProcessor* self = getInstance();
+	// Request processed, no longer pending
+	self->removePendingRequest(avatar_data.avatar_id, APT_PROPERTIES);
+	self->notifyObservers(avatar_data.avatar_id,&avatar_data,APT_PROPERTIES);
 }
 
 void LLAvatarPropertiesProcessor::processAvatarInterestsReply(LLMessageSystem* msg, void**)
@@ -228,11 +367,13 @@ void LLAvatarPropertiesProcessor::processAvatarInterestsReply(LLMessageSystem* m
 	WARNING: LLTemplateMessageReader::decodeData: Message from 216.82.37.237:13000 with no handler function received: AvatarInterestsReply
 */
 }
+
 void LLAvatarPropertiesProcessor::processAvatarClassifiedReply(LLMessageSystem* msg, void**)
 {
 	// avatarclassifiedsrequest is not sent according to new UI design but
 	// keep this method according to resolved issues. 
 }
+
 void LLAvatarPropertiesProcessor::processAvatarNotesReply(LLMessageSystem* msg, void**)
 {
 	LLAvatarNotes avatar_notes;
@@ -241,7 +382,10 @@ void LLAvatarPropertiesProcessor::processAvatarNotesReply(LLMessageSystem* msg,
 	msg->getUUID(_PREHASH_Data, _PREHASH_TargetID, avatar_notes.target_id);
 	msg->getString(_PREHASH_Data, _PREHASH_Notes, avatar_notes.notes);
 
-	notifyObservers(avatar_notes.target_id,&avatar_notes,APT_NOTES);
+	LLAvatarPropertiesProcessor* self = getInstance();
+	// Request processed, no longer pending
+	self->removePendingRequest(avatar_notes.target_id, APT_NOTES);
+	self->notifyObservers(avatar_notes.target_id,&avatar_notes,APT_NOTES);
 }
 
 void LLAvatarPropertiesProcessor::processAvatarPicksReply(LLMessageSystem* msg, void**)
@@ -261,7 +405,10 @@ void LLAvatarPropertiesProcessor::processAvatarPicksReply(LLMessageSystem* msg,
 
 		avatar_picks.picks_list.push_back(std::make_pair(pick_id,pick_name));
 	}
-	notifyObservers(avatar_picks.target_id,&avatar_picks,APT_PICKS);
+	LLAvatarPropertiesProcessor* self = getInstance();
+	// Request processed, no longer pending
+	self->removePendingRequest(avatar_picks.target_id, APT_PICKS);
+	self->notifyObservers(avatar_picks.target_id,&avatar_picks,APT_PICKS);
 }
 
 void LLAvatarPropertiesProcessor::processPickInfoReply(LLMessageSystem* msg, void**)
@@ -306,7 +453,9 @@ void LLAvatarPropertiesProcessor::processPickInfoReply(LLMessageSystem* msg, voi
 	msg->getS32(_PREHASH_Data, _PREHASH_SortOrder, pick_data.sort_order);
 	msg->getBOOL(_PREHASH_Data, _PREHASH_Enabled, pick_data.enabled);
 
-	notifyObservers(pick_data.creator_id, &pick_data, APT_PICK_INFO);
+	LLAvatarPropertiesProcessor* self = getInstance();
+	// don't need to remove pending request as we don't track pick info
+	self->notifyObservers(pick_data.creator_id, &pick_data, APT_PICK_INFO);
 }
 
 void LLAvatarPropertiesProcessor::processAvatarGroupsReply(LLMessageSystem* msg, void**)
@@ -329,12 +478,15 @@ void LLAvatarPropertiesProcessor::processAvatarGroupsReply(LLMessageSystem* msg,
 		avatar_groups.group_list.push_back(group_data);
 	}
 
-	notifyObservers(avatar_groups.avatar_id,&avatar_groups,APT_GROUPS);
+	LLAvatarPropertiesProcessor* self = getInstance();
+	self->removePendingRequest(avatar_groups.avatar_id, APT_GROUPS);
+	self->notifyObservers(avatar_groups.avatar_id,&avatar_groups,APT_GROUPS);
 }
 
 void LLAvatarPropertiesProcessor::notifyObservers(const LLUUID& id,void* data, EAvatarProcessorType type)
 {
-	LLAvatarPropertiesProcessor::observer_multimap_t observers = LLAvatarPropertiesProcessor::getInstance()->mObservers;
+	// Copy the map (because observers may delete themselves when updated?)
+	LLAvatarPropertiesProcessor::observer_multimap_t observers = mObservers;
 
 	observer_multimap_t::iterator oi = observers.lower_bound(id);
 	observer_multimap_t::iterator end = observers.upper_bound(id);
@@ -397,10 +549,8 @@ void LLAvatarPropertiesProcessor::sendPickDelete( const LLUUID& pick_id )
 	gAgent.sendReliableMessage();
 }
 
-void LLAvatarPropertiesProcessor::sendPicInfoUpdate(const void* pick_data)
+void LLAvatarPropertiesProcessor::sendPickInfoUpdate(const LLPickData* new_pick)
 {
-	if (!pick_data) return;
-	const LLPickData *new_pick = static_cast<const LLPickData*>(pick_data);
 	if (!new_pick) return;
 
 	LLMessageSystem* msg = gMessageSystem;
@@ -440,3 +590,38 @@ void LLAvatarPropertiesProcessor::sendPickInfoRequest(const LLUUID& creator_id,
 	request_params.push_back(pick_id.asString() );
 	send_generic_message("pickinforequest", request_params);
 }
+
+
+bool LLAvatarPropertiesProcessor::isPendingRequest(const LLUUID& avatar_id, EAvatarProcessorType type)
+{
+	timestamp_map_t::key_type key = std::make_pair(avatar_id, type);
+	timestamp_map_t::iterator it = mRequestTimestamps.find(key);
+
+	// Is this a new request?
+	if (it == mRequestTimestamps.end()) return false;
+
+	// We found a request, check if it has timed out
+	U32 now = time(NULL);
+	const U32 REQUEST_EXPIRE_SECS = 5;
+	U32 expires = it->second + REQUEST_EXPIRE_SECS;
+
+	// Request is still pending if it hasn't expired yet
+	// *NOTE: Expired requests will accumulate in this map, but they are rare,
+	// the data is small, and they will be updated if the same data is
+	// re-requested
+	return (now < expires);
+}
+
+void LLAvatarPropertiesProcessor::addPendingRequest(const LLUUID& avatar_id, EAvatarProcessorType type)
+{
+	timestamp_map_t::key_type key = std::make_pair(avatar_id, type);
+	U32 now = time(NULL);
+	// Add or update existing (expired) request
+	mRequestTimestamps[ key ] = now;
+}
+
+void LLAvatarPropertiesProcessor::removePendingRequest(const LLUUID& avatar_id, EAvatarProcessorType type)
+{
+	timestamp_map_t::key_type key = std::make_pair(avatar_id, type);
+	mRequestTimestamps.erase(key);
+}
diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h
index 2e10dea834552ae435d6e1ed286c9b88827aeb9b..24675c44c04415270537b77a77ae5eebfd473f9f 100644
--- a/indra/newview/llavatarpropertiesprocessor.h
+++ b/indra/newview/llavatarpropertiesprocessor.h
@@ -43,10 +43,6 @@
 - Remove EAvatarProcessorType in favor of separate observers, derived from a common parent (to get rid of void*).
 */
 
-/*
-*TODO: mantipov: get rid of sendDataRequest and sendDataUpdate methods. Use exact methods instead of.
-*/
-
 class LLMessageSystem;
 
 enum EAvatarProcessorType
@@ -157,10 +153,20 @@ class LLAvatarPropertiesProcessor
 	void addObserver(const LLUUID& avatar_id, LLAvatarPropertiesObserver* observer);
 	
 	void removeObserver(const LLUUID& avatar_id, LLAvatarPropertiesObserver* observer);
-	
-	void sendDataRequest(const LLUUID& avatar_id, EAvatarProcessorType type, const void * data = NULL);
 
-	void sendDataUpdate(const void* data, EAvatarProcessorType type);
+	// Request various types of avatar data.  Duplicate requests will be
+	// suppressed while waiting for a response from the network.
+	void sendAvatarPropertiesRequest(const LLUUID& avatar_id);
+	void sendAvatarPicksRequest(const LLUUID& avatar_id);
+	void sendAvatarNotesRequest(const LLUUID& avatar_id);
+	void sendAvatarGroupsRequest(const LLUUID& avatar_id);
+
+	// Duplicate pick info requests are not suppressed.
+	void sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id);
+
+	void sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props);
+
+	void sendPickInfoUpdate(const LLPickData* new_pick);
 
 	void sendFriendRights(const LLUUID& avatar_id, S32 rights);
 
@@ -168,6 +174,20 @@ class LLAvatarPropertiesProcessor
 
 	void sendPickDelete(const LLUUID& pick_id);
 
+	// Convert a date provided by the server (MM/DD/YYYY) into a localized,
+	// human-readable age (1 year, 2 months) using translation strings from 
+	// the XML file.
+	static std::string ageFromDate(const std::string& date_string);
+
+	// Returns translated, human readable string for account type, such
+	// as "Resident" or "Linden Employee".  Used for profiles, inspectors.
+	static std::string accountType(const LLAvatarData* avatar_data);
+
+	// Returns translated, human readable string for payment info, such
+	// as "Payment Info on File" or "Payment Info Used".
+	// Used for profiles, inspectors.
+	static std::string paymentInfo(const LLAvatarData* avatar_data);
+
 	static void processAvatarPropertiesReply(LLMessageSystem* msg, void**);
 
 	static void processAvatarInterestsReply(LLMessageSystem* msg, void**);
@@ -181,19 +201,23 @@ class LLAvatarPropertiesProcessor
 	static void processAvatarPicksReply(LLMessageSystem* msg, void**);
 
 	static void processPickInfoReply(LLMessageSystem* msg, void**);
+
 protected:
 
-	void sendAvatarPropertiesRequest(const LLUUID& avatar_id);
+	void sendGenericRequest(const LLUUID& avatar_id, EAvatarProcessorType type, const std::string method);
 
-	void sendGenericRequest(const LLUUID& avatar_id, const std::string method);
-	
-	void sendAvatarPropertiesUpdate(const void* data);
+	void notifyObservers(const LLUUID& id,void* data, EAvatarProcessorType type);
 
-	void sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id);
-	
-	void sendPicInfoUpdate(const void * pick_data);
+	// Is there a pending, not timed out, request for this avatar's data?
+	// Use this to suppress duplicate requests for data when a request is
+	// pending.
+	bool isPendingRequest(const LLUUID& avatar_id, EAvatarProcessorType type);
 
-	static void notifyObservers(const LLUUID& id,void* data, EAvatarProcessorType type);
+	// Call this when a request has been sent
+	void addPendingRequest(const LLUUID& avatar_id, EAvatarProcessorType type);
+
+	// Call this when the reply to the request is received
+	void removePendingRequest(const LLUUID& avatar_id, EAvatarProcessorType type);
 
 	typedef void* (*processor_method_t)(LLMessageSystem*);
 	static processor_method_t getProcessor(EAvatarProcessorType type);
@@ -203,6 +227,13 @@ class LLAvatarPropertiesProcessor
 	typedef std::multimap<LLUUID, LLAvatarPropertiesObserver*> observer_multimap_t;
 	
 	observer_multimap_t mObservers;
+
+	// Keep track of pending requests for data by avatar id and type.
+	// Maintain a timestamp for each request so a request that receives no reply
+	// does not block future requests forever.
+	// Map avatar_id+request_type -> U32 timestamp in seconds
+	typedef std::map< std::pair<LLUUID, EAvatarProcessorType>, U32> timestamp_map_t;
+	timestamp_map_t mRequestTimestamps;
 };
 
 #endif  // LL_LLAVATARPROPERTIESPROCESSOR_H
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index f5dfbb2851e644e71f126043534db656e79bf93b..6fb6552f2db0f8b143fd5e8427bf51866479a8e3 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -38,6 +38,7 @@
 #include "llchatmsgbox.h"
 #include "llavatariconctrl.h"
 #include "llfloaterreg.h"
+#include "lllocalcliprect.h"
 #include "lltrans.h"
 
 #include "llviewercontrol.h"
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 808fcde312c1539609c5a0462c72c0873cfd8e32..197ab9d3524625540c3597dee393718126722c1b 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -40,6 +40,7 @@
 #include "llimpanel.h"				// LLFloaterIMPanel
 #include "llimview.h"
 #include "llfloaterreg.h"
+#include "lllocalcliprect.h"
 #include "llmenugl.h"
 #include "lloutputmonitorctrl.h"
 #include "lltextbox.h"
diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp
index 31c2d93c05dea34f3f069848b8249a6aa7cc8db3..113f4c2c549e5a4b674e2ec452fc141867df46f2 100644
--- a/indra/newview/llcolorswatch.cpp
+++ b/indra/newview/llcolorswatch.cpp
@@ -197,6 +197,7 @@ BOOL LLColorSwatchCtrl::handleMouseUp(S32 x, S32 y, MASK mask)
 // assumes GL state is set for 2D
 void LLColorSwatchCtrl::draw()
 {
+	F32 alpha = getDrawContext().mAlpha;
 	mBorder->setKeyboardFocusHighlight(hasFocus());
 	// Draw border
 	LLRect border( 0, getRect().getHeight(), getRect().getWidth(), BTN_HEIGHT_SMALL );
@@ -232,15 +233,15 @@ void LLColorSwatchCtrl::draw()
 			{	
 				gl_rect_2d_checkerboard( interior );
 			}	
-			gl_draw_scaled_image( interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), fallback_image);
+			gl_draw_scaled_image( interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), fallback_image, LLColor4::white % alpha);
 			fallback_image->addTextureStats( (F32)(interior.getWidth() * interior.getHeight()) );
 		}
 		else
 		{
 			// Draw grey and an X
-			gl_rect_2d(interior, LLColor4::grey, TRUE);
+			gl_rect_2d(interior, LLColor4::grey % alpha, TRUE);
 			
-			gl_draw_x(interior, LLColor4::black);
+			gl_draw_x(interior, LLColor4::black % alpha);
 		}
 	}
 
diff --git a/indra/newview/llconfirmationmanager.cpp b/indra/newview/llconfirmationmanager.cpp
index 00ffff79a83dce46faa867edb93ae0a9d785adbf..225f1775466307811f233875e0e4a533236dd14a 100644
--- a/indra/newview/llconfirmationmanager.cpp
+++ b/indra/newview/llconfirmationmanager.cpp
@@ -37,8 +37,7 @@
 #include "lluictrlfactory.h"
 
 // viewer includes
-#include "llviewerwindow.h"
-#include "lllineeditor.h"
+#include "llnotifications.h"
 #include "llstring.h"
 
 LLConfirmationManager::ListenerBase::~ListenerBase()
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 8ceb41c27a609bbdea4949f08ff1a39495d14c2f..8af3a8b539d8d68ed7e211d4de85e482fbebcf20 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -32,16 +32,18 @@
 
 #include "llviewerprecompiledheaders.h"
 
-#include "indra_constants.h"
 #include "llfasttimerview.h"
+
 #include "llviewerwindow.h"
 #include "llrect.h"
 #include "llerror.h"
 #include "llgl.h"
 #include "llrender.h"
+#include "lllocalcliprect.h"
 #include "llmath.h"
 #include "llfontgl.h"
 #include "llsdserialize.h"
+#include "lltooltip.h"
 
 #include "llappviewer.h"
 #include "llviewertexturelist.h"
@@ -242,15 +244,20 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)
 }
 
 
-BOOL LLFastTimerView::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen)
+BOOL LLFastTimerView::handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen)
 {
 	if(LLFastTimer::sPauseHistory && mBarRect.pointInRect(x, y))
 	{
 		// tooltips for timer bars
 		if (mHoverTimer)
 		{
-			localRectToScreen(mToolTipRect, sticky_rect_screen);
-			msg = mHoverTimer->getToolTip(LLFastTimer::NamedTimer::HISTORY_NUM - mScrollIndex - mHoverBarIndex);
+			LLRect screen_rect;
+			localRectToScreen(mToolTipRect, &screen_rect);
+
+			LLToolTipMgr::instance().show(LLToolTipParams()
+				.message(mHoverTimer->getToolTip(LLFastTimer::NamedTimer::HISTORY_NUM - mScrollIndex - mHoverBarIndex))
+				.sticky_rect(screen_rect));
+
 			return TRUE;
 		}
 	}
@@ -262,11 +269,11 @@ BOOL LLFastTimerView::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* stic
 			LLFastTimer::NamedTimer* idp = getLegendID(y);
 			if (idp)
 			{
-				msg = idp->getToolTip(); 
+				LLToolTipMgr::instance().show(idp->getToolTip());
+
 				return TRUE;
 			}
 		}
-
 	}
 	
 	return FALSE;
diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h
index f301888984f4c60d8e4eff230f80dc204ddd1603..97e4e94460c43baef2bed27e262292c21ff41a50 100644
--- a/indra/newview/llfasttimerview.h
+++ b/indra/newview/llfasttimerview.h
@@ -57,7 +57,7 @@ class LLFastTimerView : public LLFloater
 	virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
 	virtual BOOL handleHover(S32 x, S32 y, MASK mask);
-	virtual BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen);
+	virtual BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen);
 	virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
 	virtual void draw();
 
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index a7f0a8ff9a6973a2b5d20433926f447398dbbcfa..df2bf53a057576955be1f63a5d15956cd5443ed3 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -42,6 +42,7 @@
 #include "lltrans.h"
 #include "lluictrlfactory.h"
 #include "llmenugl.h"
+#include "lltooltip.h"
 
 #include "llagent.h"
 #include "llclipboard.h"
@@ -122,14 +123,9 @@ class LLFavoriteLandmarkButton : public LLButton
 {
 public:
 
-	BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect)
+	BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect)
 	{
-		if(LLUI::sShowXUINames)
-		{
-			return LLButton::handleToolTip(x, y, msg, sticky_rect);
-		}
-
-		msg = mUrlGetter.getSLURL();
+		LLToolTipMgr::instance().show(mUrlGetter.getSLURL());
 		return TRUE;
 	}
 
@@ -193,14 +189,9 @@ class LLFavoritesToggleableMenu : public LLToggleableMenu
 class LLFavoriteLandmarkMenuItem : public LLMenuItemCallGL
 {
 public:
-	BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect)
+	BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect)
 	{
-		if(LLUI::sShowXUINames)
-		{
-			return LLMenuItemCallGL::handleToolTip(x, y, msg, sticky_rect);
-		}
-
-		msg = mUrlGetter.getSLURL();
+		LLToolTipMgr::instance().show(mUrlGetter.getSLURL());
 		return TRUE;
 	}
 	
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
index dec27db74b1ad5d2c202a62a4e392ad40346b4fa..c062e6ccf2a2652409be1ad5e169958b802aa096 100644
--- a/indra/newview/llfloateranimpreview.cpp
+++ b/indra/newview/llfloateranimpreview.cpp
@@ -505,7 +505,7 @@ BOOL LLFloaterAnimPreview::handleHover(S32 x, S32 y, MASK mask)
 
 		mAnimPreview->requestUpdate();
 
-		LLUI::setCursorPositionLocal(this, mLastMouseX, mLastMouseY);
+		LLUI::setMousePositionLocal(this, mLastMouseX, mLastMouseY);
 	}
 
 	if (!mPreviewRect.pointInRect(x, y) || !mAnimPreview)
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index 07dbf98a1e4c7b5f379f3423ec19be8749ddd33e..61568df12e0842477c43664c763dcda366c96612 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -547,7 +547,7 @@ BOOL LLFloaterImagePreview::handleHover(S32 x, S32 y, MASK mask)
 			mSculptedPreview->refresh();
 		}
 
-		LLUI::setCursorPositionLocal(this, mLastMouseX, mLastMouseY);
+		LLUI::setMousePositionLocal(this, mLastMouseX, mLastMouseY);
 	}
 
 	if (!mPreviewRect.pointInRect(x, y) || !mAvatarPreview || !mSculptedPreview)
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index b5c36b1083c5293c57141eee4d47e6ff428c6c1e..13a2594c45de78936fb77f3daeba423e83c1a8af 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -75,6 +75,7 @@
 #include "llimagepng.h"
 #include "llimagebmp.h"
 #include "llimagej2c.h"
+#include "lllocalcliprect.h"
 #include "llresmgr.h"		// LLLocale
 #include "llvfile.h"
 #include "llvfs.h"
diff --git a/indra/newview/llfloatertestinspectors.cpp b/indra/newview/llfloatertestinspectors.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c56586cb954971c004752f6d8d7054ffe1742589
--- /dev/null
+++ b/indra/newview/llfloatertestinspectors.cpp
@@ -0,0 +1,109 @@
+/** 
+* @file llfloatertestinspectors.cpp
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+* 
+* Copyright (c) 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 "llfloatertestinspectors.h"
+
+// Viewer includes
+#include "llstartup.h"
+
+// Linden library includes
+#include "llfloaterreg.h"
+//#include "lluictrlfactory.h"
+
+LLFloaterTestInspectors::LLFloaterTestInspectors(const LLSD& seed)
+:	LLFloater(seed)
+{
+	mCommitCallbackRegistrar.add("ShowAvatarInspector",
+		boost::bind(&LLFloaterTestInspectors::showAvatarInspector, this, _1, _2));
+}
+
+LLFloaterTestInspectors::~LLFloaterTestInspectors()
+{}
+
+BOOL LLFloaterTestInspectors::postBuild()
+{
+//	getChild<LLUICtrl>("avatar_2d_btn")->setCommitCallback(
+//		boost::bind(&LLFloaterTestInspectors::onClickAvatar2D, this));
+	getChild<LLUICtrl>("avatar_3d_btn")->setCommitCallback(
+		boost::bind(&LLFloaterTestInspectors::onClickAvatar3D, this));
+	getChild<LLUICtrl>("object_2d_btn")->setCommitCallback(
+		boost::bind(&LLFloaterTestInspectors::onClickObject2D, this));
+	getChild<LLUICtrl>("object_3d_btn")->setCommitCallback(
+		boost::bind(&LLFloaterTestInspectors::onClickObject3D, this));
+	getChild<LLUICtrl>("group_btn")->setCommitCallback(
+		boost::bind(&LLFloaterTestInspectors::onClickGroup, this));
+	getChild<LLUICtrl>("place_btn")->setCommitCallback(
+		boost::bind(&LLFloaterTestInspectors::onClickPlace, this));
+	getChild<LLUICtrl>("event_btn")->setCommitCallback(
+		boost::bind(&LLFloaterTestInspectors::onClickEvent, this));
+
+	return LLFloater::postBuild();
+}
+
+void LLFloaterTestInspectors::showAvatarInspector(LLUICtrl*, const LLSD& avatar_id)
+{
+	LLUUID id;  // defaults to null
+	if (LLStartUp::getStartupState() >= STATE_STARTED)
+	{
+		id = avatar_id.asUUID();
+	}
+	// spawns off mouse position automatically
+	LLFloaterReg::showInstance("inspect_avatar", id);
+}
+
+void LLFloaterTestInspectors::onClickAvatar2D()
+{
+}
+
+void LLFloaterTestInspectors::onClickAvatar3D()
+{
+}
+
+void LLFloaterTestInspectors::onClickObject2D()
+{
+}
+
+void LLFloaterTestInspectors::onClickObject3D()
+{
+}
+
+void LLFloaterTestInspectors::onClickGroup()
+{
+}
+
+void LLFloaterTestInspectors::onClickPlace()
+{
+}
+
+void LLFloaterTestInspectors::onClickEvent()
+{
+}
diff --git a/indra/newview/llfloatertestinspectors.h b/indra/newview/llfloatertestinspectors.h
new file mode 100644
index 0000000000000000000000000000000000000000..d2dc2248bb4dbe9e5b11c0de5232382cd7ab39ac
--- /dev/null
+++ b/indra/newview/llfloatertestinspectors.h
@@ -0,0 +1,64 @@
+/** 
+* @file llfloatertestinspectors.h
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+* 
+* Copyright (c) 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 LLFLOATERTESTINSPECTORS_H
+#define LLFLOATERTESTINSPECTORS_H
+
+#include "llfloater.h"
+
+class LLSD;
+
+class LLFloaterTestInspectors : public LLFloater
+{
+	friend class LLFloaterReg;
+public:
+	// nothing yet
+
+private:
+	// Construction handled by LLFloaterReg
+	LLFloaterTestInspectors(const LLSD& seed);
+	~LLFloaterTestInspectors();
+
+	/*virtual*/ BOOL postBuild();
+
+	// Button callback to show
+	void showAvatarInspector(LLUICtrl*, const LLSD& avatar_id);
+	
+	// Debug function hookups for buttons
+	void onClickAvatar2D();
+	void onClickAvatar3D();
+	void onClickObject2D();
+	void onClickObject3D();
+	void onClickGroup();
+	void onClickPlace();
+	void onClickEvent();
+};
+
+#endif
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 3b3ada46a8ff489eb5e325e69f52e9f6cae9f8b2..43fbe362d5954b65820865c063d690b71f6b7c2d 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -161,8 +161,6 @@ void LLAgent::renderAutoPilotTarget()
 	}
 }
 
-extern BOOL gDebugSelect;
-
 // Returns true if you got at least one object
 void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
 {
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 674fff40409323bcbc272fa62af402ed1c7c640b..020eff375bf18b9e9b4ce7e2584c0e7f8e729a95 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -1917,19 +1917,8 @@ void LLFloaterIMPanel::chatFromLogFile(LLLogChat::ELogLineType type, std::string
 void LLFloaterIMPanel::showSessionStartError(
 	const std::string& error_string)
 {
-	//the error strings etc. should be really be static and local
-	//to this file instead of in the LLFloaterIM
-	//but they were in llimview.cpp first and unfortunately
-	//some translations into non English languages already occurred
-	//thus making it a tad harder to change over to a
-	//"correct" solution.  The best solution
-	//would be to store all of the misc. strings into
-	//their own XML file which would be read in by any LLIMPanel
-	//post build function instead of repeating the same info
-	//in the group, adhoc and normal IM xml files.
 	LLSD args;
-	args["REASON"] =
-		LLFloaterIM::sErrorStringsMap[error_string];
+	args["REASON"] = LLTrans::getString(error_string);
 	args["RECIPIENT"] = getTitle();
 
 	LLSD payload;
@@ -1948,9 +1937,9 @@ void LLFloaterIMPanel::showSessionEventError(
 {
 	LLSD args;
 	args["REASON"] =
-		LLFloaterIM::sErrorStringsMap[error_string];
+		LLTrans::getString(error_string);
 	args["EVENT"] =
-		LLFloaterIM::sEventStringsMap[event_string];
+		LLTrans::getString(event_string);
 	args["RECIPIENT"] = getTitle();
 
 	LLNotifications::instance().add(
@@ -1964,7 +1953,7 @@ void LLFloaterIMPanel::showSessionForceClose(
 	LLSD args;
 
 	args["NAME"] = getTitle();
-	args["REASON"] = LLFloaterIM::sForceCloseSessionMap[reason_string];
+	args["REASON"] = LLTrans::getString(reason_string);
 
 	LLSD payload;
 	payload["session_id"] = mSessionUUID;
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index c1a5f210103f88c440ac5c647d115ed67a10179b..901b3351c8637891149c3e833e3f879b6e40520b 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -83,14 +83,7 @@ LLIMMgr* gIMMgr = NULL;
 // Statics
 //
 // *FIXME: make these all either UIStrings or Strings
-static std::string sOnlyUserMessage;
-static LLUIString sOfflineMessage;
-static std::string sMutedMessage;
-static LLUIString sInviteMessage;
 
-std::map<std::string,std::string> LLFloaterIM::sEventStringsMap;
-std::map<std::string,std::string> LLFloaterIM::sErrorStringsMap;
-std::map<std::string,std::string> LLFloaterIM::sForceCloseSessionMap;
 
 std::map<LLUUID, LLIMModel::LLIMSession*> LLIMModel::sSessionsMap;
 
@@ -749,101 +742,6 @@ LLUUID LLIMMgr::computeSessionID(
 	return session_id;
 }
 
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// LLFloaterIM
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-LLFloaterIM::LLFloaterIM()
-	: LLMultiFloater(LLSD())
-{
-	// autoresize=false is necessary to avoid resizing of the IM window whenever 
-	// a session is opened or closed (it would otherwise resize the window to match
-	// the size of the im-sesssion when they were created.  This happens in 
-	// LLMultiFloater::resizeToContents() when called through LLMultiFloater::addFloater())
-	mAutoResize = FALSE;
-	LLUICtrlFactory::getInstance()->buildFloater(this, "floater_im.xml", NULL);
-}
-
-BOOL LLFloaterIM::postBuild()
-{
-	// IM session initiation warnings
-	sOnlyUserMessage = getString("only_user_message");
-	sOfflineMessage = getString("offline_message");
-	sMutedMessage = getString("muted_message");
-
-	sInviteMessage = getString("invite_message");
-
-	if ( sErrorStringsMap.find("generic") == sErrorStringsMap.end() )
-	{
-		sErrorStringsMap["generic"] =
-			getString("generic_request_error");
-	}
-
-	if ( sErrorStringsMap.find("unverified") ==
-		 sErrorStringsMap.end() )
-	{
-		sErrorStringsMap["unverified"] =
-			getString("insufficient_perms_error");
-	}
-
-	if ( sErrorStringsMap.end() ==
-		 sErrorStringsMap.find("no_ability") )
-	{
-		sErrorStringsMap["no_ability"] =
-			getString("no_ability_error");
-	}
-
-	if ( sErrorStringsMap.end() ==
-		 sErrorStringsMap.find("muted") )
-	{
-		sErrorStringsMap["muted"] =
-			getString("muted_error");
-	}
-
-	if ( sErrorStringsMap.end() ==
-		 sErrorStringsMap.find("not_a_moderator") )
-	{
-		sErrorStringsMap["not_a_moderator"] =
-			getString("not_a_mod_error");
-	}
-
-	if ( sErrorStringsMap.end() ==
-		 sErrorStringsMap.find("does not exist") )
-	{
-		sErrorStringsMap["does not exist"] =
-			getString("session_does_not_exist_error");
-	}
-
-	if ( sEventStringsMap.end() == sEventStringsMap.find("add") )
-	{
-		sEventStringsMap["add"] =
-			getString("add_session_event");
-	}
-
-	if ( sEventStringsMap.end() == sEventStringsMap.find("message") )
-	{
-		sEventStringsMap["message"] =
-			getString("message_session_event");
-	}
-
-
-	if ( sForceCloseSessionMap.end() ==
-		 sForceCloseSessionMap.find("removed") )
-	{
-		sForceCloseSessionMap["removed"] =
-			getString("removed_from_group");
-	}
-
-	if ( sForceCloseSessionMap.end() ==
-		 sForceCloseSessionMap.find("no ability") )
-	{
-		sForceCloseSessionMap["no ability"] =
-			getString("close_on_no_ability");
-	}
-
-	return TRUE;
-}
-
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Class LLIncomingCallDialog
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1151,11 +1049,6 @@ LLIMMgr::LLIMMgr() :
 	mFriendObserver = new LLIMViewFriendObserver(this);
 	LLAvatarTracker::instance().addObserver(mFriendObserver);
 
-	// *HACK: use floater to initialize string constants from xml file
-	// then delete it right away
-	LLFloaterIM* dummy_floater = new LLFloaterIM();
-	delete dummy_floater;
-
 	mPendingInvitations = LLSD::emptyMap();
 	mPendingAgentListUpdates = LLSD::emptyMap();
 }
@@ -1809,7 +1702,7 @@ void LLIMMgr::noteOfflineUsers(
 	S32 count = ids.count();
 	if(count == 0)
 	{
-		floater->addHistoryLine(sOnlyUserMessage, LLUIColorTable::instance().getColor("SystemChatColor"));
+		floater->addHistoryLine(LLTrans::getString("only_user_message"), LLUIColorTable::instance().getColor("SystemChatColor"));
 	}
 	else
 	{
@@ -1822,7 +1715,7 @@ void LLIMMgr::noteOfflineUsers(
 			if(info && !info->isOnline()
 			   && gCacheName->getName(ids.get(i), first, last))
 			{
-				LLUIString offline = sOfflineMessage;
+				LLUIString offline = LLTrans::getString("offline_message");
 				offline.setArg("[FIRST]", first);
 				offline.setArg("[LAST]", last);
 				floater->addHistoryLine(offline, LLUIColorTable::instance().getColor("SystemChatColor"));
@@ -1848,7 +1741,7 @@ void LLIMMgr::noteMutedUsers(LLFloaterIMPanel* floater,
 		{
 			if( ml->isMuted(ids.get(i)) )
 			{
-				LLUIString muted = sMutedMessage;
+				LLUIString muted = LLTrans::getString("muted_message");
 				floater->addHistoryLine(muted);
 				break;
 			}
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index aed3b68471a00a1f676031fe86b10fc16ed514d6..4eb743b1ac97610aaf8b1f79acaea03830d13719 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -44,7 +44,6 @@ class LLFloaterChatterBox;
 class LLUUID;
 class LLFloaterIMPanel;
 class LLFriendObserver;
-class LLFloaterIM;
 
 class LLIMModel :  public LLSingleton<LLIMModel>
 {
@@ -269,18 +268,6 @@ class LLIMMgr : public LLSingleton<LLIMMgr>
 	LLUUID	mBeingRemovedSessionID;
 };
 
-
-class LLFloaterIM : public LLMultiFloater
-{
-public:
-	LLFloaterIM();
-	/*virtual*/ BOOL postBuild();
-
-	static std::map<std::string,std::string> sEventStringsMap;
-	static std::map<std::string,std::string> sErrorStringsMap;
-	static std::map<std::string,std::string> sForceCloseSessionMap;
-};
-
 class LLIncomingCallDialog : public LLModalDialog
 {
 public:
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 5bb96f0469f715b189be8a91bac409ecda533828..72f89d2e7213c6a53c4292aefa9e002a114d8e29 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -36,22 +36,72 @@
 // viewer files
 #include "llagentdata.h"
 #include "llavataractions.h"
+#include "llavatarpropertiesprocessor.h"
 #include "llcallingcard.h"
 
 // linden libraries
+#include "lltooltip.h"	// positionViewNearMouse()
 #include "lluictrl.h"
 
+// This object represents a pending request for avatar properties information
+class LLFetchAvatarData : public LLAvatarPropertiesObserver
+{
+public:
+	// If the inspector closes it will delete the pending request object, so the
+	// inspector pointer will be valid for the lifetime of this object
+	LLFetchAvatarData(const LLUUID& avatar_id, LLInspectAvatar* inspector)
+		:	mAvatarID(avatar_id),
+			mInspector(inspector)
+	{
+		LLAvatarPropertiesProcessor* processor = 
+			LLAvatarPropertiesProcessor::getInstance();
+		// register ourselves as an observer
+		processor->addObserver(mAvatarID, this);
+		// send a request (duplicates will be suppressed inside the avatar
+		// properties processor)
+		processor->sendAvatarPropertiesRequest(mAvatarID);
+	}
+
+	~LLFetchAvatarData()
+	{
+		// remove ourselves as an observer
+		LLAvatarPropertiesProcessor::getInstance()->
+			removeObserver(mAvatarID, this);
+	}
+
+	void processProperties(void* data, EAvatarProcessorType type)
+	{
+		// route the data to the inspector
+		if (data
+			&& type == APT_PROPERTIES)
+		{
+			LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data);
+			mInspector->processAvatarData(avatar_data);
+		}
+	}
 
-LLInspectAvatar::LLInspectAvatar(const LLSD& avatar_id)
-:	LLFloater(avatar_id),
-	mAvatarID( avatar_id.asUUID() ),
+	// Store avatar ID so we can un-register the observer on destruction
+	LLUUID mAvatarID;
+	LLInspectAvatar* mInspector;
+};
+
+LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
+:	LLFloater( LLSD() ),	// single_instance, doesn't really need key
+	mAvatarID(),			// set in onOpen()
 	mFirstName(),
-	mLastName()
+	mLastName(),
+	mPropertiesRequest(NULL)
 {
+	// can't make the properties request until the widgets are constructed
+	// as it might return immediately, so do it in postBuild.
 }
 
 LLInspectAvatar::~LLInspectAvatar()
 {
+	// clean up any pending requests so they don't call back into a deleted
+	// view
+	delete mPropertiesRequest;
+	mPropertiesRequest = NULL;
 }
 
 /*virtual*/
@@ -63,31 +113,94 @@ BOOL LLInspectAvatar::postBuild(void)
 	getChild<LLUICtrl>("view_profile_btn")->setCommitCallback(
 		boost::bind(&LLInspectAvatar::onClickViewProfile, this) );
 
-	// can't call from constructor as widgets are not built yet
-	refresh();
-
 	return TRUE;
 }
 
-void LLInspectAvatar::setAvatarID(const LLUUID &avatar_id)
+void LLInspectAvatar::draw()
 {
-	mAvatarID = avatar_id;
-	refresh();
+	static LLCachedControl<F32> FADE_OUT_TIME(*LLUI::sSettingGroups["config"], "InspectorFadeTime", 1.f);
+	if (mCloseTimer.getStarted())
+	{
+		F32 alpha = clamp_rescale(mCloseTimer.getElapsedTimeF32(), 0.f, FADE_OUT_TIME, 1.f, 0.f);
+		LLViewDrawContext context(alpha);
+		LLFloater::draw();
+		if (mCloseTimer.getElapsedTimeF32() > FADE_OUT_TIME)
+		{
+			closeFloater(false);
+		}
+	}
+	else
+	{
+		LLFloater::draw();
+	}
 }
 
-void LLInspectAvatar::refresh()
+
+// Multiple calls to showInstance("inspect_avatar", foo) will provide different
+// LLSD for foo, which we will catch here.
+//virtual
+void LLInspectAvatar::onOpen(const LLSD& data)
 {
-	// *HACK: Don't stomp data when spawning from login screen
-	if (mAvatarID.isNull()) return;
+	mCloseTimer.stop();
+
+	// Extract appropriate avatar id
+	mAvatarID = data.isUUID() ? data : data["avatar_id"];
+
+	// Position the inspector relative to the mouse cursor
+	// Similar to how tooltips are positioned
+	// See LLToolTipMgr::createToolTip
+	if (data.has("pos"))
+	{
+		LLUI::positionViewNearMouse(this, data["pos"]["x"].asInteger(), data["pos"]["y"].asInteger());
+	}
+	else
+	{
+		LLUI::positionViewNearMouse(this);
+	}
+
+	// can't call from constructor as widgets are not built yet
+	requestUpdate();
+}
+
+//virtual
+void LLInspectAvatar::onFocusLost()
+{
+	// Start closing when we lose focus
+	mCloseTimer.start();
+}
+
+void LLInspectAvatar::requestUpdate()
+{
+	// Don't make network requests when spawning from the debug menu at the
+	// login screen (which is useful to work on the layout).
+	if (mAvatarID.isNull())
+	{
+		getChild<LLUICtrl>("user_subtitle")->
+			setValue("Test subtitle");
+		getChild<LLUICtrl>("user_details")->
+			setValue("Test details\nTest line 2");
+		return;
+	}
+
+	// Clear out old data so it doesn't flash between old and new
+	getChild<LLUICtrl>("user_name")->setValue("");
+	getChild<LLUICtrl>("user_subtitle")->setValue("");
+	getChild<LLUICtrl>("user_details")->setValue("");
+	
+	// Make a new request for properties
+	delete mPropertiesRequest;
+	mPropertiesRequest = new LLFetchAvatarData(mAvatarID, this);
 
 	// You can't re-add someone as a friend if they are already your friend
 	bool is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarID) != NULL;
 	bool is_self = (mAvatarID == gAgentID);
 	childSetEnabled("add_friend_btn", !is_friend && !is_self);
 
-	// *TODO: replace with generic
-	// LLAvatarPropertiesProcessor::getInstance()->addObserver()
-	// ->sendDataRequest()
+	// Use an avatar_icon even though the image id will come down with the
+	// avatar properties because the avatar_icon code maintains a cache of icons
+	// and this may result in the image being visible sooner.
+	// *NOTE: This may generate a duplicate avatar properties request, but that
+	// will be suppressed internally in the avatar properties processor.
 	childSetValue("avatar_icon", LLSD(mAvatarID) );
 
 	gCacheName->get(mAvatarID, FALSE,
@@ -95,6 +208,26 @@ void LLInspectAvatar::refresh()
 			this, _1, _2, _3, _4));
 }
 
+void LLInspectAvatar::processAvatarData(LLAvatarData* data)
+{
+	LLStringUtil::format_map_t args;
+	args["[BORN_ON]"] = data->born_on;
+	args["[AGE]"] = LLAvatarPropertiesProcessor::ageFromDate(data->born_on);
+	args["[SL_PROFILE]"] = data->about_text;
+	args["[RW_PROFILE"] = data->fl_about_text;
+	args["[ACCTTYPE]"] = LLAvatarPropertiesProcessor::accountType(data);
+	args["[PAYMENTINFO]"] = LLAvatarPropertiesProcessor::paymentInfo(data);
+
+	std::string subtitle = getString("Subtitle", args);
+	getChild<LLUICtrl>("user_subtitle")->setValue( LLSD(subtitle) );
+	std::string details = getString("Details", args);
+	getChild<LLUICtrl>("user_details")->setValue( LLSD(details) );
+
+	// Delete the request object as it has been satisfied
+	delete mPropertiesRequest;
+	mPropertiesRequest = NULL;
+}
+
 void LLInspectAvatar::nameUpdatedCallback(
 	const LLUUID& id,
 	const std::string& first,
@@ -114,14 +247,14 @@ void LLInspectAvatar::nameUpdatedCallback(
 void LLInspectAvatar::onClickAddFriend()
 {
 	std::string name;
-	name.assign(getFirstName());
+	name.assign(mFirstName);
 	name.append(" ");
-	name.append(getLastName());
+	name.append(mLastName);
 
-	LLAvatarActions::requestFriendshipDialog(getAvatarID(), name);
+	LLAvatarActions::requestFriendshipDialog(mAvatarID, name);
 }
 
 void LLInspectAvatar::onClickViewProfile()
 {
-	LLAvatarActions::showProfile(getAvatarID());
+	LLAvatarActions::showProfile(mAvatarID);
 }
diff --git a/indra/newview/llinspectavatar.h b/indra/newview/llinspectavatar.h
index 05b0d6fe20cbb2f8d852eaa2bf1f0484e58ca7da..8d490382d203297070495d7d830135311b10b8b9 100644
--- a/indra/newview/llinspectavatar.h
+++ b/indra/newview/llinspectavatar.h
@@ -1,8 +1,5 @@
 /** 
  * @file llinspectavatar.h
- * @brief Avatar Inspector, a small information window used when clicking
- * on avatar names in the 2D UI and in the ambient inspector widget for
- * the 3D world.
  *
  * $LicenseInfo:firstyear=2009&license=viewergpl$
  * 
@@ -37,32 +34,45 @@
 
 #include "llfloater.h"
 
+struct LLAvatarData;
+class LLFetchAvatarData;
+
+// Avatar Inspector, a small information window used when clicking
+// on avatar names in the 2D UI and in the ambient inspector widget for
+// the 3D world.
 class LLInspectAvatar : public LLFloater
 {
 	friend class LLFloaterReg;
 
 public:
-	// key is the UUID of avatar for whom to show information
-	// *TODO: Needs to take a spawn location
+	// avatar_id - Avatar ID for which to show information
+	// Inspector will be positioned relative to current mouse position
 	LLInspectAvatar(const LLSD& avatar_id);
 	virtual ~LLInspectAvatar();
 
 	/*virtual*/ BOOL postBuild(void);
+	/*virtual*/ void draw();
+
+	// Because floater is single instance, need to re-parse data on each spawn
+	// (for example, inspector about same avatar but in different position)
+	/*virtual*/ void onOpen(const LLSD& avatar_id);
 
-	void setAvatarID(const LLUUID &avatar_id);
+	// Inspectors close themselves when they lose focus
+	/*virtual*/ void onFocusLost();
 
-	const LLUUID&		getAvatarID() const	{ return mAvatarID; }
-	const std::string&	getFirstName() const { return mFirstName; }
-	const std::string&	getLastName() const { return mLastName; }
+	// Update view based on information from avatar properties processor
+	void processAvatarData(LLAvatarData* data);
 
 private:
-	// Update widgets, including avatar name, buttons enabled, etc.
-	// Used after avatar id changes.
-	void refresh();
+	// Make network requests for all the data to display in this view.
+	// Used on construction and if avatar id changes.
+	void requestUpdate();
 
+	// Button callbacks
 	void onClickAddFriend();
 	void onClickViewProfile();
 
+	// Callback for gCacheName to look up avatar name
 	void nameUpdatedCallback(
 		const LLUUID& id,
 		const std::string& first,
@@ -74,6 +84,10 @@ class LLInspectAvatar : public LLFloater
 	// Need avatar name information to spawn friend add request
 	std::string			mFirstName;
 	std::string			mLastName;
+	// an in-flight request for avatar properties from LLAvatarPropertiesProcessor
+	// is represented by this object
+	LLFetchAvatarData*	mPropertiesRequest;
+	LLFrameTimer		mCloseTimer;
 };
 
 
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index f54a614f6254e6da7d23faa9931b133eb30c6062..d8c89690e8a01bdeb1fe90e5f2cf1c2683959cc8 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -42,6 +42,7 @@
 #include "llstring.h"
 #include "lltrans.h"
 #include "lluictrlfactory.h"
+#include "lltooltip.h"
 
 // newview includes
 #include "llinventorymodel.h"
@@ -290,12 +291,13 @@ void LLLocationInputCtrl::hideList()
 		focusTextEntry();
 }
 
-BOOL LLLocationInputCtrl::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen)
+BOOL LLLocationInputCtrl::handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen)
 {
 	// Let the buttons show their tooltips.
 	if (LLUICtrl::handleToolTip(x, y, msg, sticky_rect_screen) && !msg.empty())
 	{
-		if (mList->getRect().pointInRect(x, y)) {
+		if (mList->getRect().pointInRect(x, y)) 
+		{
 			S32 loc_x, loc_y;
 			//x,y - contain coordinates related to the location input control, but without taking the expanded list into account
 			//So we have to convert it again into local coordinates of mList
@@ -307,7 +309,7 @@ BOOL LLLocationInputCtrl::handleToolTip(S32 x, S32 y, std::string& msg, LLRect*
 				LLSD value = item->getValue();
 				if (value.has("tooltip"))
 				{
-					msg = value["tooltip"].asString();
+					LLToolTipMgr::instance().show(value["tooltip"]);
 				}
 			}
 		}
@@ -315,8 +317,7 @@ BOOL LLLocationInputCtrl::handleToolTip(S32 x, S32 y, std::string& msg, LLRect*
 		return TRUE;
 	}
 
-	msg = LLUI::sShowXUINames ? getShowNamesToolTip() : "";
-	return mTextEntry->getRect().pointInRect(x, y);
+	return FALSE;
 }
 
 BOOL LLLocationInputCtrl::handleKeyHere(KEY key, MASK mask)
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index 3c43e1a321913281fe1dfca0c98448b9be07a693..6edae9a9e2bd90559c4a492926c1124485b99266 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -71,7 +71,7 @@ class LLLocationInputCtrl
 
 	// LLView interface
 	/*virtual*/ void		setEnabled(BOOL enabled);
-	/*virtual*/ BOOL		handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect);
+	/*virtual*/ BOOL		handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect);
 	/*virtual*/ BOOL		handleKeyHere(KEY key, MASK mask);
 	/*virtual*/ void		onFocusReceived();
 	/*virtual*/ void		onFocusLost();
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index d1d112c4bf29f91c76ea4f4cc53f73f57c577f14..14a8b7cb59829f0a801029fab13a5e69588164a2 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -49,7 +49,7 @@
 #include "llbutton.h"
 #include "llviewercontrol.h"
 #include "llcriticaldamp.h"
-#include "llhoverview.h"
+#include "lltooltip.h"
 #include "llfloatertools.h"
 #include "llselectmgr.h"
 #include "llstatusbar.h"
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index cc2531d139546c38acefb14217cbdbc2bf76bf3c..2153f77336e7b2084c8493b32ebf74107b5d447a 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -379,7 +379,7 @@ BOOL LLManipTranslate::handleMouseDownOnPart( S32 x, S32 y, MASK mask )
 		}
 		else if (gSavedSettings.getBOOL("SnapToMouseCursor"))
 		{
-			LLUI::setCursorPositionScreen(mouse_pos.mX, mouse_pos.mY);
+			LLUI::setMousePositionScreen(mouse_pos.mX, mouse_pos.mY);
 			x = mouse_pos.mX;
 			y = mouse_pos.mY;
 		}
diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp
index 3c7716e9c2bed8910e05e6d7216018f61228c958..b3aa67733b051c54e8abeb3c58d8b04fab3db4a7 100644
--- a/indra/newview/llmemoryview.cpp
+++ b/indra/newview/llmemoryview.cpp
@@ -32,11 +32,11 @@
 
 #include "llviewerprecompiledheaders.h"
 
-#include "indra_constants.h"
 #include "llmemoryview.h"
 
 #include "llappviewer.h"
 #include "llallocator_heap_profile.h"
+#include "llgl.h"						// LLGLSUIDefault
 #include "llviewerwindow.h"
 #include "llviewercontrol.h"
 
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 7b0b0c2fb75b392ff9bf8bce0456a1a9681d348e..5e65f2244d9a5150e61168b7908f48f8d53baeae 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -35,15 +35,19 @@
 
 #include "llnetmap.h"
 
+// Library includes (should move below)
 #include "indra_constants.h"
 #include "llmath.h"
 #include "llfloaterreg.h"
 #include "llfocusmgr.h"
+#include "lllocalcliprect.h"
 #include "llrender.h"
 #include "llui.h"
+#include "lltooltip.h"
 
 #include "llglheaders.h"
 
+// Viewer includes
 #include "llagent.h"
 #include "llappviewer.h" // for gDisconnected
 #include "llcallingcard.h" // LLAvatarTracker
@@ -286,7 +290,7 @@ void LLNetMap::draw()
 		S32 local_mouse_x;
 		S32 local_mouse_y;
 		//localMouse(&local_mouse_x, &local_mouse_y);
-		LLUI::getCursorPositionLocal(this, &local_mouse_x, &local_mouse_y);
+		LLUI::getMousePositionLocal(this, &local_mouse_x, &local_mouse_y);
 		mClosestAgentToCursor.setNull();
 		F32 closest_dist = F32_MAX;
 
@@ -496,9 +500,8 @@ BOOL LLNetMap::handleScrollWheel(S32 x, S32 y, S32 clicks)
 	return TRUE;
 }
 
-BOOL LLNetMap::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen )
+BOOL LLNetMap::handleToolTip( S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen )
 {
-	BOOL handled = FALSE;
 	if (gDisconnected)
 	{
 		return FALSE;
@@ -530,19 +533,23 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rec
 	msg = mToolTipMsg;
 	LLStringUtil::format(msg, args);
 	
+	LLRect sticky_rect;
 	// set sticky_rect
 	if (region)
 	{
 		S32 SLOP = 4;
 		localPointToScreen( 
 			x - SLOP, y - SLOP, 
-			&(sticky_rect_screen->mLeft), &(sticky_rect_screen->mBottom) );
-		sticky_rect_screen->mRight = sticky_rect_screen->mLeft + 2 * SLOP;
-		sticky_rect_screen->mTop = sticky_rect_screen->mBottom + 2 * SLOP;
+			&(sticky_rect.mLeft), &(sticky_rect.mBottom) );
+		sticky_rect.mRight = sticky_rect.mLeft + 2 * SLOP;
+		sticky_rect.mTop = sticky_rect.mBottom + 2 * SLOP;
 	}
-	
-	handled = TRUE;
-	return handled;
+
+	LLToolTipMgr::instance().show(LLToolTipParams()
+		.message(msg)
+		.sticky_rect(sticky_rect));
+		
+	return TRUE;
 }
 
 
diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h
index a673ea3f57ed94fff75f7af3a555d8590b4e5b9d..7598154480d089f054ab448eb6cc5ec2afd2d995 100644
--- a/indra/newview/llnetmap.h
+++ b/indra/newview/llnetmap.h
@@ -67,7 +67,7 @@ class LLNetMap : public LLUICtrl
 
 	/*virtual*/ void	draw();
 	/*virtual*/ BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks);
-	/*virtual*/ BOOL	handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen );
+	/*virtual*/ BOOL	handleToolTip( S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen );
 	
 	void			setScale( F32 scale );
 	void			setRotateMap( BOOL b ) { mRotateMap = b; }
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index fd3519bf4b830b00406f48168aac172872c8ec11..ba383a8deeb797f75b1ef7a8bc1d8799b4d57d5b 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -35,7 +35,7 @@
 
 #include "llagent.h"
 #include "llavataractions.h"
-#include "llavatarconstants.h"
+#include "llavatarconstants.h"	// AVATAR_ONLINE
 #include "llcallingcard.h"
 #include "llcombobox.h"
 #include "llimview.h"
@@ -131,7 +131,8 @@ LLPanelAvatarNotes::LLPanelAvatarNotes()
 
 void LLPanelAvatarNotes::updateData()
 {
-	LLAvatarPropertiesProcessor::getInstance()->sendDataRequest(getAvatarId(),APT_NOTES);
+	LLAvatarPropertiesProcessor::getInstance()->
+		sendAvatarNotesRequest(getAvatarId());
 }
 
 BOOL LLPanelAvatarNotes::postBuild()
@@ -356,8 +357,10 @@ void LLPanelAvatarProfile::updateData()
 {
 	if (getAvatarId().notNull())
 	{
-		LLAvatarPropertiesProcessor::getInstance()->sendDataRequest(getAvatarId(),APT_PROPERTIES);
-		LLAvatarPropertiesProcessor::getInstance()->sendDataRequest(getAvatarId(),APT_GROUPS);
+		LLAvatarPropertiesProcessor::getInstance()->
+			sendAvatarPropertiesRequest(getAvatarId());
+		LLAvatarPropertiesProcessor::getInstance()->
+			sendAvatarGroupsRequest(getAvatarId());
 	}
 }
 
@@ -486,55 +489,13 @@ void LLPanelAvatarProfile::fillOnlineStatus(const LLAvatarData* avatar_data)
 
 void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data)
 {
-	std::string caption_text = avatar_data->caption_text;
-	if(caption_text.empty())
-	{
-		LLStringUtil::format_map_t args;
-		caption_text = getString("CaptionTextAcctInfo");
-		BOOL transacted = (avatar_data->flags & AVATAR_TRANSACTED);
-		BOOL identified = (avatar_data->flags & AVATAR_IDENTIFIED);
-		BOOL age_verified = (avatar_data->flags & AVATAR_AGEVERIFIED); // Not currently getting set in dataserver/lldataavatar.cpp for privacy considerations
-
-		const char* ACCT_TYPE[] = {
-			"AcctTypeResident",
-			"AcctTypeTrial",
-			"AcctTypeCharterMember",
-			"AcctTypeEmployee"
-		};
-		U8 caption_index = llclamp(avatar_data->caption_index, (U8)0, (U8)(LL_ARRAY_SIZE(ACCT_TYPE)-1));
-		args["[ACCTTYPE]"] = getString(ACCT_TYPE[caption_index]);
-
-		std::string payment_text = " ";
-		const S32 DEFAULT_CAPTION_LINDEN_INDEX = 3;
-		if(caption_index != DEFAULT_CAPTION_LINDEN_INDEX)
-		{			
-			if(transacted)
-			{
-				payment_text = "PaymentInfoUsed";
-			}
-			else if (identified)
-			{
-				payment_text = "PaymentInfoOnFile";
-			}
-			else
-			{
-				payment_text = "NoPaymentInfoOnFile";
-			}
-			args["[PAYMENTINFO]"] = getString(payment_text);
-
-			std::string age_text = age_verified ? "AgeVerified" : "NotAgeVerified";
-			// Do not display age verification status at this time
-			//args["[[AGEVERIFICATION]]"] = mPanelSecondLife->getString(age_text);
-			args["[AGEVERIFICATION]"] = " ";
-		}
-		else
-		{
-			args["[PAYMENTINFO]"] = " ";
-			args["[AGEVERIFICATION]"] = " ";
-		}
-		LLStringUtil::format(caption_text, args);
-	}
-
+	LLStringUtil::format_map_t args;
+	args["[ACCTTYPE]"] = LLAvatarPropertiesProcessor::accountType(avatar_data);
+	args["[PAYMENTINFO]"] = LLAvatarPropertiesProcessor::paymentInfo(avatar_data);
+	// *NOTE: AVATAR_AGEVERIFIED not currently getting set in 
+	// dataserver/lldataavatar.cpp for privacy considerations
+	args["[AGEVERIFICATION]"] = "";
+	std::string caption_text = getString("CaptionTextAcctInfo", args);
 	childSetValue("acc_status_text", caption_text);
 }
 
diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp
index f7ca54c732b730c1f9202443afa8da6cff28b6a1..bde6d1cf6c5caf67c590b89da612e66d82e27fe5 100644
--- a/indra/newview/llpanelpick.cpp
+++ b/indra/newview/llpanelpick.cpp
@@ -159,7 +159,7 @@ void LLPanelPick::requestData()
 {
 	mDataReceived = FALSE;
 	LLAvatarPropertiesProcessor::instance().addObserver(mCreatorId, this);
-	LLAvatarPropertiesProcessor::instance().sendDataRequest(mCreatorId, APT_PICK_INFO, &mPickId);
+	LLAvatarPropertiesProcessor::instance().sendPickInfoRequest(mCreatorId, mPickId);
 }
 
 void LLPanelPick::init(LLPickData *pick_data)
@@ -335,7 +335,7 @@ void LLPanelPick::sendUpdate()
 	mDataReceived = FALSE;
 	LLAvatarPropertiesProcessor::instance().addObserver(gAgentID, this);
 
-	LLAvatarPropertiesProcessor::instance().sendDataUpdate(&pick_data, APT_PICK_INFO);
+	LLAvatarPropertiesProcessor::instance().sendPickInfoUpdate(&pick_data);
 }
 
 
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index c34038c672b215b16e3f05838f1d3457038b5a4f..d374d24316de544a639847da16b9c43c8d286061 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -88,7 +88,7 @@ void* LLPanelPicks::create(void* data /* = NULL */)
 
 void LLPanelPicks::updateData()
 {
-	LLAvatarPropertiesProcessor::getInstance()->sendDataRequest(getAvatarId(),APT_PICKS);
+	LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(getAvatarId());
 }
 
 void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
@@ -447,7 +447,7 @@ const std::string LLPickItem::getDescription()
 void LLPickItem::update()
 {
 	mNeedData = true;
-	LLAvatarPropertiesProcessor::instance().sendDataRequest(mCreatorID, APT_PICK_INFO, &mPickID);
+	LLAvatarPropertiesProcessor::instance().sendPickInfoRequest(mCreatorID, mPickID);
 	mNeedData = false;
 }
 
diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index ec1c10d8c9cb6583dadae97900385e9671bd0e8b..457109f86938842921a169bc4da7f5db57db6048 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -894,7 +894,7 @@ void LLPanelPlaceInfo::createPick(const LLVector3d& global_pos)
 	pick_data.sort_order = 0;
 	pick_data.enabled = TRUE;
 
-	LLAvatarPropertiesProcessor::instance().sendDataUpdate(&pick_data, APT_PICK_INFO);
+	LLAvatarPropertiesProcessor::instance().sendPickInfoUpdate(&pick_data);
 }
 
 // virtual
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 32fe9961253aff314235a3df9c5cb51f3ac4c1b9..b25331e43935097a510a82ee3d4ff6b3f4e0d279 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -393,7 +393,7 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj,
 	}
 
 	// Collect all of the objects
-	LLDynamicArray<LLViewerObject*> objects;
+	std::vector<LLViewerObject*> objects;
 
 	root->addThisAndNonJointChildren(objects);
 	addAsFamily(objects, add_to_end);
@@ -439,7 +439,7 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(const std::vector<LLV
 														   BOOL send_to_sim)
 {
 	// Collect all of the objects, children included
-	LLDynamicArray<LLViewerObject*> objects;
+	std::vector<LLViewerObject*> objects;
 
 	//clear primary object (no primary object)
 	mSelectedObjects->mPrimaryObject = NULL;
@@ -563,7 +563,7 @@ void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_s
 	if(!object->isSelected()) return;
 
 	// Collect all of the objects, and remove them
-	LLDynamicArray<LLViewerObject*> objects;
+	std::vector<LLViewerObject*> objects;
 
 	if (include_entire_object)
 	{
@@ -779,47 +779,55 @@ void LLSelectMgr::addAsIndividual(LLViewerObject *objectp, S32 face, BOOL undoab
 
 LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp, S32 face)
 {
-	// Always blitz hover list when setting
-	mHoverObjects->deleteAllNodes();
-
 	if (!objectp)
 	{
+		mHoverObjects->deleteAllNodes();
 		return NULL;
 	}
 
 	// Can't select yourself
 	if (objectp->mID == gAgentID)
 	{
+		mHoverObjects->deleteAllNodes();
 		return NULL;
 	}
 
 	// Can't select land
 	if (objectp->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH)
 	{
+		mHoverObjects->deleteAllNodes();
 		return NULL;
 	}
 
-	// Collect all of the objects
-	LLDynamicArray<LLViewerObject*> objects;
 	objectp = objectp->getRootEdit();
-	objectp->addThisAndNonJointChildren(objects);
 
-	for (std::vector<LLViewerObject*>::iterator iter = objects.begin();
-		 iter != objects.end(); ++iter)
+	// is the requested object the same as the existing hover object root?
+	// NOTE: there is only ever one linked set in mHoverObjects
+	if (mHoverObjects->getFirstRootObject() != objectp) 
 	{
-		LLViewerObject* cur_objectp = *iter;
-		LLSelectNode* nodep = new LLSelectNode(cur_objectp, FALSE);
-		nodep->selectTE(face, TRUE);
-		mHoverObjects->addNodeAtEnd(nodep);
+		// Collect all of the objects
+		std::vector<LLViewerObject*> objects;
+		objectp = objectp->getRootEdit();
+		objectp->addThisAndNonJointChildren(objects);
+
+		for (std::vector<LLViewerObject*>::iterator iter = objects.begin();
+			 iter != objects.end(); ++iter)
+		{
+			LLViewerObject* cur_objectp = *iter;
+			LLSelectNode* nodep = new LLSelectNode(cur_objectp, FALSE);
+			nodep->selectTE(face, TRUE);
+			mHoverObjects->addNodeAtEnd(nodep);
+		}
+		
+		requestObjectPropertiesFamily(objectp);
 	}
 
-	requestObjectPropertiesFamily(objectp);
 	return mHoverObjects;
 }
 
 LLSelectNode *LLSelectMgr::getHoverNode()
 {
-	return getHoverObjects()->getFirstRootNode();
+	return mHoverObjects->getFirstRootNode();
 }
 
 void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp)
@@ -1286,7 +1294,7 @@ void LLSelectMgr::promoteSelectionToRoot()
 //-----------------------------------------------------------------------------
 void LLSelectMgr::demoteSelectionToIndividuals()
 {
-	LLDynamicArray<LLViewerObject*> objects;
+	std::vector<LLViewerObject*> objects;
 
 	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
 		 iter != getSelection()->root_end(); iter++)
@@ -1295,7 +1303,7 @@ void LLSelectMgr::demoteSelectionToIndividuals()
 		object->addThisAndNonJointChildren(objects);
 	}
 
-	if (objects.getLength())
+	if (!objects.empty())
 	{
 		deselectAll();
 		for (std::vector<LLViewerObject*>::iterator iter = objects.begin();
@@ -4480,7 +4488,7 @@ void LLSelectMgr::processObjectPropertiesFamily(LLMessageSystem* msg, void** use
 			return (node->getObject() && node->getObject()->mID == mID);
 		}
 	} func(id);
-	LLSelectNode* node = LLSelectMgr::getInstance()->getHoverObjects()->getFirstNode(&func);
+	LLSelectNode* node = LLSelectMgr::getInstance()->mHoverObjects->getFirstNode(&func);
 
 	if (node)
 	{
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index c41a86e355893c09851f503a0f484c620788a80e..08c27837462f778893229e0a536db93ebbc6528c 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -411,6 +411,7 @@ class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr>
 	LLObjectSelectionHandle selectHighlightedObjects();
 
 	LLObjectSelectionHandle setHoverObject(LLViewerObject *objectp, S32 face = -1);
+	LLSelectNode *getHoverNode();
 
 	void highlightObjectOnly(LLViewerObject *objectp);
 	void highlightObjectAndFamily(LLViewerObject *objectp);
@@ -445,14 +446,11 @@ class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr>
 	////////////////////////////////////////////////////////////////
 	// Selection accessors
 	////////////////////////////////////////////////////////////////
-	LLObjectSelectionHandle	getHoverObjects() { return mHoverObjects; }
 	LLObjectSelectionHandle	getSelection() { return mSelectedObjects; }
 	// right now this just renders the selection with root/child colors instead of a single color
 	LLObjectSelectionHandle	getEditSelection() { convertTransient(); return mSelectedObjects; }
 	LLObjectSelectionHandle	getHighlightedObjects() { return mHighlightedObjects; }
 
-	LLSelectNode *getHoverNode();
-
 	////////////////////////////////////////////////////////////////
 	// Grid manipulation
 	////////////////////////////////////////////////////////////////
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index 70a8ab9f61bc4eda2f69e67c53d177b0cfa33849..9da24463542f25ffa8cb952483cf5bc893c93794 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -43,7 +43,7 @@
 #include "llimageworker.h"
 #include "llrender.h"
 
-#include "llhoverview.h"
+#include "lltooltip.h"
 #include "llselectmgr.h"
 #include "lltexlayer.h"
 #include "lltexturecache.h"
@@ -662,16 +662,20 @@ void LLTextureView::draw()
 #if 1
 			if (pri < HIGH_PRIORITY && (cur_discard< 0 || desired_discard < cur_discard))
 			{
-				LLViewerObject *objectp = gHoverView->getLastHoverObject();
-				if (objectp)
+				LLSelectNode* hover_node = LLSelectMgr::instance().getHoverNode();
+				if (hover_node)
 				{
-					S32 tex_count = objectp->getNumTEs();
-					for (S32 i = 0; i < tex_count; i++)
+					LLViewerObject *objectp = hover_node->getObject();
+					if (objectp)
 					{
-						if (imagep == objectp->getTEImage(i))
+						S32 tex_count = objectp->getNumTEs();
+						for (S32 i = 0; i < tex_count; i++)
 						{
-							pri += 2*HIGH_PRIORITY;
-							break;
+							if (imagep == objectp->getTEImage(i))
+							{
+								pri += 2*HIGH_PRIORITY;
+								break;
+							}
 						}
 					}
 				}
diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp
index 7b058e9efa2b431e1f5f7181267f047a0be81cb0..ceb1358d1c0772ae86c6fc3abfb6adb32dab33f0 100644
--- a/indra/newview/lltool.cpp
+++ b/indra/newview/lltool.cpp
@@ -65,6 +65,20 @@ LLTool::~LLTool()
 	}
 }
 
+BOOL LLTool::handleAnyMouseClick(S32 x, S32 y, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down)
+{
+	// This is necessary to force clicks in the world to cause edit
+	// boxes that might have keyboard focus to relinquish it, and hence
+	// cause a commit to update their value.  JC
+	if (down)
+	{
+		gFocusMgr.setKeyboardFocus(NULL);
+	}
+
+	return LLMouseHandler::handleAnyMouseClick(x, y, mask, clicktype, down);
+}
+
+
 BOOL LLTool::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	if (gDebugClicks)
@@ -139,7 +153,7 @@ BOOL LLTool::handleMiddleMouseUp(S32 x, S32 y, MASK mask)
 	return FALSE;
 }
 
-BOOL LLTool::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen)
+BOOL LLTool::handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen)
 {
 	// by default, didn't handle it
 	// llinfos << "LLTool::handleToolTip" << llendl;
diff --git a/indra/newview/lltool.h b/indra/newview/lltool.h
index f954a8c243bc021dff2088f3bbfb480182008b1b..bef4a2e1fd85e3944c63554e764ef3cc8a7f1047 100644
--- a/indra/newview/lltool.h
+++ b/indra/newview/lltool.h
@@ -55,6 +55,7 @@ class LLTool
 	virtual BOOL isView() const { return FALSE; }
 
 	// Virtual functions inherited from LLMouseHandler
+	virtual BOOL	handleAnyMouseClick(S32 x, S32 y, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down);
 	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleMiddleMouseDown(S32 x, S32 y, MASK mask);
@@ -65,9 +66,7 @@ class LLTool
 	virtual BOOL	handleDoubleClick(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleRightMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleRightMouseUp(S32 x, S32 y, MASK mask);
-	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen);
-
-	virtual EShowToolTip getShowToolTip() { return SHOW_ALWAYS; }; // tools should permit tips even when the mouse is down, as that's pretty normal for tools
+	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen);
 
 		// Return FALSE to allow context menu to be shown.
 	virtual void	screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index c58457d599708de2f4c857c91b9a970b894c28f7..b35208cd031d354d5f98ea3b96546c806fcb3dd1 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -56,6 +56,7 @@
 #include "llpreviewnotecard.h"
 #include "llselectmgr.h"
 #include "lltoolmgr.h"
+#include "lltooltip.h"
 #include "lltrans.h"
 #include "llui.h"
 #include "llviewertexturelist.h"
@@ -758,12 +759,13 @@ BOOL LLToolDragAndDrop::handleKey(KEY key, MASK mask)
 	return FALSE;
 }
 
-BOOL LLToolDragAndDrop::handleToolTip(S32 x, S32 y, std::string& msg, LLRect *sticky_rect_screen)
+BOOL LLToolDragAndDrop::handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen)
 {
 	if (!mToolTipMsg.empty())
 	{
-		msg = mToolTipMsg;
-		//*sticky_rect_screen = gViewerWindow->getWindowRect();
+		LLToolTipMgr::instance().show(LLToolTipParams()
+			.message(mToolTipMsg)
+			.delay_time(gSavedSettings.getF32( "DragAndDropToolTipDelay" )));
 		return TRUE;
 	}
 	return FALSE;
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index f9e5bec143d1e9ee844a1c6937b3cc3dd5e334a4..c9fef26b58efc858d73e5150f4cae41476b60a70 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -57,7 +57,7 @@ class LLToolDragAndDrop : public LLTool, public LLSingleton<LLToolDragAndDrop>
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleHover(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleKey(KEY key, MASK mask);
-	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect *sticky_rect_screen);
+	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen);
 	virtual void	onMouseCaptureLost();
 	virtual void	handleDeselect();
 
diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp
index 297cf2c667b5ef5a5d97bb8b48959b817db3125c..9400840bdfaa4b3a85dbfeaf911fe3da350d55ac 100644
--- a/indra/newview/lltoolfocus.cpp
+++ b/indra/newview/lltoolfocus.cpp
@@ -45,7 +45,7 @@
 #include "llbutton.h"
 #include "llviewercontrol.h"
 #include "lldrawable.h"
-#include "llhoverview.h"
+#include "lltooltip.h"
 #include "llhudmanager.h"
 #include "llfloatertools.h"
 #include "llselectmgr.h"
@@ -287,12 +287,12 @@ BOOL LLToolCamera::handleMouseUp(S32 x, S32 y, MASK mask)
 				BOOL success = LLViewerCamera::getInstance()->projectPosAgentToScreen(focus_pos, mouse_pos);
 				if (success)
 				{
-					LLUI::setCursorPositionScreen(mouse_pos.mX, mouse_pos.mY);
+					LLUI::setMousePositionScreen(mouse_pos.mX, mouse_pos.mY);
 				}
 			}
 			else if (mMouseSteering)
 			{
-				LLUI::setCursorPositionScreen(mMouseDownX, mMouseDownY);
+				LLUI::setMousePositionScreen(mMouseDownX, mMouseDownY);
 			}
 			else
 			{
@@ -302,7 +302,7 @@ BOOL LLToolCamera::handleMouseUp(S32 x, S32 y, MASK mask)
 		else
 		{
 			// not a valid zoomable object
-			LLUI::setCursorPositionScreen(mMouseDownX, mMouseDownY);
+			LLUI::setMousePositionScreen(mMouseDownX, mMouseDownY);
 		}
 
 		// calls releaseMouse() internally
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index abadd251c1ce72724d28c6ca07aac35322b1c6c5..b7a97562bd1b0e4cfa8385094515b542007c2fd1 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -134,7 +134,7 @@ BOOL LLToolGrab::handleMouseDown(S32 x, S32 y, MASK mask)
 	if (!gAgent.leftButtonGrabbed())
 	{
 		// can grab transparent objects (how touch event propagates, scripters rely on this)
-		gViewerWindow->pickAsync(x, y, mask, pickCallback, TRUE, TRUE);
+		gViewerWindow->pickAsync(x, y, mask, pickCallback, TRUE);
 	}
 	return TRUE;
 }
@@ -996,7 +996,7 @@ void LLToolGrab::onMouseCaptureLost()
 			// ...move cursor "naturally", as if it had moved when hidden
 			S32 x = mGrabPick.mMousePt.mX + mAccumDeltaX;
 			S32 y = mGrabPick.mMousePt.mY + mAccumDeltaY;
-			LLUI::setCursorPositionScreen(x, y);
+			LLUI::setMousePositionScreen(x, y);
 		}
 		else if (mHasMoved)
 		{
@@ -1006,13 +1006,13 @@ void LLToolGrab::onMouseCaptureLost()
 			LLCoordGL gl_point;
 			if (LLViewerCamera::getInstance()->projectPosAgentToScreen(grab_point_agent, gl_point))
 			{
-				LLUI::setCursorPositionScreen(gl_point.mX, gl_point.mY);
+				LLUI::setMousePositionScreen(gl_point.mX, gl_point.mY);
 			}
 		}
 		else
 		{
 			// ...move cursor back to click position
-			LLUI::setCursorPositionScreen(mGrabPick.mMousePt.mX, mGrabPick.mMousePt.mY);
+			LLUI::setMousePositionScreen(mGrabPick.mMousePt.mX, mGrabPick.mMousePt.mY);
 		}
 
 		gViewerWindow->showCursor();
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 235d4acf9d33f6047f21b1e768a39e80341b6897..d6297c30c757543e97b975fcd0205e6c65cc57aa 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -45,7 +45,7 @@
 #include "llfloaterland.h"
 #include "llfloaterreg.h"
 #include "llfloaterscriptdebug.h"
-#include "llhoverview.h"
+#include "lltooltip.h"
 #include "llhudeffecttrail.h"
 #include "llhudmanager.h"
 #include "llmenugl.h"
@@ -55,6 +55,7 @@
 #include "lltoolgrab.h"
 #include "lltoolmgr.h"
 #include "lltoolselect.h"
+#include "lltrans.h"
 #include "llviewercamera.h"
 #include "llviewerparcelmedia.h"
 #include "llviewermenu.h"
@@ -68,6 +69,7 @@
 #include "llworld.h"
 #include "llui.h"
 #include "llweb.h"
+#include "llinspectavatar.h"
 
 extern void handle_buy(void*);
 
@@ -91,7 +93,7 @@ LLToolPie::LLToolPie()
 BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	//left mouse down always picks transparent
-	gViewerWindow->pickAsync(x, y, mask, leftMouseCallback, TRUE, TRUE);
+	gViewerWindow->pickAsync(x, y, mask, leftMouseCallback, TRUE);
 	mGrabMouseButtonDown = TRUE;
 	return TRUE;
 }
@@ -108,7 +110,7 @@ void LLToolPie::leftMouseCallback(const LLPickInfo& pick_info)
 BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)
 {
 	// don't pick transparent so users can't "pay" transparent objects
-	gViewerWindow->pickAsync(x, y, mask, rightMouseCallback, FALSE, TRUE);
+	gViewerWindow->pickAsync(x, y, mask, rightMouseCallback, FALSE);
 	// claim not handled so UI focus stays same
 	return FALSE;
 }
@@ -463,31 +465,13 @@ void LLToolPie::selectionPropertiesReceived()
 
 BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
 {
-		/*
-	// If auto-rotate occurs, tag mouse-outside-slop to make sure the drag
-	// gets started.
-	const S32 ROTATE_H_MARGIN = (S32) (0.1f * gViewerWindow->getWindowWidth() );
-	const F32 ROTATE_ANGLE_PER_SECOND = 30.f * DEG_TO_RAD;
-	const F32 rotate_angle = ROTATE_ANGLE_PER_SECOND / gFPSClamped;
-	// ...normal modes can only yaw
-	if (x < ROTATE_H_MARGIN)
-	{
-		gAgent.yaw(rotate_angle);
-		mMouseOutsideSlop = TRUE;
-	}
-	else if (x > gViewerWindow->getWindowWidth() - ROTATE_H_MARGIN)
-	{
-		gAgent.yaw(-rotate_angle);
-		mMouseOutsideSlop = TRUE;
-	}
-	*/
+	mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE);
 
 	// FIXME: This was in the pluginapi branch, but I don't think it's correct.
 //	gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
 
-	LLViewerObject *object = NULL;
 	LLViewerObject *parent = NULL;
-	object = gViewerWindow->getHoverPick().getObject();
+	LLViewerObject *object = mHoverPick.getObject();
 
 	if (object)
 	{
@@ -500,7 +484,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
 		gViewerWindow->setCursor(cursor);
 		lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
 	}
-	else if (handle_media_hover(gViewerWindow->getHoverPick()))
+	else if (handle_media_hover(mHoverPick))
 	{
 		// cursor set by media object
 		lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
@@ -553,7 +537,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
 			// same object anymore.
 			gViewerWindow->setCursor(UI_CURSOR_ARROW);
 			// Make sure the hover-picked object is ignored.
-			gHoverView->resetLastHoverObject();
+			//gToolTipView->resetLastHoverObject();
 			break;
 		default:
 			break;
@@ -584,41 +568,439 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
 		else if (mPick.mObjectID.notNull()
 				 && !mPick.mPosGlobal.isExactlyZero())
 		{
-			// Hit an object
-			// HACK: Call the last hit position the point we hit on the object
-			//gLastHitPosGlobal += gLastHitObjectOffset;
 			handle_go_to();
 			return TRUE;
 		}
 	}
 
 	return FALSE;
+}
 
-	/* JC - don't do go-there, because then double-clicking on physical
-	objects gets you into trouble.
+//FIXME - RN: get this in LLToolSelectLand too or share some other way?
+const char* DEFAULT_DESC = "(No Description)";
 
-	// If double-click on object or land, go there.
-	LLViewerObject *object = gViewerWindow->getLastPick().getObject();
-	if (object)
+BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, std::string& msg, LLRect& sticky_rect_screen)
+{
+	if (!LLUI::sSettingGroups["config"]->getBOOL("ShowHoverTips")) return TRUE;
+	if (!mHoverPick.isValid()) return TRUE;
+
+	LLViewerObject* hover_object = mHoverPick.getObject();
+
+	// update hover object and hover parcel
+	LLSelectMgr::getInstance()->setHoverObject(hover_object, mHoverPick.mObjectFace);
+
+	if (mHoverPick.mPickType == LLPickInfo::PICK_LAND)
+	{
+		LLViewerParcelMgr::getInstance()->setHoverParcel( mHoverPick.mPosGlobal );
+	}
+
+	std::string tooltip_msg;
+	std::string line;
+
+	if ( hover_object )
 	{
-		if (object->isAvatar())
+		if ( hover_object->isHUDAttachment() )
 		{
-			LLFloaterAvatarInfo::showFromAvatar(object->getID());
+			// no hover tips for HUD elements, since they can obscure
+			// what the HUD is displaying
+			return TRUE;
+		}
+
+		if ( hover_object->isAttachment() )
+		{
+			// get root of attachment then parent, which is avatar
+			LLViewerObject* root_edit = hover_object->getRootEdit();
+			if (!root_edit)
+			{
+				// Strange parenting issue, don't show any text
+				return TRUE;
+			}
+			hover_object = (LLViewerObject*)root_edit->getParent();
+			if (!hover_object)
+			{
+				// another strange parenting issue, bail out
+				return TRUE;
+			}
+		}
+
+		line.clear();
+		if (hover_object->isAvatar())
+		{
+			// only show tooltip if inspector not already open
+			if (!LLFloaterReg::instanceVisible("inspect_avatar"))
+			{
+				std::string avatar_name;
+				LLNameValue* firstname = hover_object->getNVPair("FirstName");
+				LLNameValue* lastname =  hover_object->getNVPair("LastName");
+				if (firstname && lastname)
+				{
+					avatar_name = llformat("%s %s", firstname->getString(), lastname->getString());
+				}
+				else
+				{
+					avatar_name = LLTrans::getString("TooltipPerson");
+				}
+				LLToolTipParams params;
+				params.message(avatar_name);
+				params.image.name("Info");
+				params.sticky_rect(gViewerWindow->getVirtualWorldViewRect());
+				params.click_callback(boost::bind(showAvatarInspector, hover_object->getID()));
+				LLToolTipMgr::instance().show(params);
+			}
 		}
 		else
 		{
-			handle_go_to(NULL);
+			//
+			//  We have hit a regular object (not an avatar or attachment)
+			// 
+
+			//
+			//  Default prefs will suppress display unless the object is interactive
+			//
+			BOOL suppressObjectHoverDisplay = !gSavedSettings.getBOOL("ShowAllObjectHoverTip");			
+			
+			LLSelectNode *nodep = LLSelectMgr::getInstance()->getHoverNode();
+			if (nodep)
+			{
+				line.clear();
+				if (nodep->mName.empty())
+				{
+					line.append(LLTrans::getString("TooltipNoName"));
+				}
+				else
+				{
+					line.append( nodep->mName );
+				}
+				tooltip_msg.append(line);
+				tooltip_msg.push_back('\n');
+
+				if (!nodep->mDescription.empty()
+					&& nodep->mDescription != DEFAULT_DESC)
+				{
+					tooltip_msg.append( nodep->mDescription );
+					tooltip_msg.push_back('\n');
+				}
+
+				// Line: "Owner: James Linden"
+				line.clear();
+				line.append(LLTrans::getString("TooltipOwner") + " ");
+
+				if (nodep->mValid)
+				{
+					LLUUID owner;
+					std::string name;
+					if (!nodep->mPermissions->isGroupOwned())
+					{
+						owner = nodep->mPermissions->getOwner();
+						if (LLUUID::null == owner)
+						{
+							line.append(LLTrans::getString("TooltipPublic"));
+						}
+						else if(gCacheName->getFullName(owner, name))
+						{
+							line.append(name);
+						}
+						else
+						{
+							line.append(LLTrans::getString("RetrievingData"));
+						}
+					}
+					else
+					{
+						std::string name;
+						owner = nodep->mPermissions->getGroup();
+						if (gCacheName->getGroupName(owner, name))
+						{
+							line.append(name);
+							line.append(LLTrans::getString("TooltipIsGroup"));
+						}
+						else
+						{
+							line.append(LLTrans::getString("RetrievingData"));
+						}
+					}
+				}
+				else
+				{
+					line.append(LLTrans::getString("RetrievingData"));
+				}
+				tooltip_msg.append(line);
+				tooltip_msg.push_back('\n');
+
+				// Build a line describing any special properties of this object.
+				LLViewerObject *object = hover_object;
+				LLViewerObject *parent = (LLViewerObject *)object->getParent();
+
+				if (object &&
+					(object->usePhysics() ||
+					 object->flagScripted() || 
+					 object->flagHandleTouch() || (parent && parent->flagHandleTouch()) ||
+					 object->flagTakesMoney() || (parent && parent->flagTakesMoney()) ||
+					 object->flagAllowInventoryAdd() ||
+					 object->flagTemporary() ||
+					 object->flagPhantom()) )
+				{
+					line.clear();
+					if (object->flagScripted())
+					{
+						line.append(LLTrans::getString("TooltipFlagScript") + " ");
+					}
+
+					if (object->usePhysics())
+					{
+						line.append(LLTrans::getString("TooltipFlagPhysics") + " ");
+					}
+
+					if (object->flagHandleTouch() || (parent && parent->flagHandleTouch()) )
+					{
+						line.append(LLTrans::getString("TooltipFlagTouch") + " ");
+						suppressObjectHoverDisplay = FALSE;		//  Show tip
+					}
+
+					if (object->flagTakesMoney() || (parent && parent->flagTakesMoney()) )
+					{
+						line.append(LLTrans::getString("TooltipFlagL$") + " ");
+						suppressObjectHoverDisplay = FALSE;		//  Show tip
+					}
+
+					if (object->flagAllowInventoryAdd())
+					{
+						line.append(LLTrans::getString("TooltipFlagDropInventory") + " ");
+						suppressObjectHoverDisplay = FALSE;		//  Show tip
+					}
+
+					if (object->flagPhantom())
+					{
+						line.append(LLTrans::getString("TooltipFlagPhantom") + " ");
+					}
+
+					if (object->flagTemporary())
+					{
+						line.append(LLTrans::getString("TooltipFlagTemporary") + " ");
+					}
+
+					if (object->usePhysics() || 
+						object->flagHandleTouch() ||
+						(parent && parent->flagHandleTouch()) )
+					{
+						line.append(LLTrans::getString("TooltipFlagRightClickMenu") + " ");
+					}
+					tooltip_msg.append(line);
+					tooltip_msg.push_back('\n');
+				}
+
+				// Free to copy / For Sale: L$
+				line.clear();
+				if (nodep->mValid)
+				{
+					BOOL for_copy = nodep->mPermissions->getMaskEveryone() & PERM_COPY && object->permCopy();
+					BOOL for_sale = nodep->mSaleInfo.isForSale() &&
+									nodep->mPermissions->getMaskOwner() & PERM_TRANSFER &&
+									(nodep->mPermissions->getMaskOwner() & PERM_COPY ||
+									 nodep->mSaleInfo.getSaleType() != LLSaleInfo::FS_COPY);
+					if (for_copy)
+					{
+						line.append(LLTrans::getString("TooltipFreeToCopy"));
+						suppressObjectHoverDisplay = FALSE;		//  Show tip
+					}
+					else if (for_sale)
+					{
+						LLStringUtil::format_map_t args;
+						args["[AMOUNT]"] = llformat("%d", nodep->mSaleInfo.getSalePrice());
+						line.append(LLTrans::getString("TooltipForSaleL$", args));
+						suppressObjectHoverDisplay = FALSE;		//  Show tip
+					}
+					else
+					{
+						// Nothing if not for sale
+						// line.append("Not for sale");
+					}
+				}
+				else
+				{
+					LLStringUtil::format_map_t args;
+					args["[MESSAGE]"] = LLTrans::getString("RetrievingData");
+					line.append(LLTrans::getString("TooltipForSaleMsg", args));
+				}
+				tooltip_msg.append(line);
+				tooltip_msg.push_back('\n');
+
+				if (!suppressObjectHoverDisplay)
+				{
+					LLToolTipMgr::instance().show(tooltip_msg);
+				}
+			}
 		}
 	}
-	else if (!gLastHitPosGlobal.isExactlyZero())
+	else if ( mHoverPick.mPickType == LLPickInfo::PICK_LAND )
 	{
-		handle_go_to(NULL);
+		// 
+		//  Do not show hover for land unless prefs are set to allow it.
+		// 
+		
+		if (!gSavedSettings.getBOOL("ShowLandHoverTip")) return TRUE; 
+
+		// Didn't hit an object, but since we have a land point we
+		// must be hovering over land.
+
+		LLParcel* hover_parcel = LLViewerParcelMgr::getInstance()->getHoverParcel();
+		LLUUID owner;
+		S32 width = 0;
+		S32 height = 0;
+
+		if ( hover_parcel )
+		{
+			owner = hover_parcel->getOwnerID();
+			width = S32(LLViewerParcelMgr::getInstance()->getHoverParcelWidth());
+			height = S32(LLViewerParcelMgr::getInstance()->getHoverParcelHeight());
+		}
+
+		// Line: "Land"
+		line.clear();
+		line.append(LLTrans::getString("TooltipLand"));
+		if (hover_parcel)
+		{
+			line.append(hover_parcel->getName());
+		}
+		tooltip_msg.append(line);
+		tooltip_msg.push_back('\n');
+
+		// Line: "Owner: James Linden"
+		line.clear();
+		line.append(LLTrans::getString("TooltipOwner") + " ");
+
+		if ( hover_parcel )
+		{
+			std::string name;
+			if (LLUUID::null == owner)
+			{
+				line.append(LLTrans::getString("TooltipPublic"));
+			}
+			else if (hover_parcel->getIsGroupOwned())
+			{
+				if (gCacheName->getGroupName(owner, name))
+				{
+					line.append(name);
+					line.append(LLTrans::getString("TooltipIsGroup"));
+				}
+				else
+				{
+					line.append(LLTrans::getString("RetrievingData"));
+				}
+			}
+			else if(gCacheName->getFullName(owner, name))
+			{
+				line.append(name);
+			}
+			else
+			{
+				line.append(LLTrans::getString("RetrievingData"));
+			}
+		}
+		else
+		{
+			line.append(LLTrans::getString("RetrievingData"));
+		}
+		tooltip_msg.append(line);
+		tooltip_msg.push_back('\n');
+
+		// Line: "no fly, not safe, no build"
+
+		// Don't display properties for your land.  This is just
+		// confusing, because you can do anything on your own land.
+		if ( hover_parcel && owner != gAgent.getID() )
+		{
+			S32 words = 0;
+			
+			line.clear();
+			// JC - Keep this in the same order as the checkboxes
+			// on the land info panel
+			if ( !hover_parcel->getAllowModify() )
+			{
+				if ( hover_parcel->getAllowGroupModify() )
+				{
+					line.append(LLTrans::getString("TooltipFlagGroupBuild"));
+				}
+				else
+				{
+					line.append(LLTrans::getString("TooltipFlagNoBuild"));
+				}
+				words++;
+			}
+
+			if ( !hover_parcel->getAllowTerraform() )
+			{
+				if (words) line.append(", ");
+				line.append(LLTrans::getString("TooltipFlagNoEdit"));
+				words++;
+			}
+
+			if ( hover_parcel->getAllowDamage() )
+			{
+				if (words) line.append(", ");
+				line.append(LLTrans::getString("TooltipFlagNotSafe"));
+				words++;
+			}
+
+			// Maybe we should reflect the estate's block fly bit here as well?  DK 12/1/04
+			if ( !hover_parcel->getAllowFly() )
+			{
+				if (words) line.append(", ");
+				line.append(LLTrans::getString("TooltipFlagNoFly"));
+				words++;
+			}
+
+			if ( !hover_parcel->getAllowOtherScripts() )
+			{
+				if (words) line.append(", ");
+				if ( hover_parcel->getAllowGroupScripts() )
+				{
+					line.append(LLTrans::getString("TooltipFlagGroupScripts"));
+				}
+				else
+				{
+					line.append(LLTrans::getString("TooltipFlagNoScripts"));
+				}
+				
+				words++;
+			}
+
+			if (words) 
+			{
+				tooltip_msg.append(line);
+				tooltip_msg.push_back('\n');
+			}
+		}
+
+		if (hover_parcel && hover_parcel->getParcelFlag(PF_FOR_SALE))
+		{
+			LLStringUtil::format_map_t args;
+			args["[AMOUNT]"] = llformat("%d", hover_parcel->getSalePrice());
+			line = LLTrans::getString("TooltipForSaleL$", args);
+			tooltip_msg.append(line);
+			tooltip_msg.push_back('\n');
+		}
+		LLToolTipMgr::instance().show(tooltip_msg);
 	}
 
+
 	return TRUE;
-	*/
 }
 
+// static
+void LLToolPie::showAvatarInspector(const LLUUID& avatar_id)
+{
+	LLSD params;
+	params["avatar_id"] = avatar_id;
+	if (LLToolTipMgr::instance().toolTipVisible())
+	{
+		LLRect rect = LLToolTipMgr::instance().getToolTipRect();
+		params["pos"]["x"] = rect.mLeft;
+		params["pos"]["y"] = rect.mTop;
+	}
+
+	LLFloaterReg::showInstance("inspect_avatar", params);
+}
 
 void LLToolPie::handleDeselect()
 {
@@ -627,6 +1009,7 @@ void LLToolPie::handleDeselect()
 		setMouseCapture( FALSE );  // Calls onMouseCaptureLost() indirectly
 	}
 	// remove temporary selection for pie menu
+	LLSelectMgr::getInstance()->setHoverObject(NULL);
 	LLSelectMgr::getInstance()->validateSelection();
 }
 
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index a55e43528246b29f80662f4629224846021a961c..be6e539ffd506f64c60bc7945c03cb5eec764930 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -52,6 +52,7 @@ class LLToolPie : public LLTool, public LLSingleton<LLToolPie>
 	virtual BOOL		handleHover(S32 x, S32 y, MASK mask);
 	virtual BOOL		handleDoubleClick(S32 x, S32 y, MASK mask);
 	virtual BOOL		handleScrollWheel(S32 x, S32 y, S32 clicks);
+	virtual BOOL		handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen);
 
 	virtual void		render();
 
@@ -72,6 +73,7 @@ class LLToolPie : public LLTool, public LLSingleton<LLToolPie>
 
 	static void			selectionPropertiesReceived();
 
+	static void			showAvatarInspector(const LLUUID& id);
 
 private:
 	BOOL outsideSlop		(S32 x, S32 y, S32 start_x, S32 start_y);
@@ -84,6 +86,7 @@ class LLToolPie : public LLTool, public LLSingleton<LLToolPie>
 	BOOL				mGrabMouseButtonDown;
 	BOOL				mMouseOutsideSlop;				// for this drag, has mouse moved outside slop region
 	LLPickInfo			mPick;
+	LLPickInfo			mHoverPick;
 	LLPointer<LLViewerObject> mClickActionObject;
 	U8					mClickAction;
 	LLSafeHandle<LLObjectSelection> mLeftClickSelection;
diff --git a/indra/newview/lltoolpipette.cpp b/indra/newview/lltoolpipette.cpp
index 878ed0f9a96b308bcb6631a3eb648193a6d6d67b..9a92f2ae3fbe5c67c0388b789dcb0de8a8819ded 100644
--- a/indra/newview/lltoolpipette.cpp
+++ b/indra/newview/lltoolpipette.cpp
@@ -40,6 +40,7 @@
 #include "lltoolpipette.h" 
 
 // Library includes
+#include "lltooltip.h"
 
 // Viewer includes
 #include "llviewerobjectlist.h"
@@ -92,15 +93,19 @@ BOOL LLToolPipette::handleHover(S32 x, S32 y, MASK mask)
 	return FALSE;
 }
 
-BOOL LLToolPipette::handleToolTip(S32 x, S32 y, std::string& msg, LLRect *sticky_rect_screen)
+BOOL LLToolPipette::handleToolTip(S32 x, S32 y, std::string& msg, LLRect &sticky_rect_screen)
 {
 	if (mTooltipMsg.empty())
 	{
 		return FALSE;
 	}
-	// keep tooltip message up when mouse in this part of screen
-	sticky_rect_screen->setCenterAndSize(x, y, 20, 20);
-	msg = mTooltipMsg;
+
+	LLRect sticky_rect;
+	sticky_rect.setCenterAndSize(x, y, 20, 20);
+	LLToolTipMgr::instance().show(LLToolTipParams()
+		.message(mTooltipMsg)
+		.sticky_rect(sticky_rect));
+
 	return TRUE;
 }
 
diff --git a/indra/newview/lltoolpipette.h b/indra/newview/lltoolpipette.h
index 3b6ebec67e97f95b70428de5f229044e86dab848..cce5b6ce543e536779c42830a7c43ced19503f51 100644
--- a/indra/newview/lltoolpipette.h
+++ b/indra/newview/lltoolpipette.h
@@ -56,7 +56,7 @@ class LLToolPipette
 	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleHover(S32 x, S32 y, MASK mask);
-	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect *sticky_rect_screen);
+	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen);
 
 	// Note: Don't return connection; use boost::bind + boost::signals2::trackable to disconnect slots
 	typedef boost::signals2::signal<void (const LLTextureEntry& te)> signal_t;
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 8e65c7e65e930a6f9e8e287dd7e641c698e87843..6d2482d3f0f39ef6c98607ce285a429cdcb70167 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -1260,10 +1260,6 @@ void render_ui_2d()
 		stop_glerror();
 	}
 	gViewerWindow->draw();
-	if (gDebugSelect)
-	{
-		gViewerWindow->drawPickBuffer();
-	}
 
 	// reset current origin for font rendering, in case of tiling render
 	LLFontGL::sCurOrigin.set(0, 0);
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index c8f2e039039766bb60b85014cabe974f94ed09bc..1fc387027ded946a636d394cf6c2db7d4c5f02ba 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -95,6 +95,7 @@
 #include "llfloatersettingsdebug.h"
 #include "llfloatersnapshot.h"
 #include "llfloatertelehub.h"
+#include "llfloatertestinspectors.h"
 #include "llfloatertestlistview.h"
 #include "llfloatertools.h"
 #include "llfloatertos.h"
@@ -207,6 +208,8 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("properties", "floater_inventory_item_properties.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterProperties>);
 
 	LLFloaterReg::add("telehubs", "floater_telehub.xml",&LLFloaterReg::build<LLFloaterTelehub>);
+	LLFloaterReg::add("test_inspectors", "floater_test_inspectors.xml",
+		&LLFloaterReg::build<LLFloaterTestInspectors>);
 	LLFloaterReg::add("test_list_view", "floater_test_list_view.xml",&LLFloaterReg::build<LLFloaterTestListView>);
 	LLFloaterReg::add("test_widgets", "floater_test_widgets.xml", &LLFloaterReg::build<LLFloater>);
 	LLFloaterReg::add("top_objects", "floater_top_objects.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTopObjects>);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index a06d913fd692568c1a3b10cdb14f884d7fb8901a..f033d66c1f20772582e86e63032b0abf09b7d21e 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -34,18 +34,17 @@
 
 #include "llviewermedia.h"
 #include "llviewermediafocus.h"
-#include "llhoverview.h"
 #include "llmimetypes.h"
 #include "llviewercontrol.h"
 #include "llviewertexture.h"
 #include "llviewerparcelmedia.h"
 #include "llviewerparcelmgr.h"
-#include "llviewerwindow.h"
 #include "llversionviewer.h"
 #include "llviewertexturelist.h"
 #include "llpluginclassmedia.h"
 
 #include "llevent.h"		// LLSimpleListener
+#include "llnotifications.h"
 #include "lluuid.h"
 
 #include <boost/bind.hpp>	// for SkinFolder listener
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 68a49662e7d41b34257184157fec44f31906ec45..9a613943830661a85204b63018846d48c81e4277 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -180,10 +180,11 @@ class LLViewerMediaImpl
 	/*virtual*/ BOOL	handleDoubleClick(S32 x, S32 y, MASK mask) { return FALSE; };
 	/*virtual*/ BOOL	handleRightMouseDown(S32 x, S32 y, MASK mask) { return FALSE; };
 	/*virtual*/ BOOL	handleRightMouseUp(S32 x, S32 y, MASK mask) { return FALSE; };
-	/*virtual*/ BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen) { return FALSE; };
+	/*virtual*/ BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen) { return FALSE; };
 	/*virtual*/ BOOL	handleMiddleMouseDown(S32 x, S32 y, MASK mask) { return FALSE; };
 	/*virtual*/ BOOL	handleMiddleMouseUp(S32 x, S32 y, MASK mask) {return FALSE; };
 	/*virtual*/ const std::string& getName() const { return LLStringUtil::null; };
+
 	/*virtual*/ BOOL isView() const { return FALSE; };
 	/*virtual*/ void	screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const {};
 	/*virtual*/ void	localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const {};
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 5536951ce6525777e86e26dc9bcaed13f85b89cb..338bb7ad7c4c04fba1b7b7922d366ee48fb9befc 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -134,7 +134,7 @@
 #include "llmemoryview.h"
 #include "llgivemoney.h"
 #include "llgroupmgr.h"
-#include "llhoverview.h"
+#include "lltooltip.h"
 #include "llhudeffecttrail.h"
 #include "llhudmanager.h"
 #include "llimage.h"
@@ -582,6 +582,8 @@ void init_menus()
 	gLoginMenuBarView->setBackgroundColor( color );
 	gMenuHolder->addChild(gLoginMenuBarView);
 	
+	// tooltips are on top of EVERYTHING, including menus
+	gViewerWindow->getRootView()->sendChildToFront(gToolTipView);
 }
 
 ///////////////////
@@ -1517,14 +1519,6 @@ class LLAdvancedSendTestIms : public view_listener_t
 }
 };
 
-class LLAdvancedAvatarInspector : public view_listener_t
-{
-	bool handleEvent(const LLSD& avatar_id)
-	{
-		LLFloaterReg::showInstance("inspect_avatar", avatar_id);
-		return true;
-	}
-};
 
 ///////////////
 // XUI NAMES //
@@ -2905,7 +2899,7 @@ class LLObjectMute : public view_listener_t
 
 bool handle_go_to()
 {
-	// JAMESDEBUG try simulator autopilot
+	// try simulator autopilot
 	std::vector<std::string> strings;
 	std::string val;
 	LLVector3d pos = LLToolPie::getInstance()->getPick().mPosGlobal;
@@ -6729,15 +6723,12 @@ BOOL enable_god_basic(void*)
 
 void toggle_show_xui_names(void *)
 {
-	BOOL showXUINames = gSavedSettings.getBOOL("ShowXUINames");
-	
-	showXUINames = !showXUINames;
-	gSavedSettings.setBOOL("ShowXUINames", showXUINames);
+	gSavedSettings.setBOOL("DebugShowXUINames", !gSavedSettings.getBOOL("DebugShowXUINames"));
 }
 
 BOOL check_show_xui_names(void *)
 {
-	return gSavedSettings.getBOOL("ShowXUINames");
+	return gSavedSettings.getBOOL("DebugShowXUINames");
 }
 
 class LLToolsSelectOnlyMyObjects : public view_listener_t
@@ -7157,7 +7148,7 @@ class LLViewShowHoverTips : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
-		LLHoverView::sShowHoverTips = !LLHoverView::sShowHoverTips;
+		gSavedSettings.setBOOL("ShowHoverTips", !gSavedSettings.getBOOL("ShowHoverTips"));
 		return true;
 	}
 };
@@ -7166,7 +7157,7 @@ class LLViewCheckShowHoverTips : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
-		bool new_value = LLHoverView::sShowHoverTips;
+		bool new_value = gSavedSettings.getBOOL("ShowHoverTips");
 		return new_value;
 	}
 };
@@ -7852,7 +7843,6 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLAdvancedToggleXUINames(), "Advanced.ToggleXUINames");
 	view_listener_t::addMenu(new LLAdvancedCheckXUINames(), "Advanced.CheckXUINames");
 	view_listener_t::addMenu(new LLAdvancedSendTestIms(), "Advanced.SendTestIMs");
-	view_listener_t::addMenu(new LLAdvancedAvatarInspector(), "Advanced.AvatarInspector");
 
 	// Advanced > Character > Grab Baked Texture
 	view_listener_t::addMenu(new LLAdvancedGrabBakedTexture(), "Advanced.GrabBakedTexture");
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 1594a68f36907da12514bdd8d0de9bc11c70ec02..cf77f7e2b6160349dd15cf8b16486ea7e998fbf9 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -582,9 +582,9 @@ void LLViewerObject::removeChild(LLViewerObject *childp)
 	}
 }
 
-void LLViewerObject::addThisAndAllChildren(LLDynamicArray<LLViewerObject*>& objects)
+void LLViewerObject::addThisAndAllChildren(std::vector<LLViewerObject*>& objects)
 {
-	objects.put(this);
+	objects.push_back(this);
 	for (child_list_t::iterator iter = mChildList.begin();
 		 iter != mChildList.end(); iter++)
 	{
@@ -596,9 +596,9 @@ void LLViewerObject::addThisAndAllChildren(LLDynamicArray<LLViewerObject*>& obje
 	}
 }
 
-void LLViewerObject::addThisAndNonJointChildren(LLDynamicArray<LLViewerObject*>& objects)
+void LLViewerObject::addThisAndNonJointChildren(std::vector<LLViewerObject*>& objects)
 {
-	objects.put(this);
+	objects.push_back(this);
 	// don't add any attachments when temporarily selecting avatar
 	if (isAvatar())
 	{
@@ -3475,7 +3475,7 @@ void LLViewerObject::setMediaType(U8 media_type)
 {
 	if (!mMedia)
 	{
-		// JAMESDEBUG TODO what if we don't have a media pointer?
+		// TODO what if we don't have a media pointer?
 	}
 	else if (mMedia->mMediaType != media_type)
 	{
@@ -3677,7 +3677,7 @@ void LLViewerObject::sendTEUpdate() const
 		msg->addString("MediaURL", NULL);
 	}
 
-	// JAMESDEBUG TODO send media type
+	// TODO send media type
 
 	packTEMessage(msg);
 
@@ -3688,7 +3688,7 @@ void LLViewerObject::sendTEUpdate() const
 void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)
 {
 	LLPrimitive::setTE(te, texture_entry);
-// JAMESDEBUG This doesn't work, don't get any textures.
+//  This doesn't work, don't get any textures.
 //	if (mDrawable.notNull() && mDrawable->isVisible())
 //	{
 		const LLUUID& image_id = getTE(te)->getID();
@@ -3865,7 +3865,7 @@ S32 LLViewerObject::setTEFullbright(const U8 te, const U8 fullbright)
 
 S32 LLViewerObject::setTEMediaFlags(const U8 te, const U8 media_flags)
 {
-	// JAMESDEBUG this might need work for media type
+	// this might need work for media type
 	S32 retval = 0;
 	const LLTextureEntry *tep = getTE(te);
 	if (!tep)
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index cda2c5114f0afac0f00ec9ecd6640a195cf2c81f..836e05728fea4b36e631fcc13c118a21da89160b 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -242,8 +242,8 @@ class LLViewerObject : public LLPrimitive, public LLRefCount
 	virtual void removeChild(LLViewerObject *childp);
 	const_child_list_t& getChildren() const { 	return mChildList; }
 	S32 numChildren() const { return mChildList.size(); }
-	void addThisAndAllChildren(LLDynamicArray<LLViewerObject*>& objects);
-	void addThisAndNonJointChildren(LLDynamicArray<LLViewerObject*>& objects);
+	void addThisAndAllChildren(std::vector<LLViewerObject*>& objects);
+	void addThisAndNonJointChildren(std::vector<LLViewerObject*>& objects);
 	BOOL isChild(LLViewerObject *childp) const;
 	BOOL isSeat() const;
 	
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index a8232e9a9df8a5d011719f75e56923038481164f..acdc2c2513f1c7c5e6cd6ead431117d30dd09baa 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -49,7 +49,7 @@
 #include "llagent.h"
 #include "pipeline.h"
 #include "llspatialpartition.h"
-#include "llhoverview.h"
+#include "lltooltip.h"
 #include "llworld.h"
 #include "llstring.h"
 #include "llhudtext.h"
@@ -574,10 +574,14 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)
 		// Slam priorities for textures that we care about (hovered, selected, and focused)
 		// Hovered
 		// Assumes only one level deep of parenting
-		objectp = gHoverView->getLastHoverObject();
-		if (objectp)
+		LLSelectNode* nodep = LLSelectMgr::instance().getHoverNode();
+		if (nodep)
 		{
-			objectp->boostTexturePriority();
+			objectp = nodep->getObject();
+			if (objectp)
+			{
+				objectp->boostTexturePriority();
+			}
 		}
 	}
 
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index cb233085e5f4ffffa1b3fedefb8ef615090cefde..86d51bfd4b99488b21704992dfc186638d06da3d 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -43,7 +43,7 @@
 #include "message.h"
 #include "llviewermediafocus.h"
 #include "llviewerparcelmediaautoplay.h"
-#include "llviewerwindow.h"
+#include "llnotifications.h"
 #include "llfirstuse.h"
 #include "llpluginclassmedia.h"
 
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index ca3061e083bdecbdcff1fc1b50582077be92b8e4..c5b09403cb7df6c40889e87d8bd1ddb08b36fe2d 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1283,9 +1283,11 @@ void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_ag
 }
 
 
-void LLViewerParcelMgr::requestHoverParcelProperties(const LLVector3d& pos)
+void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos)
 {
-	LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( pos );
+	//FIXME: only request parcel info when tooltip is shown
+	return;
+	/*LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( pos );
 	if (!region)
 	{
 		return;
@@ -1317,7 +1319,7 @@ void LLViewerParcelMgr::requestHoverParcelProperties(const LLVector3d& pos)
 	msg->addBOOL("SnapSelection",			FALSE );
 	msg->sendReliable( region->getHost() );
 
-	mHoverRequestResult = PARCEL_RESULT_NO_DATA;
+	mHoverRequestResult = PARCEL_RESULT_NO_DATA;*/
 }
 
 
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 7373366cd7a26c8789e6bdc6d8ec836bc517961e..275c79fd3b7c801121df5125ebd8af56612ff691 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -217,7 +217,7 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
 	void	sendParcelDwellRequest();
 
 	// If the point is outside the current hover parcel, request more data
-	void	requestHoverParcelProperties(const LLVector3d& pos_global);
+	void	setHoverParcel(const LLVector3d& pos_global);
 
 	bool	canAgentBuyParcel(LLParcel*, bool forGroup) const;
 	
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 5bb0c9a120ad957b3b5874384742f49d4c26ded1..ceb2698223a67d12aa79cf4c6941b69178b0c095 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -658,45 +658,6 @@ void LLViewerTextEditor::makePristine()
 	LLTextEditor::makePristine();
 }
 
-///////////////////////////////////////////////////////////////////
-
-BOOL LLViewerTextEditor::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen)
-{
-	for (child_list_const_iter_t child_iter = getChildList()->begin();
-			child_iter != getChildList()->end(); ++child_iter)
-	{
-		LLView *viewp = *child_iter;
-		S32 local_x = x - viewp->getRect().mLeft;
-		S32 local_y = y - viewp->getRect().mBottom;
-		if( viewp->pointInView(local_x, local_y) 
-			&& viewp->getVisible() 
-			&& viewp->getEnabled()
-			&& viewp->handleToolTip(local_x, local_y, msg, sticky_rect_screen ) )
-		{
-			return TRUE;
-		}
-	}
-
-	if( mSegments.empty() )
-	{
-		return TRUE;
-	}
-
-	const LLTextSegment* cur_segment = getSegmentAtLocalPos( x, y );
-	if( cur_segment && cur_segment->getToolTip( msg ) )
-	{
-		// Just use a slop area around the cursor
-		// Convert rect local to screen coordinates
-		S32 SLOP = 8;
-		localPointToScreen( 
-			x - SLOP, y - SLOP, 
-			&(sticky_rect_screen->mLeft), &(sticky_rect_screen->mBottom) );
-		sticky_rect_screen->mRight = sticky_rect_screen->mLeft + 2 * SLOP;
-		sticky_rect_screen->mTop = sticky_rect_screen->mBottom + 2 * SLOP;
-	}
-	return TRUE;
-}
-
 BOOL LLViewerTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	BOOL	handled = FALSE;
diff --git a/indra/newview/llviewertexteditor.h b/indra/newview/llviewertexteditor.h
index 2dfea4a5893d076a0ff521bbbe94887809c25754..100fa343af0df0f038a38571801c71ce85e3df03 100644
--- a/indra/newview/llviewertexteditor.h
+++ b/indra/newview/llviewertexteditor.h
@@ -68,7 +68,6 @@ class LLViewerTextEditor : public LLTextEditor
 	virtual BOOL	handleHover(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleDoubleClick(S32 x, S32 y, MASK mask );
 
-	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect);
 	virtual BOOL	handleDragAndDrop(S32 x, S32 y, MASK mask,
 										BOOL drop, EDragAndDropType cargo_type, 
 										void *cargo_data, EAcceptance *accept, std::string& tooltip_msg);
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 6ea1522b47e79fc14b56037d60a6810b191772c9..ec82f62a8b4fdbe146be9d7139dd3d51c2184a9d 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1810,7 +1810,7 @@ void LLViewerLODTexture::processTextureStats()
 		// data than we need to.
 		/*if (mBoostLevel == LLViewerTexture::BOOST_UI ||
 			mBoostLevel == LLViewerTexture::BOOST_PREVIEW ||
-			mBoostLevel == LLViewerTexture::BOOST_AVATAR_SELF)	// JAMESDEBUG what about AVATAR_BAKED_SELF?
+			mBoostLevel == LLViewerTexture::BOOST_AVATAR_SELF)	// what about AVATAR_BAKED_SELF?
 		{
 			discard_level = 0; // full res
 		}
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 241c6fd51152df77b622d916cb065ea4db32c653..a088006c53c337acc39674e8a37a66788212d1e7 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -74,6 +74,7 @@
 #include "lltimer.h"
 #include "timing.h"
 #include "llviewermenu.h"
+#include "lltooltip.h"
 
 // newview includes
 #include "llagent.h"
@@ -111,7 +112,7 @@
 #include "llfontfreetype.h"
 #include "llgesturemgr.h"
 #include "llglheaders.h"
-#include "llhoverview.h"
+#include "lltooltip.h"
 #include "llhudmanager.h"
 #include "llhudview.h"
 #include "llimagebmp.h"
@@ -208,22 +209,14 @@ extern BOOL gDebugClicks;
 extern BOOL gDisplaySwapBuffers;
 extern BOOL gDepthDirty;
 extern BOOL gResizeScreenTexture;
-extern S32 gJamesInt;
 
 LLViewerWindow	*gViewerWindow = NULL;
 
-
-BOOL			gDebugSelect = FALSE;
-
-LLFrameTimer	gMouseIdleTimer;
 LLFrameTimer	gAwayTimer;
 LLFrameTimer	gAwayTriggerTimer;
-LLFrameTimer	gAlphaFadeTimer;
 
 BOOL			gShowOverlayTitle = FALSE;
-BOOL			gPickTransparent = TRUE;
 
-BOOL			gDebugFastUIRender = FALSE;
 LLViewerObject*  gDebugRaycastObject = NULL;
 LLVector3       gDebugRaycastIntersection;
 LLVector2       gDebugRaycastTexCoord;
@@ -234,7 +227,6 @@ S32				gDebugRaycastFaceHit;
 // HUD display lines in lower right
 BOOL				gDisplayWindInfo = FALSE;
 BOOL				gDisplayCameraPos = FALSE;
-BOOL				gDisplayNearestWater = FALSE;
 BOOL				gDisplayFOV = FALSE;
 
 S32 CHAT_BAR_HEIGHT = 28; 
@@ -599,21 +591,6 @@ void LLViewerWindow::updateDebugText()
 // LLViewerWindow
 //
 
-bool LLViewerWindow::shouldShowToolTipFor(LLMouseHandler *mh)
-{
-	if (mToolTip && mh)
-	{
-		LLMouseHandler::EShowToolTip showlevel = mh->getShowToolTip();
-
-		bool tool_tip_allowed = (showlevel == LLMouseHandler::SHOW_ALWAYS 
-								|| (showlevel == LLMouseHandler::SHOW_IF_NOT_BLOCKED 
-									&& !mToolTipBlocked));
-
-		return tool_tip_allowed;
-	}
-	return false;
-}
-
 BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window,  LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down)
 {
 	std::string buttonname;
@@ -673,16 +650,7 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window,  LLCoordGL pos, MASK
 		mWindow->releaseMouse();
 
 	// Indicate mouse was active
-	gMouseIdleTimer.reset();
-
-	// Hide tooltips on mousedown
-	mToolTipBlocked = down;
-
-	// Also hide hover info on mousedown/mouseup
-	if (gHoverView)
-	{
-		gHoverView->cancelHover();
-	}
+	LLUI::resetMouseIdleTimer();
 
 	// Don't let the user move the mouse out of the window until mouse up.
 	if( LLToolMgr::getInstance()->getCurrentTool()->clipMouseWhenDown() )
@@ -749,10 +717,6 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window,  LLCoordGL pos, MASK
 	
 		if(LLToolMgr::getInstance()->getCurrentTool()->handleAnyMouseClick( x, y, mask, clicktype, down ) )
 		{
-			// This is necessary to force clicks in the world to cause edit
-			// boxes that might have keyboard focus to relinquish it, and hence
-			// cause a commit to update their value.  JC
-			gFocusMgr.setKeyboardFocus(NULL);
 			return TRUE;
 		}
 	}
@@ -870,13 +834,10 @@ void LLViewerWindow::handleMouseMove(LLWindow *window,  LLCoordGL pos, MASK mask
 
 	// Save mouse point for access during idle() and display()
 
-	LLCoordGL prev_saved_mouse_point = mCurrentMousePoint;
 	LLCoordGL mouse_point(x, y);
 	saveLastMouse(mouse_point);
-	BOOL mouse_actually_moved = !gFocusMgr.getMouseCapture() &&  // mouse is not currenty captured
-			((prev_saved_mouse_point.mX != mCurrentMousePoint.mX) || (prev_saved_mouse_point.mY != mCurrentMousePoint.mY)); // mouse moved from last recorded position
 
-	gMouseIdleTimer.reset();
+	LLUI::resetMouseIdleTimer();
 
 	mWindow->showCursorFromMouseMove();
 
@@ -884,17 +845,6 @@ void LLViewerWindow::handleMouseMove(LLWindow *window,  LLCoordGL pos, MASK mask
 	{
 		gAgent.clearAFK();
 	}
-
-	if(mouse_actually_moved)
-	{
-		mToolTipBlocked = FALSE;
-	}
-
-	// Activate the hover picker on mouse move.
-	if (gHoverView)
-	{
-		gHoverView->setTyping(FALSE);
-	}
 }
 
 void LLViewerWindow::handleMouseLeave(LLWindow *window)
@@ -902,10 +852,6 @@ void LLViewerWindow::handleMouseLeave(LLWindow *window)
 	// Note: we won't get this if we have captured the mouse.
 	llassert( gFocusMgr.getMouseCapture() == NULL );
 	mMouseInWindow = FALSE;
-	if (mToolTip)
-	{
-		mToolTip->setVisible( FALSE );
-	}
 }
 
 BOOL LLViewerWindow::handleCloseRequest(LLWindow *window)
@@ -1245,16 +1191,12 @@ LLViewerWindow::LLViewerWindow(
 	mLeftMouseDown(FALSE),
 	mMiddleMouseDown(FALSE),
 	mRightMouseDown(FALSE),
-	mToolTip(NULL),
-	mToolTipBlocked(FALSE),
 	mMouseInWindow( FALSE ),
 	mLastMask( MASK_NONE ),
 	mToolStored( NULL ),
-	mSuppressToolbox( FALSE ),
 	mHideCursorPermanent( FALSE ),
 	mCursorHidden(FALSE),
 	mIgnoreActivate( FALSE ),
-	mHoverPick(),
 	mResDirty(false),
 	mStatesDirty(false),
 	mIsFullscreenChecked(false),
@@ -1479,7 +1421,7 @@ void LLViewerWindow::initBase()
 	cp.font_size_index(gSavedSettings.getS32("ChatFontSize"));
 	cp.follows.flags(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_BOTTOM);
 	gConsole = LLUICtrlFactory::create<LLConsole>(cp);
-	mRootView->addChild(gConsole);
+	getRootView()->addChild(gConsole);
 
 	// optionally forward warnings to chat console/chat floater
 	// for qa runs and dev builds
@@ -1499,11 +1441,11 @@ void LLViewerWindow::initBase()
 	debug_p.follows.flags(FOLLOWS_ALL);
 	debug_p.visible(true);
 	gDebugView = LLUICtrlFactory::create<LLDebugView>(debug_p);
-	mRootView->addChild(gDebugView);
+	getRootView()->addChild(gDebugView);
 
 	// Add floater view at the end so it will be on top, and give it tab priority over others
-	mRootView->addChild(gFloaterView, -1);
-	mRootView->addChild(gSnapshotFloaterView);
+	getRootView()->addChild(gFloaterView, -1);
+	getRootView()->addChild(gSnapshotFloaterView);
 
 	// notify above floaters!
 	LLRect notify_rect = floater_view_rect;
@@ -1513,28 +1455,18 @@ void LLViewerWindow::initBase()
 	p.mouse_opaque(false);
 	p.follows.flags(FOLLOWS_ALL);
 	gNotifyBoxView = LLUICtrlFactory::create<LLNotifyBoxView> (p);
-	mRootView->addChild(gNotifyBoxView, -2);
-
-	// Tooltips go above floaters
-	LLTextBox::Params params;
-	params.text("tool tip");
-	params.name(params.text);
-	params.rect(LLRect (0, 1, 1, 0));
-	params.h_pad(4);
-	params.v_pad(2);
-	params.text_color(LLUIColorTable::instance().getColor( "ToolTipTextColor" ));
-	params.border_color(LLUIColorTable::instance().getColor( "ToolTipBorderColor" ));
-	params.border_visible(false);
-	params.background_color(LLUIColorTable::instance().getColor( "ToolTipBgColor" ));
-	params.bg_visible(true);
-	params.font.style("NORMAL");
-	params.border_drop_shadow_visible(true);
-	params.visible(false);
-	mToolTip = LLUICtrlFactory::create<LLTextBox> (params);
+	getRootView()->addChild(gNotifyBoxView, -2);
+
+	// View for tooltips
+	LLToolTipView::Params hvp;
+	hvp.name("tooltip view");
+	hvp.rect(full_window);
+	gToolTipView = LLUICtrlFactory::create<LLToolTipView>(hvp);
+	getRootView()->addChild(gToolTipView);
 
 	// Add the progress bar view (startup view), which overrides everything
 	mProgressView = new LLProgressView(full_window);
-	mRootView->addChild(mProgressView);
+	getRootView()->addChild(mProgressView);
 	setShowProgress(FALSE);
 	setProgressCancelButtonVisible(FALSE);
 }
@@ -1560,13 +1492,6 @@ void LLViewerWindow::initWorldUI()
 	LLBottomTray::getInstance()->reshape(rc.getWidth(),rc.getHeight(),FALSE);
 	LLBottomTray::getInstance()->setRect(rc);
 
-	// View for hover information
-	LLHoverView::Params hvp;
-	hvp.name("gHoverview");
-	hvp.rect(full_window);
-	gHoverView = LLUICtrlFactory::create<LLHoverView>(hvp);
-	mRootView->addChild(gHoverView);
-
 	// Pre initialize instance communicate instance;
 	//  currently needs to happen before initializing chat or IM
 	LLFloaterReg::getInstance("communicate");
@@ -1584,7 +1509,7 @@ void LLViewerWindow::initWorldUI()
 	mvp.rect(morph_view_rect);
 	mvp.visible(false);
 	gMorphView = LLUICtrlFactory::create<LLMorphView>(mvp);
-	mRootView->addChild(gMorphView);
+	getRootView()->addChild(gMorphView);
 
 	// Make space for nav bar.
 	LLRect floater_view_rect = gFloaterView->getRect();
@@ -1674,6 +1599,9 @@ void LLViewerWindow::initWorldUI()
 
 	// this allows not to see UI elements created while UI initializing after Alt+Tab was pressed during login. EXT-744.
 	moveProgressViewToFront();
+
+	// tooltips are always on top
+	getRootView()->sendChildToFront(gToolTipView);
 }
 
 // Destroy the UI
@@ -1691,10 +1619,6 @@ void LLViewerWindow::shutdownViews()
 		gMorphView->setVisible(FALSE);
 	}
 	
-	// Delete Tool Tip
-	delete mToolTip;
-	mToolTip = NULL;
-	
 	// Delete all child views.
 	delete mRootView;
 	mRootView = NULL;
@@ -1702,7 +1626,7 @@ void LLViewerWindow::shutdownViews()
 	// Automatically deleted as children of mRootView.  Fix the globals.
 	gStatusBar = NULL;
 	gIMMgr = NULL;
-	gHoverView = NULL;
+	gToolTipView = NULL;
 
 	gFloaterView = NULL;
 	gMorphView = NULL;
@@ -1775,12 +1699,6 @@ void LLViewerWindow::showCursor()
 
 void LLViewerWindow::hideCursor()
 {
-	// Hide tooltips
-	if(mToolTip ) mToolTip->setVisible( FALSE );
-
-	// Also hide hover info
-	if (gHoverView)	gHoverView->cancelHover();
-
 	// And hide the cursor
 	mWindow->hideCursor();
 
@@ -2035,9 +1953,9 @@ void LLViewerWindow::draw()
 		// No translation needed, this view is glued to 0,0
 		mRootView->draw();
 
-		if (mToolTip->getVisible() && LLView::sDebugRects)
+		if (LLView::sDebugRects)
 		{
-			gl_rect_2d(mToolTipStickyRect, LLColor4::white, false);
+			gToolTipView->drawStickyRect();
 		}
 
 		// Draw optional on-top-of-everyone view
@@ -2054,31 +1972,6 @@ void LLViewerWindow::draw()
 			LLUI::popMatrix();
 		}
 
-		// Draw tooltips
-		// Adjust their rectangle so they don't go off the top or bottom
-		// of the screen.
-		if( mToolTip && mToolTip->getVisible() )
-		{
-			glMatrixMode(GL_MODELVIEW);
-			LLUI::pushMatrix();
-			{
-				S32 tip_height = mToolTip->getRect().getHeight();
-
-				S32 screen_x, screen_y;
-				mToolTip->localPointToScreen(0, -24 - tip_height, 
-											 &screen_x, &screen_y);
-
-				// If tooltip would draw off the bottom of the screen,
-				// show it from the cursor tip position.
-				if (screen_y < tip_height) 
-				{
-					mToolTip->localPointToScreen(0, 0, &screen_x, &screen_y);
-				}
-				LLUI::translate( (F32) screen_x, (F32) screen_y, 0);
-				mToolTip->draw();
-			}
-			LLUI::popMatrix();
-		}
 
 		if( gShowOverlayTitle && !mOverlayTitle.empty() )
 		{
@@ -2120,26 +2013,9 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
 		}
 	}
 
-	//// HACK look for UI editing keys
-	//if (LLView::sEditingUI)
-	//{
-	//	if (LLFloaterEditUI::processKeystroke(key, mask))
-	//	{
-	//		return TRUE;
-	//	}
-	//}
-
-	// Hide tooltips on keypress
-	mToolTipBlocked = TRUE; // block until next time mouse is moved
-
-	// Also hide hover info on keypress
-	if (gHoverView)
-	{
-		gHoverView->cancelHover();
-
-		gHoverView->setTyping(TRUE);
-	}
-
+	// hide tooltips on keypress
+	LLToolTipMgr::instance().hideToolTips();
+	
 	// Explicit hack for debug menu.
 	if ((MASK_ALT & mask) &&
 		(MASK_CONTROL & mask) &&
@@ -2360,14 +2236,8 @@ void LLViewerWindow::handleScrollWheel(S32 clicks)
 {
 	LLView::sMouseHandlerMessage.clear();
 
-	gMouseIdleTimer.reset();
-
-	// Hide tooltips
-	if( mToolTip )
-	{
-		mToolTip->setVisible( FALSE );
-	}
-
+	LLUI::resetMouseIdleTimer();
+	
 	LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
 	if( mouse_captor )
 	{
@@ -2420,7 +2290,7 @@ void LLViewerWindow::moveCursorToCenter()
 	mLastMousePoint.set(x,y);
 	mCurrentMouseDelta.set(0,0);	
 
-	LLUI::setCursorPositionScreen(x, y);	
+	LLUI::setMousePositionScreen(x, y);	
 }
 
 void LLViewerWindow::updateBottomTrayRect()
@@ -2452,6 +2322,35 @@ void LLViewerWindow::updateBottomTrayRect()
 // Hover handlers
 //
 
+void append_xui_tooltip(LLView* viewp, std::string& tool_tip_msg)
+{
+	if (viewp) 
+	{
+		if (!tool_tip_msg.empty())
+		{
+			tool_tip_msg.append("\n---------\n");
+		}
+		LLView::root_to_view_iterator_t end_tooltip_it = viewp->endRootToView();
+		// NOTE: we skip "root" since it is assumed
+		for (LLView::root_to_view_iterator_t tooltip_it = ++viewp->beginRootToView();
+			tooltip_it != end_tooltip_it;
+			++tooltip_it)
+		{
+			LLView* viewp = *tooltip_it;
+		
+			tool_tip_msg.append(viewp->getName());
+			LLPanel* panelp = dynamic_cast<LLPanel*>(viewp);
+			if (panelp && !panelp->getXMLFilename().empty())
+			{
+				tool_tip_msg.append("(");
+				tool_tip_msg.append(panelp->getXMLFilename());
+				tool_tip_msg.append(")");
+			}
+			tool_tip_msg.append("/");
+		}
+	}
+}
+
 // Update UI based on stored mouse position from mouse-move
 // event processing.
 void LLViewerWindow::updateUI()
@@ -2473,6 +2372,17 @@ void LLViewerWindow::updateUI()
 		return;
 	}
 
+	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST))
+	{
+		gDebugRaycastFaceHit = -1;
+		gDebugRaycastObject = cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE,
+											  &gDebugRaycastFaceHit,
+											  &gDebugRaycastIntersection,
+											  &gDebugRaycastTexCoord,
+											  &gDebugRaycastNormal,
+											  &gDebugRaycastBinormal);
+	}
+
 	updateMouseDelta();
 	updateKeyboardFocus();
 
@@ -2500,8 +2410,8 @@ void LLViewerWindow::updateUI()
 	if (top_ctrl && top_ctrl->calcScreenBoundingRect().pointInRect(x, y))
 	{
 		// iterator over contents of top_ctrl, and throw into mouse_hover_set
-		for (LLView::tree_iterator_t it = top_ctrl->beginTree();
-			it != top_ctrl->endTree();
+		for (LLView::tree_iterator_t it = top_ctrl->beginTreeDFS();
+			it != top_ctrl->endTreeDFS();
 			++it)
 		{
 			LLView* viewp = *it;
@@ -2521,9 +2431,8 @@ void LLViewerWindow::updateUI()
 	else
 	{
 		// walk UI tree in depth-first order
-		LLView::tree_iterator_t end_it;
-		for (LLView::tree_iterator_t it = root_view->beginTree();
-			it != end_it;
+		for (LLView::tree_iterator_t it = root_view->beginTreeDFS();
+			it != root_view->endTreeDFS();
 			++it)
 		{
 			LLView* viewp = *it;
@@ -2536,7 +2445,7 @@ void LLViewerWindow::updateUI()
 				if (viewp->getMouseOpaque())
 				{
 					// constrain further iteration to children of this widget
-					it = viewp->beginTree();
+					it = viewp->beginTreeDFS();
 				}
 	
 				// we have a view that contains the mouse, add it to the set
@@ -2639,130 +2548,87 @@ void LLViewerWindow::updateUI()
 			}
 		}
 
-		if( !handled )
+		if (!handled)
 		{
-			lldebugst(LLERR_USER_INPUT) << "hover not handled by top view or root" << llendl;		
-		}
-	}
-
-	// *NOTE: sometimes tools handle the mouse as a captor, so this
-	// logic is a little confusing
-	LLTool *tool = NULL;
-	if (gHoverView)
-	{
-		tool = LLToolMgr::getInstance()->getCurrentTool();
-
-		if(!handled && tool)
-		{
-			handled = tool->handleHover(x, y, mask);
+			LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
 
-			if (!mWindow->isCursorHidden())
+			if(mMouseInWindow && tool)
 			{
-				gHoverView->updateHover(tool);
+				handled = tool->handleHover(x, y, mask);
 			}
 		}
-		else
-		{
-			// Cancel hovering if any UI element handled the event.
-			gHoverView->cancelHover();
-		}
-
-		// Suppress the toolbox view if our source tool was the pie tool,
-		// and we've overridden to something else.
-		mSuppressToolbox = 
-			(LLToolMgr::getInstance()->getBaseTool() == LLToolPie::getInstance()) &&
-			(LLToolMgr::getInstance()->getCurrentTool() != LLToolPie::getInstance());
-
 	}
 
-	// Show a new tool tip (or update one that is alrady shown)
+	// Show a new tool tip (or update one that is already shown)
 	BOOL tool_tip_handled = FALSE;
 	std::string tool_tip_msg;
 	if( handled 
-		&& !mWindow->isCursorHidden()
-		&& mToolTip)
+		&& !mWindow->isCursorHidden())
 	{
-		LLRect screen_sticky_rect;
-		LLMouseHandler *tooltip_source = NULL;
+		LLRect screen_sticky_rect = mRootView->getLocalRect();
 		S32 local_x, local_y;
-		if (mouse_captor)
-		{
-			mouse_captor->screenPointToLocal(x, y, &local_x, &local_y);
-			tooltip_source = mouse_captor;
-		}
-		else if (handled_by_top_ctrl)
-		{
-			top_ctrl->screenPointToLocal(x, y, &local_x, &local_y);
-			tooltip_source = top_ctrl;
-		}
-		else
-		{
-			local_x = x; local_y = y;
-			tooltip_source = mRootView;
-		}
 
-		F32 tooltip_delay = gSavedSettings.getF32( "ToolTipDelay" );
-		//HACK: hack for tool-based tooltips which need to pop up more quickly
-		//Also for show xui names as tooltips debug mode
-		if ((gFocusMgr.getMouseCapture() 
-				&& !gFocusMgr.getMouseCapture()->isView()) 
-			|| LLUI::sShowXUINames)
+		if (gSavedSettings.getBOOL("DebugShowXUINames"))
 		{
-			tooltip_delay = gSavedSettings.getF32( "DragAndDropToolTipDelay" );
-		}
-
-
-		BOOL tooltip_vis = FALSE;
-		if (shouldShowToolTipFor(tooltip_source))
-		{
-			tool_tip_handled = tooltip_source->handleToolTip(local_x, local_y, tool_tip_msg, &screen_sticky_rect );
-		
-			// if we actually got a tooltip back...
-			if( tool_tip_handled && !tool_tip_msg.empty() )
+			LLView* tooltip_view = mRootView;
+			LLView::tree_iterator_t end_it = mRootView->endTreeDFS();
+			for (LLView::tree_iterator_t it = mRootView->beginTreeDFS(); it != end_it; ++it)
 			{
-				if (mToolTip->getVisible()										// already showing a tooltip
-					|| gMouseIdleTimer.getElapsedTimeF32() > tooltip_delay)		// mouse has been still long enough to show the tooltip
+				LLView* viewp = *it;
+				LLRect screen_rect;
+				viewp->localRectToScreen(viewp->getLocalRect(), &screen_rect);
+				if (!(viewp->getVisible()
+					 && screen_rect.pointInRect(x, y)))
+				{
+					it.skipDescendants();
+				}
+				else if (viewp->getMouseOpaque())
 				{
-					// if tooltip has changed or mouse has moved outside of "sticky" rectangle...
-					if (mLastToolTipMessage != tool_tip_msg
-						|| !mToolTipStickyRect.pointInRect(x, y))
+					if (!viewp->hasAncestor(tooltip_view))
 					{
-						//...update "sticky" rect and tooltip position
-						mToolTipStickyRect = screen_sticky_rect;
-						mToolTip->setOrigin( x, y );
+						append_xui_tooltip(tooltip_view, tool_tip_msg);
+						screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect());
 					}
-
-					// remember this tooltip so we know when it changes
-					mLastToolTipMessage = tool_tip_msg;
-					mToolTip->setWrappedText( tool_tip_msg, 200 );
-					mToolTip->reshapeToFitText();
-					LLRect virtual_window_rect(0, getWindowHeight(), getWindowWidth(), 0);
-					mToolTip->translateIntoRect( virtual_window_rect, FALSE );
-					tooltip_vis = TRUE;
+					tooltip_view = viewp;
 				}
 			}
-		}
 
-		// HACK: assuming tooltip background is in ToolTipBGColor, perform fade out
-		LLColor4 bg_color = LLUIColorTable::instance().getColor( "ToolTipBgColor" );
-		if (tooltip_vis)
+			append_xui_tooltip(tooltip_view, tool_tip_msg);
+			screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect());
+			
+			LLToolTipMgr::instance().show(LLToolTipParams()
+				.message(tool_tip_msg)
+				.sticky_rect(screen_sticky_rect)
+				.width(400));
+		}
+		// if there is a mouse captor, nothing else gets a tooltip
+		else if (mouse_captor)
 		{
-			mToolTipFadeTimer.stop();
-			mToolTip->setBackgroundColor(bg_color);
+			mouse_captor->screenPointToLocal(x, y, &local_x, &local_y);
+			tool_tip_handled = mouse_captor->handleToolTip(local_x, local_y, tool_tip_msg, screen_sticky_rect );
 		}
 		else 
 		{
-			if (!mToolTipFadeTimer.getStarted())
+			// next is top_ctrl
+			if (!tool_tip_handled && top_ctrl)
 			{
-				mToolTipFadeTimer.start();
+				top_ctrl->screenPointToLocal(x, y, &local_x, &local_y);
+				tool_tip_handled = top_ctrl->handleToolTip(local_x, local_y, tool_tip_msg, screen_sticky_rect );
+			}
+			
+			if (!tool_tip_handled)
+			{
+				local_x = x; local_y = y;
+				tool_tip_handled = mRootView->handleToolTip(local_x, local_y, tool_tip_msg, screen_sticky_rect );
 			}
-			F32 tool_tip_fade_time = gSavedSettings.getF32("ToolTipFadeTime");
-			bg_color.mV[VALPHA] = clamp_rescale(mToolTipFadeTimer.getElapsedTimeF32(), 0.f, tool_tip_fade_time, bg_color.mV[VALPHA], 0.f);
-			mToolTip->setBackgroundColor(bg_color);
-		}
 
-		// above interpolation of bg_color alpha is guaranteed to reach 0.f exactly
-		mToolTip->setVisible( bg_color.mV[VALPHA] != 0.f );
+			LLTool* current_tool = LLToolMgr::getInstance()->getCurrentTool();
+			if (!tool_tip_handled && current_tool)
+			{
+				current_tool->screenPointToLocal(x, y, &local_x, &local_y);
+				tool_tip_handled = current_tool->handleToolTip(local_x, local_y, tool_tip_msg, screen_sticky_rect );
+			}
+		}
 	}		
 	
 	updateLayout();
@@ -2779,67 +2645,8 @@ void LLViewerWindow::updateUI()
 	{
 		LLSelectMgr::getInstance()->deselectUnused();
 	}
-
-	updatePicking(x, y, mask);
 }
 
-void LLViewerWindow::updatePicking(S32 x, S32 y, MASK mask)
-{
-	// per frame picking - for tooltips and changing cursor over interactive objects
-	static S32 previous_x = -1;
-	static S32 previous_y = -1;
-	static BOOL mouse_moved_since_pick = FALSE;
-
-	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST))
-	{
-		gDebugRaycastFaceHit = -1;
-		gDebugRaycastObject = cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE,
-											  &gDebugRaycastFaceHit,
-											  &gDebugRaycastIntersection,
-											  &gDebugRaycastTexCoord,
-											  &gDebugRaycastNormal,
-											  &gDebugRaycastBinormal);
-	}
-
-
-	if ((previous_x != x) || (previous_y != y))
-		mouse_moved_since_pick = TRUE;
-
-	BOOL do_pick = FALSE;
-
-	F32 picks_moving = gSavedSettings.getF32("PicksPerSecondMouseMoving");
-	if ((mouse_moved_since_pick) && (picks_moving > 0.0) && (mPickTimer.getElapsedTimeF32() > 1.0f / picks_moving))
-	{
-		do_pick = TRUE;
-	}
-
-	F32 picks_stationary = gSavedSettings.getF32("PicksPerSecondMouseStationary");
-	if ((!mouse_moved_since_pick) && (picks_stationary > 0.0) && (mPickTimer.getElapsedTimeF32() > 1.0f / picks_stationary))
-	{
-		do_pick = TRUE;
-	}
-
-	if (getCursorHidden())
-	{
-		do_pick = FALSE;
-	}
-
-	if(LLViewerMediaFocus::getInstance()->getFocus())
-	{
-		// When in-world media is in focus, pick every frame so that browser mouse-overs, dragging scrollbars, etc. work properly.
-		do_pick = TRUE;
-	}
-
-	if (do_pick)
-	{
-		mouse_moved_since_pick = FALSE;
-		mPickTimer.reset();
-		pickAsync(getCurrentMouseX(), getCurrentMouseY(), mask, hoverPickCallback, TRUE);
-	}
-
-	previous_x = x;
-	previous_y = y;
-}
 
 void LLViewerWindow::updateLayout()
 {
@@ -2851,6 +2658,12 @@ void LLViewerWindow::updateLayout()
 		&& tool != LLToolDragAndDrop::getInstance() 
 		&& !gSavedSettings.getBOOL("FreezeTime"))
 	{ 
+		// Suppress the toolbox view if our source tool was the pie tool,
+		// and we've overridden to something else.
+		bool suppress_toolbox = 
+			(LLToolMgr::getInstance()->getBaseTool() == LLToolPie::getInstance()) &&
+			(LLToolMgr::getInstance()->getCurrentTool() != LLToolPie::getInstance());
+
 		LLMouseHandler *captor = gFocusMgr.getMouseCapture();
 		// With the null, inspect, or drag and drop tool, don't muck
 		// with visibility.
@@ -2858,7 +2671,7 @@ void LLViewerWindow::updateLayout()
 		if (gFloaterTools->isMinimized()
 			||	(tool != LLToolPie::getInstance()						// not default tool
 				&& tool != LLToolCompGun::getInstance()					// not coming out of mouselook
-				&& !mSuppressToolbox									// not override in third person
+				&& !suppress_toolbox									// not override in third person
 				&& LLToolMgr::getInstance()->getCurrentToolset() != gFaceEditToolset	// not special mode
 				&& LLToolMgr::getInstance()->getCurrentToolset() != gMouselookToolset
 				&& (!captor || captor->isView())))						// not dragging
@@ -3043,13 +2856,6 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window)
 	}
 }
 
-/* static */
-void LLViewerWindow::hoverPickCallback(const LLPickInfo& pick_info)
-{
-	gViewerWindow->mHoverPick = pick_info;
-}
-	
-
 void LLViewerWindow::saveLastMouse(const LLCoordGL &point)
 {
 	// Store last mouse location.
@@ -3295,7 +3101,7 @@ BOOL LLViewerWindow::clickPointOnSurfaceGlobal(const S32 x, const S32 y, LLViewe
 	return intersect;
 }
 
-void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& info), BOOL pick_transparent, BOOL get_surface_info)
+void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& info), BOOL pick_transparent)
 {
 	if (gNoRender)
 	{
@@ -3329,7 +3135,7 @@ void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback
 	LLRect screen_region = mPickScreenRegion;
 	screen_region.translate(mPicks.size() * PICK_DIAMETER, 0);
 
-	LLPickInfo pick(LLCoordGL(x, y_from_bot), screen_region, mask, pick_transparent, get_surface_info, callback);
+	LLPickInfo pick(LLCoordGL(x, y_from_bot), screen_region, mask, pick_transparent, TRUE, callback);
 
 	schedulePick(pick);
 }
@@ -4900,11 +4706,6 @@ F32	LLViewerWindow::getWorldViewAspectRatio() const
 	}
 }
 
-void LLViewerWindow::drawPickBuffer() const
-{
-	mHoverPick.drawPickBuffer();
-}
-
 void LLViewerWindow::calcDisplayScale()
 {
 	F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor");
@@ -5153,49 +4954,6 @@ void LLPickInfo::updateXYCoords()
 	}
 }
 
-void LLPickInfo::drawPickBuffer() const
-{
-	if (mPickBuffer)
-	{
-		gGL.pushMatrix();
-		LLGLDisable no_blend(GL_BLEND);
-		LLGLDisable no_alpha_test(GL_ALPHA_TEST);
-		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-		glPixelZoom(10.f, 10.f);
-		LLVector2 display_scale = gViewerWindow->getDisplayScale();
-		glRasterPos2f(((F32)mMousePt.mX * display_scale.mV[VX] + 10.f), 
-			((F32)mMousePt.mY * display_scale.mV[VY] + 10.f));
-		glDrawPixels(PICK_DIAMETER, PICK_DIAMETER, GL_RGBA, GL_UNSIGNED_BYTE, mPickBuffer);
-		glPixelZoom(1.f, 1.f);
-		gGL.color4fv(LLColor4::white.mV);
-		gl_rect_2d(llround((F32)mMousePt.mX * display_scale.mV[VX] - (F32)(PICK_HALF_WIDTH)), 
-			llround((F32)mMousePt.mY * display_scale.mV[VY] + (F32)(PICK_HALF_WIDTH)),
-			llround((F32)mMousePt.mX * display_scale.mV[VX] + (F32)(PICK_HALF_WIDTH)),
-			llround((F32)mMousePt.mY * display_scale.mV[VY] - (F32)(PICK_HALF_WIDTH)),
-			FALSE);
-		gl_line_2d(llround((F32)mMousePt.mX * display_scale.mV[VX] - (F32)(PICK_HALF_WIDTH)), 
-			llround((F32)mMousePt.mY * display_scale.mV[VY] + (F32)(PICK_HALF_WIDTH)),
-			llround((F32)mMousePt.mX * display_scale.mV[VX] + 10.f), 
-			llround((F32)mMousePt.mY * display_scale.mV[VY] + (F32)(PICK_DIAMETER) * 10.f + 10.f));
-		gl_line_2d(llround((F32)mMousePt.mX * display_scale.mV[VX] + (F32)(PICK_HALF_WIDTH)),
-			llround((F32)mMousePt.mY * display_scale.mV[VY] - (F32)(PICK_HALF_WIDTH)),
-			llround((F32)mMousePt.mX * display_scale.mV[VX] + (F32)(PICK_DIAMETER) * 10.f + 10.f), 
-			llround((F32)mMousePt.mY * display_scale.mV[VY] + 10.f));
-		gGL.translatef(10.f, 10.f, 0.f);
-		gl_rect_2d(llround((F32)mPickPt.mX * display_scale.mV[VX]), 
-			llround((F32)mPickPt.mY * display_scale.mV[VY] + (F32)(PICK_DIAMETER) * 10.f),
-			llround((F32)mPickPt.mX * display_scale.mV[VX] + (F32)(PICK_DIAMETER) * 10.f),
-			llround((F32)mPickPt.mY * display_scale.mV[VY]),
-			FALSE);
-		gl_rect_2d(llround((F32)mPickPt.mX * display_scale.mV[VX]), 
-			llround((F32)mPickPt.mY * display_scale.mV[VY] + 10.f),
-			llround((F32)mPickPt.mX * display_scale.mV[VX] + 10.f),
-			llround((F32)mPickPt.mY * display_scale.mV[VY]),
-			FALSE);
-		gGL.popMatrix();
-	}
-}
-
 void LLPickInfo::getSurfaceInfo()
 {
 	// set values to uninitialized - this is what we return if no intersection is found
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 7afb77bed880e5a5038cde67e067959862883b40..c3c9d7021e976b22624732a31a1881a08e7433e5 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -47,7 +47,6 @@
 #include "llwindowcallbacks.h"
 #include "lltimer.h"
 #include "llstat.h"
-#include "llnotifications.h"
 #include "llmousehandler.h"
 #include "llcursortypes.h"
 #include "llhandle.h"
@@ -58,7 +57,7 @@ class LLUUID;
 class LLProgressView;
 class LLTool;
 class LLVelocityBar;
-class LLTextBox;
+class LLPanel;
 class LLImageRaw;
 class LLHUDIcon;
 class LLWindow;
@@ -69,6 +68,17 @@ class LLRootView;
 
 class LLPickInfo
 {
+public:
+	typedef enum
+	{
+		PICK_OBJECT,
+		PICK_FLORA,
+		PICK_LAND,
+		PICK_ICON,
+		PICK_PARCEL_WALL,
+		PICK_INVALID
+	} EPickType;
+
 public:
 	LLPickInfo();
 	LLPickInfo(const LLCoordGL& mouse_pos, 
@@ -81,20 +91,10 @@ class LLPickInfo
 	void fetchResults();
 	LLPointer<LLViewerObject> getObject() const;
 	LLUUID getObjectID() const { return mObjectID; }
-	void drawPickBuffer() const;
+	bool isValid() const { return mPickType != PICK_INVALID; }
 
 	static bool isFlora(LLViewerObject* object);
 
-	typedef enum
-	{
-		PICK_OBJECT,
-		PICK_FLORA,
-		PICK_LAND,
-		PICK_ICON,
-		PICK_PARCEL_WALL,
-		PICK_INVALID
-	} EPickType;
-
 public:
 	LLCoordGL		mMousePt;
 	MASK			mKeyMask;
@@ -147,6 +147,8 @@ class LLViewerWindow : public LLWindowCallbacks
 	void            adjustControlRectanglesForFirstUse(const LLRect& window);
 	void			initWorldUI();
 
+	BOOL handleAnyMouseClick(LLWindow *window,  LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down);
+
 	//
 	// LLWindowCallback interface implementation
 	//
@@ -154,7 +156,6 @@ class LLViewerWindow : public LLWindowCallbacks
 	/*virtual*/ BOOL handleTranslatedKeyUp(KEY key,  MASK mask);
 	/*virtual*/ void handleScanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level);
 	/*virtual*/ BOOL handleUnicodeChar(llwchar uni_char, MASK mask);	// NOT going to handle extended 
-	/*virtual*/ BOOL handleAnyMouseClick(LLWindow *window,  LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down);
 	/*virtual*/ BOOL handleMouseDown(LLWindow *window,  LLCoordGL pos, MASK mask);
 	/*virtual*/ BOOL handleMouseUp(LLWindow *window,  LLCoordGL pos, MASK mask);
 	/*virtual*/ BOOL handleCloseRequest(LLWindow *window);
@@ -234,7 +235,6 @@ class LLViewerWindow : public LLWindowCallbacks
 	BOOL			getRightMouseDown()	const	{ return mRightMouseDown; }
 
 	const LLPickInfo&	getLastPick() const { return mLastPick; }
-	const LLPickInfo&	getHoverPick() const { return mHoverPick; }
 
 	void			setup2DViewport(S32 x_offset = 0, S32 y_offset = 0);
 	void			setup3DViewport(S32 x_offset = 0, S32 y_offset = 0);
@@ -281,7 +281,6 @@ class LLViewerWindow : public LLWindowCallbacks
 	void				updateLayout();						
 	void				updateMouseDelta();		
 	void				updateKeyboardFocus();		
-	void				updatePicking(S32 x, S32 y, MASK mask);
 
 	void			updateWorldViewRect(bool use_full_window=false);
 	void			updateBottomTrayRect();
@@ -332,11 +331,8 @@ class LLViewerWindow : public LLWindowCallbacks
 	void			returnEmptyPicks();
 
 
-	void			pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& pick_info),
-							  BOOL pick_transparent = FALSE, BOOL get_surface_info = FALSE);
+	void			pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& pick_info), BOOL pick_transparent = FALSE);
 	LLPickInfo		pickImmediate(S32 x, S32 y, BOOL pick_transparent);
-	static void     hoverPickCallback(const LLPickInfo& pick_info);
-	
 	LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth,
 										   LLVector3* intersection);
 
@@ -382,8 +378,6 @@ class LLViewerWindow : public LLWindowCallbacks
 	const LLVector2& getDisplayScale() const { return mDisplayScale; }
 	void			calcDisplayScale();
 
-	void			drawPickBuffer() const;
-
 private:
 	bool                    shouldShowToolTipFor(LLMouseHandler *mh);
 	static bool onAlert(const LLSD& notify);
@@ -422,9 +416,8 @@ class LLViewerWindow : public LLWindowCallbacks
 	LLProgressView	*mProgressView;
 
 	LLFrameTimer	mToolTipFadeTimer;
-	LLTextBox*		mToolTip;
+	LLPanel*		mToolTip;
 	std::string		mLastToolTipMessage;
-	BOOL			mToolTipBlocked;			// True after a key press or a mouse button event.  False once the mouse moves again.
 	LLRect			mToolTipStickyRect;			// Once a tool tip is shown, it will stay visible until the mouse leaves this rect.
 
 	BOOL			mMouseInWindow;				// True if the mouse is over our window or if we have captured the mouse.
@@ -435,12 +428,9 @@ class LLViewerWindow : public LLWindowCallbacks
 	// Variables used for tool override switching based on modifier keys.  JC
 	MASK			mLastMask;			// used to detect changes in modifier mask
 	LLTool*			mToolStored;		// the tool we're overriding
-	BOOL			mSuppressToolbox;	// sometimes hide the toolbox, despite
-										// having a camera tool selected
 	BOOL			mHideCursorPermanent;	// true during drags, mouselook
 	BOOL            mCursorHidden;
 	LLPickInfo		mLastPick;
-	LLPickInfo		mHoverPick;
 	std::vector<LLPickInfo> mPicks;
 	LLRect			mPickScreenRegion; // area of frame buffer for rendering pick frames (generally follows mouse to avoid going offscreen)
 	LLTimer         mPickTimer;        // timer for scheduling n picks per second
@@ -477,13 +467,9 @@ void update_saved_window_size(const std::string& control,S32 delta_width, S32 de
 
 extern LLViewerWindow*	gViewerWindow;
 
-extern LLFrameTimer		gMouseIdleTimer;		// how long has it been since the mouse last moved?
 extern LLFrameTimer		gAwayTimer;				// tracks time before setting the avatar away state to true
 extern LLFrameTimer		gAwayTriggerTimer;		// how long the avatar has been away
 
-extern BOOL				gDebugSelect;
-
-extern BOOL				gDebugFastUIRender;
 extern LLViewerObject*  gDebugRaycastObject;
 extern LLVector3        gDebugRaycastIntersection;
 extern LLVector2        gDebugRaycastTexCoord;
@@ -495,7 +481,6 @@ extern S32 CHAT_BAR_HEIGHT;
 
 extern BOOL			gDisplayCameraPos;
 extern BOOL			gDisplayWindInfo;
-extern BOOL			gDisplayNearestWater;
 extern BOOL			gDisplayFOV;
 
 #endif
diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp
index a2793acceac60a99f730c28a3ba0cb0201e6ff1a..570a3334b9ec4b25da058e7571bed200db5be109 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -38,7 +38,7 @@
 #include "llviewercontrol.h"
 
 #include "llagent.h"
-#include "llviewerwindow.h"
+#include "llnotifications.h"
 #include "lldrawable.h"
 #include "llface.h"
 #include "llsky.h"
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 67bc205f62979e201be7f33d8d962c4c750dea86..4d7423eaae418cac9c79be413ddfb7f5fff927e4 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -41,6 +41,7 @@
 #include "lleventflags.h"
 #include "llfloaterreg.h"
 #include "llrender.h"
+#include "lltooltip.h"
 
 #include "llagent.h"
 #include "llcallingcard.h"
@@ -50,6 +51,7 @@
 #include "llfloatermap.h"
 #include "llfloaterworldmap.h"
 #include "llfocusmgr.h"
+#include "lllocalcliprect.h"
 #include "lltextbox.h"
 #include "lltextureview.h"
 #include "lltracker.h"
@@ -1179,10 +1181,12 @@ LLVector3d LLWorldMapView::viewPosToGlobal( S32 x, S32 y )
 }
 
 
-BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen )
+BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen )
 {
 	LLVector3d pos_global = viewPosToGlobal(x, y);
 
+	std::string tooltip_msg;
+
 	LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);
 	if (info)
 	{
@@ -1217,22 +1221,26 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* stic
 				}
 			}
 		}
-		msg.assign( message );
+		tooltip_msg.assign( message );
 
 		// Optionally show region flags
 		std::string region_flags = LLViewerRegion::regionFlagsToString(info->mRegionFlags);
 
 		if (!region_flags.empty())
 		{
-			msg += '\n';
-			msg += region_flags;
+			tooltip_msg += '\n';
+			tooltip_msg += region_flags;
 		}
 					
 		const S32 SLOP = 9;
 		S32 screen_x, screen_y;
 
 		localPointToScreen(x, y, &screen_x, &screen_y);
-		sticky_rect_screen->setCenterAndSize(screen_x, screen_y, SLOP, SLOP);
+		sticky_rect_screen.setCenterAndSize(screen_x, screen_y, SLOP, SLOP);
+
+		LLToolTipMgr::instance().show(LLToolTipParams()
+			.message(tooltip_msg)
+			.sticky_rect(sticky_rect_screen));
 	}
 	return TRUE;
 }
@@ -1744,7 +1752,7 @@ BOOL LLWorldMapView::handleMouseUp( S32 x, S32 y, MASK mask )
 			LLRect clip_rect = getRect();
 			clip_rect.stretch(-8);
 			clip_rect.clipPointToRect(mMouseDownX, mMouseDownY, local_x, local_y);
-			LLUI::setCursorPositionLocal(this, local_x, local_y);
+			LLUI::setMousePositionLocal(this, local_x, local_y);
 
 			// finish the pan
 			mPanning = FALSE;
diff --git a/indra/newview/llworldmapview.h b/indra/newview/llworldmapview.h
index 41c977269440e5be02839a47c5788a5f06eda8fb..8349d5399f5fcda3eac21d2610d644620b5488f4 100644
--- a/indra/newview/llworldmapview.h
+++ b/indra/newview/llworldmapview.h
@@ -72,7 +72,7 @@ class LLWorldMapView : public LLPanel
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleDoubleClick( S32 x, S32 y, MASK mask );
 	virtual BOOL	handleHover( S32 x, S32 y, MASK mask );
-	virtual BOOL	handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen );
+	virtual BOOL	handleToolTip( S32 x, S32 y, std::string& msg, LLRect& sticky_rect_screen );
 
 	bool			checkItemHit(S32 x, S32 y, LLItemInfo& item, LLUUID* id, bool track);
 	void			handleClick(S32 x, S32 y, MASK mask, S32* hit_type, LLUUID* id);
diff --git a/indra/newview/skins/default/xui/en/floater_test_inspectors.xml b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b23bf49435c1456a16a532a969d9a34629139d37
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_resize="true"
+ height="400"
+ layout="topleft"
+ name="floater_test_inspectors"
+ title="Test Inspectors" 
+ width="400">
+  <text
+   height="20"
+   left="10"
+   name="test_inspectors"
+   top="30"
+   width="300">
+    Click to spawn an inspector:
+  </text>
+  <!-- James Tester, 4 years old -->
+  <button
+    name="avatar_2d_btn1"
+    label="Avatar 2D"
+    top="50"
+    left="10"
+    height="20"
+    width="100"
+	commit_callback.function="ShowAvatarInspector"
+	commit_callback.parameter="22df1dcb-810a-4975-aab9-0159958fe155" />
+	<!-- DonkeyPuncher 2008-10-1 -->
+  <button
+    name="avatar_2d_btn5"
+    label="Avatar 2D"
+    top_pad="10"
+    left="10"
+    height="20"
+    width="100"
+	commit_callback.function="ShowAvatarInspector"
+	commit_callback.parameter="d5330e4e-391a-4f00-9352-b797ed2f9a97" />
+	<!-- DonkeyPuncher 2009-01-15 -->
+  <button
+    name="avatar_2d_btn2"
+    label="Avatar 2D"
+    top_pad="10"
+    left="10"
+    height="20"
+    width="100"
+	commit_callback.function="ShowAvatarInspector"
+	commit_callback.parameter="05511655-a58a-48b6-b645-966f69fc17a7" />
+	<!-- 2009-06-14 -->
+  <button
+    name="avatar_2d_btn3"
+    label="Avatar 2D"
+    top_pad="10"
+    left="10"
+    height="20"
+    width="100"
+	commit_callback.function="ShowAvatarInspector"
+	commit_callback.parameter="6a164b3d-7c2c-43eb-880a-0ebc0687b3ec" />
+	<!-- jarvtest Bombastic 2009-10-3 -->
+  <button
+    name="avatar_2d_btn4"
+    label="Avatar 2D"
+    top_pad="10"
+    left="10"
+    height="20"
+    width="100"
+	commit_callback.function="ShowAvatarInspector"
+	commit_callback.parameter="e7dc3c83-1e11-4fa7-beeb-4b18adfb4efa" />
+  <button
+    name="avatar_3d_btn"
+    label="Avatar 3D"
+    top="50"
+    left="150"
+    height="20"
+    width="100"/>
+  <button
+    name="object_2d_btn"
+    label="Object 2D"
+    top_pad="10"
+    left_delta="0"
+    height="20"
+    width="100"/>
+  <button
+    name="object_3d_btn"
+    label="Object 3D"
+    top_pad="10"
+    left_delta="0"
+    height="20"
+    width="100"/>
+  <button
+    name="group_btn"
+    label="Group"
+    top_pad="10"
+    left_delta="0"
+    height="20"
+    width="100"/>
+  <button
+    name="place_btn"
+    label="Place"
+    top_pad="10"
+    left_delta="0"
+    height="20"
+    width="100"/>
+  <button
+    name="event_btn"
+    label="Event"
+    top_pad="10"
+    left_delta="0"
+    height="20"
+    width="100"/>
+
+</floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml
index cee789d4353788b0789cfed0abd804e89c9d6412..f908e9d610b7f2a9d51f175135c56ed378c60a35 100644
--- a/indra/newview/skins/default/xui/en/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml
@@ -1,14 +1,20 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <!-- All our XML is utf-8 encoded. -->
 
-<!-- No title to avoid window chrome -->
+<!--
+  Not can_close / no title to avoid window chrome
+  Single instance - only have one at a time, recycle it each spawn
+-->
 <floater
   background_opaque="false"
   background_visible="true"
   bevel_style="in"
-  bg_alpha_color="black"
+  bg_alpha_color="PanelDefaultBackgroundColor"
+  can_close="false" 
   can_minimize="false" 
 	name="inspect_avatar"
+  single_instance="true" 
+  sound_flags="0" 
 	title=""
   visible="true"
 	width="300"
@@ -16,28 +22,39 @@
   left="0"
   top="200"
   >
+  <!-- Allowed fields include:
+	[BORN_ON] ("12/3/2008")
+	[SL_PROFILE] (Second Life profile),
+    [RW_PROFILE] (real world profile),
+	[ACCTTYPE] ("Resident"),
+	[PAYMENTINFO] ("Payment Info on File"),
+	[AGE] ("1 year 2 months") -->
+  <string name="Subtitle">
+[AGE]
+  </string>
+  <string name="Details">
+[ACCTTYPE], [PAYMENTINFO]
+Profile: [SL_PROFILE]
+  </string>
   <text
-      top="180" left="10" width="220" height="70" follows="left|top|right|bottom"
+      top="180" left="10" width="280" height="70" follows="left|top|right|bottom"
       use_ellipses="true"  word_wrap="true"
       font="SansSerifHugeBold" text_color="white"
       mouse_opaque="true" name="user_name" >
-    Codex Linden
+    Test Name
   </text>
+  <!-- General purpose subtitle area, not sure yet what goes here -->
   <text
     top="155" left="10" width="150" height="20" follows="left|top|right|bottom"
-    font="SansSerifBig" font.style="UNDERLINE"
+    font="SansSerifBig"
     text_color="white"
     mouse_opaque="true"
-    name="active_group" >
-    The Guild
-  </text>
+    name="user_subtitle" />
+  <!-- Leave text fields blank so it doesn't flash when data arrives off the network -->
   <text
-      top="110" left="10" width="290" height="50" follows="left|top|right|bottom"
+      top="115" left="10" width="290" height="50" follows="left|top|right|bottom"
       font="SansSerifSmall" text_color="white" word_wrap="true"
-      mouse_opaque="true" name="user_detail" >
-3 year-old account, Payment info on file
-Languages: English, Spanish; +5 Sexterity Vest
-  </text>  
+      mouse_opaque="true" name="user_details" />
   <avatar_icon
       top="185" left="230" width="60" height="60" follows="left|top|right|bottom"
       color="1 1 1 1" enabled="true" mouse_opaque="true" name="avatar_icon"
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 1e911c26640a2d25194497018785af6efd9ecac4..8a2955654e6cafa2935421219b50db169c3ffc32 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -97,18 +97,20 @@
          layout="topleft"
          name="Widget Test"
          shortcut="control|shift|T">
-            <menu_item_call.on_click
-             function="ShowFloater"
-             parameter="test_widgets" />
-        </menu_item_call>
-        <menu_item_call
-         label="Avatar Inspector"
-         name="Avatar Inspector"
-         shortcut="control|shift|I">
-            <menu_item_call.on_click
-             function="ShowFloater"
-             parameter="inspect_avatar" />
-        </menu_item_call>
+        <menu_item_call.on_click
+         function="ShowFloater"
+         parameter="test_widgets" />
+      </menu_item_call>
+      <menu_item_call
+         label="Inspectors Test"
+         name="inspectors_test"
+         shortcut="control|shift|I"
+         >
+        <menu_item_call.on_click
+         function="ShowFloater"
+         parameter="test_inspectors" />
+      </menu_item_call>
+      <menu_item_separator />
         <menu_item_call
          label="Show TOS"
          layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 6bc12368b7e112093f69ccc508bbd72aae336638..9ad9a87f9577498f86cbe75ee980ddcee208f041 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2751,14 +2751,13 @@
             <menu_item_call.on_click
              function="Advanced.SendTestIMs" />
           </menu_item_call>
-          <!-- *HACK: Hard code James Tester's UUID -->
           <menu_item_call
-           label="Avatar Inspector"
-           name="Avatar Inspector"
+           label="Test Inspectors"
+           name="Test Inspectors"
            shortcut="control|shift|I">
             <menu_item_call.on_click
-             function="Advanced.AvatarInspector"
-             parameter="22df1dcb-810a-4975-aab9-0159958fe155" />
+             function="Floater.Show"
+             parameter="test_inspectors" />
           </menu_item_call>
         </menu>
         <menu
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 794b69d7ed59fae2d3d26dbc11032f4a152afd8a..d943b2ea23692a19e6589ebfcce200d763cd3cdd 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -55,6 +55,7 @@
      max_length="31"
      name="first_name_edit"
      select_on_focus="true"
+     tool_tip="Enter first name here" 
      top_pad="4"
      width="120" />
     <text
@@ -111,6 +112,25 @@
      select_on_focus="true"
      top_pad="4"
      width="120" />
+     <button
+     follows="left|bottom"
+     height="24"
+     label="Log In"
+     label_selected="Log In"
+     layout="topleft"
+     left="435"
+     name="connect_btn"
+     top="548"
+     width="120" />
+    <combo_box
+     allow_text_entry="true"
+     follows="left|bottom"
+     height="18"
+     layout="topleft"
+     left_pad="15"
+     name="server_combo"
+     top_delta="2"
+     width="120" />
     <text
      type="string"
      length="1"
@@ -158,25 +178,7 @@
      name="remember_check"
      top_delta="3"
      width="138" />
-    <button
-     follows="left|bottom"
-     height="24"
-     label="Log In"
-     label_selected="Log In"
-     layout="topleft"
-     left="435"
-     name="connect_btn"
-     top="548"
-     width="120" />
-    <combo_box
-     allow_text_entry="true"
-     follows="left|bottom"
-     height="18"
-     layout="topleft"
-     left_pad="15"
-     name="server_combo"
-     top_delta="2"
-     width="120" />
+ 
     <text
      type="string"
      length="1"
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 135dcb167b9608889fa261b4e785343d023f5d5d..41de34fbed4a5a1ff765ee30e6aab8fa3eb9bee9 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -13,33 +13,6 @@
      name="CaptionTextAcctInfo">
         [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
     </string>
-    <string
-     name="AcctTypeResident"
-     value="Resident" />
-    <string
-     name="AcctTypeTrial"
-     value="Trial" />
-    <string
-     name="AcctTypeCharterMember"
-     value="Charter Member" />
-    <string
-     name="AcctTypeEmployee"
-     value="Linden Lab Employee" />
-    <string
-     name="PaymentInfoUsed"
-     value="Payment Info Used" />
-    <string
-     name="PaymentInfoOnFile"
-     value="Payment Info On File" />
-    <string
-     name="NoPaymentInfoOnFile"
-     value="No Payment Info On File" />
-    <string
-     name="AgeVerified"
-     value="Age-verified" />
-    <string
-     name="NotAgeVerified"
-     value="Not Age-verified" />
     <string
      name="payment_update_link_url">
         http://www.secondlife.com/account/billing.php?lang=en
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index b8152a4956bab632b927ee2e77bf1233f9f415bb..faed615bdd92ee60892e2bb317fe27cd311fb9dd 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -46,7 +46,7 @@
 	<string name="AgentLostConnection">This region may be experiencing trouble.  Please check your connection to the Internet.</string>
 	
 	
-	<!-- Tooltip, llhoverview.cpp -->
+	<!-- Tooltip, lltooltipview.cpp -->
 	<string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar -->
 	<string name="TooltipNoName">(no name)</string> <!-- No name on an object -->
 	<string name="TooltipOwner">Owner:</string> <!-- Owner name follows -->
@@ -1913,8 +1913,35 @@ this texture in your inventory
 	<string name="Stomach">Stomach</string>
 	<string name="Left Pec">Left Pec</string>
 	<string name="Right Pec">Right Pec</string>	
-	
-	<!-- HUD Position --> 
+
+  <!-- Avatar age computation, see LLAvatarPropertiesProcessor::ageFromDate -->
+  <string name="YearsMonthsOld">[AGEYEARS][AGEMONTHS]old</string>
+  <string name="WeeksOld">[AGEWEEKS]old</string>
+  <string name="DaysOld">[AGEDAYS]old</string>
+  <string name="TodayOld">Joined today</string>
+  
+  <!-- Use value="" because of trailing spaces -->
+  <string name="AgeYears"  value="[YEARS] years " />
+  <string name="Age1Year"  value="1 year "/>
+  <string name="AgeMonths" value="[MONTHS] months "/>
+  <string name="Age1Month" value="1 month "/>
+  <string name="AgeWeeks"  value="[WEEKS] weeks "/>
+  <string name="Age1Week"  value="1 week "/>
+  <string name="AgeDays"   value="[DAYS] days "/>
+  <string name="Age1Day"   value="1 day "/>
+
+  <!-- Account types, see LLAvatarPropertiesProcessor -->
+  <string name="AcctTypeResident">Resident</string>
+  <string name="AcctTypeTrial">Trial</string>
+  <string name="AcctTypeCharterMember">Charter Member</string>
+  <string name="AcctTypeEmployee">Linden Lab Employee</string>
+  <string name="PaymentInfoUsed">Payment Info Used</string>
+  <string name="PaymentInfoOnFile">Payment Info On File</string>
+  <string name="NoPaymentInfoOnFile">No Payment Info On File</string>
+  <string name="AgeVerified">Age-verified</string>
+  <string name="NotAgeVerified">Not Age-verified</string>
+  
+  <!-- HUD Position --> 
 	<string name="Center 2">Center 2</string>	
 	<string name="Top Right">Top Right</string>	
 	<string name="Top">Top</string>	
@@ -2425,4 +2452,48 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 	<string name="UpdaterFailStartTitle">
 	  Failed to start viewer
 	</string>
+
+  <!-- IM system messages -->
+  <string name="only_user_message">
+    You are the only user in this session.
+  </string>
+  <string name="offline_message">
+    [FIRST] [LAST] is offline.
+  </string>
+  <string name="invite_message">
+    Click the [BUTTON NAME] button to accept/connect to this voice chat.
+  </string>
+  <string name="muted_message">
+    You have blocked this resident. Sending a message will automatically unblock them.
+  </string>
+  <string name="generic_request_error">
+    Error making request, please try again later.
+  </string>
+  <string name="insufficient_perms_error">
+    You do not have sufficient permissions.
+  </string>
+  <string name="session_does_not_exist_error">
+    The session no longer exists
+  </string>
+  <string name="no_ability_error">
+    You do not have that ability.
+  </string>
+  <string name="not_a_mod_error">
+    You are not a session moderator.
+  </string>
+  <string name="muted_error">
+    A group moderator disabled your text chat.
+  </string>
+  <string name="add_session_event">
+    Unable to add users to chat session with [RECIPIENT].
+  </string>
+  <string name="message_session_event">
+    Unable to send your message to the chat session with [RECIPIENT].
+  </string>
+  <string name="removed_from_group">
+    You have been removed from the group.
+  </string>
+  <string name="close_on_no_ability">
+    You no longer have the ability to be in the chat session.
+  </string>
 </strings>
diff --git a/indra/newview/skins/default/xui/en/widgets/floater.xml b/indra/newview/skins/default/xui/en/widgets/floater.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4a866c2eb21fcf5c3807827dcbaf7629c69442c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/floater.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater name="floater"
+         bg_opaque_color="FloaterFocusBackgroundColor"
+         bg_alpha_color="FloaterDefaultBackgroundColor"
+         background_visible="true"
+         background_opaque="false"/>