diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 2459429f6e52f28f6c259841fd208f22a7881f01..6c08ec74315e12529bf9bd31c0c0d82ecb881abd 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -314,7 +314,7 @@ boost::signals2::connection LLButton::setHeldDownCallback( const commit_signal_t
 }
 
 
-// *TODO: Deprecate (for backwards compatability only)
+// *TODO: Deprecate (for backwards compatibility only)
 boost::signals2::connection LLButton::setClickedCallback( button_callback_t cb, void* data )
 {
 	return setClickedCallback(boost::bind(cb, data));
@@ -919,7 +919,7 @@ void LLButton::setToggleState(BOOL b)
 
 void LLButton::setFlashing( BOOL b )	
 { 
-	if (b != mFlashing)
+	if ((bool)b != mFlashing)
 	{
 		mFlashing = b; 
 		mFlashingTimer.reset();
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 59689160060716520320afa126f7f9b9606323d1..bc5e69fad54f58298d10a8524c653a885bd56882 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -327,15 +327,14 @@ class LLButton
 	LLUIColor					mImageColor;
 	LLUIColor					mDisabledImageColor;
 
-	BOOL						mIsToggle;
-	BOOL						mScaleImage;
+	bool						mIsToggle;
+	bool						mScaleImage;
 
-	BOOL						mDropShadowedText;
-	BOOL						mAutoResize;
-	BOOL						mUseEllipses;
-	BOOL						mBorderEnabled;
-
-	BOOL						mFlashing;
+	bool						mDropShadowedText;
+	bool						mAutoResize;
+	bool						mUseEllipses;
+	bool						mBorderEnabled;
+	bool						mFlashing;
 
 	LLFontGL::HAlign			mHAlign;
 	S32							mLeftHPad;
@@ -355,9 +354,9 @@ class LLButton
 	F32							mHoverGlowStrength;
 	F32							mCurGlowStrength;
 
-	BOOL						mNeedsHighlight;
-	BOOL						mCommitOnReturn;
-	BOOL						mFadeWhenDisabled;
+	bool						mNeedsHighlight;
+	bool						mCommitOnReturn;
+	bool						mFadeWhenDisabled;
 	bool						mForcePressedState;
 
 	LLFrameTimer				mFlashingTimer;
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index a250404292aab6b9e91cf67893fdf54a43da2bf9..0d1f608e61b6ba1f2b482bfacd142c3996346980 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -55,6 +55,7 @@ LLLayoutPanel::LLLayoutPanel(const Params& p)
  	mMaxDim(p.max_dim), 
  	mAutoResize(p.auto_resize),
  	mUserResize(p.user_resize),
+	mFitContent(p.fit_content),
 	mCollapsed(FALSE),
 	mCollapseAmt(0.f),
 	mVisibleAmt(1.f), // default to fully visible
@@ -104,6 +105,14 @@ F32 LLLayoutPanel::getCollapseFactor(LLLayoutStack::ELayoutOrientation orientati
 	}
 }
 
+void LLLayoutPanel::fitToContent()
+{
+	if (mFitContent)
+	{
+		setShape(calcBoundingRect());
+	}
+}
+
 //
 // LLLayoutStack
 //
@@ -324,6 +333,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
 	for (panel_it = mPanels.begin(); panel_it != mPanels.end();	++panel_it)
 	{
 		LLLayoutPanel* panelp = (*panel_it);
+		panelp->fitToContent();
 		if (panelp->getVisible()) 
 		{
 			if (mAnimate)
@@ -478,7 +488,9 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
 				{
 					// shrink proportionally to amount over minimum
 					// so we can do this in one pass
-					delta_size = (shrink_headroom_available > 0) ? llround((F32)pixels_to_distribute * ((F32)(cur_width - relevant_min) / (F32)shrink_headroom_available)) : 0;
+					delta_size = (shrink_headroom_available > 0) 
+						? llround((F32)pixels_to_distribute * ((F32)(cur_width - relevant_min) / (F32)shrink_headroom_available)) 
+						: 0;
 					shrink_headroom_available -= (cur_width - relevant_min);
 				}
 				else
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index d8ef0aeaca39c274a5c7ff7e8dc9b2fd12405a52..2ed32a2fa9fe0a3365a1153d05663ad63d0123ce 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -161,14 +161,16 @@ friend class LLUICtrlFactory;
 								min_dim,
 								max_dim;
 		Optional<bool>			user_resize,
-								auto_resize;
+								auto_resize,
+								fit_content;
 
 		Params()
 		:	expanded_min_dim("expanded_min_dim", 0),
 			min_dim("min_dim", 0),
 			max_dim("max_dim", 0),
 			user_resize("user_resize", true),
-			auto_resize("auto_resize", true)
+			auto_resize("auto_resize", true),
+			fit_content("fit_content", false)
 		{
 			addSynonym(min_dim, "min_width");
 			addSynonym(min_dim, "min_height");
@@ -206,18 +208,20 @@ friend class LLUICtrlFactory;
 	LLLayoutPanel(const Params& p);
 	
 	F32 getCollapseFactor(LLLayoutStack::ELayoutOrientation orientation);
+	void fitToContent();
 
-	bool mExpandedMinDimSpecified;
-	S32 mExpandedMinDim;
+	bool	mExpandedMinDimSpecified;
+	S32		mExpandedMinDim;
 	
-	S32 mMinDim;
-	S32 mMaxDim;
-	BOOL mAutoResize;
-	BOOL mUserResize;
-	BOOL mCollapsed;
+	S32		mMinDim;
+	S32		mMaxDim;
+	bool	mAutoResize;
+	bool	mUserResize;
+	bool	mCollapsed;
+	bool	mFitContent;
+	F32		mVisibleAmt;
+	F32		mCollapseAmt;
 	class LLResizeBar* mResizeBar;
-	F32 mVisibleAmt;
-	F32 mCollapseAmt;
 };
 
 
diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index 0356fd5c8aa9b957a58dfb88b00b24d1ccbeeecb..cdd3a502053e6c7f6869f598a03242e8b7d9b58a 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -41,37 +41,118 @@ LLToolBar::LLToolBar(const Params& p)
 :	LLUICtrl(p),
 	mOrientation(p.orientation),
 	mStack(NULL)
+{}
+
+void LLToolBar::initFromParams(const LLToolBar::Params& p)
 {
+	LLLayoutStack::Params centering_stack_p;
+	centering_stack_p.rect = getLocalRect();
+	centering_stack_p.follows.flags = FOLLOWS_ALL;
+	centering_stack_p.orientation = p.orientation;
+	centering_stack_p.name = "centering_stack";
 
-}
+	LLLayoutPanel::Params border_panel_p;
+	border_panel_p.name = "border_panel";
+	border_panel_p.rect = getLocalRect();
+	border_panel_p.auto_resize = true;
+	border_panel_p.user_resize = false;
 
-void LLToolBar::draw()
-{
-	gl_rect_2d(getLocalRect(), LLColor4::blue, TRUE);
-}
+	LLLayoutStack* centering_stack = LLUICtrlFactory::create<LLLayoutStack>(centering_stack_p);
+	addChild(centering_stack);
+	
+	LLLayoutPanel::Params center_panel_p;
+	center_panel_p.name = "center_panel";
+	center_panel_p.rect = getLocalRect();
+	center_panel_p.auto_resize = false;
+	center_panel_p.user_resize = false;
+	center_panel_p.fit_content = true;
+
+	centering_stack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p));
+	LLLayoutPanel* center_panel = LLUICtrlFactory::create<LLLayoutPanel>(center_panel_p);
+	centering_stack->addChild(center_panel);
+	centering_stack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p));
 
-void LLToolBar::initFromParams(const LLToolBar::Params& p)
-{
 	LLLayoutStack::Params stack_p;
 	stack_p.rect = getLocalRect();
-	stack_p.follows.flags = FOLLOWS_ALL;
 	stack_p.name = "button_stack";
 	stack_p.orientation = p.orientation;
+	stack_p.follows.flags = (mOrientation == LLLayoutStack::HORIZONTAL)
+							? (FOLLOWS_TOP|FOLLOWS_BOTTOM)  // horizontal
+							: (FOLLOWS_LEFT|FOLLOWS_RIGHT); // vertical
 
 	mStack = LLUICtrlFactory::create<LLLayoutStack>(stack_p);
-	addChild(mStack);
+	center_panel->addChild(mStack);
 
-	BOOST_FOREACH (LLButton::Params button_p, p.buttons)
+	BOOST_FOREACH (LLToolBarButton::Params button_p, p.buttons)
 	{
-		LLLayoutPanel::Params panel_p;
-		panel_p.name = button_p.name() + "_panel";
-		panel_p.rect = button_p.rect;
-		panel_p.user_resize = false;
-		panel_p.auto_resize= false;
-
-		LLLayoutPanel* panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
-		LLButton* button = LLUICtrlFactory::create<LLButton>(button_p);
-		panel->addChild(button);
-		mStack->addChild(panel);
+		// remove any offset from button
+		LLRect button_rect(button_p.rect);
+
+		if (mOrientation == LLLayoutStack::HORIZONTAL)
+		{
+			button_rect.setOriginAndSize(0, 0, 0, getRect().getHeight());
+		}
+		else // VERTICAL
+		{
+			button_rect.setOriginAndSize(0, 0, 0, button_rect.getHeight());
+		}
+		button_p.follows.flags = FOLLOWS_NONE;
+		button_p.rect = button_rect;
+		button_p.chrome = true;
+		button_p.auto_resize = true;
+
+		LLToolBarButton* button = LLUICtrlFactory::create<LLToolBarButton>(button_p);
+
+		addButton(button);
 	}
+
+	updateLayout();
+}
+
+void LLToolBar::addButton(LLToolBarButton* buttonp)
+{
+	LLLayoutPanel::Params panel_p;
+	panel_p.name = buttonp->getName() + "_panel";
+	panel_p.user_resize = false;
+	panel_p.auto_resize= false;
+	panel_p.fit_content = true;
+
+	LLLayoutPanel* panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
+	
+	panel->addChild(buttonp);
+	mStack->addChild(panel);
+	mButtons.push_back(buttonp);
 }
+
+void LLToolBar::updateLayout()
+{
+	S32 total_width = 0;
+	S32 total_height = 0;
+	S32 max_width = getRect().getWidth();
+	S32 max_height = getRect().getHeight();
+
+	BOOST_FOREACH(LLToolBarButton* button, mButtons)
+	{
+		total_width += button->getRect().getWidth();
+		total_height += button->getRect().getHeight();
+		max_width = llmax(button->getRect().getWidth(), max_width);
+		max_height = llmax(button->getRect().getHeight(), max_height);
+	}
+
+	if (mOrientation == LLLayoutStack::HORIZONTAL)
+	{
+		mStack->reshape(total_width, mStack->getParent()->getRect().getHeight());
+	}
+	else
+	{
+		mStack->reshape(mStack->getParent()->getRect().getWidth(), total_height);
+		reshape(max_width, getRect().getHeight());
+	}
+}
+
+
+void LLToolBar::draw()
+{
+	LLUICtrl::draw();
+}
+
diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h
index dd454e3f0be9723a3a0a7a42939d7a68c2707a8d..fb03095c566ade98ca41a81105eb55c2f60a736e 100644
--- a/indra/llui/lltoolbar.h
+++ b/indra/llui/lltoolbar.h
@@ -32,28 +32,44 @@
 #include "lllayoutstack.h"
 #include "llbutton.h"
 
+class LLToolBarButton : public LLButton
+{
+public:
+	struct Params : public LLInitParam::Block<Params, LLButton::Params>
+	{
+	};
+
+	LLToolBarButton(const Params& p) : LLButton(p) {}
+
+};
+
 class LLToolBar
 :	public LLUICtrl
 {
 public:
+
 	struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
 	{
-		Mandatory<LLLayoutStack::ELayoutOrientation>	orientation;
-		Multiple<LLButton::Params>						buttons;
+		Mandatory<LLLayoutStack::ELayoutOrientation, 
+				LLLayoutStack::OrientationNames>		orientation;
+		Multiple<LLToolBarButton::Params>				buttons;
 
 		Params();
 	};
 
-	void draw();
+	/*virtual*/ void draw();
 
 protected:
 	friend class LLUICtrlFactory;
 	LLToolBar(const Params&);
 	void initFromParams(const Params&);
+	void addButton(LLToolBarButton* buttonp);
+	void updateLayout();
 
 private:
-	LLLayoutStack::ELayoutOrientation mOrientation;
-	LLLayoutStack* mStack;
+	LLLayoutStack::ELayoutOrientation	mOrientation;
+	LLLayoutStack*						mStack;
+	std::list<LLToolBarButton*>			mButtons;
 };
 
 
diff --git a/indra/newview/skins/default/xui/en/floater_test_toolbar.xml b/indra/newview/skins/default/xui/en/floater_test_toolbar.xml
new file mode 100644
index 0000000000000000000000000000000000000000..55cfd462acc6f1725876976afabe5496a2a6a94e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_test_toolbar.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ height="500"
+ layout="topleft"
+ name="floater_test_toolbar"
+ translate="false"
+ width="500">
+  <toolbar name="test_toolbar_horizontal"
+           follows="left|right|top"
+           height="50"
+           width="500"
+           left="0"
+           top="20"
+           orientation="horizontal">
+    <button width="0"
+            auto_resize="true"
+            label="Button 1"/>
+    <button width="0"
+            auto_resize="true"
+            label="Button with long label"/>
+    <button width="0"
+            auto_resize="true"
+            label="Button with longest label of all"/>
+  </toolbar>
+  <toolbar name="test_toolbar_vertical"
+           follows="left|bottom|top"
+           height="430"
+           width="100"
+           left="0"
+           top="70"
+           orientation="vertical">
+    <button height="30"
+            label="Button 1"/>
+    <button height="50"
+            label="Button 2"/>
+    <button height="60"
+            label="Button 3"/>
+  </toolbar>
+
+</floater>