diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 65bf1176ffaba8ade06dc35e0fd5fb8146ec7a3c..954da8abd7657dfe1bc2429467c99b4287c8c42b 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -2232,9 +2232,22 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 }
 
 //static
-BOOL LLIMFloater::toggle(const LLUUID& session_id)
+bool LLIMFloater::toggle(const LLUUID& session_id)
 {
-	return LLFloaterReg::toggleInstance("impanel", session_id);
+	LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
+	if (floater && floater->getVisible())
+	{
+		// clicking on chiclet to close floater just hides it to maintain existing
+		// scroll/text entry state
+		floater->setVisible(false);
+		return false;
+	}
+	else
+	{
+		// ensure the list of messages is updated when floater is made visible
+		show(session_id);
+		return true;
+	}
 }
 
 void LLIMFloater::updateMessages()
diff --git a/indra/newview/llimpanel.h b/indra/newview/llimpanel.h
index 52f67df4b7a98a1b32355a15b7c08e277711d98c..284a486b0fb71af400397728518095d93a6e8933 100644
--- a/indra/newview/llimpanel.h
+++ b/indra/newview/llimpanel.h
@@ -384,10 +384,12 @@ class LLIMFloater : public LLFloater
 	// LLFloater overrides
 	/*virtual*/ void setDocked(bool docked,  bool pop_on_undock = true);
 
+	// Make IM conversion visible and update the message history
 	static LLIMFloater* show(const LLUUID& session_id);
 
 	// Toggle panel specified by session_id
-	static BOOL toggle(const LLUUID& session_id);
+	// Returns true iff panel became visible
+	static bool toggle(const LLUUID& session_id);
 
 	// get new messages from LLIMModel
 	void updateMessages();