diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 4f0c0d31bd13413618372b1b8b5972cce52b2b90..f40d99c024acb4cb3dd01067dd9ead711b30a8eb 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -732,16 +732,7 @@ void LLButton::draw()
 	}
 
 	// Unselected label assignments
-	LLWString label;
-
-	if( getToggleState() )
-	{
-		label = mSelectedLabel;
-	}
-	else
-	{
-		label = mUnselectedLabel;
-	}
+	LLWString label = getCurrentLabel();
 
 	// overlay with keyboard focus border
 	if (hasFocus())
@@ -988,6 +979,23 @@ void LLButton::setLabelSelected( const LLStringExplicit& label )
 	mSelectedLabel = label;
 }
 
+bool LLButton::labelIsTruncated() const
+{
+	return getCurrentLabel().getString().size() > mLastDrawCharsCount;
+}
+
+const LLUIString& LLButton::getCurrentLabel() const
+{
+	if( getToggleState() )
+	{
+		return mSelectedLabel;
+	}
+	else
+	{
+		return mUnselectedLabel;
+	}
+}
+
 void LLButton::setImageUnselected(LLPointer<LLUIImage> image)
 {
 	mImageUnselected = image;
@@ -999,16 +1007,7 @@ void LLButton::setImageUnselected(LLPointer<LLUIImage> image)
 
 void LLButton::autoResize()
 {
-	LLUIString label;
-	if(getToggleState())
-	{
-		label = mSelectedLabel;
-	}
-	else
-	{
-		label = mUnselectedLabel;
-	}
-	resize(label);
+	resize(getCurrentLabel());
 }
 
 void LLButton::resize(LLUIString label)
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index ba0345f61099a01c7af0f591c544222dd01c4b85..7d9adcd8927818c53eca357b32743d113b359bc0 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -242,6 +242,8 @@ class LLButton
 
 
 	S32				getLastDrawCharsCount() const { return mLastDrawCharsCount; }
+	bool			labelIsTruncated() const;
+	const LLUIString&	getCurrentLabel() const;
 
 	void			setScaleImage(BOOL scale)			{ mScaleImage = scale; }
 	BOOL			getScaleImage() const				{ return mScaleImage; }
diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index 21eeed1d276ff9a913105dfa6bf9455203064a2e..e67e18872c83c857790f1a30441209f259715dfe 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -194,9 +194,9 @@ void LLToolBar::initFromParams(const LLToolBar::Params& p)
 	
 	mCenteringStack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p));
 
-	BOOST_FOREACH(LLCommandId::Params params, p.commands)
+	BOOST_FOREACH(LLCommandId id, p.commands)
 	{
-		addCommand(params);
+		addCommand(id);
 	}
 
 	mNeedsLayout = true;
@@ -452,17 +452,17 @@ int LLToolBar::getRankFromPosition(S32 x, S32 y)
 	{
 		// We hit passed the end of the list so put the insertion point at the end
 		if (orientation == LLLayoutStack::HORIZONTAL)
-		{
+	{
 			mDragx = button_rect.mRight + mPadRight;
 			mDragy = button_rect.mTop + mPadTop;
-		}
-		else
-		{
+	}
+	else
+	{
 			mDragx = button_rect.mLeft - mPadLeft;
 			mDragy = button_rect.mBottom - mPadBottom;
 		}
 	}
-	
+
 	// Update the "girth" of the caret, i.e. the width or height (depending of orientation)
 	if (orientation == LLLayoutStack::HORIZONTAL)
 	{
@@ -723,13 +723,10 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)
 	LLCommand* commandp = LLCommandManager::instance().getCommand(id);
 	if (!commandp) return NULL;
 
-	std::string label = LLTrans::getString(commandp->labelRef());
-	std::string tooltip = label + "\n" + LLTrans::getString(commandp->tooltipRef());
-
 	LLToolBarButton::Params button_p;
 	button_p.name = id.name();
-	button_p.label = label;
-	button_p.tool_tip = tooltip;
+	button_p.label = LLTrans::getString(commandp->labelRef());
+	button_p.tool_tip = LLTrans::getString(commandp->tooltipRef());
 	button_p.image_overlay = LLUI::getUIImage(commandp->icon());
 	button_p.overwriteFrom(mButtonParams[mButtonType]);
 	LLToolBarButton* button = LLUICtrlFactory::create<LLToolBarButton>(button_p);
@@ -925,3 +922,28 @@ void LLToolBarButton::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
 	LLButton::reshape(mWidthRange.clamp(width), height, called_from_parent);
 }
+
+const std::string LLToolBarButton::getToolTip() const	
+{ 
+	std::string tooltip;
+	if (labelIsTruncated() || getCurrentLabel().empty())
+	{
+		return LLTrans::getString(LLCommandManager::instance().getCommand(mId)->labelRef()) + " -- " + LLView::getToolTip();
+	}
+	else
+	{
+		return LLView::getToolTip();
+	}
+}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h
index 7f8ae4f83930cf4a2347d27af83973587f380682..8d38bc02345f059665d0f66aec788de9cebb13af 100644
--- a/indra/llui/lltoolbar.h
+++ b/indra/llui/lltoolbar.h
@@ -72,6 +72,10 @@ class LLToolBarButton : public LLButton
 	void onMouseEnter(S32 x, S32 y, MASK mask);
 	void onMouseCaptureLost();
 
+	virtual const std::string getToolTip() const;		
+
+
+
 private:
 	LLCommandId		mId;
 	S32				mMouseDownX;
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index e10c2f0d1e21f230474e2079e913728360d443dd..55d053254c9ce3218c57ab30230bd78b70d4c99c 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -708,15 +708,16 @@ BOOL LLView::handleToolTip(S32 x, S32 y, MASK mask)
 
 	// parents provide tooltips first, which are optionally
 	// overridden by children, in case child is mouse_opaque
-	if (!mToolTipMsg.empty())
+	std::string tooltip = getToolTip();
+	if (!tooltip.empty())
 	{
 		// 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( "ToolTipFastDelay" )
 			: LLUI::sSettingGroups["config"]->getF32( "ToolTipDelay" );
 		LLToolTipMgr::instance().show(LLToolTip::Params()
-			.message(mToolTipMsg)
+			.message(tooltip)
 			.sticky_rect(calcScreenRect())
 			.delay_time(timeout));
 
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index a1c46f3bf3a629088d298c4aceed658fa5c612a1..5e3387dc9841ee178c7a732a941b6954c69c577e 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -238,7 +238,7 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 
 	ECursorType	getHoverCursor() { return mHoverCursor; }
 
-	const std::string& getToolTip() const			{ return mToolTipMsg.getString(); }
+	virtual const std::string getToolTip() const			{ return mToolTipMsg.getString(); }
 
 	void		sendChildToFront(LLView* child);
 	void		sendChildToBack(LLView* child);
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index dd540654fbfdb69a509afe62cc918d2774f3b5d9..4b847dfbf71bcd88a816209c14487522e1f3409c 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -10905,7 +10905,17 @@
       <key>Value</key>
       <real>0.699999988079</real>
     </map>
-    <key>ToolTipFadeTime</key>
+     <key>ToolTipFastDelay</key>
+    <map>
+      <key>Comment</key>
+      <string>Seconds before displaying tooltip when mouse stops over UI element (when a tooltip is already visible)</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>F32</string>
+      <key>Value</key>
+      <real>0.1</real>
+    </map>   <key>ToolTipFadeTime</key>
     <map>
       <key>Comment</key>
       <string>Seconds over which tooltip fades away</string>
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 478af6ab7dc215a337051093cdd5b1152df984b8..aee46ed5bed9b35205f3ef726511a8bbe4157405 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -6875,6 +6875,13 @@ class LLToolsEnableSaveToObjectInventory : public view_listener_t
 	}
 };
 
+class LLToggleHowTo : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+	{
+		return true;
+	}
+};
 
 class LLViewEnableMouselook : public view_listener_t
 {
@@ -8039,6 +8046,7 @@ void initialize_menus()
 
 	// Help menu
 	// most items use the ShowFloater method
+	view_listener_t::addMenu(new LLToggleHowTo(), "Help.ToggleHowTo");
 
 	// Advanced menu
 	view_listener_t::addMenu(new LLAdvancedToggleConsole(), "Advanced.ToggleConsole");