diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 5568a844943737f7d8542875efd4d7c417f1445d..a28cda55e6f217ebf2010d20e71149c7b410999b 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -3990,25 +3990,39 @@ void LLTearOffMenu::closeTearOff()
 }
 
 LLContextMenuBranch::LLContextMenuBranch(const LLContextMenuBranch::Params& p) 
-:	LLMenuItemGL(p),
-	mBranch( p.branch()->getHandle() )
+:	LLMenuItemGL(p)
+{
+	LLContextMenu* branch = static_cast<LLContextMenu*>(p.branch);
+	if (branch)
+	{
+		mBranchHandle = branch->getHandle();
+		branch->hide();
+		branch->setParentMenuItem(this);
+	}
+}
+
+LLContextMenuBranch::~LLContextMenuBranch()
 {
-	mBranch.get()->hide();
-	mBranch.get()->setParentMenuItem(this);
+	if (mBranchHandle.get())
+	{
+		mBranchHandle.get()->die();
+	}
 }
 
 // called to rebuild the draw label
 void LLContextMenuBranch::buildDrawLabel( void )
 {
+	auto menu = getBranch();
+	if (menu)
 	{
 		// default enablement is this -- if any of the subitems are
 		// enabled, this item is enabled. JC
-		U32 sub_count = mBranch.get()->getItemCount();
+		U32 sub_count = menu->getItemCount();
 		U32 i;
 		BOOL any_enabled = FALSE;
 		for (i = 0; i < sub_count; i++)
 		{
-			LLMenuItemGL* item = mBranch.get()->getItem(i);
+			LLMenuItemGL* item = menu->getItem(i);
 			item->buildDrawLabel();
 			if (item->getEnabled() && !item->getDrawTextDisabled() )
 			{
@@ -4030,13 +4044,17 @@ void LLContextMenuBranch::buildDrawLabel( void )
 
 void	LLContextMenuBranch::showSubMenu()
 {
-	LLMenuItemGL* menu_item = mBranch.get()->getParentMenuItem();
-	if (menu_item != NULL && menu_item->getVisible())
+	auto menu = getBranch();
+	if(menu)
 	{
-		S32 center_x;
-		S32 center_y;
-		localPointToScreen(getRect().getWidth(), getRect().getHeight() , &center_x, &center_y);
-		mBranch.get()->show(center_x, center_y);
+		LLMenuItemGL* menu_item = menu->getParentMenuItem();
+		if (menu_item != NULL && menu_item->getVisible())
+		{
+			S32 center_x;
+			S32 center_y;
+			localPointToScreen(getRect().getWidth(), getRect().getHeight(), &center_x, &center_y);
+			menu->show(center_x, center_y);
+		}
 	}
 }
 
@@ -4050,13 +4068,17 @@ void LLContextMenuBranch::setHighlight( BOOL highlight )
 {
 	if (highlight == getHighlight()) return;
 	LLMenuItemGL::setHighlight(highlight);
-	if( highlight )
-	{
-		showSubMenu();
-	}
-	else
+	auto menu = getBranch();
+	if (menu)
 	{
-		mBranch.get()->hide();
+		if (highlight)
+		{
+			showSubMenu();
+		}
+		else
+		{
+			menu->hide();
+		}
 	}
 }
 
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 1f11f26192b232da83c956076dd8df1ed22b9ee4..e3378aad6180407ea2c41db1249f66ea4b47fd7a 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -735,8 +735,7 @@ class LLContextMenuBranch : public LLMenuItemGL
 
 	LLContextMenuBranch(const Params&);
 
-	virtual ~LLContextMenuBranch()
-	{}
+	virtual ~LLContextMenuBranch();
 
 	// called to rebuild the draw label
 	virtual void	buildDrawLabel( void );
@@ -744,13 +743,13 @@ class LLContextMenuBranch : public LLMenuItemGL
 	// onCommit() - do the primary funcationality of the menu item.
 	virtual void	onCommit( void );
 
-	LLContextMenu*	getBranch() { return mBranch.get(); }
+	LLContextMenu*	getBranch() { return mBranchHandle.get(); }
 	void			setHighlight( BOOL highlight );
 
 protected:
 	void	showSubMenu();
 
-	LLHandle<LLContextMenu> mBranch;
+	LLHandle<LLContextMenu> mBranchHandle;
 };