diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp
index c68a96ef5d722d81c3a9fd412a1194d5f50292d6..7bd6ef8cd7bd1620b125a213b4942f65483c4e3e 100644
--- a/indra/newview/llconversationlog.cpp
+++ b/indra/newview/llconversationlog.cpp
@@ -228,7 +228,7 @@ void LLConversationLog::logConversation(const LLUUID& session_id, BOOL has_offli
 	const LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id);
 	LLConversation* conversation = findConversation(session);
 
-	if (session)
+	if (session && session->mOtherParticipantID != gAgentID)
 	{
     	if (conversation)
 		{
diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
index 7184a70db51e629b397be7282f265bbb0a3135db..bfc564f4077dcd634429abc9695ee412a7ef6bdc 100644
--- a/indra/newview/llconversationmodel.cpp
+++ b/indra/newview/llconversationmodel.cpp
@@ -37,6 +37,8 @@
 #include "llimview.h" //For LLIMModel
 #include "lltrans.h"
 
+#include <boost/foreach.hpp>
+
 //
 // Conversation items : common behaviors
 //
@@ -234,15 +236,19 @@ void LLConversationItemSession::updateName(LLConversationItemParticipant* partic
 	}
 
 	uuid_vec_t temp_uuids; // uuids vector for building the added participants' names string
-	if (conversation_type == CONV_SESSION_AD_HOC)
+	if (conversation_type == CONV_SESSION_AD_HOC || conversation_type == CONV_SESSION_1_ON_1)
 	{
 		// Build a string containing the participants UUIDs (minus own agent) and check if ready for display (we don't want "(waiting)" in there)
 		// Note: we don't bind ourselves to the LLAvatarNameCache event as updateParticipantName() is called by
 		// onAvatarNameCache() which is itself attached to the same event.
-		child_list_t::iterator iter = mChildren.begin();
-		while (iter != mChildren.end())
+
+		// In the case of a P2P conversation, we need to grab the name of the other participant in the session instance itself
+		// as we do not create participants for such a session.
+
+		LLFolderViewModelItem * itemp;
+		BOOST_FOREACH(itemp, mChildren)
 		{
-			LLConversationItemParticipant* current_participant = dynamic_cast<LLConversationItemParticipant*>(*iter);
+			LLConversationItem* current_participant = dynamic_cast<LLConversationItem*>(itemp);
 			// Add the avatar uuid to the list (except if it's the own agent uuid)
 			if (current_participant->getUUID() != gAgentID)
 			{
@@ -250,18 +256,13 @@ void LLConversationItemSession::updateName(LLConversationItemParticipant* partic
 				if (LLAvatarNameCache::get(current_participant->getUUID(), &av_name))
 				{
 					temp_uuids.push_back(current_participant->getUUID());
+
+					if (conversation_type == CONV_SESSION_1_ON_1)
+					{
+						break;
+					}
 				}
 			}
-			iter++;
-		}
-	}
-	else if (conversation_type == CONV_SESSION_1_ON_1)
-	{
-		// In the case of a P2P conversation, we need to grab the name of the other participant in the session instance itself
-		// as we do not create participants for such a session.
-		if (gAgentID != participant->getUUID())
-		{
-			temp_uuids.push_back(participant->getUUID());
 		}
 	}
 
diff --git a/indra/newview/llfloaterconversationlog.cpp b/indra/newview/llfloaterconversationlog.cpp
index a44ebcf6ab615a9052f1ee94bbf8673d8690c84c..07723ce44df1dab714c2e5bf17aaf28f482516ad 100644
--- a/indra/newview/llfloaterconversationlog.cpp
+++ b/indra/newview/llfloaterconversationlog.cpp
@@ -72,6 +72,7 @@ BOOL LLFloaterConversationLog::postBuild()
 
 void LLFloaterConversationLog::draw()
 {
+	getChild<LLMenuButton>("conversations_gear_btn")->setEnabled(mConversationLogList->getSelectedItem() != NULL);
 	LLFloater::draw();
 }
 
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index f52cf3b8f01b4eae1a9ef55094540b7e8fa682c7..6dbcdb447472b5fd29d3b4487a52b529a44930f7 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -498,25 +498,28 @@ void LLFloaterIMSessionTab::refreshConversation()
 		updateSessionName(session_name);
 	}
 
-	LLParticipantList* participant_list = getParticipantList();
-	if (participant_list)
+	if (mSessionID.notNull())
 	{
-		LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = participant_list->getChildrenBegin();
-		LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = participant_list->getChildrenEnd();
-		LLIMSpeakerMgr *speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
-		while (current_participant_model != end_participant_model)
+		LLParticipantList* participant_list = getParticipantList();
+		if (participant_list)
 		{
-			LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
-			if (speaker_mgr && participant_model)
+			LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = participant_list->getChildrenBegin();
+			LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = participant_list->getChildrenEnd();
+			LLIMSpeakerMgr *speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+			while (current_participant_model != end_participant_model)
 			{
-				LLSpeaker *participant_speaker = speaker_mgr->findSpeaker(participant_model->getUUID());
-				LLSpeaker *agent_speaker = speaker_mgr->findSpeaker(gAgentID);
-				if (participant_speaker && agent_speaker)
+				LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
+				if (speaker_mgr && participant_model)
 				{
-					participant_model->setDisplayModeratorRole(agent_speaker->mIsModerator && participant_speaker->mIsModerator);
+					LLSpeaker *participant_speaker = speaker_mgr->findSpeaker(participant_model->getUUID());
+					LLSpeaker *agent_speaker = speaker_mgr->findSpeaker(gAgentID);
+					if (participant_speaker && agent_speaker)
+					{
+						participant_model->setDisplayModeratorRole(agent_speaker->mIsModerator && participant_speaker->mIsModerator);
+					}
 				}
+				current_participant_model++;
 			}
-			current_participant_model++;
 		}
 	}
 	
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 5dd5704916f9a741a17034ac0927e6d5d0a2f606..5acb0b63740450ee63cd2ce068bcdcc043fb3259 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -847,8 +847,9 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co
 
 bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, bool voice, bool has_offline_msg)
 {
-	uuid_vec_t no_ids;
-	return newSession(session_id, name, type, other_participant_id, no_ids, voice, has_offline_msg);
+	uuid_vec_t ids;
+	ids.push_back(other_participant_id);
+	return newSession(session_id, name, type, other_participant_id, ids, voice, has_offline_msg);
 }
 
 bool LLIMModel::clearSession(const LLUUID& session_id)
@@ -2545,12 +2546,6 @@ void LLIMMgr::addMessage(
 {
 	LLUUID other_participant_id = target_id;
 
-	// Agent can't create session with himself
-	if (other_participant_id == gAgentID)
-	{
-		return;
-	}
-
 	LLUUID new_session_id = session_id;
 	if (new_session_id.isNull())
 	{