diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 8839afb60df9b4effb49cc1d5fdc2b33df56b6d2..7cee9f5b46215299909811a1343d8437eb16bcdf 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -46,6 +46,7 @@
 
 const F32	CURSOR_FLASH_DELAY = 1.0f;  // in seconds
 const S32	CURSOR_THICKNESS = 2;
+const F32	TRIPLE_CLICK_INTERVAL = 0.3f;	// delay between double and triple click.
 
 LLTextBase::line_info::line_info(S32 index_start, S32 index_end, LLRect rect, S32 line_num) 
 :	mDocIndexStart(index_start), 
@@ -605,7 +606,8 @@ void LLTextBase::drawText()
 
 				// Find the start of the first word
 				U32 word_start = seg_start, word_end = -1;
-				while ( (word_start < wstrText.length()) && (!LLStringOps::isAlpha(wstrText[word_start])) )
+				U32 text_length = wstrText.length();
+				while ( (word_start < text_length) && (!LLStringOps::isAlpha(wstrText[word_start])) )
 				{
 					word_start++;
 				}
@@ -627,11 +629,15 @@ void LLTextBase::drawText()
 						break;
 					}
 
-					// Don't process words shorter than 3 characters
-					std::string word = wstring_to_utf8str(wstrText.substr(word_start, word_end - word_start));
-					if ( (word.length() >= 3) && (!LLSpellChecker::instance().checkSpelling(word)) )
+					if (word_start < text_length && word_end <= text_length && word_end > word_start)
 					{
-						mMisspellRanges.push_back(std::pair<U32, U32>(word_start, word_end));
+						std::string word = wstring_to_utf8str(wstrText.substr(word_start, word_end - word_start));
+
+						// Don't process words shorter than 3 characters
+						if ( (word.length() >= 3) && (!LLSpellChecker::instance().checkSpelling(word)) )
+						{
+							mMisspellRanges.push_back(std::pair<U32, U32>(word_start, word_end));
+						}
 					}
 
 					// Find the start of the next word
@@ -999,6 +1005,13 @@ void LLTextBase::insertSegment(LLTextSegmentPtr segment_to_insert)
 
 BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask)
 {
+	// handle triple click
+	if (!mTripleClickTimer.hasExpired())
+	{
+		selectAll();
+		return TRUE;
+	}
+
 	LLTextSegmentPtr cur_segment = getSegmentAtLocalPos(x, y);
 	if (cur_segment && cur_segment->handleMouseDown(x, y, mask))
 	{
@@ -1073,6 +1086,7 @@ BOOL LLTextBase::handleRightMouseUp(S32 x, S32 y, MASK mask)
 
 BOOL LLTextBase::handleDoubleClick(S32 x, S32 y, MASK mask)
 {
+	mTripleClickTimer.setTimerExpirySec(TRIPLE_CLICK_INTERVAL);
 	LLTextSegmentPtr cur_segment = getSegmentAtLocalPos(x, y);
 	if (cur_segment && cur_segment->handleDoubleClick(x, y, mask))
 	{
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 629b304b25ddf10da72fe72d3f7750f90ddeb8b2..ad566a36d394d34e11bb442c480499b82c7a2474 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -598,7 +598,8 @@ class LLTextBase
 	// selection
 	S32							mSelectionStart;
 	S32							mSelectionEnd;
-	
+	LLTimer		                mTripleClickTimer;
+
 	BOOL						mIsSelecting;		// Are we in the middle of a drag-select? 
 
 	// spell checking
diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp
index 82176b3a067020b9958f48f8c824fd0b9ac4aac2..15d61e978d67f83d3981d8c11e57537cbc82418d 100644
--- a/indra/newview/llconversationlog.cpp
+++ b/indra/newview/llconversationlog.cpp
@@ -276,7 +276,7 @@ void LLConversationLog::updateConversationName(const LLIMModel::LLIMSession* ses
 	LLConversation* conversation = findConversation(session);
 	if (conversation)
 	{
-		conversation->setConverstionName(name);
+		conversation->setConversationName(name);
 		notifyParticularConversationObservers(conversation->getSessionID(), LLConversationLogObserver::CHANGED_NAME);
 	}
 }
@@ -378,7 +378,7 @@ void LLConversationLog::cache()
 std::string LLConversationLog::getFileName()
 {
 	std::string filename = "conversation";
-	return gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, filename) + ".log";
+	return gDirUtilp->getExpandedFilename(LL_PATH_PER_ACCOUNT_CHAT_LOGS, filename) + ".log";
 }
 
 bool LLConversationLog::saveToFile(const std::string& filename)
diff --git a/indra/newview/llconversationlog.h b/indra/newview/llconversationlog.h
index d5b6eccb294d4a6cbcf146c829f544581bee2164..fd3855613150f6864104690a9d47230e70058780 100644
--- a/indra/newview/llconversationlog.h
+++ b/indra/newview/llconversationlog.h
@@ -58,7 +58,7 @@ class LLConversation
 	const time_t&		getTime()				const	{ return mTime; }
 	bool				hasOfflineMessages()	const	{ return mHasOfflineIMs; }
 
-	void setConverstionName(std::string conv_name) { mConversationName = conv_name; }
+	void setConversationName(std::string conv_name) { mConversationName = conv_name; }
 	void setOfflineMessages(bool new_messages) { mHasOfflineIMs = new_messages; }
 	bool isOlderThan(U32 days) const;
 
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index 2b13ce6377835cabf6075f2d18965c0fbc7f9afd..cef45a5b567473ff7fb8dd0cbadbd87dfd29ab23 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -62,7 +62,8 @@ LLFloaterIMContainer::LLFloaterIMContainer(const LLSD& seed, const Params& param
 	mExpandCollapseBtn(NULL),
 	mConversationsRoot(NULL),
 	mConversationsEventStream("ConversationsEvents"),
-	mInitialized(false)
+	mInitialized(false),
+	mIsFirstLaunch(false)
 {
     mEnableCallbackRegistrar.add("IMFloaterContainer.Check", boost::bind(&LLFloaterIMContainer::isActionChecked, this, _2));
 	mCommitCallbackRegistrar.add("IMFloaterContainer.Action", boost::bind(&LLFloaterIMContainer::onCustomAction,  this, _2));
@@ -243,6 +244,7 @@ BOOL LLFloaterIMContainer::postBuild()
 	mGeneralTitle = getTitle();
 	
 	mInitialized = true;
+	mIsFirstLaunch = true;
 
 	// Add callbacks:
 	// We'll take care of view updates on idle
@@ -273,14 +275,19 @@ void LLFloaterIMContainer::addFloater(LLFloater* floaterp,
 		openFloater(floaterp->getKey());
 		return;
 	}
+
+	LLUUID session_id = floaterp->getKey();
 	
 	// Make sure the message panel is open when adding a floater or it stays mysteriously hidden
-	collapseMessagesPane(false);
+	if (!mIsFirstLaunch)
+	{
+		collapseMessagesPane(false);
+	}
 
 	// Add the floater
 	LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
 
-	LLUUID session_id = floaterp->getKey();
+
 	
 	LLIconCtrl* icon = 0;
 
@@ -630,6 +637,12 @@ void LLFloaterIMContainer::collapseMessagesPane(bool collapse)
 		return;
 	}
 
+	if (mIsFirstLaunch)
+	{
+		mIsFirstLaunch = false;
+		return;
+	}
+
 	// Save current width of panels before collapsing/expanding right pane.
 	S32 conv_pane_width = mConversationsPane->getRect().getWidth();
     S32 msg_pane_width = mMessagesPane->getRect().getWidth();
@@ -1756,7 +1769,7 @@ void LLFloaterIMContainer::openNearbyChat()
 {
 	// If there's only one conversation in the container and that conversation is the nearby chat
 	//(which it should be...), open it so to make the list of participants visible. This happens to be the most common case when opening the Chat floater.
-	if(mConversationsItems.size() == 1)
+	if((mConversationsItems.size() == 1)&&(!mConversationsPane->isCollapsed()))
 	{
 		LLConversationViewSession* nearby_chat = dynamic_cast<LLConversationViewSession*>(get_ptr_in_map(mConversationsWidgets,LLUUID()));
 		if (nearby_chat)
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
index 06af6c7b516e5fc1f0606e7e49b88872cd9f6fe5..a28dba3b988422f00ff8a4d30f3c53b8d4ddda20 100644
--- a/indra/newview/llfloaterimcontainer.h
+++ b/indra/newview/llfloaterimcontainer.h
@@ -167,6 +167,7 @@ class LLFloaterIMContainer
 	LLLayoutStack* mConversationsStack;
 	
 	bool mInitialized;
+	bool mIsFirstLaunch;
 
 	LLUUID mSelectedSession;
 	std::string mGeneralTitle;
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 2eaef48049ebb9e1cd17697a81992331351d0614..cdf6cb6252513786a990c59bc7218f53be3378a8 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -66,6 +66,7 @@
 #include "lltoolbarview.h"
 #include "llviewercontrol.h"
 #include "llviewerparcelmgr.h"
+#include "llconversationlog.h"
 #include "message.h"
 
 
@@ -950,6 +951,7 @@ bool LLIMModel::logToFile(const std::string& file_name, const std::string& from,
 		}
 
 		LLLogChat::saveHistory(file_name, from_name, from_id, utf8_text);
+		LLConversationLog::instance().cache(); // update the conversation log too
 		return true;
 	}
 	else
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 1357b613bb8e159e83f8736ea90c3c95391c7f11..fabcd50c7d8d52bbd9e9e0514f5d41d685d1d1b6 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -1401,8 +1401,7 @@ bool LLInventoryPanel::isSelectionRemovable()
 				}
 				else
 				{
-					can_delete &= listener->isItemRemovable();
-					can_delete &= !listener->isItemInTrash();
+					can_delete &= listener->isItemRemovable() && !listener->isItemInTrash();
 				}
 			}
 		}
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index bd6c42d4742011335e440706438e531fa63c31df..3fd056ea31b31294dd6dfef3184a9fba0dbe6af5 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -403,6 +403,9 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
         }
     }
 
+	//.xml file intially makes info panel only follow left/right/top. This is so that when control buttons are added the info panel 
+	//can shift upward making room for the buttons inside mControlPanel. After the buttons are added, the info panel can then be set to follow 'all'.
+	mInfoPanel->setFollowsAll();
     snapToMessageHeight(mTextBox, MAX_LENGTH);
 }
 
diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 421ecf10a17f916833f40826400a5c0ea14deb36..94c468e1bb0d06e189cc7d6cfeeee4ae94a13f8d 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -22,7 +22,7 @@
     background_visible="true"
   bg_alpha_color="ToastBackground"
   bg_opaque_color="ToastBackground"
-    follows="all"
+    follows="left|right|top"
     height="100"
     label="info_panel"
     layout="topleft"