diff --git a/.hgtags b/.hgtags
index af1d6bea4a905c025f40023e704a7ad7aade8a49..584e5a1e17fd6a55af806bd1af16ce05082fb14d 100644
--- a/.hgtags
+++ b/.hgtags
@@ -32,3 +32,4 @@ b0cd7e150009809a0b5b0a9d5785cd4bb230413a 2.2.0-beta3
 98e0d6df638429fd2f0476667504bd5a6b298def 2.3.0-beta1
 1415e6538d54fd5d568ee88343424d57c6803c2c 2.2.0-release
 98e0d6df638429fd2f0476667504bd5a6b298def 2.3.0-start
+a3c12342b1af0951b8aa3b828aacef17fcea8178 2.3.0-beta1
diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp
index 522b99bc02db21fac0cd2e3d53cb99282e6c357b..a8f53a38c39c74138818f8056377cbccaaef5afe 100644
--- a/indra/llmessage/llcachename.cpp
+++ b/indra/llmessage/llcachename.cpp
@@ -556,25 +556,38 @@ std::string LLCacheName::buildUsername(const std::string& full_name)
 //static 
 std::string LLCacheName::buildLegacyName(const std::string& complete_name)
 {
-	boost::regex complete_name_regex("(.+)( \\()([A-Za-z]+)(.[A-Za-z]+)*(\\))");
-	boost::match_results<std::string::const_iterator> name_results;
-	if (!boost::regex_match(complete_name, name_results, complete_name_regex)) return complete_name;
+	// regexp doesn't play nice with unicode, chop off the display name
+	S32 open_paren = complete_name.rfind(" (");
 
-	std::string legacy_name = name_results[3];
+	if (open_paren == std::string::npos)
+	{
+		return complete_name;
+	}
+
+	std::string username = complete_name.substr(open_paren);
+	boost::regex complete_name_regex("( \\()([a-z0-9]+)(.[a-z]+)*(\\))");
+	boost::match_results<std::string::const_iterator> name_results;
+	if (!boost::regex_match(username, name_results, complete_name_regex)) return complete_name;
+
+	std::string legacy_name = name_results[2];
 	// capitalize the first letter
 	std::string cap_letter = legacy_name.substr(0, 1);
 	LLStringUtil::toUpper(cap_letter);
-	legacy_name = cap_letter + legacy_name.substr(1);
-
-	if (name_results[4].matched)
-	{
-		std::string last_name = name_results[4];
+	legacy_name = cap_letter + legacy_name.substr(1);
+
+	if (name_results[3].matched)
+	{
+		std::string last_name = name_results[3];
 		std::string cap_letter = last_name.substr(1, 1);
 		LLStringUtil::toUpper(cap_letter);
-		last_name = cap_letter + last_name.substr(2);
-		legacy_name = legacy_name + " " + last_name;
-	}
-
+		last_name = cap_letter + last_name.substr(2);
+		legacy_name = legacy_name + " " + last_name;
+	}
+	else
+	{
+		legacy_name = legacy_name + " Resident";
+	}
+
 	return legacy_name;
 }
 
diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp
index 7f6df627e016ff37b7950dc03b4a400321259754..3f0deb98cdbe7ecc3a2e8796ee40bc44c957bfc6 100644
--- a/indra/newview/llhints.cpp
+++ b/indra/newview/llhints.cpp
@@ -109,7 +109,14 @@ class LLHintPopup : public LLPanel
 
 	/*virtual*/ BOOL postBuild();
 
-	void onClickClose() { hide(); LLNotifications::instance().cancel(mNotification); }
+	void onClickClose() 
+	{ 
+		if (!mHidden) 
+		{
+			hide(); 
+			LLNotifications::instance().cancel(mNotification);
+		}
+	}
 	void draw();
 	void hide() { if(!mHidden) {mHidden = true; mFadeTimer.reset();} }
 
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 914e7a3df09eed78dc904522b1b388070007f9de..164c51a9e05f85219ea0a18b315cc8c644a0757a 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -257,21 +257,17 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 	// history files have consistent (English) names in different locales.
 	if (isAdHocSessionType() && IM_SESSION_INVITE == type)
 	{
-		// Name here has a form of "<Avatar's name> Conference"
-		// Lets update it to localize the "Conference" word. See EXT-8429.
-		S32 separator_index = mName.rfind(" ");
-		std::string name = mName.substr(0, separator_index);
-		++separator_index;
-		std::string conference_word = mName.substr(separator_index, mName.length());
+		LLAvatarNameCache::get(mOtherParticipantID, 
+							   boost::bind(&LLIMModel::LLIMSession::onAdHocNameCache, 
+							   this, _2));
+	}
+}
 
-		// additional check that session name is what we expected
-		if ("Conference" == conference_word)
-		{
+void LLIMModel::LLIMSession::onAdHocNameCache(const LLAvatarName& av_name)
+{
 			LLStringUtil::format_map_t args;
-			args["[AGENT_NAME]"] = name;
+	args["[AGENT_NAME]"] = av_name.getCompleteName();
 			LLTrans::findString(mName, "conference-title-incoming", args);
-		}
-	}
 }
 
 void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction)
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 3da44658621675cc5d1bd9f3fbcd358cb9d0d5da..650d329e18548d3ec0ae44de109b92e663de86ea 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -100,6 +100,8 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 
 		void onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name);
 
+		void onAdHocNameCache(const LLAvatarName& av_name);
+
 		//*TODO make private
 		static std::string generateHash(const std::set<LLUUID>& sorted_uuids);
 
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index f4f1235d55ea74d494c5fc80061b701a972029e5..a779a1735c6f6fb952de98b69a238debbef64224 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -33,6 +33,8 @@
 #include <string>
 #include <vector>
 
+#include <boost/signals2.hpp>
+
 #include "imageids.h"			// IMG_INVISIBLE
 #include "llchat.h"
 #include "lldrawpoolalpha.h"
@@ -71,7 +73,8 @@ class LLVOAvatarSkeletonInfo;
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 class LLVOAvatar :
 	public LLViewerObject,
-	public LLCharacter
+	public LLCharacter,
+	public boost::signals2::trackable
 {
 public:
 	friend class LLVOAvatarSelf;
diff --git a/indra/newview/skins/default/xui/en/floater_display_name.xml b/indra/newview/skins/default/xui/en/floater_display_name.xml
index 7a3fb9334aa38156a75b0b60dc482f8a8079ecba..9a9fd32a773b3a07584c45368ce4f062d17bc6de 100644
--- a/indra/newview/skins/default/xui/en/floater_display_name.xml
+++ b/indra/newview/skins/default/xui/en/floater_display_name.xml
@@ -63,7 +63,7 @@
        width="300"
        height="20"
       font="SansSerif"
-    name="set_name_label">
+    name="name_confirm_label">
       Type your new name again to confirm:
     </text>
     <line_editor