diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index bc740dde1713783830c2a4947746f8bcdb9e655b..8a0513f24652f780cbe0cdbb360b4eaa0cf69623 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -455,12 +455,42 @@ void LLFloaterReg::toggleFloaterInstance(const LLSD& sdname)
 //static
 void LLFloaterReg::toggleToolbarFloaterInstance(const LLSD& sdname)
 {
-	// Do some extra logic here for 3-state toolbar floater toggling madness :)
-
+	//
+	// Floaters controlled by the toolbar behave a bit differently from others.
+	// Namely they have 3-4 states as defined in the design wiki page here:
+	//   https://wiki.lindenlab.com/wiki/FUI_Button_states
+	//
+	// The basic idea is this:
+	// * If the target floater is minimized, this button press will un-minimize it.
+	// * Else if the target floater is closed open it.
+	// * Else if the target floater does not have focus, give it focus.
+	//       * Also, if it is not on top, bring it forward when focus is given.
+	// * Else the target floater is open, close it.
+	// 
+
+	// First parse the parameter
 	LLSD key;
 	std::string name = sdname.asString();
 	parse_name_key(name, key);
-	toggleInstance(name, key);
+
+	LLFloater* instance = findInstance(name, key); 
+
+	if (LLFloater::isMinimized(instance))
+	{
+		instance->setMinimized(FALSE);
+	}
+	else if (!LLFloater::isShown(instance))
+	{
+		showInstance(name, key, TRUE);
+	}
+	else if (!instance->hasFocus())
+	{
+		instance->setFocus(TRUE);
+	}
+	else
+	{
+		instance->closeFloater();
+	}
 }
 
 //static