diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index 31a18dc7073449acab47e6ae38970d3755222a78..a9513b759a88d7d1aa0f4ffaace04771d262ad39 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -31,6 +31,7 @@
 #include "lltoolbar.h"
 
 #include "llcommandmanager.h"
+#include "llmenugl.h"
 #include "lltrans.h"
 
 // uncomment this and remove the one in llui.cpp when there is an external reference to this translation unit
@@ -51,6 +52,7 @@ namespace LLToolBarEnums
 		return orientation;
 	}
 }
+
 using namespace LLToolBarEnums;
 
 
@@ -58,8 +60,8 @@ namespace LLInitParam
 {
 	void TypeValues<ButtonType>::declareValues()
 	{
-		declare("icons_only",		BTNTYPE_ICONS_ONLY);
 		declare("icons_with_text",	BTNTYPE_ICONS_WITH_TEXT);
+		declare("icons_only",		BTNTYPE_ICONS_ONLY);
 	}
 
 	void TypeValues<SideType>::declareValues()
@@ -77,6 +79,7 @@ LLToolBar::Params::Params()
 	side("side", SIDE_TOP),
 	button_icon("button_icon"),
 	button_icon_and_text("button_icon_and_text"),
+	read_only("read_only", false),
 	wrap("wrap", true),
 	min_button_width("min_button_width", 0),
 	max_button_width("max_button_width", S32_MAX),
@@ -91,6 +94,7 @@ LLToolBar::Params::Params()
 
 LLToolBar::LLToolBar(const LLToolBar::Params& p)
 :	LLUICtrl(p),
+	mReadOnly(p.read_only),
 	mButtonType(p.button_display_mode),
 	mSideType(p.side),
 	mWrap(p.wrap),
@@ -104,10 +108,47 @@ LLToolBar::LLToolBar(const LLToolBar::Params& p)
 	mPadRight(p.pad_right),
 	mPadTop(p.pad_top),
 	mPadBottom(p.pad_bottom),
-	mPadBetween(p.pad_between)
+	mPadBetween(p.pad_between),
+	mPopupMenuHandle()
 {
-	mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_ONLY] = p.button_icon;
 	mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_WITH_TEXT] = p.button_icon_and_text;
+	mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_ONLY] = p.button_icon;
+}
+
+LLToolBar::~LLToolBar()
+{
+	LLView::deleteViewByHandle(mPopupMenuHandle);
+}
+
+BOOL LLToolBar::postBuild()
+{
+	if (!mReadOnly)
+	{
+		LLUICtrl::CommitCallbackRegistry::Registrar& commit_reg = LLUICtrl::CommitCallbackRegistry::defaultRegistrar();
+		commit_reg.add("Toolbars.EnableSetting", boost::bind(&LLToolBar::onSettingEnable, this, _2));
+
+		LLUICtrl::EnableCallbackRegistry::Registrar& enable_reg = LLUICtrl::EnableCallbackRegistry::defaultRegistrar();
+		enable_reg.add("Toolbars.CheckSetting", boost::bind(&LLToolBar::isSettingChecked, this, _2));
+
+		//
+		// Setup the context menu
+		//
+
+		LLMenuGL* menu = LLUICtrlFactory::instance().createFromFile<LLMenuGL>("menu_toolbars.xml", LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
+
+		if (menu)
+		{
+			menu->setBackgroundColor(LLUIColorTable::instance().getColor("MenuPopupBgColor"));
+
+			mPopupMenuHandle = menu->getHandle();
+		}
+		else
+		{
+			llwarns << "Unable to load toolbars context menu." << llendl;
+		}
+	}
+
+	return TRUE;
 }
 
 void LLToolBar::initFromParams(const LLToolBar::Params& p)
@@ -199,6 +240,61 @@ bool LLToolBar::addCommand(LLCommand * command)
 	return true;
 }
 
+BOOL LLToolBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+	BOOL handle_it_here = !mReadOnly;
+
+	if (handle_it_here)
+	{
+		LLMenuGL * menu = (LLMenuGL *) mPopupMenuHandle.get();
+
+		if (menu)
+		{
+			LLMenuGL::showPopup(this, menu, x, y);
+		}
+	}
+
+	return handle_it_here;
+}
+
+BOOL LLToolBar::isSettingChecked(const LLSD& userdata)
+{
+	BOOL retval = FALSE;
+
+	const std::string setting_name = userdata.asString();
+
+	if (setting_name == "icons_and_labels")
+	{
+		retval = (mButtonType == BTNTYPE_ICONS_WITH_TEXT);
+	}
+	else if (setting_name == "icons_only")
+	{
+		retval = (mButtonType == BTNTYPE_ICONS_ONLY);
+	}
+
+	return retval;
+}
+
+void LLToolBar::onSettingEnable(const LLSD& userdata)
+{
+	llassert(!mReadOnly);
+
+	const std::string setting_name = userdata.asString();
+
+	const ButtonType current_button_type = mButtonType;
+
+	if (setting_name == "icons_and_labels")
+	{
+		mButtonType = BTNTYPE_ICONS_WITH_TEXT;
+	}
+	else if (setting_name == "icons_only")
+	{
+		mButtonType = BTNTYPE_ICONS_ONLY;
+	}
+
+	mNeedsLayout |= (current_button_type != mButtonType);
+}
+
 void LLToolBar::resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row, S32 max_row_girth)
 {
 	// make buttons in current row all same girth
@@ -264,8 +360,8 @@ void LLToolBar::updateLayoutAsNeeded()
 
 	std::vector<LLToolBarButton*> buttons_in_row;
 
-		BOOST_FOREACH(LLToolBarButton* button, mButtons)
-		{
+	BOOST_FOREACH(LLToolBarButton* button, mButtons)
+	{
 		button->reshape(mMinButtonWidth, mButtonHeight);
 		button->autoResize();
 
@@ -296,11 +392,11 @@ void LLToolBar::updateLayoutAsNeeded()
 			cur_start = row_pad_start;
 			cur_row += max_row_girth + mPadBetween;
 			max_row_girth = 0;
-	}
+		}
 
 		LLRect button_rect;
 		if (orientation == LLLayoutStack::HORIZONTAL)
-	{
+		{
 			button_rect.setLeftTopAndSize(cur_start, panel_rect.mTop - cur_row, button_clamped_width, button->getRect().getHeight());
 		}
 		else // VERTICAL
@@ -340,8 +436,9 @@ void LLToolBar::updateLayoutAsNeeded()
 		{ // shift left to maintain right edge
 			mButtonPanel->translate(mButtonPanel->getRect().getWidth() - total_girth, 0);
 		}
+
 		mButtonPanel->reshape(total_girth, max_row_length);
-		}
+	}
 
 	// re-center toolbar buttons
 	mCenteringStack->updateLayout();
diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h
index 92c289cd3f7a8606c201439bf460dfdc8e94bb7d..5028c39fb83e1a53863c5a48c83fb372cb4bb4e7 100644
--- a/indra/llui/lltoolbar.h
+++ b/indra/llui/lltoolbar.h
@@ -51,8 +51,8 @@ namespace LLToolBarEnums
 {
 	enum ButtonType
 	{
-		BTNTYPE_ICONS_ONLY = 0,
-		BTNTYPE_ICONS_WITH_TEXT,
+		BTNTYPE_ICONS_WITH_TEXT = 0,
+		BTNTYPE_ICONS_ONLY,
 
 		BTNTYPE_COUNT
 	};
@@ -96,7 +96,9 @@ class LLToolBar
 		Optional<LLToolBarButton::Params>		button_icon,
 												button_icon_and_text;
 
-		Optional<bool>							wrap;
+		Optional<bool>							read_only,
+												wrap;
+
 		Optional<S32>							min_button_width,
 												max_button_width,
 												button_height;
@@ -116,6 +118,7 @@ class LLToolBar
 
 	// virtuals
 	void draw();
+	BOOL postBuild();
 	void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
 
 	bool addCommand(LLCommand * command);
@@ -123,13 +126,20 @@ class LLToolBar
 protected:
 	friend class LLUICtrlFactory;
 	LLToolBar(const Params&);
+	~LLToolBar();
 
 	void initFromParams(const Params&);
 
+	BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+	BOOL isSettingChecked(const LLSD& userdata);
+	void onSettingEnable(const LLSD& userdata);
+
 private:
 	void updateLayoutAsNeeded();
 	void resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row, S32 max_row_girth);
 
+	const bool						mReadOnly;
+
 	std::list<LLToolBarButton*>		mButtons;
 	LLToolBarEnums::ButtonType		mButtonType;
 	LLLayoutStack*					mCenteringStack;
@@ -149,6 +159,8 @@ class LLToolBar
 									mPadBetween;
 
 	LLToolBarButton::Params			mButtonParams[LLToolBarEnums::BTNTYPE_COUNT];
+
+	LLHandle<LLView>				mPopupMenuHandle;
 };
 
 
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index 5cb8ddffcd4a656fc8c578ff0cb2a3a6a36ef195..dbb0e8b7ca25b97f834316764ab60cb3ad0e4ef0 100644
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -21,6 +21,7 @@
            function="Floater.ToolbarToggle"
            param="chat"
            />
+  <!-- Compass it not supported by the viewer yet
   <command name="compass"
            icon="Command_Compass_Icon"
            label_ref="Command_Compass_Label"
@@ -28,6 +29,7 @@
            function="Floater.ToolbarToggle"
            param="compass"
            />
+           -->
   <command name="gestures"
            icon="Command_Gestures_Icon"
            label_ref="Command_Gestures_Label"
@@ -56,6 +58,13 @@
            function="Floater.ToolbarToggle"
            param="map"
            />
+  <command name="minimap"
+           icon="Command_MiniMap_Icon"
+           label_ref="Command_MiniMap_Label"
+           tooltip_ref="Command_MiniMap_Tooltip"
+           function="Floater.ToolbarToggle"
+           param="minimap"
+           />
   <command name="move"
            icon="Command_Move_Icon"
            label_ref="Command_Move_Label"
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index d68594097ce1b417f69597ada21473bdbccdb4da..8f2194e652d95c2d857758d260bfbcbe3b97f5b6 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -133,6 +133,7 @@ with the same filename but different name
   <texture name="Command_HowTo_Icon"     file_name="icons/SL_Logo.png" preload="true" />
   <texture name="Command_Landmarks_Icon" file_name="icons/SL_Logo.png" preload="true" />
   <texture name="Command_Map_Icon"       file_name="icons/SL_Logo.png" preload="true" />
+  <texture name="Command_MiniMap_Icon"   file_name="icons/SL_Logo.png" preload="true" />
   <texture name="Command_Move_Icon"      file_name="icons/SL_Logo.png" preload="true" />
   <texture name="Command_MyLand_Icon"    file_name="icons/SL_Logo.png" preload="true" />
   <texture name="Command_MyStuff_Icon"   file_name="icons/SL_Logo.png" preload="true" />
diff --git a/indra/newview/skins/default/xui/en/floater_toybox.xml b/indra/newview/skins/default/xui/en/floater_toybox.xml
index 5f3a59d9647de462fc73bb1c37df99da29c8c1c9..1c9f20c496fa06a18ef51d67c02692f54d91a35d 100644
--- a/indra/newview/skins/default/xui/en/floater_toybox.xml
+++ b/indra/newview/skins/default/xui/en/floater_toybox.xml
@@ -45,10 +45,12 @@
   </text>
   <toolbar
     bottom="395"
+    button_display_mode="icons_with_text"
     left="40"
     max_button_width="140"
-    min_button_width="140"
+    min_button_width="70"
     name="toybox_toolbar"
+    read_only="true"
     right="-40"
     side="top"
     top="85">
diff --git a/indra/newview/skins/default/xui/en/menu_toolbars.xml b/indra/newview/skins/default/xui/en/menu_toolbars.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b3ecd3dcb67075556c3f1381950e918ce477cfeb
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_toolbars.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu bottom="825"
+      layout="topleft"
+      name="Toolbars Popup"
+      visible="false">
+  <menu_item_call label="Choose buttons..."
+                  layout="topleft"
+                  name="Chose Buttons">
+    <menu_item_call.on_click function="Floater.Show"
+                             parameter="toybox" />
+  </menu_item_call>
+  <menu_item_separator layout="topleft" />
+  <menu_item_check label="Icons and labels"
+                   layout="topleft"
+                   name="icons_and_labels">
+    <on_click function="Toolbars.EnableSetting"
+              parameter="icons_and_labels" />
+    <on_check function="Toolbars.CheckSetting"
+              parameter="icons_and_labels" />
+  </menu_item_check>
+  <menu_item_check label="Icons only"
+                   layout="topleft"
+                   name="icons_only">
+    <on_click function="Toolbars.EnableSetting"
+              parameter="icons_only" />
+    <on_check function="Toolbars.CheckSetting"
+              parameter="icons_only" />
+  </menu_item_check>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index d4c2bc50ca46f3f002bae19a78ee440886975900..feea555fdcf0f03c897f6eab1316382e057c5beb 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -3668,6 +3668,8 @@ Try enclosing path to the editor with double quotes.
   <string name="Command_Landmarks_Tooltip"></string>
   <string name="Command_Map_Label">Map</string>
   <string name="Command_Map_Tooltip"></string>
+  <string name="Command_MiniMap_Label">Mini Map</string>
+  <string name="Command_MiniMap_Tooltip"></string>
   <string name="Command_Move_Label">Move</string>
   <string name="Command_Move_Tooltip"></string>
   <string name="Command_MyLand_Label">My Land</string>
diff --git a/indra/newview/skins/default/xui/en/widgets/toolbar.xml b/indra/newview/skins/default/xui/en/widgets/toolbar.xml
index 45210277b2ac7b21b4db873499e0356fa46ccd32..7346e5ce2d9e53fb5358462da9730478541121d6 100644
--- a/indra/newview/skins/default/xui/en/widgets/toolbar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/toolbar.xml
@@ -4,7 +4,8 @@
          pad_right="5"
          pad_top="5"
          pad_bottom="5"
-         pad_between="5">
+         pad_between="5"
+         read_only="false">
 
   <button_panel name="button_panel"
                 bg_opaque_image="Rounded_Rect"