diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 51545bcc07cad066646712c09db0ae37d5c75f8a..4179d7a58d581e88d35141f5a20d50c7e822a0fe 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -33,6 +33,7 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llavataractions.h"
 #include "llavatarlistitem.h"
 
 #include "llfloaterreg.h"
@@ -49,6 +50,7 @@ LLAvatarListItem::LLAvatarListItem()
 	mStatus(NULL),
 	mSpeakingIndicator(NULL),
 	mInfoBtn(NULL),
+	mProfileBtn(NULL),
 	mContextMenu(NULL),
 	mAvatarId(LLUUID::null)
 {
@@ -63,10 +65,14 @@ BOOL  LLAvatarListItem::postBuild()
 
 	mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");
 	mInfoBtn = getChild<LLButton>("info_btn");
+	mProfileBtn = getChild<LLButton>("profile_btn");
 
 	mInfoBtn->setVisible(false);
 	mInfoBtn->setClickedCallback(boost::bind(&LLAvatarListItem::onInfoBtnClick, this));
 
+	mProfileBtn->setVisible(false);
+	mProfileBtn->setClickedCallback(boost::bind(&LLAvatarListItem::onProfileBtnClick, this));
+
 /*
 	if(!p.buttons.profile)
 	{
@@ -104,6 +110,7 @@ void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)
 {
 	childSetVisible("hovered_icon", true);
 	mInfoBtn->setVisible(true);
+	mProfileBtn->setVisible(true);
 
 	LLPanel::onMouseEnter(x, y, mask);
 }
@@ -112,6 +119,7 @@ void LLAvatarListItem::onMouseLeave(S32 x, S32 y, MASK mask)
 {
 	childSetVisible("hovered_icon", false);
 	mInfoBtn->setVisible(false);
+	mProfileBtn->setVisible(false);
 
 	LLPanel::onMouseLeave(x, y, mask);
 }
@@ -171,6 +179,11 @@ void LLAvatarListItem::onInfoBtnClick()
 	*/
 }
 
+void LLAvatarListItem::onProfileBtnClick()
+{
+	LLAvatarActions::showProfile(mAvatarId);
+}
+
 void LLAvatarListItem::showStatus(bool show_status)
 {
 	// *HACK: dirty hack until we can determine correct avatar status (EXT-1076).
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index bde9250e4a18ba6a5fb112c3feea7b4c78d61b4d..871441b2d3eef6ade633e373e8f56704c4af6ee7 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -66,6 +66,7 @@ class LLAvatarListItem : public LLPanel
 	const std::string getAvatarName() const;
 
 	void onInfoBtnClick();
+	void onProfileBtnClick();
 
 	void showSpeakingIndicator(bool show) { mSpeakingIndicator->setVisible(show); }
 	void showInfoBtn(bool show_info_btn) {mInfoBtn->setVisible(show_info_btn); }
@@ -82,6 +83,7 @@ class LLAvatarListItem : public LLPanel
 	
 	LLOutputMonitorCtrl* mSpeakingIndicator;
 	LLButton* mInfoBtn;
+	LLButton* mProfileBtn;
 	ContextMenu* mContextMenu;
 
 	LLUUID mAvatarId;
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index e3440ee779234c702e63dd27b52894c9ab939254..2b7bd83ca3c7c6a4ae9069b32d0d89a37a6f62e9 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -682,7 +682,11 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
 			{
 				std::string notifyMsg = notification->getMessage();
 				if (!notifyMsg.empty())
+				{
 					floater->addHistoryLine(notifyMsg,LLUIColorTable::instance().getColor("SystemChatColor"));
+
+					LLIMModel::getInstance()->addMessage(session_id, SYSTEM_FROM, LLUUID::null, notifyMsg);
+				}
 			}
 		}
 
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 23664fa6d65a6c336590690f0a102c567d9c24ab..340b0fa22cec68bcb4027035093f641d07912166 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -763,15 +763,14 @@ bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 index)
 	if(mScrollArea->addChild(chiclet))
 	{
 		S32 offset = 0;
-		// Do not scroll chiclets if chiclets are scrolled right and new
-		// chiclet is added to the beginning of the list
-		if(canScrollLeft())
+
+		// if index == 0 and chickelt list isn't empty insert chiclet before first in the list
+		// without scrolling, so other visible chicklets aren't change screen position
+		if (0 == index && !mChicletList.empty())
 		{
-			offset = - (chiclet->getRequiredRect().getWidth() + getChicletPadding());
-			if(0 == index)
-			{
-				offset += getChiclet(0)->getRect().mLeft;
-			}
+			offset = getChiclet(0)->getRect().mLeft
+					- (chiclet->getRequiredRect().getWidth()
+							+ getChicletPadding());
 		}
 
 		mChicletList.insert(mChicletList.begin() + index, chiclet);
@@ -1128,6 +1127,25 @@ BOOL LLChicletPanel::handleScrollWheel(S32 x, S32 y, S32 clicks)
 	return TRUE;
 }
 
+bool LLChicletPanel::isAnyIMFloaterDoked()
+{
+	bool res = false;
+	for (chiclet_list_t::iterator it = mChicletList.begin(); it
+			!= mChicletList.end(); it++)
+	{
+		LLIMFloater* im_floater = LLFloaterReg::findTypedInstance<LLIMFloater>(
+				"impanel", (*it)->getSessionId());
+		if (im_floater != NULL && im_floater->getVisible()
+				&& !im_floater->isMinimized() && im_floater->isDocked())
+		{
+			res = true;
+			break;
+		}
+	}
+
+	return res;
+}
+
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index ef47b543331fa7f51eb6bafa8cc990f0c13b58ed..458bc73bc42dcdee01db757d01134233bfe29f02 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -752,6 +752,8 @@ class LLChicletPanel : public LLPanel
 
 	S32 getScrollingOffset() { return mScrollingOffset; }
 
+	bool isAnyIMFloaterDoked();
+
 protected:
 
 	chiclet_list_t mChicletList;
@@ -818,7 +820,10 @@ T* LLChicletPanel::createChiclet(const LLUUID& session_id /*= LLUUID::null*/, S3
 		return NULL;
 	}
 
-	scrollToChiclet(chiclet);
+	if (!isAnyIMFloaterDoked())
+	{
+		scrollToChiclet(chiclet);
+	}
 
 	chiclet->setSessionId(session_id);
 
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp
index 4caef8e0001810e322a50165a685e0e0ee88b067..ae869d9ac4e7d8b0ce7e5f63f2151890e41629af 100644
--- a/indra/newview/llgrouplist.cpp
+++ b/indra/newview/llgrouplist.cpp
@@ -315,7 +315,7 @@ void LLGroupListItem::setActive(bool active)
 	// rebuild the text.  This will cause problems if the text contains
 	// hyperlinks, as their styles will be wrong.
 	std::string text = mGroupNameBox->getText();
-	mGroupNameBox->clear();
+	mGroupNameBox->setText(LLStringUtil::null);// *HACK: replace with clear() when it's fixed.
 	mGroupNameBox->appendText(text, false, style_params);
 }
 
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index c2d515f15833d79350cbc8c816e579ce4b9d7370..0ff3bd24e983b59978d9b1d171f5af22936c83f2 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -1013,33 +1013,28 @@ LLFloaterIMPanel::LLFloaterIMPanel(const std::string& session_label,
 				       (void *)this);
 	}
 
-	if ( !mSessionInitialized )
+	//*TODO we probably need the same "awaiting message" thing in LLIMFloater
+	LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionUUID);
+	if (!im_session)
 	{
-		if ( !LLIMModel::instance().sendStartSession(
-				 mSessionUUID,
-				 mOtherParticipantUUID,
-				 mSessionInitialTargetIDs,
-				 mDialog) )
-		{
-			//we don't need to need to wait for any responses
-			//so we're already initialized
-			mSessionInitialized = TRUE;
-			mSessionStartMsgPos = 0;
-		}
-		else
-		{
-			//locally echo a little "starting session" message
-			LLUIString session_start = sSessionStartString;
+		llerror("im session with id " + mSessionUUID.asString() + " does not exist!", 0);
+		return;
+	}
 
-			session_start.setArg("[NAME]", getTitle());
-			mSessionStartMsgPos = 
-				mHistoryEditor->getWText().length();
+	mSessionInitialized =  im_session->mSessionInitialized;
+	if (!mSessionInitialized)
+	{
+		//locally echo a little "starting session" message
+		LLUIString session_start = sSessionStartString;
 
-			addHistoryLine(
-				session_start,
-				LLUIColorTable::instance().getColor("SystemChatColor"),
-				false);
-		}
+		session_start.setArg("[NAME]", getTitle());
+		mSessionStartMsgPos = 
+			mHistoryEditor->getWText().length();
+
+		addHistoryLine(
+			session_start,
+			LLUIColorTable::instance().getColor("SystemChatColor"),
+			false);
 	}
 }
 
@@ -1346,25 +1341,6 @@ void LLFloaterIMPanel::addHistoryLine(const std::string &utf8msg, const LLColor4
 	mHistoryEditor->appendText(utf8msg, prepend_newline, LLStyle::Params().color(color));
 	mHistoryEditor->blockUndo();
 
-	S32 im_log_option =  gSavedPerAccountSettings.getS32("IMLogOptions");
-	if (log_to_file && (im_log_option!=LOG_CHAT))
-	{
-		std::string histstr;
-		if (gSavedPerAccountSettings.getBOOL("LogTimestamp"))
-			histstr = LLLogChat::timestamp(gSavedPerAccountSettings.getBOOL("LogTimestampDate")) + name + separator_string + utf8msg;
-		else
-			histstr = name + separator_string + utf8msg;
-
-		if(im_log_option==LOG_BOTH_TOGETHER)
-		{
-			LLLogChat::saveHistory(std::string("chat"),histstr);
-		}
-		else
-		{
-			LLLogChat::saveHistory(getTitle(),histstr);
-		}
-	}
-
 	if (!isInVisibleChain())
 	{
 		mNumUnreadMessages++;
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 6b947b2503ae7f0daa052bd7121ca681a378eff4..2ecd3eb448f516cd21d565c610fe3870f46369c4 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -86,6 +86,7 @@ LLIMMgr* gIMMgr = NULL;
 //
 // *FIXME: make these all either UIStrings or Strings
 
+const static std::string IM_SEPARATOR(": ");
 
 std::map<LLUUID, LLIMModel::LLIMSession*> LLIMModel::sSessionsMap;
 
@@ -119,14 +120,16 @@ LLIMModel::LLIMModel()
 }
 
 
-LLIMModel::LLIMSession::LLIMSession( const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id )
+LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
 :	mSessionID(session_id),
 	mName(name),
 	mType(type),
 	mNumUnread(0),
 	mOtherParticipantID(other_participant_id),
+	mInitialTargetIDs(ids),
 	mVoiceChannel(NULL),
-	mSpeakers(NULL)
+	mSpeakers(NULL),
+	mSessionInitialized(false)
 {
 	if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
 	{
@@ -140,6 +143,14 @@ LLIMModel::LLIMSession::LLIMSession( const LLUUID& session_id, const std::string
 
 	// All participants will be added to the list of people we've recently interacted with.
 	mSpeakers->addListener(&LLRecentPeople::instance(), "add");
+
+	if (!LLIMModel::getInstance()->sendStartSession(mSessionID, mOtherParticipantID, 
+		mInitialTargetIDs, mType))
+	{
+		//we don't need to wait for any responses
+		//so we're already initialized
+		mSessionInitialized = true;
+	}
 }
 
 LLIMModel::LLIMSession::~LLIMSession()
@@ -186,11 +197,18 @@ void LLIMModel::updateSessionID(const LLUUID& old_session_id, const LLUUID& new_
 		session->mSessionID = new_session_id;
 		session->mVoiceChannel->updateSessionID(new_session_id);
 
-		//*TODO set session initialized flag here? (IB)
+		session->mSessionInitialized = true;
 
 		sSessionsMap.erase(old_session_id);
 		sSessionsMap[new_session_id] = session;
 	}
+
+	//*TODO remove this "floater" stuff when Communicate Floater is gone
+	LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(old_session_id);
+	if (floater)
+	{
+		floater->sessionInitReplyReceived(new_session_id);
+	}
 }
 
 void LLIMModel::testMessages()
@@ -219,7 +237,7 @@ void LLIMModel::testMessages()
 }
 
 
-bool LLIMModel::newSession(LLUUID session_id, std::string name, EInstantMessage type, LLUUID other_participant_id)
+bool LLIMModel::newSession(LLUUID session_id, std::string name, EInstantMessage type, LLUUID other_participant_id, const std::vector<LLUUID>& ids)
 {
 	if (is_in_map(sSessionsMap, session_id))
 	{
@@ -227,7 +245,7 @@ bool LLIMModel::newSession(LLUUID session_id, std::string name, EInstantMessage
 		return false;
 	}
 
-	LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id);
+	LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids);
 	sSessionsMap[session_id] = session;
 
 	LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id);
@@ -303,9 +321,34 @@ bool LLIMModel::addToHistory(LLUUID session_id, std::string from, std::string ut
 
 }
 
-		
-bool LLIMModel::addMessage(LLUUID session_id, std::string from, LLUUID from_id, std::string utf8_text) { 
+//*TODO rewrite chat history persistence using LLSD serialization (IB)
+bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const std::string& utf8_text)
+{
+	S32 im_log_option =  gSavedPerAccountSettings.getS32("IMLogOptions");
+	if (im_log_option != LOG_CHAT)
+	{
+		std::string histstr;
+		if (gSavedPerAccountSettings.getBOOL("LogTimestamp"))
+			histstr = LLLogChat::timestamp(gSavedPerAccountSettings.getBOOL("LogTimestampDate")) + from + IM_SEPARATOR + utf8_text;
+		else
+			histstr = from + IM_SEPARATOR + utf8_text;
+
+		if(im_log_option == LOG_BOTH_TOGETHER)
+		{
+			LLLogChat::saveHistory(std::string("chat"), histstr);
+			return true;
+		}
+		else
+		{
+			LLLogChat::saveHistory(LLIMModel::getInstance()->getName(session_id), histstr);
+			return true;
+		}
+	}
+	return false;
+}
 
+//*TODO add const qualifier and pass by references (IB)
+bool LLIMModel::addMessage(LLUUID session_id, std::string from, LLUUID from_id, std::string utf8_text, bool log2file /* = true */) { 
 	LLIMSession* session = findIMSession(session_id);
 
 	if (!session) 
@@ -315,10 +358,8 @@ bool LLIMModel::addMessage(LLUUID session_id, std::string from, LLUUID from_id,
 	}
 
 	addToHistory(session_id, from, utf8_text);
+	if (log2file) logToFile(session_id, from, utf8_text);
 
-	std::string agent_name;
-	LLAgentUI::buildFullname(agent_name);
-	
 	session->mNumUnread++;
 
 	// notify listeners
@@ -527,7 +568,7 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
 		// Do we have to replace the /me's here?
 		std::string from;
 		LLAgentUI::buildFullname(from);
-		LLIMModel::instance().addToHistory(im_session_id, from, utf8_text);
+		LLIMModel::getInstance()->addMessage(im_session_id, from, gAgentID, utf8_text);
 
 		//local echo for the legacy communicate panel
 		std::string history_echo;
@@ -1475,9 +1516,12 @@ LLUUID LLIMMgr::addSession(
 
 	if (!LLIMModel::getInstance()->findIMSession(session_id))
 	{
-		LLIMModel::instance().newSession(session_id, name, dialog, other_participant_id);
+		LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids);
 	}
 
+	LLIMFloater::show(session_id);
+
+	//*TODO remove this "floater" thing when Communicate Floater's gone
 	LLFloaterIMPanel* floater = findFloaterBySession(session_id);
 	if(!floater)
 	{
@@ -1490,19 +1534,17 @@ LLUUID LLIMMgr::addSession(
 			dialog,
 			TRUE,
 			ids);
+	}
 
-		if ( !floater ) return LLUUID::null;
-
-		noteOfflineUsers(floater, ids);
+	noteOfflineUsers(session_id, floater, ids);
 
-		// Only warn for regular IMs - not group IMs
-		if( dialog == IM_NOTHING_SPECIAL )
-		{
-			noteMutedUsers(floater, ids);
-		}
+	// Only warn for regular IMs - not group IMs
+	if( dialog == IM_NOTHING_SPECIAL )
+	{
+		noteMutedUsers(session_id, floater, ids);
 	}
-	floater->setInputFocus(TRUE);
-	LLIMFloater::show(session_id);
+
+
 
 	return session_id;
 }
@@ -1868,18 +1910,25 @@ LLFloaterIMPanel* LLIMMgr::createFloater(
 }
 
 void LLIMMgr::noteOfflineUsers(
+	const LLUUID& session_id,
 	LLFloaterIMPanel* floater,
 	const LLDynamicArray<LLUUID>& ids)
 {
 	S32 count = ids.count();
 	if(count == 0)
 	{
-		floater->addHistoryLine(LLTrans::getString("only_user_message"), LLUIColorTable::instance().getColor("SystemChatColor"));
+		const std::string& only_user = LLTrans::getString("only_user_message");
+		if (floater)
+		{
+			floater->addHistoryLine(only_user, LLUIColorTable::instance().getColor("SystemChatColor"));
+		}
+		LLIMModel::getInstance()->addMessage(session_id, SYSTEM_FROM, LLUUID::null, only_user);
 	}
 	else
 	{
 		const LLRelationship* info = NULL;
 		LLAvatarTracker& at = LLAvatarTracker::instance();
+		LLIMModel* im_model = LLIMModel::getInstance();
 		for(S32 i = 0; i < count; ++i)
 		{
 			info = at.getBuddyInfo(ids.get(i));
@@ -1890,13 +1939,19 @@ void LLIMMgr::noteOfflineUsers(
 				LLUIString offline = LLTrans::getString("offline_message");
 				offline.setArg("[FIRST]", first);
 				offline.setArg("[LAST]", last);
-				floater->addHistoryLine(offline, LLUIColorTable::instance().getColor("SystemChatColor"));
+
+				if (floater)
+				{
+					floater->addHistoryLine(offline, LLUIColorTable::instance().getColor("SystemChatColor"));
+				}
+
+				im_model->addMessage(session_id, SYSTEM_FROM, LLUUID::null, offline);
 			}
 		}
 	}
 }
 
-void LLIMMgr::noteMutedUsers(LLFloaterIMPanel* floater,
+void LLIMMgr::noteMutedUsers(const LLUUID& session_id, LLFloaterIMPanel* floater,
 								  const LLDynamicArray<LLUUID>& ids)
 {
 	// Don't do this if we don't have a mute list.
@@ -1909,12 +1964,18 @@ void LLIMMgr::noteMutedUsers(LLFloaterIMPanel* floater,
 	S32 count = ids.count();
 	if(count > 0)
 	{
+		LLIMModel* im_model = LLIMModel::getInstance();
+		
 		for(S32 i = 0; i < count; ++i)
 		{
 			if( ml->isMuted(ids.get(i)) )
 			{
 				LLUIString muted = LLTrans::getString("muted_message");
+
+				//*TODO remove this "floater" thing when Communicate Floater's gone
 				floater->addHistoryLine(muted);
+
+				im_model->addMessage(session_id, SYSTEM_FROM, LLUUID::null, muted);
 				break;
 			}
 		}
@@ -1941,17 +2002,6 @@ void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)
 	}
 }
 
-void LLIMMgr::updateFloaterSessionID(
-	const LLUUID& old_session_id,
-	const LLUUID& new_session_id)
-{
-	LLFloaterIMPanel* floater = findFloaterBySession(old_session_id);
-	if (floater)
-	{
-		floater->sessionInitReplyReceived(new_session_id);
-	}
-}
-
 class LLViewerChatterBoxSessionStartReply : public LLHTTPNode
 {
 public:
@@ -1980,9 +2030,6 @@ class LLViewerChatterBoxSessionStartReply : public LLHTTPNode
 		if ( success )
 		{
 			session_id = body["session_id"].asUUID();
-			gIMMgr->updateFloaterSessionID(
-				temp_session_id,
-				session_id);
 
 			LLIMModel::getInstance()->updateSessionID(temp_session_id, session_id);
 
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 9a94d01bb29ee55de40bcf29a076790dab0389e3..df28c16bb1446467a217a2da9a4ca18870c70c03 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -53,18 +53,21 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 	struct LLIMSession
 	{
 		LLIMSession(const LLUUID& session_id, const std::string& name, 
-			const EInstantMessage& type, const LLUUID& other_participant_id);
+			const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids);
 		virtual ~LLIMSession();
 
 		LLUUID mSessionID;
 		std::string mName;
 		EInstantMessage mType;
 		LLUUID mOtherParticipantID;
+		std::vector<LLUUID> mInitialTargetIDs;
 		S32 mNumUnread;
 		std::list<LLSD> mMsgs;
 
 		LLVoiceChannel* mVoiceChannel;
 		LLIMSpeakerMgr* mSpeakers;
+
+		bool mSessionInitialized;
 	};
 	
 
@@ -88,11 +91,16 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 
 	boost::signals2::connection addChangedCallback( boost::function<void (const LLSD& data)> cb );
 
-	bool newSession(LLUUID session_id, std::string name, EInstantMessage type, LLUUID other_participant_id);
+	bool newSession(LLUUID session_id, std::string name, EInstantMessage type, LLUUID other_participant_id, 
+		const std::vector<LLUUID>& ids = std::vector<LLUUID>());
 	bool clearSession(LLUUID session_id);
 	std::list<LLSD> getMessages(LLUUID session_id, int start_index = 0);
-	bool addMessage(LLUUID session_id, std::string from, LLUUID other_participant_id, std::string utf8_text);
+
+	bool addMessage(LLUUID session_id, std::string from, LLUUID other_participant_id, std::string utf8_text, bool log2file = true);
 	bool addToHistory(LLUUID session_id, std::string from, std::string utf8_text); 
+
+	bool logToFile(const LLUUID& session_id, const std::string& from, const std::string& utf8_text);
+
 	//used to get the name of the session, for use as the title
 	//currently just the other avatar name
 	const std::string& getName(const LLUUID& session_id) const;
@@ -223,12 +231,6 @@ class LLIMMgr : public LLSingleton<LLIMMgr>
 		const std::string& session_handle = LLStringUtil::null,
 		const std::string& session_uri = LLStringUtil::null);
 
-	//Updates a given session's session IDs.  Does not open,
-	//create or do anything new.  If the old session doesn't
-	//exist, then nothing happens.
-	void updateFloaterSessionID(const LLUUID& old_session_id,
-								const LLUUID& new_session_id);
-
 	void processIMTypingStart(const LLIMInfo* im_info);
 	void processIMTypingStop(const LLIMInfo* im_info);
 
@@ -293,8 +295,8 @@ class LLIMMgr : public LLSingleton<LLIMMgr>
 	// prints a simple message if they are not online. Used to help
 	// reduce 'hello' messages to the linden employees unlucky enough
 	// to have their calling card in the default inventory.
-	void noteOfflineUsers(LLFloaterIMPanel* panel, const LLDynamicArray<LLUUID>& ids);
-	void noteMutedUsers(LLFloaterIMPanel* panel, const LLDynamicArray<LLUUID>& ids);
+	void noteOfflineUsers(const LLUUID& session_id, LLFloaterIMPanel* panel, const LLDynamicArray<LLUUID>& ids);
+	void noteMutedUsers(const LLUUID& session_id, LLFloaterIMPanel* panel, const LLDynamicArray<LLUUID>& ids);
 
 	void processIMTypingCore(const LLIMInfo* im_info, BOOL typing);
 
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 261d0836a0b08dbb3ae3d83c66ae30ac3fb63bac..44dd11dd8626e686185a20fb2ad5da5e1689abef 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -39,7 +39,6 @@
 #include "llavataractions.h"
 #include "llavatarpropertiesprocessor.h"
 #include "llcallingcard.h"
-#include "lldateutil.h"		// ageFromDate()
 #include "llfloaterreporter.h"
 #include "llfloaterworldmap.h"
 #include "llmutelist.h"
@@ -359,7 +358,7 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data)
 {
 	LLStringUtil::format_map_t args;
 	args["[BORN_ON]"] = data->born_on;
-	args["[AGE]"] = LLDateUtil::ageFromDate(data->born_on);
+	args["[AGE]"] = data->born_on;
 	args["[SL_PROFILE]"] = data->about_text;
 	args["[RW_PROFILE"] = data->fl_about_text;
 	args["[ACCTTYPE]"] = LLAvatarPropertiesProcessor::accountType(data);
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index b47d6f42143e51399374da6bbbb12e0de7d383f6..ff7f08bf9733886683c2bb05beffd0272b81f559 100644
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -530,6 +530,8 @@ void notify_automute_callback(const LLUUID& agent_id, const std::string& first_n
 			{
 				timp->addHistoryLine(message);
 			}
+
+			LLIMModel::getInstance()->addMessage(agent_id, SYSTEM_FROM, LLUUID::null, message);
 		}
 
 		LLChat auto_chat(message);
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index c2e1019f4366a75adb64423bd5385342ca20c6aa..4f3bca50ff18e8241ad20679db30f0bc566bec9c 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -192,7 +192,7 @@ BOOL LLNearbyChatBar::postBuild()
 	mChatBox->setKeystrokeCallback(&onChatBoxKeystroke, this);
 	mChatBox->setFocusLostCallback(boost::bind(&onChatBoxFocusLost, _1, this));
 
-	mChatBox->setIgnoreArrowKeys(TRUE);
+	mChatBox->setIgnoreArrowKeys( FALSE ); 
 	mChatBox->setCommitOnFocusLost( FALSE );
 	mChatBox->setRevertOnEsc( FALSE );
 	mChatBox->setIgnoreTab(TRUE);
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index c543f85f2240241f40c93d4b87b59a6a89c1bf3a..3a3ea1fc3ca80f28e829dc8f674b596a61fe0c42 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -38,7 +38,6 @@
 #include "llavatarconstants.h"	// AVATAR_ONLINE
 #include "llcallingcard.h"
 #include "llcombobox.h"
-#include "lldateutil.h"
 #include "llimview.h"
 #include "lltexteditor.h"
 #include "lltexturectrl.h"
@@ -448,7 +447,7 @@ void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_g
 
 void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
 {
-	childSetValue("register_date", LLDateUtil::ageFromDate(avatar_data->born_on));
+	childSetValue("register_date", avatar_data->born_on );
 	childSetValue("sl_description_edit", avatar_data->about_text);
 	childSetValue("fl_description_edit",avatar_data->fl_about_text);
 	childSetValue("2nd_life_pic", avatar_data->image_id);
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index a6b67d668aa1cb0dc2d321addb97caa76c1deb85..1c2875bf467ee3314012f381a928054e5157353c 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -476,8 +476,15 @@ bool LLPanelGroupGeneral::confirmMatureApply(const LLSD& notification, const LLS
 
 	// If we got here it means they set a valid value
 	std::string mesg = "";
-	apply(mesg);
-	return false;
+	bool ret = apply(mesg);
+	if ( !mesg.empty() )
+	{
+		LLSD args;
+		args["MESSAGE"] = mesg;
+		LLNotifications::instance().add("GenericAlert", args);
+	}
+
+	return ret;
 }
 
 // static
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index c3ae2d953aeb3c6e5c651adc3c3214ae6a41c9b5..f7f08b9b6a4e1a313a672aaccfa5607d32ca5195 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -47,7 +47,7 @@
      top="4"
      use_ellipses="true" 
      value="Unknown"
-     width="180" />
+     width="162" />
     <text
      follows="right"
      font="SansSerif"
@@ -85,4 +85,19 @@
      picture_style="true"
      top="2"
      width="18" />
+    <button
+     follows="right"
+     font="SansSerifBigBold"
+     height="18"
+     image_disabled="profile_chevron_btn.tga"
+     image_disabled_selected="profile_chevron_btn.tga"
+     image_hover_selected="profile_chevron_btn_active.tga"
+     image_selected="profile_chevron_btn_active.tga"
+     image_unselected="profile_chevron_btn.tga"
+     layout="topleft"
+     left_pad="2"
+     name="profile_btn"
+     picture_style="true"
+     top="2"
+     width="18" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
index b13058f40a1a652802ffd9d2ea6023e86fd4631c..b728c23bc576745dece0212780cc38d28a58b926 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
@@ -14,7 +14,8 @@
  width="255">
    <string
     name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+       [ACCTTYPE] 
+[PAYMENTINFO] [AGEVERIFICATION]
    </string>
    <string
     name="AcctTypeResident"
@@ -294,7 +295,7 @@
          width="100"/>
         <text
          follows="left|top|right"
-         height="15"
+         height="20"
          layout="topleft"
          left="10"
          name="acc_status_text"
diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml
index deea0a44abd5daf4f4bacdf51f26b8dd9b896ebd..bd98996ae13718963d0da6787bb41f0c944f41d0 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml
@@ -7,13 +7,13 @@
         4
     </string>
 	<panel follows="top" background_visible="true" bevel_style="in" bg_alpha_color="black"
-		height="50" label="header" layout="topleft" left="0" name="header"
+		height="30" label="header" layout="topleft" left="0" name="header"
 		top="0" width="350">
-		<icon follows="left|top|right|bottom" height="40"  width="40" layout="topleft"
+		<icon follows="left|top|right|bottom" height="20"  width="20" layout="topleft"
 			top="5"  left="5" mouse_opaque="true" name="group_icon"/>
 		<text type="string" length="1" follows="left|top|right|bottom"
-			font="SansSerifBigBold" height="20" layout="topleft" left="60" name="title"
-			text_color="GroupNotifyTextColor" top="20" width="275" use_ellipses="true">
+			font="SansSerifBigBold" height="20" layout="topleft" left_pad="10" name="title"
+			text_color="GroupNotifyTextColor" top="5" width="275" use_ellipses="true">
 			Sender Name / Group Name
         </text>
 	</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 78aff64216cf949d30f3bdbfc6ca768cb2ea8435..bdd1d8066374a3a1867cac2a4bc5ebad2407e936 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -10,7 +10,8 @@
  width="313">
     <string
      name="CaptionTextAcctInfo">
-        [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+        [ACCTTYPE] 
+[PAYMENTINFO] [AGEVERIFICATION]
     </string>
     <string
      name="payment_update_link_url">
@@ -198,7 +199,7 @@
          width="100"/> -->
         <text
          follows="left|top"
-         height="15"
+         height="20"
          layout="topleft"
          left="10"
          name="acc_status_text"