diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 0e429225430c19323eb1fc49e9fb233d071c5716..04f6b11b7c7020587f6e6e013c94b496ebba556f 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -3039,7 +3039,29 @@ void LLFloaterView::syncFloaterTabOrder()
 			LLFloater* floaterp = dynamic_cast<LLFloater*>(*child_it);
 			if (gFocusMgr.childHasKeyboardFocus(floaterp))
 			{
-				bringToFront(floaterp, FALSE);
+                if (mFrontChild != floaterp)
+                {
+                    // Grab a list of the top floaters that want to stay on top of the focused floater
+					std::list<LLView*> listTop;
+					if (mFrontChild && !mFrontChild->canFocusStealFrontmost())
+                    {
+                        for (LLView* childfloaterp : *getChildList())
+                        {
+                            if (static_cast<LLFloater*>(childfloaterp)->canFocusStealFrontmost())
+                                break;
+							listTop.push_back(childfloaterp);
+                        }
+                    }
+
+                    bringToFront(floaterp, FALSE);
+
+                    // Restore top floaters
+                    for (LLView* childp :listTop)
+                    {
+                        sendChildToFront(childp);
+                    }
+                }
+
 				break;
 			}
 		}
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 2672d600c6236f828fbc3b822962b6f94b485279..1d4aff31eb0baf52fe7d27a72a4e9aac8230340d 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -313,6 +313,9 @@ class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater>
 	/*virtual*/ void setVisible(BOOL visible); // do not override
 	/*virtual*/ void onVisibilityChange ( BOOL new_visibility ); // do not override
 	
+	bool            canFocusStealFrontmost() const { return mFocusStealsFrontmost; }
+	void            setFocusStealsFrontmost(bool wants_frontmost) { mFocusStealsFrontmost = wants_frontmost; }
+
 	void			setFrontmost(BOOL take_focus = TRUE, BOOL restore = TRUE);
      virtual void	setVisibleAndFrontmost(BOOL take_focus=TRUE, const LLSD& key = LLSD());
 	
@@ -478,6 +481,7 @@ class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater>
 	BOOL			mCanTearOff;
 	BOOL			mCanMinimize;
 	BOOL			mCanClose;
+    bool            mFocusStealsFrontmost = true;	// FALSE if we don't want the currently focused floater to cover this floater without user interaction
 	BOOL			mDragOnLeft;
 	BOOL			mResizable;