diff --git a/indra/llui/llmenubutton.cpp b/indra/llui/llmenubutton.cpp
index 0930eb95dda631d77a93d8d30861ecd3781b4832..3df05f4d3f7f77701e924efd104effc2db16455c 100644
--- a/indra/llui/llmenubutton.cpp
+++ b/indra/llui/llmenubutton.cpp
@@ -57,8 +57,6 @@ LLMenuButton::LLMenuButton(const LLMenuButton::Params& p)
 			llwarns << "Error loading menu_button menu" << llendl;
 		}
 	}
-
-	setMenuPosition();
 }
 
 void LLMenuButton::toggleMenu()
@@ -72,34 +70,12 @@ void LLMenuButton::toggleMenu()
 	}
 	else
 	{
-	    //mMenu->needsArrange(); //so it recalculates the visible elements
-		LLMenuGL::showPopup(getParent(), mMenu, mX, mY);
+	    LLRect rect = getRect();
+		//mMenu->needsArrange(); //so it recalculates the visible elements
+		LLMenuGL::showPopup(getParent(), mMenu, rect.mLeft, rect.mBottom);
 	}
 }
 
-void LLMenuButton::setMenuPosition(EMenuPosition position /*ON_BOTTOM_LEFT*/)
-{
-	if (!mMenu)
-		return;
-
-	LLRect rect = getRect();
-
-	switch (position)
-	{
-		case ON_TOP_LEFT:
-		{
-			mX = rect.mLeft;
-			mY = rect.mTop + mMenu->getRect().getHeight();
-			break;
-		}
-		case ON_BOTTOM_LEFT:
-		{
-			mX = rect.mLeft;
-			mY = rect.mBottom;
-			break;
-		}
-	}
-}
 
 void LLMenuButton::hideMenu() 
 { 
@@ -133,8 +109,6 @@ BOOL LLMenuButton::handleMouseDown(S32 x, S32 y, MASK mask)
 		setFocus(TRUE);
 	}
 
-	LLUICtrl::handleMouseDown(x, y, mask);
-
 	toggleMenu();
 	
 	if (getSoundFlags() & MOUSE_DOWN)
diff --git a/indra/llui/llmenubutton.h b/indra/llui/llmenubutton.h
index 273af2413ec45a8eabbdab51e65793887d5ab0a9..81ca0e047ca6e242d0659ea3b0149c834c8f7aa6 100644
--- a/indra/llui/llmenubutton.h
+++ b/indra/llui/llmenubutton.h
@@ -42,22 +42,14 @@ class LLMenuButton
 		Optional<std::string>	menu_filename;
 	
 		Params();
-	};
-
-	enum EMenuPosition
-	{
-		ON_TOP_LEFT,
-		ON_BOTTOM_LEFT
-	};
+	};	
 	
 	void toggleMenu();
-	void setMenuPosition(EMenuPosition position = ON_BOTTOM_LEFT);
 	/*virtual*/ void draw();
 	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask );
 	void hideMenu();
 	LLMenuGL* getMenu() { return mMenu; }
-	void setMenu(LLMenuGL* menu) { mMenu = menu; }
 
 protected:
 	friend class LLUICtrlFactory;
@@ -66,7 +58,6 @@ class LLMenuButton
 private:
 	LLMenuGL*	mMenu;
 	bool mMenuVisibleLastFrame;
-	S32 mX, mY;
 };
 
 
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index bd9536d931c851da8298b5e29d664cd339540591..c0f7fa4abfb04f68d9049ef7ed6eca3216e47a82 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -38,7 +38,6 @@
 #include "llinventoryfunctions.h"
 #include "llinventorymodel.h"
 #include "lllistcontextmenu.h"
-#include "llmenubutton.h"
 #include "llnotificationsutil.h"
 #include "lloutfitobserver.h"
 #include "llsidetray.h"
@@ -100,8 +99,10 @@ class LLOutfitListGearMenu
 
 		updateItemsVisibility();
 		mMenu->buildDrawLabels();
-		mMenu->arrangeAndClear();
 		mMenu->updateParent(LLMenuGL::sMenuContainer);
+		S32 menu_x = 0;
+		S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight();
+		LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y);
 	}
 
 	void updateItemsVisibility()
@@ -114,8 +115,6 @@ class LLOutfitListGearMenu
 		mMenu->arrangeAndClear(); // update menu height
 	}
 
-	LLMenuGL* getMenu() { return mMenu; }
-
 private:
 	const LLUUID& getSelectedOutfitID()
 	{
@@ -354,15 +353,6 @@ BOOL LLOutfitsList::postBuild()
 	mAccordion = getChild<LLAccordionCtrl>("outfits_accordion");
 	mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR);
 
-	LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn");
-
-	// LLMenuButton::handleMouseDownCallback calls signal LLUICtrl::mouse_signal_t, not LLButton::commit_signal_t.
-	// That's why to set signal LLUICtrl::mouse_signal_t we need to upcast to LLUICtrl. Using static_cast instead
-	// of getChild<LLUICtrl>(...) for performance.
-	static_cast<LLUICtrl*>(menu_gear_btn)->setMouseDownCallback(boost::bind(&LLOutfitsList::showGearMenu, this, _1));
-
-	menu_gear_btn->setMenu(mGearMenu->getMenu());
-
 	return TRUE;
 }
 
@@ -705,14 +695,7 @@ bool LLOutfitsList::isActionEnabled(const LLSD& userdata)
 void LLOutfitsList::showGearMenu(LLView* spawning_view)
 {
 	if (!mGearMenu) return;
-
 	mGearMenu->show(spawning_view);
-
-	LLMenuButton* btn = dynamic_cast<LLMenuButton*>(spawning_view);
-	if (btn)
-	{
-		btn->setMenuPosition(LLMenuButton::ON_TOP_LEFT);
-	}
 }
 
 void LLOutfitsList::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 0e74cce37f6a421275b0e488d2067e4393adabf8..24bf67a000a19ba1b679ac1c0a31f98e3c1fbdc5 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -47,7 +47,6 @@
 #include "llinventorymodelbackgroundfetch.h"
 #include "llinventorypanel.h"
 #include "lllandmarkactions.h"
-#include "llmenubutton.h"
 #include "llplacesinventorybridge.h"
 #include "llplacesinventorypanel.h"
 #include "llsidetray.h"
@@ -708,8 +707,6 @@ void LLLandmarksPanel::initListCommandsHandlers()
 	mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_place_add_button.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 
 	mListCommands->childSetAction(ADD_BUTTON_NAME, boost::bind(&LLLandmarksPanel::showActionMenu, this, mMenuAdd, ADD_BUTTON_NAME));
-
-	getChild<LLUICtrl>("options_gear_btn")->setMouseDownCallback(boost::bind(&LLLandmarksPanel::onActionsButtonClick, this));
 }
 
 
@@ -754,15 +751,6 @@ void LLLandmarksPanel::showActionMenu(LLMenuGL* menu, std::string spawning_view_
 		menu->buildDrawLabels();
 		menu->updateParent(LLMenuGL::sMenuContainer);
 		LLView* spawning_view = getChild<LLView> (spawning_view_name);
-
-		LLMenuButton* btn = dynamic_cast <LLMenuButton*>(spawning_view);
-		if (btn)
-		{
-			btn->setMenu(menu);
-			btn->setMenuPosition(LLMenuButton::ON_TOP_LEFT);
-			return;
-		}
-
 		S32 menu_x, menu_y;
 		//show menu in co-ordinates of panel
 		spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this);
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 59d58321a94681a92e3438dc5327b58c919fe453..27e054af349934b40c28ba0285bbf7c1669000f8 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -192,8 +192,6 @@ BOOL LLPanelMainInventory::postBuild()
 		mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2));
 	}
 
-	mGearMenuButton = getChild<LLMenuButton>("options_gear_btn");
-
 	initListCommandsHandlers();
 
 	// *TODO:Get the cost info from the server
@@ -902,14 +900,10 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
 
 void LLPanelMainInventory::initListCommandsHandlers()
 {
+	childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
 	childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
 	childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
 
-	// LLMenuButton::handleMouseDownCallback calls signal LLUICtrl::mouse_signal_t, not LLButton::commit_signal_t.
-	// That's why to set signal LLUICtrl::mouse_signal_t we need to upcast to LLUICtrl. Using static_cast instead
-	// of getChild<LLUICtrl>(...) for performance.
-	static_cast<LLUICtrl*>(mGearMenuButton)->setMouseDownCallback(boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
-
 	mTrashButton = getChild<LLDragAndDropButton>("trash_btn");
 	mTrashButton->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
 			,	_4 // BOOL drop
@@ -920,7 +914,6 @@ void LLPanelMainInventory::initListCommandsHandlers()
 	mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));
 	mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
 	mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-	mGearMenuButton->setMenu(mMenuGearDefault);
 	mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 
 	// Update the trash button when selected item(s) get worn or taken off.
@@ -936,9 +929,7 @@ void LLPanelMainInventory::updateListCommands()
 
 void LLPanelMainInventory::onGearButtonClick()
 {
-	mMenuGearDefault->buildDrawLabels();
-	mMenuGearDefault->updateParent(LLMenuGL::sMenuContainer);
-	mGearMenuButton->setMenuPosition(LLMenuButton::ON_TOP_LEFT);
+	showActionMenu(mMenuGearDefault,"options_gear_btn");
 }
 
 void LLPanelMainInventory::onAddButtonClick()
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 8853ba924827d0c038e7ff6db0336d0dc0317ac8..fb31206870985872c4df3d7562e78d8330572ae7 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -31,7 +31,6 @@
 #include "llpanel.h"
 #include "llinventoryobserver.h"
 #include "lldndbutton.h"
-#include "llmenubutton.h"
 
 #include "llfolderview.h"
 
@@ -145,7 +144,6 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
 	LLDragAndDropButton*		mTrashButton;
 	LLMenuGL*					mMenuGearDefault;
 	LLMenuGL*					mMenuAdd;
-	LLMenuButton*				mGearMenuButton;
 
 	bool						mNeedUploadCost;
 	// List Commands                                                              //
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index c625ba5a1147310df42042eaac73f963bb3e5976..54b0805a6c05f9b5bcc28d0bd0d4b123f523a21a 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -403,9 +403,7 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()
 	mAddWearablesPanel(NULL),
 	mFolderViewFilterCmbBox(NULL),
 	mListViewFilterCmbBox(NULL),
-	mPlusBtn(NULL),
-	mWearablesGearMenuBtn(NULL),
-	mGearMenuBtn(NULL)
+	mPlusBtn(NULL)
 {
 	mSavedFolderState = new LLSaveFolderState();
 	mSavedFolderState->setApply(FALSE);
@@ -480,20 +478,13 @@ BOOL LLPanelOutfitEdit::postBuild()
 	childSetCommitCallback("folder_view_btn", boost::bind(&LLPanelOutfitEdit::saveListSelection, this), NULL);
 	childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesListView, this), NULL);
 	childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::saveListSelection, this), NULL);
+	childSetCommitCallback("wearables_gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL);
+	childSetCommitCallback("gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL);
 	childSetCommitCallback("shop_btn_1", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL);
 	childSetCommitCallback("shop_btn_2", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL);
 
 	setVisibleCallback(boost::bind(&LLPanelOutfitEdit::onVisibilityChange, this, _2));
 
-	mWearablesGearMenuBtn = getChild<LLMenuButton>("wearables_gear_menu_btn");
-	mGearMenuBtn = getChild<LLMenuButton>("gear_menu_btn");
-
-	// LLMenuButton::handleMouseDownCallback calls signal LLUICtrl::mouse_signal_t, not LLButton::commit_signal_t.
-	// That's why to set signal LLUICtrl::mouse_signal_t we need to upcast to LLUICtrl. Using static_cast instead
-	// of getChild<LLUICtrl>(...) for performance.
-	static_cast<LLUICtrl*>(mWearablesGearMenuBtn)->setMouseDownCallback(boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1));
-	static_cast<LLUICtrl*>(mGearMenuBtn)->setMouseDownCallback(boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1));
-
 	mCOFWearables = getChild<LLCOFWearables>("cof_wearables_list");
 	mCOFWearables->setCommitCallback(boost::bind(&LLPanelOutfitEdit::filterWearablesBySelectedItem, this));
 
@@ -1268,36 +1259,32 @@ void LLPanelOutfitEdit::resetAccordionState()
 void LLPanelOutfitEdit::onGearButtonClick(LLUICtrl* clicked_button)
 {
 	LLMenuGL* menu = NULL;
-	LLMenuButton* btn = NULL;
 
 	if (mAddWearablesPanel->getVisible())
 	{
 		if (!mAddWearablesGearMenu)
 		{
 			mAddWearablesGearMenu = LLAddWearablesGearMenu::create(mWearableItemsList, mInventoryItemsPanel);
-			mWearablesGearMenuBtn->setMenu(mAddWearablesGearMenu);
 		}
 
 		menu = mAddWearablesGearMenu;
-		btn = mWearablesGearMenuBtn;
 	}
 	else
 	{
 		if (!mGearMenu)
 		{
 			mGearMenu = LLPanelOutfitEditGearMenu::create();
-			mGearMenuBtn->setMenu(mGearMenu);
 		}
 
 		menu = mGearMenu;
-		btn = mGearMenuBtn;
 	}
 
-	if (!menu || !btn) return;
+	if (!menu) return;
 
+	menu->arrangeAndClear(); // update menu height
+	S32 menu_y = menu->getRect().getHeight() + clicked_button->getRect().getHeight();
 	menu->buildDrawLabels();
-	menu->arrangeAndClear();
-	btn->setMenuPosition(LLMenuButton::ON_TOP_LEFT);
+	LLMenuGL::showPopup(clicked_button, menu, 0, menu_y);
 }
 
 void LLPanelOutfitEdit::onAddMoreButtonClicked()
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
index 07edbdb9ba897c17c03dfe08ca10fde5f733176a..2dca986e330b84a901075494a84e8f482f83179c 100644
--- a/indra/newview/llpaneloutfitedit.h
+++ b/indra/newview/llpaneloutfitedit.h
@@ -38,7 +38,6 @@
 #include "llinventory.h"
 #include "llinventoryfunctions.h"
 #include "llinventorymodel.h"
-#include "llmenubutton.h"
 #include "llwearableitemslist.h"
 
 class LLButton;
@@ -239,8 +238,8 @@ class LLPanelOutfitEdit : public LLPanel
 	LLMenuGL*			mAddWearablesGearMenu;
 	bool				mInitialized;
 	std::auto_ptr<LLSaveOutfitComboBtn> mSaveComboBtn;
-	LLMenuButton*		mWearablesGearMenuBtn;
-	LLMenuButton*		mGearMenuBtn;
+
+
 
 };
 
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 8d387f3e8560955bf205335eaef4944183fdf9d1..d096b17145a64a6f7a1d8bdc6187e6adb7a81eb2 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -463,11 +463,7 @@ LLPanelPeople::LLPanelPeople()
 		mAllFriendList(NULL),
 		mNearbyList(NULL),
 		mRecentList(NULL),
-		mGroupList(NULL),
-		mNearbyGearButton(NULL),
-		mFriendsGearButton(NULL),
-		mGroupsGearButton(NULL),
-		mRecentGearButton(NULL)
+		mGroupList(NULL)
 {
 	mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList,	this));
 	mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList,	this));
@@ -603,6 +599,11 @@ BOOL LLPanelPeople::postBuild()
 	buttonSetAction("teleport_btn",		boost::bind(&LLPanelPeople::onTeleportButtonClicked,	this));
 	buttonSetAction("share_btn",		boost::bind(&LLPanelPeople::onShareButtonClicked,		this));
 
+	getChild<LLPanel>(NEARBY_TAB_NAME)->childSetAction("nearby_view_sort_btn",boost::bind(&LLPanelPeople::onNearbyViewSortButtonClicked,		this));
+	getChild<LLPanel>(RECENT_TAB_NAME)->childSetAction("recent_viewsort_btn",boost::bind(&LLPanelPeople::onRecentViewSortButtonClicked,			this));
+	getChild<LLPanel>(FRIENDS_TAB_NAME)->childSetAction("friends_viewsort_btn",boost::bind(&LLPanelPeople::onFriendsViewSortButtonClicked,		this));
+	getChild<LLPanel>(GROUP_TAB_NAME)->childSetAction("groups_viewsort_btn",boost::bind(&LLPanelPeople::onGroupsViewSortButtonClicked,		this));
+
 	// Must go after setting commit callback and initializing all pointers to children.
 	mTabContainer->selectTabByName(NEARBY_TAB_NAME);
 
@@ -622,49 +623,24 @@ BOOL LLPanelPeople::postBuild()
 	enable_registrar.add("People.Recent.ViewSort.CheckItem",	boost::bind(&LLPanelPeople::onRecentViewSortMenuItemCheck,	this, _2));
 	enable_registrar.add("People.Nearby.ViewSort.CheckItem",	boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemCheck,	this, _2));
 
-	mNearbyGearButton = getChild<LLMenuButton>("nearby_view_sort_btn");
-	mFriendsGearButton = getChild<LLMenuButton>("friends_viewsort_btn");
-	mGroupsGearButton = getChild<LLMenuButton>("groups_viewsort_btn");
-	mRecentGearButton = getChild<LLMenuButton>("recent_viewsort_btn");
-
-	// LLMenuButton::handleMouseDownCallback calls signal LLUICtrl::mouse_signal_t, not LLButton::commit_signal_t.
-	// That's why to set signal LLUICtrl::mouse_signal_t we need to upcast to LLUICtrl. Using static_cast instead
-	// of getChild<LLUICtrl>(...) for performance.
-	static_cast<LLUICtrl*>(mNearbyGearButton)->setMouseDownCallback(boost::bind(&LLPanelPeople::onViewSortButtonClicked, this));
-	static_cast<LLUICtrl*>(mFriendsGearButton)->setMouseDownCallback(boost::bind(&LLPanelPeople::onViewSortButtonClicked, this));
-	static_cast<LLUICtrl*>(mGroupsGearButton)->setMouseDownCallback(boost::bind(&LLPanelPeople::onViewSortButtonClicked, this));
-	static_cast<LLUICtrl*>(mRecentGearButton)->setMouseDownCallback(boost::bind(&LLPanelPeople::onViewSortButtonClicked, this));
-
 	LLMenuGL* plus_menu  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_group_plus.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 	mGroupPlusMenuHandle  = plus_menu->getHandle();
 
 	LLMenuGL* nearby_view_sort  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_nearby_view_sort.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 	if(nearby_view_sort)
-	{
 		mNearbyViewSortMenuHandle  = nearby_view_sort->getHandle();
-		mNearbyGearButton->setMenu(nearby_view_sort);
-	}
 
 	LLMenuGL* friend_view_sort  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_friends_view_sort.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 	if(friend_view_sort)
-	{
 		mFriendsViewSortMenuHandle  = friend_view_sort->getHandle();
-		mFriendsGearButton->setMenu(friend_view_sort);
-	}
 
 	LLMenuGL* group_view_sort  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_groups_view_sort.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 	if(group_view_sort)
-	{
 		mGroupsViewSortMenuHandle  = group_view_sort->getHandle();
-		mGroupsGearButton->setMenu(group_view_sort);
-	}
 
 	LLMenuGL* recent_view_sort  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_recent_view_sort.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 	if(recent_view_sort)
-	{
 		mRecentViewSortMenuHandle  = recent_view_sort->getHandle();
-		mRecentGearButton->setMenu(recent_view_sort);
-	}
 
 	LLVoiceClient::getInstance()->addObserver(this);
 
@@ -931,9 +907,20 @@ void LLPanelPeople::getCurrentItemIDs(uuid_vec_t& selected_uuids) const
 void LLPanelPeople::showGroupMenu(LLMenuGL* menu)
 {
 	// Shows the menu at the top of the button bar.
+
+	// Calculate its coordinates.
+	// (assumes that groups panel is the current tab)
+	LLPanel* bottom_panel = mTabContainer->getCurrentPanel()->getChild<LLPanel>("bottom_panel"); 
+	LLPanel* parent_panel = mTabContainer->getCurrentPanel();
 	menu->arrangeAndClear();
+	S32 menu_height = menu->getRect().getHeight();
+	S32 menu_x = -2; // *HACK: compensates HPAD in showPopup()
+	S32 menu_y = bottom_panel->getRect().mTop + menu_height;
+
+	// Actually show the menu.
 	menu->buildDrawLabels();
 	menu->updateParent(LLMenuGL::sMenuContainer);
+	LLMenuGL::showPopup(parent_panel, menu, menu_x, menu_y);
 }
 
 void LLPanelPeople::setSortOrder(LLAvatarList* list, ESortOrder order, bool save)
@@ -1360,39 +1347,36 @@ void LLPanelPeople::onMoreButtonClicked()
 	// *TODO: not implemented yet
 }
 
-void LLPanelPeople::onViewSortButtonClicked()
-{
-	std::string current_panel = getActiveTabName();
-
-    LLMenuGL* menu = NULL;
-    LLMenuButton* btn = NULL;
-
-    if (current_panel == NEARBY_TAB_NAME)
-    {
-        menu = dynamic_cast<LLMenuGL*>(mNearbyViewSortMenuHandle.get());
-        btn = mNearbyGearButton;
-    }
-    else if (current_panel == FRIENDS_TAB_NAME)
-    {
-        menu = dynamic_cast<LLMenuGL*>(mFriendsViewSortMenuHandle.get());
-        btn = mFriendsGearButton;
-    }
-    else if (current_panel == GROUP_TAB_NAME)
-    {
-        menu = dynamic_cast<LLMenuGL*>(mGroupsViewSortMenuHandle.get());
-        btn = mGroupsGearButton;
-    }
-    else if (current_panel == RECENT_TAB_NAME)
-    {
-        menu = dynamic_cast<LLMenuGL*>(mRecentViewSortMenuHandle.get());
-        btn = mRecentGearButton;
-    }
-
-    if (menu && btn)
-    {
-    	showGroupMenu(menu);
-    	btn->setMenuPosition(LLMenuButton::ON_TOP_LEFT);
-    }
+void LLPanelPeople::onFriendsViewSortButtonClicked()
+{
+	LLMenuGL* menu = (LLMenuGL*)mFriendsViewSortMenuHandle.get();
+	if (!menu)
+		return;
+	showGroupMenu(menu);
+}
+
+void LLPanelPeople::onGroupsViewSortButtonClicked()
+{
+	LLMenuGL* menu = (LLMenuGL*)mGroupsViewSortMenuHandle.get();
+	if (!menu)
+		return;
+	showGroupMenu(menu);
+}
+
+void LLPanelPeople::onRecentViewSortButtonClicked()
+{
+	LLMenuGL* menu = (LLMenuGL*)mRecentViewSortMenuHandle.get();
+	if (!menu)
+		return;
+	showGroupMenu(menu);
+}
+
+void LLPanelPeople::onNearbyViewSortButtonClicked()
+{
+	LLMenuGL* menu = (LLMenuGL*)mNearbyViewSortMenuHandle.get();
+	if (!menu)
+		return;
+	showGroupMenu(menu);
 }
 
 void	LLPanelPeople::onOpen(const LLSD& key)
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index 3109feef0c8138a972224f29b300b7be337c629c..d0913ee756c7740bfc0b5a8a39951534791462d5 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -30,7 +30,6 @@
 #include <llpanel.h>
 
 #include "llcallingcard.h" // for avatar tracker
-#include "llmenubutton.h"
 #include "llvoiceclient.h"
 
 class LLFilterEditor;
@@ -101,7 +100,10 @@ class LLPanelPeople
 	void					onShareButtonClicked();
 	void					onMoreButtonClicked();
 	void					onActivateButtonClicked();
-	void					onViewSortButtonClicked();
+	void					onRecentViewSortButtonClicked();
+	void					onNearbyViewSortButtonClicked();
+	void					onFriendsViewSortButtonClicked();
+	void					onGroupsViewSortButtonClicked();
 	void					onAvatarListDoubleClicked(LLUICtrl* ctrl);
 	void					onAvatarListCommitted(LLAvatarList* list);
 	void					onGroupPlusButtonClicked();
@@ -155,11 +157,6 @@ class LLPanelPeople
 	Updater*				mNearbyListUpdater;
 	Updater*				mRecentListUpdater;
 
-	LLMenuButton*			mNearbyGearButton;
-	LLMenuButton*			mFriendsGearButton;
-	LLMenuButton*			mGroupsGearButton;
-	LLMenuButton*			mRecentGearButton;
-
 	std::string				mFilterSubString;
 	std::string				mFilterSubStringOrig;
 };
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 216b7e2fa9e0bc0ff4a56943ceea03369b18c3d7..a7cbf5229080fc87f3bcfb471d6ac73393f64297 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -375,8 +375,7 @@ LLTeleportHistoryPanel::LLTeleportHistoryPanel()
 		mHistoryAccordion(NULL),
 		mAccordionTabMenu(NULL),
 		mLastSelectedFlatlList(NULL),
-		mLastSelectedItemIndex(-1),
-		mMenuGearButton(NULL)
+		mLastSelectedItemIndex(-1)
 {
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_teleport_history.xml");
 }
@@ -440,6 +439,8 @@ BOOL LLTeleportHistoryPanel::postBuild()
 		}
 	}
 
+	getChild<LLPanel>("bottom_panel")->childSetAction("gear_btn",boost::bind(&LLTeleportHistoryPanel::onGearButtonClicked, this));
+
 	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
 
 	registrar.add("TeleportHistory.ExpandAllFolders",  boost::bind(&LLTeleportHistoryPanel::onExpandAllFolders,  this));
@@ -447,19 +448,9 @@ BOOL LLTeleportHistoryPanel::postBuild()
 	registrar.add("TeleportHistory.ClearTeleportHistory",  boost::bind(&LLTeleportHistoryPanel::onClearTeleportHistory,  this));
 	mEnableCallbackRegistrar.add("TeleportHistory.GearMenu.Enable", boost::bind(&LLTeleportHistoryPanel::isActionEnabled, this, _2));
 
-	mMenuGearButton = getChild<LLMenuButton>("gear_btn");
-
-	LLMenuGL* gear_menu  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_teleport_history_gear.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());;
+	LLMenuGL* gear_menu  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_teleport_history_gear.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 	if(gear_menu)
-	{
 		mGearMenuHandle  = gear_menu->getHandle();
-		mMenuGearButton->setMenu(gear_menu);
-	}
-
-	// LLMenuButton::handleMouseDownCallback calls signal LLUICtrl::mouse_signal_t, not LLButton::commit_signal_t.
-	// That's why to set signal LLUICtrl::mouse_signal_t we need to upcast to LLUICtrl. Using static_cast instead
-	// of getChild<LLUICtrl>(...) for performance.
-	static_cast<LLUICtrl*>(mMenuGearButton)->setMouseDownCallback(boost::bind(&LLTeleportHistoryPanel::onGearButtonClicked, this));
 
 	return TRUE;
 }
@@ -1000,12 +991,19 @@ void LLTeleportHistoryPanel::onGearButtonClicked()
 	if (!menu)
 		return;
 
+	// Shows the menu at the top of the button bar.
+
+	// Calculate its coordinates.
+	LLPanel* bottom_panel = getChild<LLPanel>("bottom_panel");
 	menu->arrangeAndClear();
+	S32 menu_height = menu->getRect().getHeight();
+	S32 menu_x = -2; // *HACK: compensates HPAD in showPopup()
+	S32 menu_y = bottom_panel->getRect().mTop + menu_height;
+
+	// Actually show the menu.
 	menu->buildDrawLabels();
 	menu->updateParent(LLMenuGL::sMenuContainer);
-
-	// Shows the menu at the top of the button bar.
-	mMenuGearButton->setMenuPosition(LLMenuButton::ON_TOP_LEFT);
+	LLMenuGL::showPopup(this, menu, menu_x, menu_y);
 }
 
 bool LLTeleportHistoryPanel::isActionEnabled(const LLSD& userdata) const
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index 04809383f224a4ef4764fa2564db1caf090776ac..b5a025b39bcedf200387cac4a2cecc59d53879f0 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -33,7 +33,6 @@
 #include "llpanelplacestab.h"
 #include "llteleporthistory.h"
 #include "llmenugl.h"
-#include "llmenubutton.h"
 
 class LLTeleportHistoryStorage;
 class LLAccordionCtrl;
@@ -119,7 +118,6 @@ class LLTeleportHistoryPanel : public LLPanelPlacesTab
 	ContextMenu mContextMenu;
 	LLContextMenu*			mAccordionTabMenu;
 	LLHandle<LLView>		mGearMenuHandle;
-	LLMenuButton*			mMenuGearButton;
 };
 
 
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index 1b46294c52c15e48b23c161d6ba4068841e983c1..860470cd73ee55829c3bd19b96b1a98531191677 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -32,7 +32,6 @@
 #include "llinventoryfunctions.h"
 #include "llinventorymodel.h"
 #include "llinventoryobserver.h"
-#include "llmenubutton.h"
 #include "llsidetray.h"
 #include "llviewermenu.h"
 #include "llwearableitemslist.h"
@@ -68,13 +67,13 @@ class LLWearingGearMenu
 	{
 		if (!mMenu) return;
 
-		mMenu->arrangeAndClear();
 		mMenu->buildDrawLabels();
 		mMenu->updateParent(LLMenuGL::sMenuContainer);
+		S32 menu_x = 0;
+		S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight();
+		LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y);
 	}
 
-	LLMenuGL* getMenu() { return mMenu; }
-
 private:
 
 	void onTakeOff()
@@ -190,16 +189,6 @@ BOOL LLPanelWearing::postBuild()
 	mCOFItemsList = getChild<LLWearableItemsList>("cof_items_list");
 	mCOFItemsList->setRightMouseDownCallback(boost::bind(&LLPanelWearing::onWearableItemsListRightClick, this, _1, _2, _3));
 
-	LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn");
-
-	// LLMenuButton::handleMouseDownCallback calls signal LLUICtrl::mouse_signal_t, not LLButton::commit_signal_t.
-	// That's why to set signal LLUICtrl::mouse_signal_t we need to upcast to LLUICtrl. Using static_cast instead
-	// of getChild<LLUICtrl>(...) for performance.
-	static_cast<LLUICtrl*>(menu_gear_btn)->setMouseDownCallback(boost::bind(&LLPanelWearing::showGearMenu, this, _1));
-
-	menu_gear_btn->setMenu(mGearMenu->getMenu());
-
-
 	return TRUE;
 }
 
@@ -268,14 +257,7 @@ bool LLPanelWearing::isActionEnabled(const LLSD& userdata)
 void LLPanelWearing::showGearMenu(LLView* spawning_view)
 {
 	if (!mGearMenu) return;
-
 	mGearMenu->show(spawning_view);
-
-	LLMenuButton* btn = dynamic_cast<LLMenuButton*>(spawning_view);
-	if (btn)
-	{
-		btn->setMenuPosition(LLMenuButton::ON_TOP_LEFT);
-	}
 }
 
 boost::signals2::connection LLPanelWearing::setSelectionChangeCallback(commit_callback_t cb)
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index 51062158352f17d4e0ce09e06943e07a584c28cf..7e415f45a4978e398136ee998f50abe5ea31e1b0 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -115,7 +115,7 @@
 		       layout="topleft"
 		       name="options_gear_btn_panel"
 		       width="32">
-		          <menu_button
+		          <button
 		           follows="bottom|left"
 		           tool_tip="Show additional options"
 		           height="25"
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 2b6e082542aedf2cdd56fa7b37e56eba58e2140b..16529f4064b0c30d97265c22b5ce86aeefade544 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -119,7 +119,7 @@
        layout="topleft"
        name="options_gear_btn_panel"
        width="32">
-          <menu_button
+          <button
            follows="bottom|left"
            tool_tip="Show additional options"
            height="25"
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index 89e12b2d1d63999bc304f94bdd36dcc6b99adea3..883cbb30c60f5632751009d4ef4063e19ae3d776 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -375,7 +375,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap
      name="no_add_wearables_button_bar"
      top_pad="0"
      width="313">
-        <menu_button
+        <button
          follows="bottom|left"
          height="25"
          image_hover_unselected="Toolbar_Left_Over"
@@ -423,7 +423,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap
      top_delta="0"
      visible="false"
      width="313">
-        <menu_button
+        <button
          follows="bottom|left"
          height="25"
          image_hover_unselected="Toolbar_Left_Over"
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
index 9f98019c948ad53a4d746444516041c5736d2a60..d18f0d57ca629efd4f4e2cdef1515170c6aacfbb 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
@@ -35,7 +35,7 @@
 	 visible="true"
 	 name="bottom_panel"
 	 width="312">
-     <menu_button
+     <button
        follows="bottom|left"
        tool_tip="Show additional options"
        height="25"
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml
index d85b778db2174ab3f0a7a8cdd59e4c1203998355..2fbbf6610c786f14c2778635c3fb07116756f8d1 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml
@@ -29,7 +29,7 @@
      name="bottom_panel"
      top_pad="0"
      width="312">
-        <menu_button
+        <button
          follows="bottom|left"
          height="25"
          image_hover_unselected="Toolbar_Left_Over"
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 3ffb462bb5f767752b2b5463e655d5b08e899710..ab8930c967c3a8a5bcdee4849e90764a04c8aefa 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -114,7 +114,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
              name="bottom_panel"
              top_pad="0"
              width="313">
-             <menu_button
+             <button
              follows="bottom|left"
              height="25"
              image_hover_unselected="Toolbar_Left_Over"
@@ -242,7 +242,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
 				       layout="topleft"
 				       name="options_gear_btn_panel"
 				       width="32">
-				          <menu_button
+				          <button
 				           follows="bottom|left"
 				           tool_tip="Show additional options"
 				           height="25"
@@ -407,7 +407,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
              name="bottom_panel"
              top_pad="0"
              width="313">
-               <menu_button
+               <button
                follows="bottom|left"
                tool_tip="Options"
                height="25"
@@ -490,7 +490,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
              name="bottom_panel"
              top_pad="0"
              width="313">
-               <menu_button
+               <button
                follows="bottom|left"
                tool_tip="Options"
                height="25"
@@ -499,6 +499,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
                image_selected="Toolbar_Left_Selected"
                image_unselected="Toolbar_Left_Off"
                layout="topleft"
+               left="3"
                name="recent_viewsort_btn"
                top="1"
                width="31" />
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
index 768efc2f3f116098c3a1bd45191d549b546d272d..bf09836e87853bcd903061f309d8777fc041ec1e 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
@@ -157,7 +157,7 @@
      left="3"
      name="bottom_panel"
      width="313">
-        <menu_button
+        <button
          follows="bottom|left"
          tool_tip="Show additional options"
          height="25"