diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index c8ec607f7851e9ec29ac9058198727c63ab12320..c8af7447dd40a6347bd55f543cc84edc822eaf97 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -77,6 +77,7 @@ LLButton::Params::Params()
 	image_pressed_selected("image_pressed_selected"),
 	image_overlay("image_overlay"),
 	image_overlay_alignment("image_overlay_alignment", std::string("center")),
+	image_overlay_enable("image_overlay_enable", true),
 	image_top_pad("image_top_pad"),
 	image_bottom_pad("image_bottom_pad"),
 	imgoverlay_label_space("imgoverlay_label_space", 1),
@@ -129,6 +130,7 @@ LLButton::LLButton(const LLButton::Params& p)
 	mGLFont(p.font),
 	mHeldDownDelay(p.held_down_delay.seconds),			// seconds until held-down callback is called
 	mHeldDownFrameDelay(p.held_down_delay.frames),
+	mImageOverlayEnable(p.image_overlay_enable),
 	mImageUnselected(p.image_unselected),
 	mImageSelected(p.image_selected),
 	mImageDisabled(p.image_disabled),
@@ -847,7 +849,7 @@ void LLButton::draw()
 	S32 text_width = getRect().getWidth() - mLeftHPad - mRightHPad;
 
 	// draw overlay image
-	if (mImageOverlay.notNull())
+	if (mImageOverlayEnable && mImageOverlay.notNull())
 	{
 		// get max width and height (discard level 0)
 		S32 overlay_width;
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 7629ed1fea8d01865ef8a8abbc564252b8551fa0..e5bccfe725093214c222d705832a33929afd1429 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -87,7 +87,8 @@ class LLButton
 								image_overlay;
 
 		Optional<std::string>	image_overlay_alignment;
-		
+		Optional<bool>			image_overlay_enable;
+
 		// colors
 		Optional<LLUIColor>		label_color,
 								label_color_selected,
@@ -307,6 +308,7 @@ class LLButton
 	S32							mHeldDownFrameDelay;	// frames, after which held-down callbacks get called
 	S32							mLastDrawCharsCount;
 
+	bool					mImageOverlayEnable;
 	LLPointer<LLUIImage>		mImageOverlay;
 	LLFontGL::HAlign			mImageOverlayAlignment;
 	LLUIColor					mImageOverlayColor;
diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index 89a33b7b6728c8f4313393256ec5dd9e466cd0f5..57316e9138de57e7153e56e52c6c3455afa2c59e 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -27,7 +27,6 @@
 
 #include "linden_common.h"
 
-#include <boost/foreach.hpp>
 #include "lltoolbar.h"
 
 #include "llcommandmanager.h"
@@ -64,6 +63,8 @@ namespace LLInitParam
 	{
 		declare("icons_with_text",	BTNTYPE_ICONS_WITH_TEXT);
 		declare("icons_only",		BTNTYPE_ICONS_ONLY);
+		declare("icons_only_small",	BTNTYPE_ICONS_ONLY_SMALL);
+		declare("text_only",		BTNTYPE_TEXT_ONLY);
 	}
 
 	void TypeValues<SideType>::declareValues()
@@ -73,14 +74,24 @@ namespace LLInitParam
 		declare("right",	SIDE_RIGHT);
 		declare("top",		SIDE_TOP);
 	}
+	
+	void TypeValues<LayoutType>::declareValues()
+	{
+		declare("none",		LAYOUT_NONE);
+		declare("left",		LAYOUT_LEFT);
+		declare("right",	LAYOUT_RIGHT);
+		declare("fill",		LAYOUT_FILL);
+	}
 }
 
 LLToolBar::Params::Params()
 :	button_display_mode("button_display_mode"),
-	commands("command"),
 	side("side", SIDE_TOP),
+	button_layout_mode("button_layout_mode", LLToolBarEnums::LAYOUT_NONE),
 	button_icon("button_icon"),
+	button_icon_small("button_icon_small"),
 	button_icon_and_text("button_icon_and_text"),
+	button_text("button_text"),
 	read_only("read_only", false),
 	wrap("wrap", true),
 	pad_left("pad_left"),
@@ -89,40 +100,48 @@ LLToolBar::Params::Params()
 	pad_bottom("pad_bottom"),
 	pad_between("pad_between"),
 	min_girth("min_girth"),
+	commands("command"),
 	button_panel("button_panel")
 {}
 
 LLToolBar::LLToolBar(const LLToolBar::Params& p)
 :	LLUICtrl(p),
 	mReadOnly(p.read_only),
-	mButtonType(p.button_display_mode),
 	mSideType(p.side),
 	mWrap(p.wrap),
-	mNeedsLayout(false),
-	mModified(false),
-	mButtonPanel(NULL),
-	mCenteringStack(NULL),
 	mPadLeft(p.pad_left),
 	mPadRight(p.pad_right),
 	mPadTop(p.pad_top),
 	mPadBottom(p.pad_bottom),
 	mPadBetween(p.pad_between),
 	mMinGirth(p.min_girth),
-	mPopupMenuHandle(),
-	mRightMouseTargetButton(NULL),
 	mStartDragItemCallback(NULL),
 	mHandleDragItemCallback(NULL),
 	mHandleDropCallback(NULL),
+	mDragAndDropTarget(false),
+	mDragRank(0),
+	mDragx(0),
+	mDragy(0),
+	mDragGirth(0),
+	mButtonType(p.button_display_mode),
+	mLayoutType(p.button_layout_mode),
+	mCenteringStack(nullptr),
+	mCenterPanel(nullptr),
+	mButtonPanel(nullptr),
+	mPopupMenuHandle(),
+	mRightMouseTargetButton(nullptr),
+	mNeedsLayout(false),
+	mModified(false),
 	mButtonAddSignal(NULL),
 	mButtonEnterSignal(NULL),
 	mButtonLeaveSignal(NULL),
 	mButtonRemoveSignal(NULL),
-	mDragAndDropTarget(false),
-	mCaretIcon(NULL),
-	mCenterPanel(NULL)
+	mCaretIcon(nullptr)
 {
 	mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_WITH_TEXT] = p.button_icon_and_text;
 	mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_ONLY] = p.button_icon;
+	mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_ONLY_SMALL] = p.button_icon_small;
+	mButtonParams[LLToolBarEnums::BTNTYPE_TEXT_ONLY] = p.button_text;
 }
 
 LLToolBar::~LLToolBar()
@@ -146,12 +165,15 @@ void LLToolBar::createContextMenu()
 		// Setup bindings specific to this instance for the context menu options
 
 		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar commit_reg;
-		commit_reg.add("Toolbars.EnableSetting", boost::bind(&LLToolBar::onSettingEnable, this, _2));
+		commit_reg.add("Toolbars.EnableSetting", boost::bind(&LLToolBar::onButtonTypeChanged, this, _2));
+		commit_reg.add("Toolbars.ChangeLayout", boost::bind(&LLToolBar::onLayoutChanged, this, _2));
 		commit_reg.add("Toolbars.RemoveSelectedCommand", boost::bind(&LLToolBar::onRemoveSelectedCommand, this));
 
 		LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_reg;
-		enable_reg.add("Toolbars.CheckSetting", boost::bind(&LLToolBar::isSettingChecked, this, _2));
-
+		enable_reg.add("Toolbars.CheckSetting", boost::bind(&LLToolBar::isButtonTypeChecked, this, _2));
+		enable_reg.add("Toolbars.CheckLayout", boost::bind(&LLToolBar::isLayoutChecked, this, _2));
+		enable_reg.add("Toolbars.CheckOrientation", boost::bind(&LLToolBar::checkOrientation, this, _2));
+		
 		// Create the context menu
 		llassert(LLMenuGL::sMenuContainer != NULL);
 		LLContextMenu* menu = LLUICtrlFactory::instance().createFromFile<LLContextMenu>("menu_toolbars.xml", LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
@@ -193,13 +215,14 @@ void LLToolBar::initFromParams(const LLToolBar::Params& p)
 	addChild(mCenteringStack);
 	
 	LLLayoutPanel::Params border_panel_p;
-	border_panel_p.name = "border_panel";
+	border_panel_p.name = "border_panel_left_top";
 	border_panel_p.rect = getLocalRect();
 	border_panel_p.auto_resize = true;
 	border_panel_p.user_resize = false;
 	border_panel_p.mouse_opaque = false;
 	
-	mCenteringStack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p));
+	mLeftTopPanel = LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p);
+    mCenteringStack->addChild(mLeftTopPanel);
 
 	LLLayoutPanel::Params center_panel_p;
 	center_panel_p.name = "center_panel";
@@ -217,9 +240,11 @@ void LLToolBar::initFromParams(const LLToolBar::Params& p)
 	mCenterPanel->setButtonPanel(mButtonPanel);
 	mCenterPanel->addChild(mButtonPanel);
 	
-	mCenteringStack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p));
+	border_panel_p.name = "border_panel_right_bottom";
+	mRightBottomPanel = LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p);
+    mCenteringStack->addChild(mRightBottomPanel);
 
-	BOOST_FOREACH(LLCommandId id, p.commands)
+	for (LLCommandId id : p.commands)
 	{
 		addCommand(id);
 	}
@@ -417,7 +442,7 @@ BOOL LLToolBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
 		// Determine which button the mouse was over during the click in case the context menu action
 		// is intended to affect the button.
 		mRightMouseTargetButton = NULL;
-		BOOST_FOREACH(LLToolBarButton* button, mButtons)
+		for (LLToolBarButton* button : mButtons)
 		{
 			LLRect button_rect;
 			button->localRectToOtherView(button->getLocalRect(), &button_rect, this);
@@ -444,7 +469,7 @@ BOOL LLToolBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
 	return handle_it_here;
 }
 
-BOOL LLToolBar::isSettingChecked(const LLSD& userdata)
+BOOL LLToolBar::isButtonTypeChecked(const LLSD& userdata)
 {
 	BOOL retval = FALSE;
 
@@ -458,11 +483,19 @@ BOOL LLToolBar::isSettingChecked(const LLSD& userdata)
 	{
 		retval = (mButtonType == BTNTYPE_ICONS_ONLY);
 	}
+	else if (setting_name == "icons_only_small")
+	{
+		retval = (mButtonType == BTNTYPE_ICONS_ONLY_SMALL);
+	}
+	else if (setting_name == "text_only")
+	{
+		retval = (mButtonType == BTNTYPE_TEXT_ONLY);
+	}
 
 	return retval;
 }
 
-void LLToolBar::onSettingEnable(const LLSD& userdata)
+void LLToolBar::onButtonTypeChanged(const LLSD& userdata)
 {
 	llassert(!mReadOnly);
 
@@ -476,6 +509,81 @@ void LLToolBar::onSettingEnable(const LLSD& userdata)
 	{
 		setButtonType(BTNTYPE_ICONS_ONLY);
 	}
+	else if (setting_name == "icons_only_small")
+	{
+		setButtonType(BTNTYPE_ICONS_ONLY_SMALL);
+	}
+	else if (setting_name == "text_only")
+	{
+		setButtonType(BTNTYPE_TEXT_ONLY);
+	}
+}
+
+BOOL LLToolBar::isLayoutChecked(const LLSD& userdata)
+{
+	BOOL retval = FALSE;
+	
+	const std::string& layout_name = userdata.asString();
+	
+	if (layout_name == "fill")
+	{
+		retval = (mLayoutType == LAYOUT_FILL);
+	}
+    else if (layout_name == "left")
+    {
+        retval = (mLayoutType == LAYOUT_LEFT);
+    }
+    else if (layout_name == "right")
+    {
+        retval = (mLayoutType == LAYOUT_RIGHT);
+    }
+	else if (layout_name == "none")
+	{
+		retval = (mLayoutType == LAYOUT_NONE);
+	}
+	
+	return retval;
+}
+
+BOOL LLToolBar::checkOrientation(const LLSD& userdata) const
+{
+	switch (getOrientation(mSideType))
+	{
+		case LLLayoutStack::HORIZONTAL:
+			return userdata.asString() == "horizontal";
+		case LLLayoutStack::VERTICAL:
+			return userdata.asString() == "vertical";
+		default:
+			return FALSE;
+	}
+}
+
+void LLToolBar::onLayoutChanged(const LLSD& userdata)
+{
+	llassert(!mReadOnly);
+	
+	const std::string& layout_name = userdata.asString();
+	
+	if (layout_name == "fill")
+	{
+		setLayoutType(LAYOUT_FILL);
+	}
+    else if (layout_name == "left")
+    {
+        setLayoutType(LAYOUT_LEFT);
+    }
+    else if (layout_name == "right")
+    {
+        setLayoutType(LAYOUT_RIGHT);
+    }
+	else if (layout_name == "none")
+	{
+		setLayoutType(LAYOUT_NONE);
+	}
+	else
+	{
+		LL_WARNS("Toolbar") << "Unrecognized layout '" << layout_name << "'" << LL_ENDL;
+	}
 }
 
 void LLToolBar::onRemoveSelectedCommand()
@@ -502,10 +610,16 @@ void LLToolBar::setButtonType(LLToolBarEnums::ButtonType button_type)
 	}
 }
 
+void LLToolBar::setLayoutType(LLToolBarEnums::LayoutType layout_type)
+{
+	mLayoutType = layout_type;
+	mNeedsLayout = true;
+}
+
 void LLToolBar::resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row, S32 max_row_girth)
 {
 	// make buttons in current row all same girth
-	BOOST_FOREACH(LLToolBarButton* button, buttons_in_row)
+	for (LLToolBarButton* button : buttons_in_row)
 	{
 		if (getOrientation(mSideType) == LLLayoutStack::HORIZONTAL)
 		{
@@ -692,13 +806,47 @@ void LLToolBar::updateLayoutAsNeeded()
 	LLRect panel_rect = mButtonPanel->getLocalRect();
 
 	std::vector<LLToolBarButton*> buttons_in_row;
+	S32 equalized_width = 0;
 
-	BOOST_FOREACH(LLToolBarButton* button, mButtons)
+	switch (mLayoutType)
+	{
+		case LLToolBarEnums::LAYOUT_FILL:
+			if (!mButtons.empty())
+			{
+				equalized_width = (max_length - mPadBetween * (mButtons.size() + 1)) / mButtons.size();
+			}
+			break;
+        case LLToolBarEnums::LAYOUT_LEFT:
+            mLeftTopPanel->setVisible(false);
+            mRightBottomPanel->setVisible(true);
+            break;
+        case LLToolBarEnums::LAYOUT_RIGHT:
+            mLeftTopPanel->setVisible(true);
+            mRightBottomPanel->setVisible(false);
+            break;
+		case LLToolBarEnums::LAYOUT_NONE:
+            mLeftTopPanel->setVisible(true);
+            mRightBottomPanel->setVisible(true);
+			break;
+	}
+	
+	for (LLToolBarButton* button : mButtons)
 	{
-		button->reshape(button->mWidthRange.getMin(), button->mDesiredHeight);
+		if (equalized_width)
+		{
+			button->mWidthRange.setRange(button->mWidthRange.getMin(), equalized_width);
+			button->reshape(equalized_width, button->mDesiredHeight);
+		}
+		else
+		{
+			button->reshape(button->mWidthRange.getMin(), button->mDesiredHeight);
+		}
 		button->autoResize();
 
-		S32 button_clamped_width = button->mWidthRange.clamp(button->getRect().getWidth());
+		S32 button_clamped_width = equalized_width ? equalized_width
+				: button->mWidthRange.clamp(button->getRect().getWidth());
+		
+		
 		S32 button_length = (orientation == LLLayoutStack::HORIZONTAL)
 							? button_clamped_width
 							: button->getRect().getHeight();
@@ -707,8 +855,8 @@ void LLToolBar::updateLayoutAsNeeded()
 							: button_clamped_width;
 		
 		// wrap if needed
-		if (mWrap
-			&& row_running_length + button_length > max_length	// out of room...
+		if (mWrap && mLayoutType != LAYOUT_FILL					// if we aren't trying to fill the bar
+			&& row_running_length + button_length > max_length	// ...and out of room...
 			&& cur_start != row_pad_start)						// ...and not first button in row
 		{
 			if (orientation == LLLayoutStack::VERTICAL)
@@ -753,7 +901,10 @@ void LLToolBar::updateLayoutAsNeeded()
 	
 	max_row_length = llmax(max_row_length, row_running_length - mPadBetween + row_pad_end);
 
-	resizeButtonsInRow(buttons_in_row, max_row_girth);
+	if (equalized_width == 0)
+	{
+		resizeButtonsInRow(buttons_in_row, max_row_girth);
+	}
 
 	// grow and optionally shift toolbar to accommodate buttons
 	if (orientation == LLLayoutStack::HORIZONTAL)
@@ -878,7 +1029,7 @@ void LLToolBar::createButtons()
 {
 	std::set<LLUUID> set_flashing;
 
-	BOOST_FOREACH(LLToolBarButton* button, mButtons)
+	for (LLToolBarButton* button : mButtons)
 	{
         if (button->getFlashTimer() && button->getFlashTimer()->isFlashingInProgress())
         {
@@ -896,7 +1047,7 @@ void LLToolBar::createButtons()
 	mButtonMap.clear();
 	mRightMouseTargetButton = NULL;
 	
-	BOOST_FOREACH(LLCommandId& command_id, mButtonCommands)
+	for (LLCommandId& command_id : mButtonCommands)
 	{
 		LLToolBarButton* button = createButton(command_id);
 		mButtons.push_back(button);
diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h
index 6ba3c662d414d40356f25f973f0a77933a0b6645..1b218e2f141d22d8ca60d3b94b5ec91613618a6d 100644
--- a/indra/llui/lltoolbar.h
+++ b/indra/llui/lltoolbar.h
@@ -43,7 +43,7 @@ typedef boost::function<void (S32 x, S32 y, LLToolBarButton* button)> tool_start
 typedef boost::function<BOOL (S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type)> tool_handledrag_callback_t;
 typedef boost::function<BOOL (void* data, S32 x, S32 y, LLToolBar* toolbar)> tool_handledrop_callback_t;
 
-class LLToolBarButton : public LLButton
+class LLToolBarButton final : public LLButton
 {
 	friend class LLToolBar;
 public:
@@ -113,6 +113,8 @@ namespace LLToolBarEnums
 	{
 		BTNTYPE_ICONS_WITH_TEXT = 0,
 		BTNTYPE_ICONS_ONLY,
+		BTNTYPE_ICONS_ONLY_SMALL,
+		BTNTYPE_TEXT_ONLY,
 
 		BTNTYPE_COUNT
 	};
@@ -124,6 +126,14 @@ namespace LLToolBarEnums
 		SIDE_RIGHT,
 		SIDE_TOP,
 	};
+	
+	enum LayoutType
+	{
+		LAYOUT_NONE,
+		LAYOUT_LEFT,
+		LAYOUT_RIGHT,
+		LAYOUT_FILL
+	};
 
 	enum EToolBarLocation
 	{
@@ -156,10 +166,16 @@ namespace LLInitParam
 	{
 		static void declareValues();
 	};
+	
+	template<>
+	struct TypeValues<LLToolBarEnums::LayoutType> : public TypeValuesHelper<LLToolBarEnums::LayoutType>
+	{
+		static void declareValues();
+	};
 }
 
 
-class LLToolBar
+class LLToolBar final 
 :	public LLUICtrl
 {
 	friend class LLToolBarButton;
@@ -171,7 +187,7 @@ class LLToolBar
 		typedef boost::function<void(LLToolBarEnums::EToolBarLocation tb, const LLRect& rect)> reshape_callback_t;
 
 		virtual ~LLCenterLayoutPanel() {}
-		/*virtual*/ void handleReshape(const LLRect& rect, bool by_user);
+		/*virtual*/ void handleReshape(const LLRect& rect, bool by_user) override;
 
 		void setLocationId(LLToolBarEnums::EToolBarLocation id) { mLocationId = id; }
 		void setReshapeCallback(reshape_callback_t cb) { mReshapeCallback = cb; }
@@ -179,7 +195,7 @@ class LLToolBar
 
 	protected:
 		friend class LLUICtrlFactory;
-		LLCenterLayoutPanel(const Params& params) : LLLayoutPanel(params), mButtonPanel(NULL) {}
+		LLCenterLayoutPanel(const Params& params) : LLLayoutPanel(params), mLocationId(LLToolBarEnums::TOOLBAR_NONE), mButtonPanel(nullptr) {}
 
 	private:
 		reshape_callback_t					mReshapeCallback;
@@ -191,10 +207,14 @@ class LLToolBar
 	{
 		Mandatory<LLToolBarEnums::ButtonType>	button_display_mode;
 		Mandatory<LLToolBarEnums::SideType>		side;
+		
+		Optional<LLToolBarEnums::LayoutType>	button_layout_mode;
 
 		Optional<LLToolBarButton::Params>		button_icon,
-												button_icon_and_text;
-
+												button_icon_small,
+												button_icon_and_text,
+												button_text;
+		
 		Optional<bool>							read_only,
 												wrap;
 
@@ -214,14 +234,14 @@ class LLToolBar
 	};
 
 	// virtuals
-	void draw();
-	void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
-	BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
-	virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+	void draw() override;
+	void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE) override;
+	BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override;
+	BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 								   EDragAndDropType cargo_type,
 								   void* cargo_data,
 								   EAcceptance* accept,
-								   std::string& tooltip_msg);
+								   std::string& tooltip_msg) override;
 	
 	static const int RANK_NONE = -1;
 	bool addCommand(const LLCommandId& commandId, int rank = RANK_NONE);
@@ -251,13 +271,16 @@ class LLToolBar
 	LLToolBarEnums::SideType getSideType() const { return mSideType; }
 	bool hasButtons() const { return !mButtons.empty(); }
 	bool isModified() const { return mModified; }
+	BOOL checkOrientation(const LLSD& userdata) const;
 
 	int  getRankFromPosition(S32 x, S32 y);	
 	int  getRankFromPosition(const LLCommandId& id);	
 
 	// Methods used in loading and saving toolbar settings
 	void setButtonType(LLToolBarEnums::ButtonType button_type);
-	LLToolBarEnums::ButtonType getButtonType() { return mButtonType; }
+	void setLayoutType(LLToolBarEnums::LayoutType layout_type);
+	LLToolBarEnums::ButtonType getButtonType() const { return mButtonType; }
+	LLToolBarEnums::LayoutType getLayoutType() const { return mLayoutType; }
 	command_id_list_t& getCommandsList() { return mButtonCommands; }
 	void clearCommandsList();
 
@@ -271,8 +294,10 @@ class LLToolBar
 	void updateLayoutAsNeeded();
 	void createButtons();
 	void resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row, S32 max_row_girth);
-	BOOL isSettingChecked(const LLSD& userdata);
-	void onSettingEnable(const LLSD& userdata);
+	BOOL isButtonTypeChecked(const LLSD& userdata);
+	void onButtonTypeChanged(const LLSD& userdata);
+	BOOL isLayoutChecked(const LLSD& userdata);
+	void onLayoutChanged(const LLSD& userdata);
 	void onRemoveSelectedCommand();
 
 private:
@@ -304,10 +329,13 @@ class LLToolBar
 	command_id_map					mButtonMap;
 
 	LLToolBarEnums::ButtonType		mButtonType;
+	LLToolBarEnums::LayoutType		mLayoutType;
 	LLToolBarButton::Params			mButtonParams[LLToolBarEnums::BTNTYPE_COUNT];
 
 	// related widgets
 	LLLayoutStack*					mCenteringStack;
+    LLLayoutPanel*                  mLeftTopPanel;
+    LLLayoutPanel*                  mRightBottomPanel;
 	LLCenterLayoutPanel*			mCenterPanel;
 	LLPanel*						mButtonPanel;
 	LLHandle<class LLContextMenu>	mPopupMenuHandle;
diff --git a/indra/newview/app_settings/toolbars.xml b/indra/newview/app_settings/toolbars.xml
index eec0d81e8b001a7e5ed3aaa4127b43d00866fa24..72531ba4a188f6d97fd75494961e556e382219c1 100644
--- a/indra/newview/app_settings/toolbars.xml
+++ b/indra/newview/app_settings/toolbars.xml
@@ -4,23 +4,21 @@
     button_display_mode="icons_with_text">
     <command name="chat"/>
     <command name="speak"/>
-    <command name="destinations"/>
     <command name="people"/>
     <command name="profile"/>
     <command name="move"/>
     <command name="view"/>
-    <command name="howto"/>
+    <command name="snapshot"/>
   </bottom_toolbar>
   <left_toolbar
-    button_display_mode="icons_only">
-    <command name="avatar"/>
+    button_display_mode="icons_only_small">
     <command name="appearance"/>
     <command name="inventory"/>
     <command name="search"/>
     <command name="places"/>
-    <command name="voice"/>
     <command name="minimap"/>
-    <command name="snapshot"/>
+    <command name="myenvironments"/>
+    <command name="stats"/>
   </left_toolbar>
   <right_toolbar
     button_display_mode="icons_only">
diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp
index e11f1bd00fae6a3e5df38307beeda33895d39502..9d14a548f9338394606f38554752c31aa86fa5f4 100644
--- a/indra/newview/lltoolbarview.cpp
+++ b/indra/newview/lltoolbarview.cpp
@@ -45,8 +45,6 @@
 #include "llfloaterreg.h"  // HACK for destinations guide on startup
 #include "llviewercontrol.h"  // HACK for destinations guide on startup
 
-#include <boost/foreach.hpp>
-
 LLToolBarView* gToolBarView = NULL;
 
 static LLDefaultChildRegistry::Register<LLToolBarView> r("toolbar_view");
@@ -58,6 +56,7 @@ bool isToolDragged()
 
 LLToolBarView::Toolbar::Toolbar()
 :	button_display_mode("button_display_mode"),
+	button_layout_mode("button_layout_mode"),
 	commands("command")
 {}
 
@@ -285,7 +284,12 @@ bool LLToolBarView::loadToolbars(bool force_default)
 			LLToolBarEnums::ButtonType button_type = toolbar_set.left_toolbar.button_display_mode;
 			mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->setButtonType(button_type);
 		}
-		BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.left_toolbar.commands)
+		if (toolbar_set.left_toolbar.button_layout_mode.isProvided())
+		{
+			LLToolBarEnums::LayoutType layout_type = toolbar_set.left_toolbar.button_layout_mode;
+			mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->setLayoutType(layout_type);
+		}
+		for (const LLCommandId::Params& command_params : toolbar_set.left_toolbar.commands)
 		{
 			if (!addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_LEFT]))
 			{
@@ -300,7 +304,12 @@ bool LLToolBarView::loadToolbars(bool force_default)
 			LLToolBarEnums::ButtonType button_type = toolbar_set.right_toolbar.button_display_mode;
 			mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->setButtonType(button_type);
 		}
-		BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.right_toolbar.commands)
+		if (toolbar_set.right_toolbar.button_layout_mode.isProvided())
+		{
+			LLToolBarEnums::LayoutType layout_type = toolbar_set.right_toolbar.button_layout_mode;
+			mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->setLayoutType(layout_type);
+		}
+		for (const LLCommandId::Params& command_params : toolbar_set.right_toolbar.commands)
 		{
 			if (!addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]))
 			{
@@ -315,7 +324,12 @@ bool LLToolBarView::loadToolbars(bool force_default)
 			LLToolBarEnums::ButtonType button_type = toolbar_set.bottom_toolbar.button_display_mode;
 			mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->setButtonType(button_type);
 		}
-		BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.bottom_toolbar.commands)
+		if (toolbar_set.bottom_toolbar.button_layout_mode.isProvided())
+		{
+			LLToolBarEnums::LayoutType layout_type = toolbar_set.bottom_toolbar.button_layout_mode;
+			mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->setLayoutType(layout_type);
+		}
+		for (const LLCommandId::Params& command_params : toolbar_set.bottom_toolbar.commands)
 		{
 			if (!addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]))
 			{
@@ -330,11 +344,11 @@ bool LLToolBarView::loadToolbars(bool force_default)
 			LLToolBarEnums::ButtonType button_type = toolbar_set.top_toolbar.button_display_mode;
 			mToolbars[LLToolBarEnums::TOOLBAR_TOP]->setButtonType(button_type);
 		}
-		//if (toolbar_set.top_toolbar.button_layout_mode.isProvided())
-		//{
-		//	LLToolBarEnums::LayoutType layout_type = toolbar_set.top_toolbar.button_layout_mode;
-		//	mToolbars[LLToolBarEnums::TOOLBAR_TOP]->setLayoutType(layout_type);
-		//}
+		if (toolbar_set.top_toolbar.button_layout_mode.isProvided())
+		{
+			LLToolBarEnums::LayoutType layout_type = toolbar_set.top_toolbar.button_layout_mode;
+			mToolbars[LLToolBarEnums::TOOLBAR_TOP]->setLayoutType(layout_type);
+		}
 		for (const LLCommandId::Params& command_params : toolbar_set.top_toolbar.commands)
 		{
 			if (addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_TOP]))
@@ -404,22 +418,25 @@ void LLToolBarView::saveToolbars() const
 	if (mToolbars[LLToolBarEnums::TOOLBAR_LEFT])
 	{
 		toolbar_set.left_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->getButtonType();
+		toolbar_set.left_toolbar.button_layout_mode = mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->getLayoutType();
 		addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->getCommandsList(), toolbar_set.left_toolbar);
 	}
 	if (mToolbars[LLToolBarEnums::TOOLBAR_RIGHT])
 	{
 		toolbar_set.right_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->getButtonType();
+		toolbar_set.right_toolbar.button_layout_mode = mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->getLayoutType();
 		addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->getCommandsList(), toolbar_set.right_toolbar);
 	}
 	if (mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM])
 	{
 		toolbar_set.bottom_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->getButtonType();
+		toolbar_set.bottom_toolbar.button_layout_mode = mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->getLayoutType();
 		addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->getCommandsList(), toolbar_set.bottom_toolbar);
 	}
 	if (mToolbars[LLToolBarEnums::TOOLBAR_TOP])
 	{
 		toolbar_set.top_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_TOP]->getButtonType();
-		//toolbar_set.top_toolbar.button_layout_mode = mToolbars[LLToolBarEnums::TOOLBAR_TOP]->getLayoutType();
+		toolbar_set.top_toolbar.button_layout_mode = mToolbars[LLToolBarEnums::TOOLBAR_TOP]->getLayoutType();
 		addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_TOP]->getCommandsList(), toolbar_set.top_toolbar);
 	}
 	
@@ -433,7 +450,7 @@ void LLToolBarView::saveToolbars() const
 	{
 		const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "toolbars.xml");
 		LLFILE *fp = LLFile::fopen(filename, "w");
-		if (fp != NULL)
+		if (fp != nullptr)
 		{
 			LLXMLNode::writeHeaderToFile(fp);
 			output_node->writeToFile(fp);
diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h
index a4f7039011a43da5b950c1464a623cc2e0738696..77e4116950d8bfb6663462f9c7c81f6e4425ef4a 100644
--- a/indra/newview/lltoolbarview.h
+++ b/indra/newview/lltoolbarview.h
@@ -52,6 +52,7 @@ class LLToolBarView : public LLUICtrl
 	struct Toolbar : public LLInitParam::Block<Toolbar>
 	{
 		Mandatory<LLToolBarEnums::ButtonType>	button_display_mode;
+		Optional<LLToolBarEnums::LayoutType>	button_layout_mode;
 		Multiple<LLCommandId::Params>	commands;
 
 		Toolbar();
diff --git a/indra/newview/skins/default/xui/en/menu_toolbars.xml b/indra/newview/skins/default/xui/en/menu_toolbars.xml
index fbe40a7244fcc47d89f297d99be9549b7283198c..f6c816a5f70de833e266a4b907bd3c8af3a4a728 100644
--- a/indra/newview/skins/default/xui/en/menu_toolbars.xml
+++ b/indra/newview/skins/default/xui/en/menu_toolbars.xml
@@ -32,4 +32,80 @@
     <on_check function="Toolbars.CheckSetting"
               parameter="icons_only" />
   </menu_item_check>
+  <menu_item_check label="Small Icons only"
+                   layout="topleft"
+                   name="icons_only_small">
+    <on_click function="Toolbars.EnableSetting"
+              parameter="icons_only_small" />
+    <on_check function="Toolbars.CheckSetting"
+              parameter="icons_only_small" />
+  </menu_item_check>
+  <menu_item_check label="Text only"
+                   layout="topleft"
+                   name="text_only">
+    <on_click function="Toolbars.EnableSetting"
+              parameter="text_only" />
+    <on_check function="Toolbars.CheckSetting"
+              parameter="text_only" />
+  </menu_item_check>
+  <menu_item_separator
+   name="layout_separator" />
+  <menu_item_check label="Buttons auto-layout"
+                   layout="topleft"
+                   name="autolayout">
+    <on_click function="Toolbars.ChangeLayout"
+              parameter="none" />
+    <on_check function="Toolbars.CheckLayout"
+              parameter="none" />
+  </menu_item_check>
+  <menu_item_check label="Buttons fill width"
+                   layout="topleft"
+                   name="filllayout">
+    <on_click function="Toolbars.ChangeLayout"
+              parameter="fill" />
+    <on_check function="Toolbars.CheckLayout"
+              parameter="fill" />
+	<on_visible function="Toolbars.CheckOrientation"
+			  parameter="horizontal" />
+  </menu_item_check>
+  <menu_item_check label="Buttons left align"
+                   layout="topleft"
+                   name="left_align">
+    <on_click function="Toolbars.ChangeLayout"
+              parameter="left" />
+    <on_check function="Toolbars.CheckLayout"
+              parameter="left" />
+    <on_visible function="Toolbars.CheckOrientation"
+          parameter="horizontal" />
+  </menu_item_check>
+  <menu_item_check label="Buttons right align"
+                 layout="topleft"
+                 name="right_align">
+    <on_click function="Toolbars.ChangeLayout"
+              parameter="right" />
+    <on_check function="Toolbars.CheckLayout"
+              parameter="right" />
+    <on_visible function="Toolbars.CheckOrientation"
+          parameter="horizontal" />
+  </menu_item_check>
+  <menu_item_check label="Buttons top aligned"
+                 layout="topleft"
+                 name="top_align">
+    <on_click function="Toolbars.ChangeLayout"
+              parameter="left" />
+    <on_check function="Toolbars.CheckLayout"
+              parameter="left" />
+    <on_visible function="Toolbars.CheckOrientation"
+          parameter="vertical" />
+  </menu_item_check>
+  <menu_item_check label="Buttons bottom aligned"
+                 layout="topleft"
+                 name="bottom_align">
+    <on_click function="Toolbars.ChangeLayout"
+              parameter="right" />
+    <on_check function="Toolbars.CheckLayout"
+              parameter="right" />
+    <on_visible function="Toolbars.CheckOrientation"
+          parameter="vertical" />
+  </menu_item_check>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/widgets/toolbar.xml b/indra/newview/skins/default/xui/en/widgets/toolbar.xml
index 0ace37a5dc10685e052652f87dc6a56a4741a63b..f60a8da1e62ad0a91502f35c49d4f48ed91a49c1 100644
--- a/indra/newview/skins/default/xui/en/widgets/toolbar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/toolbar.xml
@@ -54,4 +54,45 @@
                button_flash_count="4"
                button_flash_rate="0.5"
                flash_color="BeaconColor"/>
+  <button_icon_small pad_left="3"
+                     pad_right="3"
+                     image_bottom_pad="3"
+                     image_top_pad="3"
+                     image_pressed="PushButton_Press"
+                     image_pressed_selected="PushButton_Selected_Press"
+                     image_selected="PushButton_Selected_Press"
+                     image_disabled_selected="PushButton_Selected_Disabled"
+                     image_disabled="PushButton_Disabled"
+                     desired_height="30"
+                     button_width.min="30"
+                     button_width.max="30"
+                     follows="left|top"
+                     label=""
+                     halign="left"
+                     chrome="true"
+                     use_ellipses="true"
+                     auto_resize="true"
+                     button_flash_count="4"
+                     button_flash_rate="0.5"
+                     flash_color="BeaconColor"/>
+  <button_text label_color_selected="White"
+               halign="center"
+               image_pressed="PushButton_Press"
+               image_pressed_selected="PushButton_Selected_Press"
+               image_selected="PushButton_Selected_Press"
+               image_disabled_selected="PushButton_Selected_Disabled"
+               image_disabled="PushButton_Disabled"
+               button_width.min="63"
+               button_width.max="140"
+               desired_height="24"
+               pad_left="10"
+               pad_right="10"
+               follows="left|top"
+               chrome="true"
+               image_overlay_enable="false"
+               use_ellipses="true"
+               auto_resize="true"
+               button_flash_count="4"
+               button_flash_rate="0.5"
+               flash_color="BeaconColor"/>
 </toolbar>