diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 6cac841cdeacb3fceb58351b210fa7d2b2840e41..badba7a416cc0f3a8227fdd96aa0236cdd138c6b 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -947,7 +947,7 @@ LLMenuItemBranchGL::LLMenuItemBranchGL(const LLMenuItemBranchGL::Params& p)
 
 LLMenuItemBranchGL::~LLMenuItemBranchGL()
 {
-	LLView::deleteViewByHandle(mBranchHandle);
+	delete mBranchHandle.get();
 }
 
 // virtual
diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index 278c04aef8e620d4e9686c36a5d731900721ed8c..bd45cf46567c47a449edefa07c4e8a9bdcb932c5 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -116,12 +116,12 @@ LLToolBar::LLToolBar(const LLToolBar::Params& p)
 
 LLToolBar::~LLToolBar()
 {
-	LLView::deleteViewByHandle(mPopupMenuHandle);
+	delete mPopupMenuHandle.get();
 }
 
-BOOL LLToolBar::postBuild()
+void LLToolBar::createContextMenu()
 {
-	if (!mReadOnly)
+	if (!mPopupMenuHandle.get())
 	{
 		LLUICtrl::CommitCallbackRegistry::Registrar& commit_reg = LLUICtrl::CommitCallbackRegistry::defaultRegistrar();
 		commit_reg.add("Toolbars.EnableSetting", boost::bind(&LLToolBar::onSettingEnable, this, _2));
@@ -129,11 +129,7 @@ BOOL LLToolBar::postBuild()
 		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());
+		LLContextMenu* menu = LLUICtrlFactory::instance().createFromFile<LLContextMenu>("menu_toolbars.xml", LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
 
 		if (menu)
 		{
@@ -146,8 +142,6 @@ BOOL LLToolBar::postBuild()
 			llwarns << "Unable to load toolbars context menu." << llendl;
 		}
 	}
-
-	return TRUE;
 }
 
 void LLToolBar::initFromParams(const LLToolBar::Params& p)
@@ -278,10 +272,12 @@ BOOL LLToolBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
 
 	if (handle_it_here)
 	{
-		LLMenuGL * menu = (LLMenuGL *) mPopupMenuHandle.get();
+		createContextMenu();
+		LLContextMenu * menu = (LLContextMenu *) mPopupMenuHandle.get();
 
 		if (menu)
 		{
+			menu->show(x, y);
 			LLMenuGL::showPopup(this, menu, x, y);
 		}
 	}
diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h
index f7562b29d247c38015280082de27d8323d15acfa..657e92831934d67140864c93a98b119da46444ee 100644
--- a/indra/llui/lltoolbar.h
+++ b/indra/llui/lltoolbar.h
@@ -119,8 +119,8 @@ class LLToolBar
 
 	// virtuals
 	void draw();
-	BOOL postBuild();
 	void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+	BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 
 	bool addCommand(const LLCommandId& commandId);
 	bool hasCommand(const LLCommandId& commandId) const;
@@ -133,13 +133,12 @@ class 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 createContextMenu();
 	void updateLayoutAsNeeded();
 	void resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row, S32 max_row_girth);
+	BOOL isSettingChecked(const LLSD& userdata);
+	void onSettingEnable(const LLSD& userdata);
 
 	const bool						mReadOnly;
 
@@ -164,7 +163,7 @@ class LLToolBar
 
 	LLToolBarButton::Params			mButtonParams[LLToolBarEnums::BTNTYPE_COUNT];
 
-	LLHandle<LLView>				mPopupMenuHandle;
+	LLHandle<class LLContextMenu>			mPopupMenuHandle;
 };
 
 
diff --git a/indra/llui/lltoolbarview.cpp b/indra/llui/lltoolbarview.cpp
index 21d3785c822d5b959cd519087123c8bd9367f0e3..6ae10fbf1dc000cb3b734b0726efa97a6e1da538 100644
--- a/indra/llui/lltoolbarview.cpp
+++ b/indra/llui/lltoolbarview.cpp
@@ -90,9 +90,9 @@ void LLToolBarView::draw()
 	
 	LLRect bottom_rect, left_rect, right_rect;
 
-	if (mToolbarBottom) bottom_rect = mToolbarBottom->getRect();
-	if (mToolbarLeft)   left_rect   = mToolbarLeft->getRect();
-	if (mToolbarRight)  right_rect  = mToolbarRight->getRect();
+	if (mToolbarBottom) mToolbarBottom->localRectToOtherView(mToolbarBottom->getLocalRect(), &bottom_rect, this);
+	if (mToolbarLeft)   mToolbarLeft->localRectToOtherView(mToolbarLeft->getLocalRect(), &left_rect, this);
+	if (mToolbarRight)  mToolbarRight->localRectToOtherView(mToolbarRight->getLocalRect(), &right_rect, this);
 	
 	
 	if ((old_width != getRect().getWidth()) || (old_height != getRect().getHeight()))
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 60452b9ae4d578817759761bdde98f7313c6a2de..e10c2f0d1e21f230474e2079e913728360d443dd 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -1826,13 +1826,6 @@ LLView* LLView::findNextSibling(LLView* child)
 	return (next_it != mChildList.end()) ? *next_it : NULL;
 }
 
-void LLView::deleteViewByHandle(LLHandle<LLView> handle)
-{
-	LLView* viewp = handle.get();
-
-	delete viewp;
-}
-
 
 LLCoordGL getNeededTranslation(const LLRect& input, const LLRect& constraint, BOOL allow_partial_outside)
 {
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 594a5eec6be9b8927f45b76d66c9730ad326dae7..7a1b2e4ba047872aee08b9cd79347ddc9f170326 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -482,7 +482,6 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 	// return query for iterating over focus roots in tab order
 	static const LLCtrlQuery & getFocusRootsQuery();
 
-	static void deleteViewByHandle(LLHandle<LLView> handle);
 	static LLWindow*	getWindow(void) { return LLUI::sWindow; }
 
 	// Set up params after XML load before calling new(),
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 0b17d64eb078a60daeebc5f3d33a2412f45b8395..836c580ea89033ae1b3131251a6ecdc6a272ef3a 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -403,8 +403,8 @@ LLFavoritesBarCtrl::~LLFavoritesBarCtrl()
 {
 	gInventory.removeObserver(this);
 
-	LLView::deleteViewByHandle(mOverflowMenuHandle);
-	LLView::deleteViewByHandle(mContextMenuHandle);
+	delete mOverflowMenuHandle.get();
+	delete mContextMenuHandle.get();
 }
 
 BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 00dc7b1627500a411bb3421ec5d2bbf2b500dac5..9d020517d84c275cf2f6a2e39e0c20f9931ffb2f 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -2112,7 +2112,7 @@ LLFloaterSnapshot::LLFloaterSnapshot(const LLSD& key)
 // Destroys the object
 LLFloaterSnapshot::~LLFloaterSnapshot()
 {
-	LLView::deleteViewByHandle(impl.mPreviewHandle);
+	delete impl.mPreviewHandle.get();
 
 	//unfreeze everything else
 	gSavedSettings.setBOOL("FreezeTime", FALSE);
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 9ba5f827e254b47b4d809077acdacdb12d26829b..6ec2598e4479ee7b0ecfdee947b8598571380442 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -299,7 +299,7 @@ LLFolderView::~LLFolderView( void )
 	mAutoOpenItems.removeAllNodes();
 	gIdleCallbacks.deleteFunction(idle, this);
 
-	LLView::deleteViewByHandle(mPopupMenuHandle);
+	delete mPopupMenuHandle.get();
 
 	mAutoOpenItems.removeAllNodes();
 	clearSelection();
@@ -1969,7 +1969,7 @@ BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 void LLFolderView::deleteAllChildren()
 {
 	closeRenamer();
-	LLView::deleteViewByHandle(mPopupMenuHandle);
+	delete mPopupMenuHandle.get();
 	mPopupMenuHandle = LLHandle<LLView>();
 	mScrollContainer = NULL;
 	mRenameItem = NULL;
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp
index c3e6e1c2dca29c0fd9ea096a3110148559bc9b41..f7ed1116cbd38c05ca55c59971812d1b08ee62f7 100644
--- a/indra/newview/llgrouplist.cpp
+++ b/indra/newview/llgrouplist.cpp
@@ -95,7 +95,7 @@ LLGroupList::LLGroupList(const Params& p)
 LLGroupList::~LLGroupList()
 {
 	gAgent.removeListener(this);
-	LLView::deleteViewByHandle(mContextMenuHandle);
+	delete mContextMenuHandle.get();
 }
 
 // virtual
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index e3a7b749ea6be37294d2204355fe42feb2988928..177aa4f5c81dd0a6958a8d2c62801521b3124823 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -526,11 +526,11 @@ LLPanelPeople::~LLPanelPeople()
 		LLVoiceClient::getInstance()->removeObserver(this);
 	}
 
-	LLView::deleteViewByHandle(mGroupPlusMenuHandle);
-	LLView::deleteViewByHandle(mNearbyViewSortMenuHandle);
-	LLView::deleteViewByHandle(mFriendsViewSortMenuHandle);
-	LLView::deleteViewByHandle(mGroupsViewSortMenuHandle);
-	LLView::deleteViewByHandle(mRecentViewSortMenuHandle);
+	delete mGroupPlusMenuHandle.get();
+	delete mNearbyViewSortMenuHandle.get();
+	delete mFriendsViewSortMenuHandle.get();
+	delete mGroupsViewSortMenuHandle.get();
+	delete mRecentViewSortMenuHandle.get();
 
 }
 
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 9b35e78134a5d59faa992a703e7a97b00113ef48..dfa8c75493f53f0d6735b79c4a364ad5d940761b 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -388,7 +388,7 @@ LLTeleportHistoryPanel::LLTeleportHistoryPanel()
 LLTeleportHistoryPanel::~LLTeleportHistoryPanel()
 {
 	LLTeleportHistoryFlatItemStorage::instance().purge();
-	LLView::deleteViewByHandle(mGearMenuHandle);
+	delete mGearMenuHandle.get();
 }
 
 BOOL LLTeleportHistoryPanel::postBuild()
diff --git a/indra/newview/skins/default/xui/en/menu_toolbars.xml b/indra/newview/skins/default/xui/en/menu_toolbars.xml
index b3ecd3dcb67075556c3f1381950e918ce477cfeb..de13fec6701eccac9af05690649e8a763ae25c4b 100644
--- a/indra/newview/skins/default/xui/en/menu_toolbars.xml
+++ b/indra/newview/skins/default/xui/en/menu_toolbars.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu bottom="825"
+<context_menu
       layout="topleft"
       name="Toolbars Popup"
       visible="false">
@@ -26,4 +26,4 @@
     <on_check function="Toolbars.CheckSetting"
               parameter="icons_only" />
   </menu_item_check>
-</menu>
+</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 95ccc6e92c5e89dce9b9d9be5e6513fb3c6922f5..29b5d022997be0a8122880ef4ec3af73b27c8422 100644
--- a/indra/newview/skins/default/xui/en/widgets/toolbar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/toolbar.xml
@@ -7,7 +7,6 @@
          pad_between="5"
          mouse_opaque="false"
          read_only="false">
-
   <button_panel name="button_panel"
                 bg_opaque_image="Rounded_Rect"
                 background_visible="true"