diff --git a/indra/llui/llbadge.cpp b/indra/llui/llbadge.cpp
index ea934aa93ba34f612f35e233eda024d69167d45c..e4c64e327e9486f04844073191ebb4f74feaca2f 100644
--- a/indra/llui/llbadge.cpp
+++ b/indra/llui/llbadge.cpp
@@ -38,6 +38,8 @@ template class LLBadge* LLView::getChild<class LLBadge>(const std::string& name,
 
 LLBadge::Params::Params()
 	: image("image")
+	, border_image("border_image")
+	, border_color("border_color")
 	, image_color("image_color")
 	, label("label")
 	, label_color("label_color")
@@ -57,6 +59,8 @@ bool LLBadge::Params::equals(const Params& a) const
 	
 	// skip owner in comparison on purpose
 	
+	comp &= (border_image() == a.border_image());
+	comp &= (border_color() == a.border_color());
 	comp &= (image() == a.image());
 	comp &= (image_color() == a.image_color());
 	comp &= (label() == a.label());
@@ -73,6 +77,8 @@ bool LLBadge::Params::equals(const Params& a) const
 LLBadge::LLBadge(const LLBadge::Params& p)
 	: LLUICtrl(p)
 	, mOwner(p.owner)
+	, mBorderImage(p.border_image)
+	, mBorderColor(p.border_color)
 	, mGLFont(p.font)
 	, mImage(p.image)
 	, mImageColor(p.image_color)
@@ -216,6 +222,11 @@ void LLBadge::draw()
 				F32 badge_y = badge_center_y - badge_height * 0.5f;
 			
 				mImage->drawSolid(badge_x, badge_y, badge_width, badge_height, mImageColor % alpha);
+
+				if (!mBorderImage.isNull())
+				{
+					mBorderImage->drawSolid(badge_x, badge_y, badge_width, badge_height, mBorderColor % alpha);
+				}
 			}
 			else
 			{
diff --git a/indra/llui/llbadge.h b/indra/llui/llbadge.h
index c2e0a763b2dfba604fad806c6718cd3f486c8bdf..05a76af42c9664604476ef1108656abbac70a963 100644
--- a/indra/llui/llbadge.h
+++ b/indra/llui/llbadge.h
@@ -94,6 +94,9 @@ class LLBadge
 	{
 		Optional< LLHandle<LLUICtrl> >	owner;	// Mandatory in code but not in xml
 		
+		Optional< LLUIImage* >			border_image;
+		Optional< LLUIColor >			border_color;
+
 		Optional< LLUIImage* >			image;
 		Optional< LLUIColor >			image_color;
 		
@@ -126,6 +129,9 @@ class LLBadge
 	void				setLabel( const LLStringExplicit& label);
 
 private:
+	LLPointer< LLUIImage >	mBorderImage;
+	LLUIColor				mBorderColor;
+
 	const LLFontGL*			mGLFont;
 	
 	LLPointer< LLUIImage >	mImage;
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index a63281b3c12ae2460c04444e5e858c838b9e2962..c841933a5fc23b05db6a181ec0ef6b59ff9d2569 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -1098,7 +1098,7 @@ void LLButton::addBadgeToParentPanel()
 		{
 			parentPanel = dynamic_cast<LLPanel*>(parent);
 		
-			if (parentPanel != NULL)
+			if (parentPanel && parentPanel->acceptsBadge())
 			{
 				break;
 			}
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 232ab81e0d37db84786e44a2838703ab979440d0..07f03957199789ed1f6e39507058f249db238de6 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -125,7 +125,7 @@ class LLButton
 		Optional<F32>				hover_glow_amount;
 		Optional<TimeIntervalParam>	held_down_delay;
 
-		Optional<bool>			use_draw_context_alpha;
+		Optional<bool>				use_draw_context_alpha;
 		
 		Optional<LLBadge::Params>	badge;
 
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index b2383106a86c05cbbeddb602237c95bce6beb51b..1dcdd79efae5cd37e7ae925ec8871e490e4f52d3 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -87,7 +87,8 @@ LLPanel::Params::Params()
 	filename("filename"),
 	class_name("class"),
 	help_topic("help_topic"),
-	visible_callback("visible_callback")
+	visible_callback("visible_callback"),
+	accepts_badge("accepts_badge")
 {
 	name = "panel";
 	addSynonym(background_visible, "bg_visible");
@@ -113,7 +114,8 @@ LLPanel::LLPanel(const LLPanel::Params& p)
 	mCommitCallbackRegistrar(false),
 	mEnableCallbackRegistrar(false),
 	mXMLFilename(p.filename),
-	mVisibleSignal(NULL)
+	mVisibleSignal(NULL),
+	mAcceptsBadge(p.accepts_badge)
 	// *NOTE: Be sure to also change LLPanel::initFromParams().  We have too
 	// many classes derived from LLPanel to retrofit them all to pass in params.
 {
@@ -485,6 +487,8 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
 	mBgAlphaImage = p.bg_alpha_image();
 	mBgOpaqueImageOverlay = p.bg_opaque_image_overlay;
 	mBgAlphaImageOverlay = p.bg_alpha_image_overlay;
+
+	mAcceptsBadge = p.accepts_badge;
 }
 
 static LLFastTimer::DeclareTimer FTM_PANEL_SETUP("Panel Setup");
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index 7bbbeaf709cacfa8f93c5cff9623ebd53d3f1bac..67674fab7e9ca9f56727787907585f1c7392d796 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -89,6 +89,8 @@ class LLPanel : public LLUICtrl
 		Multiple<LocalizedString>	strings;
 		
 		Optional<CommitCallbackParam> visible_callback;
+
+		Optional<bool>			accepts_badge;
 		
 		Params();
 	};
@@ -250,6 +252,8 @@ class LLPanel : public LLUICtrl
 	
 	boost::signals2::connection setVisibleCallback( const commit_signal_t::slot_type& cb );
 
+	bool acceptsBadge() const { return mAcceptsBadge; }
+
 protected:
 	// Override to set not found list
 	LLButton*		getDefaultButton() { return mDefaultBtn; }
@@ -264,6 +268,7 @@ class LLPanel : public LLUICtrl
 	static factory_stack_t	sFactoryStack;
 	
 private:
+	bool			mAcceptsBadge;
 	BOOL			mBgVisible;				// any background at all?
 	BOOL			mBgOpaque;				// use opaque color or image
 	LLUIColor		mBgOpaqueColor;
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 0a06b5e74f6b38480b9f1e3df73b9fd69687c2a8..d58df5801bec40247347736bd5e2cf9bb793dad4 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -68,6 +68,7 @@ LLUICtrl::ControlVisibility::ControlVisibility()
 LLUICtrl::Params::Params()
 :	tab_stop("tab_stop", true),
 	chrome("chrome", false),
+	requests_front("requests_front", false),
 	label("label"),
 	initial_value("value"),
 	init_callback("init_callback"),
@@ -96,9 +97,10 @@ const LLUICtrl::Params& LLUICtrl::getDefaultParams()
 
 LLUICtrl::LLUICtrl(const LLUICtrl::Params& p, const LLViewModelPtr& viewmodel) 
 :	LLView(p),
-	mTentative(FALSE),
 	mIsChrome(FALSE),
+	mRequestsFront(p.requests_front),
 	mTabStop(FALSE),
+	mTentative(FALSE),
     mViewModel(viewmodel),
 	mControlVariable(NULL),
 	mEnabledControlVariable(NULL),
@@ -123,6 +125,8 @@ void LLUICtrl::initFromParams(const Params& p)
 {
 	LLView::initFromParams(p);
 
+	mRequestsFront = p.requests_front;
+
 	setIsChrome(p.chrome);
 	setControlName(p.control_name);
 	if(p.enabled_controls.isProvided())
@@ -403,6 +407,36 @@ LLViewModel* LLUICtrl::getViewModel() const
 	return mViewModel;
 }
 
+//virtual
+BOOL LLUICtrl::postBuild()
+{
+	//
+	// Find all of the children that want to be in front and move them to the front
+	//
+
+	if (getChildCount() > 0)
+	{
+		std::vector<LLUICtrl*> childrenToMoveToFront;
+
+		for (LLView::child_list_const_iter_t child_it = beginChild(); child_it != endChild(); ++child_it)
+		{
+			LLUICtrl* uictrl = dynamic_cast<LLUICtrl*>(*child_it);
+
+			if (uictrl && uictrl->mRequestsFront)
+			{
+				childrenToMoveToFront.push_back(uictrl);
+			}
+		}
+
+		for (std::vector<LLUICtrl*>::iterator it = childrenToMoveToFront.begin(); it != childrenToMoveToFront.end(); ++it)
+		{
+			sendChildToFront(*it);
+		}
+	}
+
+	return LLView::postBuild();
+}
+
 bool LLUICtrl::setControlValue(const LLSD& value)
 {
 	if (mControlVariable)
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index b37e9f6b1b4d5818a811b91db300e26e4aac6a9c..09bed9b958e896c9a7bfba6bd7111bbc087f2aee 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -94,7 +94,8 @@ class LLUICtrl
 	{
 		Optional<std::string>			label;
 		Optional<bool>					tab_stop,
-										chrome;
+										chrome,
+										requests_front;
 		Optional<LLSD>					initial_value;
 
 		Optional<CommitCallbackParam>	init_callback,
@@ -143,6 +144,8 @@ class LLUICtrl
 	virtual LLViewModel* getViewModel() const;
     // We shouldn't ever need to set this directly
     //virtual void    setViewModel(const LLViewModelPtr&);
+
+	virtual BOOL	postBuild();
 	
 public:
 	// LLView interface
@@ -301,8 +304,9 @@ class LLUICtrl
 
 private:
 
-	BOOL			mTabStop;
 	BOOL			mIsChrome;
+	BOOL			mRequestsFront;
+	BOOL			mTabStop;
 	BOOL			mTentative;
 	LLRootHandle<LLUICtrl> mUICtrlHandle;
 
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index a548849d60f8b1489baf94fa0c97311d150898f6..efd2559a552d1136512b46c7b854272cd8e3ff16 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -136,7 +136,7 @@
      name="BadgeImageColor"
      value="0.44 0.69 0.56 1.0" />
     <color
-     name="BadgeImageBorderColor"
+     name="BadgeBorderColor"
      value="0.9 0.9 0.9 1.0" />
     <color
      name="BadgeLabelColor"
diff --git a/indra/newview/skins/default/xui/en/widgets/badge.xml b/indra/newview/skins/default/xui/en/widgets/badge.xml
index ceec09d1e40956497d8c11011082d1ec664f8b9e..f77c4b71787f75830591a37bc533086d1bc1b12b 100644
--- a/indra/newview/skins/default/xui/en/widgets/badge.xml
+++ b/indra/newview/skins/default/xui/en/widgets/badge.xml
@@ -1,7 +1,9 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <!-- Additional attributes:
    -->
-<badge font="SansSerifSmall"
+<badge border_image="Badge_Border"
+       border_color="BadgeBorderColor"
+       font="SansSerifSmall"
        image="Badge_Background"
        image_color="BadgeImageColor"
        label_color="BadgeLabelColor"
@@ -10,5 +12,6 @@
        location_percent_vcenter="85"
        padding_horiz="7"
        padding_vert="4"
+       requests_front="true"
        >
 </badge>
diff --git a/indra/newview/skins/default/xui/en/widgets/panel.xml b/indra/newview/skins/default/xui/en/widgets/panel.xml
index 9bf99fa363eb623052cee62325bb0291c5f9d085..47a210d9b70d989b6d086798196c06372728ea88 100644
--- a/indra/newview/skins/default/xui/en/widgets/panel.xml
+++ b/indra/newview/skins/default/xui/en/widgets/panel.xml
@@ -10,4 +10,5 @@
        bg_alpha_image_overlay="White"
        background_visible="false"
        background_opaque="false"
-       chrome="false"/>
\ No newline at end of file
+       chrome="false"
+       accepts_badge="true"/>
\ No newline at end of file