diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp
index 04b8ef96375ea12958e3c0ce1a15f5799613fe50..e1e5f5bc022b2f7679c28ae3284c322eea51ffd3 100644
--- a/indra/llmessage/llcachename.cpp
+++ b/indra/llmessage/llcachename.cpp
@@ -75,7 +75,7 @@ public:
 public:
 	bool mIsGroup;
 	U32 mCreateTime;	// unix time_t
-	std::string mFirstName;
+	std::string mFirstName;		// IDEVO TODO collapse to one field
 	std::string mLastName;
 	std::string mGroupName;
 };
@@ -520,13 +520,7 @@ BOOL LLCacheName::getFullName(const LLUUID& id, std::string& fullname)
 {
 	std::string first_name, last_name;
 	BOOL res = getName(id, first_name, last_name);
-	fullname = first_name;
-	if (!last_name.empty())
-	{
-		// IDEVO legacy resident name, not SLID
-		fullname += " ";
-		fullname += last_name;
-	}
+	fullname = buildFullname(first_name, last_name);
 	return res;
 }
 
@@ -566,7 +560,7 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group)
 
 BOOL LLCacheName::getUUID(const std::string& first, const std::string& last, LLUUID& id)
 {
-	std::string fullname = first + " " + last;
+	std::string fullname = buildFullname(first, last);
 	return getUUID(fullname, id);
 }
 
@@ -584,6 +578,19 @@ BOOL LLCacheName::getUUID(const std::string& fullname, LLUUID& id)
 	}
 }
 
+//static
+std::string LLCacheName::buildFullname(const std::string& first, const std::string& last)
+{
+	std::string fullname = first;
+	if (!last.empty()
+		&& last != "Resident")
+	{
+		fullname += ' ';
+		fullname += last;
+	}
+	return fullname;
+}
+
 // This is a little bit kludgy. LLCacheNameCallback is a slot instead of a function pointer.
 //  The reason it is a slot is so that the legacy get() function below can bind an old callback
 //  and pass it as a slot. The reason it isn't a boost::function is so that trackable behavior
@@ -591,7 +598,7 @@ BOOL LLCacheName::getUUID(const std::string& fullname, LLUUID& id)
 //  we call it immediately. -Steve
 // NOTE: Even though passing first and last name is a bit of extra overhead, it eliminates the
 //  potential need for any parsing should any code need to handle first and last name independently.
-boost::signals2::connection LLCacheName::get(const LLUUID& id, BOOL is_group, const LLCacheNameCallback& callback)
+boost::signals2::connection LLCacheName::get(const LLUUID& id, bool is_group, const LLCacheNameCallback& callback)
 {
 	boost::signals2::connection res;
 	
@@ -599,7 +606,7 @@ boost::signals2::connection LLCacheName::get(const LLUUID& id, BOOL is_group, co
 	{
 		LLCacheNameSignal signal;
 		signal.connect(callback);
-		signal(id, sCacheName["nobody"], "", is_group);
+		signal(id, sCacheName["nobody"], is_group);
 		return res;
 	}
 
@@ -611,11 +618,13 @@ boost::signals2::connection LLCacheName::get(const LLUUID& id, BOOL is_group, co
 		// id found in map therefore we can call the callback immediately.
 		if (entry->mIsGroup)
 		{
-			signal(id, entry->mGroupName, "", entry->mIsGroup);
+			signal(id, entry->mGroupName, entry->mIsGroup);
 		}
 		else
 		{
-			signal(id, entry->mFirstName, entry->mLastName, entry->mIsGroup);
+			std::string fullname =
+				buildFullname(entry->mFirstName, entry->mLastName);
+			signal(id, fullname, entry->mIsGroup);
 		}
 	}
 	else
@@ -637,9 +646,9 @@ boost::signals2::connection LLCacheName::get(const LLUUID& id, BOOL is_group, co
 	return res;
 }
 
-boost::signals2::connection LLCacheName::get(const LLUUID& id, BOOL is_group, old_callback_t callback, void* user_data)
+boost::signals2::connection LLCacheName::get(const LLUUID& id, bool is_group, old_callback_t callback, void* user_data)
 {
-	return get(id, is_group, boost::bind(callback, _1, _2, _3, _4, user_data));
+	return get(id, is_group, boost::bind(callback, _1, _2, _3, user_data));
 }
 
 void LLCacheName::processPending()
@@ -711,7 +720,7 @@ void LLCacheName::dump()
 		{
 			llinfos
 				<< iter->first << " = "
-				<< entry->mFirstName << " " << entry->mLastName
+				<< buildFullname(entry->mFirstName, entry->mLastName)
 				<< " @ " << entry->mCreateTime
 				<< llendl;
 		}
@@ -757,11 +766,13 @@ void LLCacheName::Impl::processPendingReplies()
 
 		if (!entry->mIsGroup)
 		{
-			(reply->mSignal)(reply->mID, entry->mFirstName, entry->mLastName, FALSE);
+			std::string fullname =
+				LLCacheName::buildFullname(entry->mFirstName, entry->mLastName);
+			(reply->mSignal)(reply->mID, fullname, false);
 		}
 		else
 		{
-			(reply->mSignal)(reply->mID, entry->mGroupName, "", TRUE);
+			(reply->mSignal)(reply->mID, entry->mGroupName, true);
 		}
 	}
 
@@ -924,7 +935,8 @@ void LLCacheName::Impl::processUUIDReply(LLMessageSystem* msg, bool isGroup)
 			msg->getStringFast(_PREHASH_UUIDNameBlock, _PREHASH_FirstName, entry->mFirstName, i);
 			msg->getStringFast(_PREHASH_UUIDNameBlock, _PREHASH_LastName,  entry->mLastName, i);
 
-			// IDEVO HACK - blank out last name
+			// IDEVO blank out last name for storage to reduce string compares on
+			// retrieval.  Eventually need to convert to single mName field.
 			if (entry->mLastName == "Resident")
 			{
 				entry->mLastName = "";
@@ -938,13 +950,14 @@ void LLCacheName::Impl::processUUIDReply(LLMessageSystem* msg, bool isGroup)
 
 		if (!isGroup)
 		{
-			mSignal(id, entry->mFirstName, entry->mLastName, FALSE);
-			std::string fullname = entry->mFirstName + " " + entry->mLastName;
+			std::string fullname =
+				LLCacheName::buildFullname(entry->mFirstName, entry->mLastName);
+			mSignal(id, fullname, false);
 			mReverseCache[fullname] = id;
 		}
 		else
 		{
-			mSignal(id, entry->mGroupName, "", TRUE);
+			mSignal(id, entry->mGroupName, true);
 			mReverseCache[entry->mGroupName] = id;
 		}
 	}
@@ -973,4 +986,3 @@ void LLCacheName::Impl::handleUUIDGroupNameReply(LLMessageSystem* msg, void** us
 {
 	((LLCacheName::Impl*)userData)->processUUIDReply(msg, true);
 }
-
diff --git a/indra/llmessage/llcachename.h b/indra/llmessage/llcachename.h
index 111cc8b650a8367549a19db146b05188fd60aae1..c7385204f5eb9fc5d0cc7d7a2202eccf5c1d2693 100644
--- a/indra/llmessage/llcachename.h
+++ b/indra/llmessage/llcachename.h
@@ -42,13 +42,12 @@ class LLUUID;
 
 
 typedef boost::signals2::signal<void (const LLUUID& id,
-                                      const std::string& first_name,
-                                      const std::string& last_name,
-                                      BOOL is_group)> LLCacheNameSignal;
+                                      const std::string& name,
+                                      bool is_group)> LLCacheNameSignal;
 typedef LLCacheNameSignal::slot_type LLCacheNameCallback;
 
 // Old callback with user data for compatability
-typedef void (*old_callback_t)(const LLUUID&, const std::string&, const std::string&, BOOL, void*);
+typedef void (*old_callback_t)(const LLUUID&, const std::string&, bool, void*);
 
 // Here's the theory:
 // If you request a name that isn't in the cache, it returns "waiting"
@@ -89,6 +88,10 @@ public:
 	// Reverse lookup of UUID from name
 	BOOL getUUID(const std::string& first, const std::string& last, LLUUID& id);
 	BOOL getUUID(const std::string& fullname, LLUUID& id);
+
+	// IDEVO Temporary code
+	// Clean up new-style "bobsmith123 Resident" names to "bobsmith123" for display
+	static std::string buildFullname(const std::string& first, const std::string& last);
 	
 	// If available, this method copies the group name into the string
 	// provided. The caller must allocate at least
@@ -100,10 +103,10 @@ public:
 	// If the data is currently available, may call the callback immediatly
 	// otherwise, will request the data, and will call the callback when
 	// available.  There is no garuntee the callback will ever be called.
-	boost::signals2::connection get(const LLUUID& id, BOOL is_group, const LLCacheNameCallback& callback);
+	boost::signals2::connection get(const LLUUID& id, bool is_group, const LLCacheNameCallback& callback);
 	
 	// LEGACY
-	boost::signals2::connection get(const LLUUID& id, BOOL is_group, old_callback_t callback, void* user_data);
+	boost::signals2::connection get(const LLUUID& id, bool is_group, old_callback_t callback, void* user_data);
 	// This method needs to be called from time to time to send out
 	// requests.
 	void processPending();
diff --git a/indra/llmessage/mean_collision_data.h b/indra/llmessage/mean_collision_data.h
index 03b96f9f90645bec59ca07f1d0761279c2ddde24..a6c635e81ea1c52147bf557b0488a1ccb5095e73 100644
--- a/indra/llmessage/mean_collision_data.h
+++ b/indra/llmessage/mean_collision_data.h
@@ -61,7 +61,7 @@ public:
 	
 	LLMeanCollisionData(LLMeanCollisionData *mcd)
 		: mVictim(mcd->mVictim), mPerp(mcd->mPerp), mTime(mcd->mTime), mType(mcd->mType), mMag(mcd->mMag),
-		  mFirstName(mcd->mFirstName), mLastName(mcd->mLastName)
+		  mFullName(mcd->mFullName)
 	{
 	}		
 	
@@ -95,8 +95,7 @@ public:
 	time_t mTime;
 	EMeanCollisionType mType;
 	F32	   mMag;
-	std::string mFirstName;
-	std::string mLastName;
+	std::string mFullName;
 };
 
 
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 17aecaf32fd81860635a48c03dcd1bac799d5844..790240ab48b4cd1bae9d335a04b0a93ee69f1619 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -2493,7 +2493,7 @@ S32	LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin
 	LLUIImagePtr image = mStyle->getImage();
 	if( image.notNull())
 	{
-		num_pixels -= image->getWidth();
+		num_pixels = llmax(0, num_pixels - image->getWidth());
 	}
 
 	// search for newline and if found, truncate there
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index d04cb8c7ff22d78e2ade1f44dc6980ff37ca4129..40f8c27431922442651840cd1167c11d83e2638b 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -315,12 +315,11 @@ LLUrlEntryGroup::LLUrlEntryGroup()
 }
 
 void LLUrlEntryGroup::onGroupNameReceived(const LLUUID& id,
-										  const std::string& first,
-										  const std::string& last,
-										  BOOL is_group)
+										  const std::string& name,
+										  bool is_group)
 {
 	// received the group name from the server - tell our observers
-	callObservers(id.asString(), first);
+	callObservers(id.asString(), name);
 }
 
 std::string LLUrlEntryGroup::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
@@ -350,9 +349,9 @@ std::string LLUrlEntryGroup::getLabel(const std::string &url, const LLUrlLabelCa
 	}
 	else
 	{
-		gCacheName->get(group_id, TRUE,
+		gCacheName->get(group_id, true,
 			boost::bind(&LLUrlEntryGroup::onGroupNameReceived,
-				this, _1, _2, _3, _4));
+				this, _1, _2, _3));
 		addObserver(group_id_string, url, cb);
 		return LLTrans::getString("LoadingData");
 	}
diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h
index 33ec9d82a9c72a023d874fdd01316131701f64c3..6d875a40c7c3f5cd3894ce3839bd4ae5f5c3cd0a 100644
--- a/indra/llui/llurlentry.h
+++ b/indra/llui/llurlentry.h
@@ -168,8 +168,7 @@ public:
 	LLUrlEntryGroup();
 	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
 private:
-	void onGroupNameReceived(const LLUUID& id, const std::string& first,
-							 const std::string& last, BOOL is_group);
+	void onGroupNameReceived(const LLUUID& id, const std::string& name, bool is_group);
 };
 
 ///
diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp
index 3731800adffc97852eb39b28ceddac4a55d363dc..30bab1eb911921483bb9854063fb6c8a5b599a41 100644
--- a/indra/llui/tests/llurlentry_stub.cpp
+++ b/indra/llui/tests/llurlentry_stub.cpp
@@ -49,7 +49,7 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group)
 	return TRUE;
 }
 
-boost::signals2::connection LLCacheName::get(const LLUUID& id, BOOL is_group, const LLCacheNameCallback& callback)
+boost::signals2::connection LLCacheName::get(const LLUUID& id, bool is_group, const LLCacheNameCallback& callback)
 {
 	return boost::signals2::connection();
 }
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 87b8d807c4e8f78f46abc4d6d0ff372273ab6727..11cc45669545b87772ad0e3b17d7c907425ba8f5 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -244,7 +244,8 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)
 		LLIconCtrl::setValue(value);
 	}
 
-	gCacheName->get(mAvatarId, FALSE, boost::bind(&LLAvatarIconCtrl::nameUpdatedCallback, this, _1, _2, _3, _4));
+	gCacheName->get(mAvatarId, false,
+		boost::bind(&LLAvatarIconCtrl::nameUpdatedCallback, this, _1, _2, _3));
 }
 
 bool LLAvatarIconCtrl::updateFromCache()
@@ -289,22 +290,20 @@ void LLAvatarIconCtrl::processProperties(void* data, EAvatarProcessorType type)
 
 void LLAvatarIconCtrl::nameUpdatedCallback(
 	const LLUUID& id,
-	const std::string& first,
-	const std::string& last,
-	BOOL is_group)
+	const std::string& name,
+	bool is_group)
 {
 	if (id == mAvatarId)
 	{
-		mFirstName = first;
-		mLastName = last;
+		mFullName = name;
 
 		if (mDrawTooltip)
 		{
-			setToolTip(mFirstName + " " + mLastName);
+			setToolTip(name);
 		}
 		else
 		{
-			setToolTip(std::string(""));
+			setToolTip(std::string());
 		}
 	}
 }
diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h
index 38616b7852e2597accf4de6c099b2afadb1886af..a5452ee1d357f48eb050f01008dbcb1b8ffda033 100644
--- a/indra/newview/llavatariconctrl.h
+++ b/indra/newview/llavatariconctrl.h
@@ -92,20 +92,17 @@ public:
 
 	void nameUpdatedCallback(
 		const LLUUID& id,
-		const std::string& first,
-		const std::string& last,
-		BOOL is_group);
+		const std::string& name,
+		bool is_group);
 
 	const LLUUID&		getAvatarId() const	{ return mAvatarId; }
-	const std::string&	getFirstName() const { return mFirstName; }
-	const std::string&	getLastName() const { return mLastName; }
+	const std::string&	getFullName() const { return mFullName; }
 
 	void setDrawTooltip(bool value) { mDrawTooltip = value;}
 
 protected:
 	LLUUID				mAvatarId;
-	std::string			mFirstName;
-	std::string			mLastName;
+	std::string			mFullName;
 	bool				mDrawTooltip;
 	std::string			mDefaultIconName;
 
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 66ab32f3e88bd599ac39c3d232bc75a0ffc3fecc..6024dd8a2192951009efbe391b63064c275a980f 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -193,7 +193,7 @@ void LLAvatarListItem::setAvatarId(const LLUUID& id, bool ignore_status_changes)
 		LLAvatarTracker::instance().addParticularFriendObserver(mAvatarId, this);
 
 	// Set avatar name.
-	gCacheName->get(id, FALSE, boost::bind(&LLAvatarListItem::onNameCache, this, _2, _3));
+	gCacheName->get(id, false, boost::bind(&LLAvatarListItem::onNameCache, this, _2));
 }
 
 void LLAvatarListItem::showLastInteractionTime(bool show)
@@ -298,10 +298,9 @@ void LLAvatarListItem::setNameInternal(const std::string& name, const std::strin
 	mAvatarName->setToolTip(name);
 }
 
-void LLAvatarListItem::onNameCache(const std::string& first_name, const std::string& last_name)
+void LLAvatarListItem::onNameCache(const std::string& fullname)
 {
-	std::string name = first_name + " " + last_name;
-	setName(name);
+	setName(fullname);
 }
 
 // Convert given number of seconds to a string like "23 minutes", "15 hours" or "3 years",
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index 479a4833cb94bb8bcfec844a9c866dbb3ccde582..f3c1f0ec016125044ceeae5d09e0e4758e3b27d4 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -139,7 +139,7 @@ private:
 	} EAvatarListItemChildIndex;
 
 	void setNameInternal(const std::string& name, const std::string& highlight);
-	void onNameCache(const std::string& first_name, const std::string& last_name);
+	void onNameCache(const std::string& fullname);
 
 	std::string formatSeconds(U32 secs);
 
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index a46cd84b60876e775437a28223d8e0567e12ded6..12c8d589768426187432758498535bd40233c6d1 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -103,11 +103,7 @@ public:
 		}
 		else if (level == "add")
 		{
-			std::string name;
-			name.assign(getFirstName());
-			name.append(" ");
-			name.append(getLastName());
-
+			std::string name = getFullName();
 			LLAvatarActions::requestFriendshipDialog(getAvatarId(), name);
 		}
 		else if (level == "remove")
@@ -177,14 +173,13 @@ public:
 	}
 
 	const LLUUID&		getAvatarId () const { return mAvatarID;}
-	const std::string&	getFirstName() const { return mFirstName; }
-	const std::string&	getLastName	() const { return mLastName; }
+	const std::string&	getFullName() const { return mFullName; }
 
 	void setup(const LLChat& chat,const LLStyle::Params& style_params) 
 	{
 		mAvatarID = chat.mFromID;
 		mSourceType = chat.mSourceType;
-		gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4));
+		gCacheName->get(mAvatarID, false, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3));
 		if(chat.mFromID.isNull())
 		{
 			mSourceType = CHAT_SOURCE_SYSTEM;
@@ -256,12 +251,11 @@ public:
 		LLPanel::draw();
 	}
 
-	void nameUpdatedCallback(const LLUUID& id,const std::string& first,const std::string& last,BOOL is_group)
+	void nameUpdatedCallback(const LLUUID& id,const std::string& full_name, bool is_group)
 	{
 		if (id != mAvatarID)
 			return;
-		mFirstName = first;
-		mLastName = last;
+		mFullName = full_name;
 	}
 protected:
 	static const S32 PADDING = 20;
@@ -341,8 +335,7 @@ protected:
 
 	LLUUID			    mAvatarID;
 	EChatSourceType		mSourceType;
-	std::string			mFirstName;
-	std::string			mLastName;
+	std::string			mFullName;
 	std::string			mFrom;
 
 	S32					mMinUserNameWidth;
diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp
index e925796526e75ef38c7e52f8160aa25280620cb8..9ccae43a9245e743fdb90017671c1d4bc6b5f407 100644
--- a/indra/newview/llfloaterbump.cpp
+++ b/indra/newview/llfloaterbump.cpp
@@ -89,7 +89,7 @@ void LLFloaterBump::onOpen(const LLSD& key)
 
 void LLFloaterBump::add(LLScrollListCtrl* list, LLMeanCollisionData* mcd)
 {
-	if (mcd->mFirstName.empty() || list->getItemCount() >= 20)
+	if (mcd->mFullName.empty() || list->getItemCount() >= 20)
 	{
 		return;
 	}
@@ -127,8 +127,7 @@ void LLFloaterBump::add(LLScrollListCtrl* list, LLMeanCollisionData* mcd)
 	// All above action strings are in XML file
 	LLUIString text = getString(action);
 	text.setArg("[TIME]", timeStr);
-	text.setArg("[FIRST]", mcd->mFirstName);
-	text.setArg("[LAST]", mcd->mLastName);
+	text.setArg("[NAME]", mcd->mFullName);
 
 	LLSD row;
 	row["id"] = mcd->mPerp;
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 9b88923e7eae962009e83b85c0915b01564798af..47678d1e8206fc711b6d3c687ae6be7de1689084 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -182,9 +182,8 @@ public:
 	void updateNames();
 	// Name cache callback
 	void updateGroupName(const LLUUID& id,
-						 const std::string& first_name,
-						 const std::string& last_name,
-						 BOOL is_group);
+						 const std::string& name,
+						 bool is_group);
 	
 	void refreshUI();
 	
@@ -801,9 +800,9 @@ void LLFloaterBuyLandUI::updateNames()
 	}
 	else if (parcelp->getIsGroupOwned())
 	{
-		gCacheName->get(parcelp->getGroupID(), TRUE,
+		gCacheName->get(parcelp->getGroupID(), true,
 			boost::bind(&LLFloaterBuyLandUI::updateGroupName, this,
-				_1, _2, _3, _4));
+				_1, _2, _3));
 	}
 	else
 	{
@@ -813,16 +812,15 @@ void LLFloaterBuyLandUI::updateNames()
 }
 
 void LLFloaterBuyLandUI::updateGroupName(const LLUUID& id,
-						 const std::string& first_name,
-						 const std::string& last_name,
-						 BOOL is_group)
+						 const std::string& name,
+						 bool is_group)
 {
 	LLParcel* parcelp = mParcel->getParcel();
 	if (parcelp
 		&& parcelp->getGroupID() == id)
 	{
 		// request is current
-		mParcelSellerName = first_name;
+		mParcelSellerName = name;
 	}
 }
 
diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp
index c2389e73a06ee6dc45b67f2bc0aebc510885c3e8..b37be3c1bf83fa72a2132ab22dcd977a2f23347a 100644
--- a/indra/newview/llfloaterpay.cpp
+++ b/indra/newview/llfloaterpay.cpp
@@ -47,6 +47,7 @@
 #include "lllineeditor.h"
 #include "llmutelist.h"
 #include "llfloaterreporter.h"
+#include "llslurl.h"
 #include "llviewerobject.h"
 #include "llviewerobjectlist.h"
 #include "llviewerregion.h"
@@ -102,10 +103,6 @@ private:
 	static void onGive(void* data);
 	void give(S32 amount);
 	static void processPayPriceReply(LLMessageSystem* msg, void **userdata);
-	void onCacheOwnerName(const LLUUID& owner_id,
-						  const std::string& firstname,
-						  const std::string& lastname,
-						  BOOL is_group);
 	void finishPayUI(const LLUUID& target_id, BOOL is_group);
 
 protected:
@@ -426,33 +423,28 @@ void LLFloaterPay::payDirectly(money_callback callback,
 	
 void LLFloaterPay::finishPayUI(const LLUUID& target_id, BOOL is_group)
 {
-	gCacheName->get(target_id, is_group, boost::bind(&LLFloaterPay::onCacheOwnerName, this, _1, _2, _3, _4));
-
-	// Make sure the amount field has focus
-
-	childSetFocus("amount", TRUE);
-	
-	LLLineEditor* amount = getChild<LLLineEditor>("amount");
-	amount->selectAll();
-	mTargetIsGroup = is_group;
-}
-
-void LLFloaterPay::onCacheOwnerName(const LLUUID& owner_id,
-									const std::string& firstname,
-									const std::string& lastname,
-									BOOL is_group)
-{
+	// IDEVO
+	//gCacheName->get(target_id, is_group, boost::bind(&LLFloaterPay::onCacheOwnerName, this, _1, _2, _3, _4));
+	std::string slurl;
 	if (is_group)
 	{
 		setTitle(getString("payee_group"));
+		slurl = LLSLURL::buildCommand("group", target_id, "inspect");
 	}
 	else
 	{
 		setTitle(getString("payee_resident"));
+		slurl = LLSLURL::buildCommand("agent", target_id, "inspect");
 	}
+	childSetText("payee_name", slurl);
+
+	// Make sure the amount field has focus
+
+	childSetFocus("amount", TRUE);
 	
-	childSetTextArg("payee_name", "[FIRST]", firstname);
-	childSetTextArg("payee_name", "[LAST]", lastname);
+	LLLineEditor* amount = getChild<LLLineEditor>("amount");
+	amount->selectAll();
+	mTargetIsGroup = is_group;
 }
 
 // static
diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp
index 0964ad7f917cc88ea10eac2abce6a965f378534c..4a194217b59c3c406baf9df0c8dfe057336bac4d 100644
--- a/indra/newview/llfloaterscriptlimits.cpp
+++ b/indra/newview/llfloaterscriptlimits.cpp
@@ -335,11 +335,8 @@ void LLPanelScriptLimitsRegionMemory::setErrorStatus(U32 status, const std::stri
 // callback from the name cache with an owner name to add to the list
 void LLPanelScriptLimitsRegionMemory::onNameCache(
 						 const LLUUID& id,
-						 const std::string& first_name,
-						 const std::string& last_name)
+						 const std::string& name)
 {
-	std::string name = first_name + " " + last_name;
-
 	LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list");	
 	std::vector<LLSD>::iterator id_itor;
 	for (id_itor = mObjectListItems.begin(); id_itor != mObjectListItems.end(); ++id_itor)
@@ -421,9 +418,12 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content)
 				if(std::find(names_requested.begin(), names_requested.end(), owner_id) == names_requested.end())
 				{
 					names_requested.push_back(owner_id);
-					gCacheName->get(owner_id, TRUE,
-					boost::bind(&LLPanelScriptLimitsRegionMemory::onNameCache,
-						this, _1, _2, _3));
+					// Is this a bug?  It's trying to look up a GROUP name, not
+					// an AVATAR name?  JC
+					const bool is_group = true;
+					gCacheName->get(owner_id, is_group,
+						boost::bind(&LLPanelScriptLimitsRegionMemory::onNameCache,
+							this, _1, _2));
 				}
 			}
 
diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h
index 7e2b536eb6b15aacf2740b0f20dc9df4852d473b..77ff496893463266edcd97f5519e049df0c38bdc 100644
--- a/indra/newview/llfloaterscriptlimits.h
+++ b/indra/newview/llfloaterscriptlimits.h
@@ -166,10 +166,8 @@ public:
 	void returnObjects();
 
 private:
-
 	void onNameCache(	 const LLUUID& id,
-						 const std::string& first_name,
-						 const std::string& last_name);
+						 const std::string& name);
 
 	LLUUID mParcelId;
 	BOOL mGotParcelMemoryUsed;
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index c2a7969c0d05a880cd36c6b16befbbd5efc3e0bf..9cc4aefe35e885eaaca475391dbeb52bafd645a8 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -2556,7 +2556,8 @@ void LLIMMgr::inviteToSession(
 	{
 		if (caller_name.empty())
 		{
-			gCacheName->get(caller_id, FALSE, boost::bind(&LLIMMgr::onInviteNameLookup, payload, _1, _2, _3, _4));
+			gCacheName->get(caller_id, false,
+				boost::bind(&LLIMMgr::onInviteNameLookup, payload, _1, _2, _3));
 		}
 		else
 		{
@@ -2566,9 +2567,9 @@ void LLIMMgr::inviteToSession(
 	}
 }
 
-void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
+void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::string& name, bool is_group)
 {
-	payload["caller_name"] = first + " " + last;
+	payload["caller_name"] = name;
 	payload["session_name"] = payload["caller_name"].asString();
 
 	std::string notify_box_type = payload["notify_box_type"].asString();
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index a3b4f78af0c8b702c79f1bf14ccc9683c9f1ac75..4de3d8b9b9c79304f93e140984f9fc07667867b0 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -456,7 +456,7 @@ private:
 
 	void processIMTypingCore(const LLIMInfo* im_info, BOOL typing);
 
-	static void onInviteNameLookup(LLSD payload, const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
+	static void onInviteNameLookup(LLSD payload, const LLUUID& id, const std::string& name, bool is_group);
 
 	void notifyObserverSessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id);
 	void notifyObserverSessionRemoved(const LLUUID& session_id);
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 4b0539337ba56114a62ba6655f167632bc7ed105..c5cf40d7b716a581d023d620e24c90b79637a8f5 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -138,11 +138,9 @@ private:
 	bool isNotFriend();
 	
 	// Callback for gCacheName to look up avatar name
-	void nameUpdatedCallback(
-							 const LLUUID& id,
-							 const std::string& first,
-							 const std::string& last,
-							 BOOL is_group);
+	void nameUpdatedCallback(const LLUUID& id,
+							 const std::string& name,
+							 bool is_group);
 	
 private:
 	LLUUID				mAvatarID;
@@ -359,9 +357,9 @@ void LLInspectAvatar::requestUpdate()
 
 	childSetValue("avatar_icon", LLSD(mAvatarID) );
 
-	gCacheName->get(mAvatarID, FALSE,
+	gCacheName->get(mAvatarID, false,
 		boost::bind(&LLInspectAvatar::nameUpdatedCallback,
-			this, _1, _2, _3, _4));
+			this, _1, _2, _3));
 }
 
 void LLInspectAvatar::processAvatarData(LLAvatarData* data)
@@ -597,13 +595,12 @@ void LLInspectAvatar::onVolumeChange(const LLSD& data)
 
 void LLInspectAvatar::nameUpdatedCallback(
 	const LLUUID& id,
-	const std::string& first,
-	const std::string& last,
-	BOOL is_group)
+	const std::string& name,
+	bool is_group)
 {
 	if (id == mAvatarID)
 	{
-		mAvatarName = first + " " + last;
+		mAvatarName = name;
 		childSetValue("user_name", LLSD(mAvatarName) );
 	}
 }
diff --git a/indra/newview/llinspectgroup.cpp b/indra/newview/llinspectgroup.cpp
index 7fd7b69021c3b66db3e4e2844ee8fba9b27a6d92..364da3f64c476101c91311efd1c4b36c781e565d 100644
--- a/indra/newview/llinspectgroup.cpp
+++ b/indra/newview/llinspectgroup.cpp
@@ -84,9 +84,8 @@ public:
 	// Callback for gCacheName to look up group name
 	// Faster than waiting for group properties to return
 	void nameUpdatedCallback(const LLUUID& id,
-							 const std::string& first,
-							 const std::string& last,
-							 BOOL is_group);
+							 const std::string& name,
+							 bool is_group);
 
 	// Button/menu callbacks
 	void onClickViewProfile();
@@ -225,21 +224,19 @@ void LLInspectGroup::requestUpdate()
 	mPropertiesRequest = new LLFetchGroupData(mGroupID, this);
 
 	// Name lookup will be faster out of cache, use that
-	gCacheName->get(mGroupID, TRUE,
+	gCacheName->get(mGroupID, true,
 		boost::bind(&LLInspectGroup::nameUpdatedCallback,
-			this, _1, _2, _3, _4));
+			this, _1, _2, _3));
 }
 
 void LLInspectGroup::nameUpdatedCallback(
 	const LLUUID& id,
-	const std::string& first,
-	const std::string& last,
-	BOOL is_group)
+	const std::string& name,
+	bool is_group)
 {
 	if (id == mGroupID)
 	{
-		// group names are returned as a first name
-		childSetValue("group_name", LLSD(first) );
+		childSetValue("group_name", LLSD(name) );
 	}
 	
 	// Otherwise possibly a request for an older inspector, ignore it
diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp
index e4d2eec242bf8bd846498aee5379b449b66a7335..31f69d21d99da5a8aeb1a2a1e9163e15d91b02d5 100644
--- a/indra/newview/llinspectremoteobject.cpp
+++ b/indra/newview/llinspectremoteobject.cpp
@@ -67,7 +67,7 @@ public:
 	
 private:
 	void update();
-	static void nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data);
+	void onNameCache(const LLUUID& id, const std::string& name, bool is_group);
 	
 private:
 	LLUUID		 mObjectID;
@@ -122,7 +122,8 @@ void LLInspectRemoteObject::onOpen(const LLSD& data)
 	mOwner = "";
 	if (gCacheName)
 	{
-		gCacheName->get(mOwnerID, mGroupOwned, nameCallback, this);
+		gCacheName->get(mOwnerID, mGroupOwned,
+			boost::bind(&LLInspectRemoteObject::onNameCache, this, _1, _2, _3));
 	}
 
 	// update the inspector with the current object state
@@ -153,16 +154,10 @@ void LLInspectRemoteObject::onClickClose()
 	closeFloater();
 }
 
-//static 
-void LLInspectRemoteObject::nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data)
+void LLInspectRemoteObject::onNameCache(const LLUUID& id, const std::string& name, bool is_group)
 {
-	LLInspectRemoteObject *self = (LLInspectRemoteObject*)data;
-	self->mOwner = first;
-	if (!last.empty())
-	{
-		self->mOwner += " " + last;
-	}
-	self->update();
+	mOwner = name;
+	update();
 }
 
 void LLInspectRemoteObject::update()
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 961f7adc0a5e003af9481f2f98de3780c43a58d0..eadcfe9f09a37ff29f0d140826f9096096ac7259 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -752,7 +752,8 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
 			new_item->setCreator(id);
 			std::string avatar_name;
 			// Fetch the currect name
-			gCacheName->get(id, FALSE, boost::bind(&LLViewerInventoryItem::onCallingCardNameLookup, new_item.get(), _1, _2, _3));
+			gCacheName->get(id, false,
+				boost::bind(&LLViewerInventoryItem::onCallingCardNameLookup, new_item.get(), _1, _2, _3));
 		}
 	}
 	else if (new_item->getType() == LLAssetType::AT_GESTURE)
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index 7ee4c64f8fb57d1d41582ca6a1b3efae57f50fc5..0b4c07c9ed9fbb0d9e146abb17f3be4f8a14f6bd 100644
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -496,7 +496,7 @@ void LLMuteList::updateRemove(const LLMute& mute)
 	gAgent.sendReliableMessage();
 }
 
-void notify_automute_callback(const LLUUID& agent_id, const std::string& first_name, const std::string& last_name, BOOL is_group, LLMuteList::EAutoReason reason)
+void notify_automute_callback(const LLUUID& agent_id, const std::string& full_name, bool is_group, LLMuteList::EAutoReason reason)
 {
 	std::string notif_name;
 	switch (reason)
@@ -514,8 +514,7 @@ void notify_automute_callback(const LLUUID& agent_id, const std::string& first_n
 	}
 
 	LLSD args;
-	args["FIRST"] = first_name;
-	args["LAST"] = last_name;
+	args["NAME"] = full_name;
     
 	LLNotificationPtr notif_ptr = LLNotifications::instance().add(notif_name, args, LLSD());
 	if (notif_ptr)
@@ -536,7 +535,7 @@ void notify_automute_callback(const LLUUID& agent_id, const std::string& first_n
 }
 
 
-BOOL LLMuteList::autoRemove(const LLUUID& agent_id, const EAutoReason reason, const std::string& first_name, const std::string& last_name)
+BOOL LLMuteList::autoRemove(const LLUUID& agent_id, const EAutoReason reason)
 {
 	BOOL removed = FALSE;
 
@@ -546,24 +545,17 @@ BOOL LLMuteList::autoRemove(const LLUUID& agent_id, const EAutoReason reason, co
 		removed = TRUE;
 		remove(automute);
 
-		if (first_name.empty() && last_name.empty())
+		std::string full_name;
+		if (gCacheName->getFullName(agent_id, full_name))
 		{
-			std::string cache_first, cache_last;
-			if (gCacheName->getName(agent_id, cache_first, cache_last))
-			{
-				// name in cache, call callback directly
-				notify_automute_callback(agent_id, cache_first, cache_last, FALSE, reason);
-			}
-			else
-			{
-				// not in cache, lookup name from cache
-				gCacheName->get(agent_id, FALSE, boost::bind(&notify_automute_callback, _1, _2, _3, _4, reason));
-			}
+			// name in cache, call callback directly
+			notify_automute_callback(agent_id, full_name, false, reason);
 		}
 		else
 		{
-			// call callback directly
-			notify_automute_callback(agent_id, first_name, last_name, FALSE, reason);
+			// not in cache, lookup name from cache
+			gCacheName->get(agent_id, false,
+				boost::bind(&notify_automute_callback, _1, _2, _3, reason));
 		}
 	}
 
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index 409b637bf2d6c3dbfce828af103c652c3bda203f..11a20e015e7fa27947c49b3ef489c618db4c5c4d 100644
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -107,7 +107,7 @@ public:
 
 	// Remove both normal and legacy mutes, for any or all properties.
 	BOOL remove(const LLMute& mute, U32 flags = 0);
-	BOOL autoRemove(const LLUUID& agent_id, const EAutoReason reason, const std::string& first_name = LLStringUtil::null, const std::string& last_name = LLStringUtil::null);
+	BOOL autoRemove(const LLUUID& agent_id, const EAutoReason reason);
 	
 	// Name is required to test against legacy text-only mutes.
 	BOOL isMuted(const LLUUID& id, const std::string& name = LLStringUtil::null, U32 flags = 0) const;
diff --git a/indra/newview/llnamebox.cpp b/indra/newview/llnamebox.cpp
index cd810b9793b3a4799cbb21f7b31e9e939f8a3136..da3e95e947738aa2adf45887bd1333d81148eb1c 100644
--- a/indra/newview/llnamebox.cpp
+++ b/indra/newview/llnamebox.cpp
@@ -87,26 +87,15 @@ void LLNameBox::setNameID(const LLUUID& name_id, BOOL is_group)
 		setText(mInitialValue);
 }
 
-void LLNameBox::refresh(const LLUUID& id, const std::string& firstname,
-						const std::string& lastname, BOOL is_group)
+void LLNameBox::refresh(const LLUUID& id, const std::string& full_name, bool is_group)
 {
 	if (id == mNameID)
 	{
-		std::string name;
-		if (!is_group)
-		{
-			name = firstname + " " + lastname;
-		}
-		else
-		{
-			name = firstname;
-		}
-		setName(name, is_group);
+		setName(full_name, is_group);
 	}
 }
 
-void LLNameBox::refreshAll(const LLUUID& id, const std::string& firstname,
-						   const std::string& lastname, BOOL is_group)
+void LLNameBox::refreshAll(const LLUUID& id, const std::string& full_name, bool is_group)
 {
 	std::set<LLNameBox*>::iterator it;
 	for (it = LLNameBox::sInstances.begin();
@@ -114,7 +103,7 @@ void LLNameBox::refreshAll(const LLUUID& id, const std::string& firstname,
 		 ++it)
 	{
 		LLNameBox* box = *it;
-		box->refresh(id, firstname, lastname, is_group);
+		box->refresh(id, full_name, is_group);
 	}
 }
 
diff --git a/indra/newview/llnamebox.h b/indra/newview/llnamebox.h
index 48b54faec8fb5cac0a9f5135ef7189db138b4d20..2fe899065378bd4b0537e4471db6cd1a271cb24b 100644
--- a/indra/newview/llnamebox.h
+++ b/indra/newview/llnamebox.h
@@ -59,10 +59,9 @@ public:
 
 	void setNameID(const LLUUID& name_id, BOOL is_group);
 
-	void refresh(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
+	void refresh(const LLUUID& id, const std::string& full_name, bool is_group);
 
-	static void refreshAll(const LLUUID& id, const std::string& firstname,
-						   const std::string& lastname, BOOL is_group);
+	static void refreshAll(const LLUUID& id, const std::string& full_name, bool is_group);
 
 protected:
 	LLNameBox (const Params&);
diff --git a/indra/newview/llnameeditor.cpp b/indra/newview/llnameeditor.cpp
index 65601da7da7c40abe703410a59f6c9dd84e0ab26..0c704a1f565dbe6fb7a53579a7e019faeae18ba6 100644
--- a/indra/newview/llnameeditor.cpp
+++ b/indra/newview/llnameeditor.cpp
@@ -81,26 +81,15 @@ void LLNameEditor::setNameID(const LLUUID& name_id, BOOL is_group)
 	setText(name);
 }
 
-void LLNameEditor::refresh(const LLUUID& id, const std::string& firstname,
-						   const std::string& lastname, BOOL is_group)
+void LLNameEditor::refresh(const LLUUID& id, const std::string& full_name, bool is_group)
 {
 	if (id == mNameID)
 	{
-		std::string name;
-		if (!is_group)
-		{
-			name = firstname + " " + lastname;
-		}
-		else
-		{
-			name = firstname;
-		}
-		setText(name);
+		setText(full_name);
 	}
 }
 
-void LLNameEditor::refreshAll(const LLUUID& id, const std::string& firstname,
-							  const std::string& lastname, BOOL is_group)
+void LLNameEditor::refreshAll(const LLUUID& id, const std::string& full_name, bool is_group)
 {
 	std::set<LLNameEditor*>::iterator it;
 	for (it = LLNameEditor::sInstances.begin();
@@ -108,7 +97,7 @@ void LLNameEditor::refreshAll(const LLUUID& id, const std::string& firstname,
 		 ++it)
 	{
 		LLNameEditor* box = *it;
-		box->refresh(id, firstname, lastname, is_group);
+		box->refresh(id, full_name, is_group);
 	}
 }
 
diff --git a/indra/newview/llnameeditor.h b/indra/newview/llnameeditor.h
index 99e03a11662a53f0993ebb929533a5c235592bf3..a75c492aca3a47df9b245998bf0da3573d80c49d 100644
--- a/indra/newview/llnameeditor.h
+++ b/indra/newview/llnameeditor.h
@@ -65,10 +65,9 @@ public:
 
 	void setNameID(const LLUUID& name_id, BOOL is_group);
 
-	void refresh(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
+	void refresh(const LLUUID& id, const std::string& full_name, bool is_group);
 
-	static void refreshAll(const LLUUID& id, const std::string& firstname,
-						   const std::string& lastname, BOOL is_group);
+	static void refreshAll(const LLUUID& id, const std::string& full_name, bool is_group);
 
 
 	// Take/return agent UUIDs
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 6375362ae281ca68d2108fc3f7ae4ba01467fd09..c9fbf35033b620cef4747a2024f26132d738ecc4 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -314,22 +314,11 @@ void LLNameListCtrl::removeNameItem(const LLUUID& agent_id)
 }
 
 // public
-void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first, 
-							 const std::string& last, BOOL is_group)
+void LLNameListCtrl::refresh(const LLUUID& id, const std::string& full_name, bool is_group)
 {
 	//llinfos << "LLNameListCtrl::refresh " << id << " '" << first << " "
 	//	<< last << "'" << llendl;
 
-	std::string fullname;
-	if (!is_group)
-	{
-		fullname = first + " " + last;
-	}
-	else
-	{
-		fullname = first;
-	}
-
 	// TODO: scan items for that ID, fix if necessary
 	item_list::iterator iter;
 	for (iter = getItemList().begin(); iter != getItemList().end(); iter++)
@@ -341,7 +330,7 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first,
 			cell = item->getColumn(mNameColumnIndex);
 			if (cell)
 			{
-				cell->setValue(fullname);
+				cell->setValue(full_name);
 			}
 		}
 	}
@@ -351,14 +340,13 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first,
 
 
 // static
-void LLNameListCtrl::refreshAll(const LLUUID& id, const std::string& first,
-								const std::string& last, BOOL is_group)
+void LLNameListCtrl::refreshAll(const LLUUID& id, const std::string& full_name, bool is_group)
 {
 	LLInstanceTracker<LLNameListCtrl>::instance_iter it;
 	for (it = beginInstances(); it != endInstances(); ++it)
 	{
 		LLNameListCtrl& ctrl = *it;
-		ctrl.refresh(id, first, last, is_group);
+		ctrl.refresh(id, full_name, is_group);
 	}
 }
 
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index 192a3a5afaec62607ca7eb742006ef67ac70221e..0e8eb39fd6ef64071873c7a95875cfd1dc2aff5b 100644
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -105,10 +105,9 @@ public:
 
 	void removeNameItem(const LLUUID& agent_id);
 
-	void refresh(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
+	void refresh(const LLUUID& id, const std::string& full_name, bool is_group);
 
-	static void refreshAll(const LLUUID& id, const std::string& firstname,
-						   const std::string& lastname, BOOL is_group);
+	static void refreshAll(const LLUUID& id, const std::string& full_name, bool is_group);
 
 	// LLView interface
 	/*virtual*/ BOOL	handleDragAndDrop(S32 x, S32 y, MASK mask,
diff --git a/indra/newview/llpanelavatartag.cpp b/indra/newview/llpanelavatartag.cpp
index 7563cc7f61cf4a400df81f39241a581f74c9eb59..173fb851ce2b0b813c4ab1a9629c71e6942a8a2c 100644
--- a/indra/newview/llpanelavatartag.cpp
+++ b/indra/newview/llpanelavatartag.cpp
@@ -86,7 +86,7 @@ void LLPanelAvatarTag::setAvatarId(const LLUUID& avatar_id)
 	{
 		mIcon->setValue(avatar_id);
 	}
-	setName(std::string(mIcon->getFirstName()+ " "+ mIcon->getLastName()));
+	setName(std::string(mIcon->getFullName()));
 }
 
 boost::signals2::connection LLPanelAvatarTag::setLeftButtonClickCallback(
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index a334eb9d6804964517f45f1df76c1aba89d77b3d..a39fe64767774b9de0c526db6295b8be1a87ed7c 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -164,7 +164,7 @@ void LLPanelIMControlPanel::onViewProfileButtonClicked()
 void LLPanelIMControlPanel::onAddFriendButtonClicked()
 {
 	LLAvatarIconCtrl* avatar_icon = getChild<LLAvatarIconCtrl>("avatar_icon");
-	std::string full_name = avatar_icon->getFirstName() + " " + avatar_icon->getLastName();
+	std::string full_name = avatar_icon->getFullName();
 	LLAvatarActions::requestFriendshipDialog(mAvatarID, full_name);
 }
 
@@ -213,7 +213,8 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
 	else
 	{
 		// If the participant is an avatar, fetch the currect name
-		gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4));
+		gCacheName->get(mAvatarID, false,
+			boost::bind(&LLPanelIMControlPanel::onNameCache, this, _1, _2, _3));
 	}
 }
 
@@ -229,14 +230,11 @@ void LLPanelIMControlPanel::changed(U32 mask)
 	}
 }
 
-void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
+void LLPanelIMControlPanel::onNameCache(const LLUUID& id, const std::string& full_name, bool is_group)
 {
 	if ( id == mAvatarID )
 	{
-		std::string avatar_name;
-		avatar_name.assign(first);
-		avatar_name.append(" ");
-		avatar_name.append(last);
+		std::string avatar_name = full_name;
 		getChild<LLTextBox>("avatar_name")->setValue(avatar_name);
 		getChild<LLTextBox>("avatar_name")->setToolTip(avatar_name);
 	}
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 25fdf944c925a2cb81ff7e941ebc3bbbe40eb9b0..0d750acc82c655e88ed7ec63cb9917f13db35b07 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -82,7 +82,7 @@ public:
 	virtual void changed(U32 mask);
 
 protected:
-	void nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
+	void onNameCache(const LLUUID& id, const std::string& full_name, bool is_group);
 
 private:
 	void onViewProfileButtonClicked();
diff --git a/indra/newview/llpanelmediasettingspermissions.cpp b/indra/newview/llpanelmediasettingspermissions.cpp
index a23aed2e985370950242d454436000a6decdbb81..dcc052f15ee55259fb372307f6284f5b9584712f 100644
--- a/indra/newview/llpanelmediasettingspermissions.cpp
+++ b/indra/newview/llpanelmediasettingspermissions.cpp
@@ -115,7 +115,7 @@ void LLPanelMediaSettingsPermissions::draw()
 		if(mPermsGroupName)
 		{
 			mPermsGroupName->setNameID(LLUUID::null, TRUE);
-			mPermsGroupName->refresh(LLUUID::null, LLStringUtil::null, LLStringUtil::null, true);
+			mPermsGroupName->refresh(LLUUID::null, std::string(), true);
 			mPermsGroupName->setEnabled(false);
 		};
 	};
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 8b8b1bed3756ed9070c8a7ffce6c61fd7ce1954f..b820adeaf3ec0482f4e4bb7243b0e261692d860c 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -385,7 +385,7 @@ void LLPanelPermissions::refresh()
 		if (mLabelGroupName)
 		{
 			mLabelGroupName->setNameID(LLUUID::null, TRUE);
-			mLabelGroupName->refresh(LLUUID::null,LLStringUtil::null, LLStringUtil::null, TRUE);
+			mLabelGroupName->refresh(LLUUID::null, std::string(), true);
 			mLabelGroupName->setEnabled(FALSE);
 		}
 	}
diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index 0c10f11bfcbcd54a08eecdc9b44d1094f64d59bc..ccb364a0013a53f1030aa4745cc6d8f30e3ba388 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -274,9 +274,7 @@ void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit*
 }
 
 // static
-void LLPanelPlaceInfo::nameUpdatedCallback(LLTextBox* text,
-										   const std::string& first,
-										   const std::string& last)
+void LLPanelPlaceInfo::onNameCache(LLTextBox* text, const std::string& full_name)
 {
-	text->setText(first + " " + last);
+	text->setText(full_name);
 }
diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h
index 3091f7ed24a63abdc7ad7922133c340dc4e9b8d1..248b9678422e1ac5678d8620e987620f4ba4b488 100644
--- a/indra/newview/llpanelplaceinfo.h
+++ b/indra/newview/llpanelplaceinfo.h
@@ -100,9 +100,7 @@ public:
 	void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel);
 
 protected:
-	static void nameUpdatedCallback(LLTextBox* text,
-									const std::string& first,
-									const std::string& last);
+	static void onNameCache(LLTextBox* text, const std::string& full_name);
 
 	/**
 	 * mParcelID is valid only for remote places, in other cases it's null. See resetLocation() 
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index a80b6f2e0eee27b279bdff4d631f88f24d30be1c..a24f8731459b6361dc0821db2deb8b2b3ca04cc7 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -426,11 +426,11 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
 			if(!parcel->getGroupID().isNull())
 			{
 				// FIXME: Using parcel group as region group.
-				gCacheName->get(parcel->getGroupID(), TRUE,
-								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionGroupText, _2, _3));
+				gCacheName->get(parcel->getGroupID(), true,
+								boost::bind(&LLPanelPlaceInfo::onNameCache, mRegionGroupText, _2));
 
-				gCacheName->get(parcel->getGroupID(), TRUE,
-								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3));
+				gCacheName->get(parcel->getGroupID(), true,
+								boost::bind(&LLPanelPlaceInfo::onNameCache, mParcelOwner, _2));
 			}
 			else
 			{
@@ -448,8 +448,8 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
 			std::string parcel_owner =
 				LLSLURL::buildCommand("agent", parcel->getOwnerID(), "inspect");
 			mParcelOwner->setText(parcel_owner);
-			gCacheName->get(region->getOwner(), FALSE,
-							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionOwnerText, _2, _3));
+			gCacheName->get(region->getOwner(), false,
+							boost::bind(&LLPanelPlaceInfo::onNameCache, mRegionOwnerText, _2));
 		}
 
 		if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus())
@@ -475,8 +475,8 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
 		const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID();
 		if(auth_buyer_id.notNull())
 		{
-			gCacheName->get(auth_buyer_id, TRUE,
-							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mSaleToText, _2, _3));
+			gCacheName->get(auth_buyer_id, true,
+							boost::bind(&LLPanelPlaceInfo::onNameCache, mSaleToText, _2));
 
 			// Show sales info to a specific person or a group he belongs to.
 			if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id))
diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp
index 7832f63e6a698e9f8f302b6e00fde196043c97df..1e7a259b41c1b8f5ea449e33cd5f8e491ff121cb 100644
--- a/indra/newview/llpanelprofileview.cpp
+++ b/indra/newview/llpanelprofileview.cpp
@@ -109,8 +109,8 @@ void LLPanelProfileView::onOpen(const LLSD& key)
 	}
 
 	// Update the avatar name.
-	gCacheName->get(getAvatarId(), FALSE,
-		boost::bind(&LLPanelProfileView::onAvatarNameCached, this, _1, _2, _3, _4));
+	gCacheName->get(getAvatarId(), false,
+		boost::bind(&LLPanelProfileView::onNameCache, this, _1, _2, _3));
 /*
 // disable this part of code according to EXT-2022. See processOnlineStatus
 	// status should only show if viewer has permission to view online/offline. EXT-453 
@@ -187,10 +187,10 @@ void LLPanelProfileView::processOnlineStatus(bool online)
 	mStatusText->setVisible(online);
 }
 
-void LLPanelProfileView::onAvatarNameCached(const LLUUID& id, const std::string& first_name, const std::string& last_name, BOOL is_group)
+void LLPanelProfileView::onNameCache(const LLUUID& id, const std::string& full_name, bool is_group)
 {
 	llassert(getAvatarId() == id);
-	getChild<LLUICtrl>("user_name", FALSE)->setValue(first_name + " " + last_name);
+	getChild<LLUICtrl>("user_name", FALSE)->setValue(full_name);
 }
 
 void LLPanelProfileView::togglePanel(LLPanel* panel, const LLSD& key)
diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h
index 5dc617d4a04e568b04a3f81114f8e4c2c2f59a6a..02bb004a1e845cabf2ec3256191fa371aae5ba32 100644
--- a/indra/newview/llpanelprofileview.h
+++ b/indra/newview/llpanelprofileview.h
@@ -88,11 +88,10 @@ protected:
 private:
 	// LLCacheName will call this function when avatar name is loaded from server.
 	// This is required to display names that have not been cached yet.
-	void onAvatarNameCached(
+	void onNameCache(
 		const LLUUID& id, 
-		const std::string& first_name,
-		const std::string& last_name,
-		BOOL is_group);
+		const std::string& full_name,
+		bool is_group);
 
 	LLTextBox* mStatusText;
 	AvatarStatusObserver* mAvatarStatusObserver;
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 0b8f66c5f3af41dd0e1def576e0f41cf9d16f779..1da6fc516d3035c5093713c090140431b6878291 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -348,7 +348,7 @@ void LLSidepanelTaskInfo::refresh()
 		if (mLabelGroupName)
 		{
 			mLabelGroupName->setNameID(LLUUID::null, TRUE);
-			mLabelGroupName->refresh(LLUUID::null,LLStringUtil::null, LLStringUtil::null, TRUE);
+			mLabelGroupName->refresh(LLUUID::null, std::string(), true);
 			mLabelGroupName->setEnabled(FALSE);
 		}
 	}
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 9608cd1263766a72ae959744ab76aad4d6c395b7..fea78852c15b84c4aca25cf083ddffd7f69cbed8 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -77,12 +77,13 @@ LLSpeaker::LLSpeaker(const LLUUID& id, const std::string& name, const ESpeakerTy
 
 void LLSpeaker::lookupName()
 {
-	gCacheName->get(mID, FALSE, boost::bind(&LLSpeaker::onAvatarNameLookup, this, _1, _2, _3, _4));
+	gCacheName->get(mID, false,
+		boost::bind(&LLSpeaker::onNameCache, this, _1, _2, _3));
 }
 
-void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
+void LLSpeaker::onNameCache(const LLUUID& id, const std::string& full_name, bool is_group)
 {
-	mDisplayName = first + " " + last;
+	mDisplayName = full_name;
 }
 
 bool LLSpeaker::isInVoiceChannel()
diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h
index 63237204c8620e2b1e40d2ef04864471a2fe1db0..cf236f4fe8780ce9987f20e8854df87f2008c745 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -65,7 +65,7 @@ public:
 	~LLSpeaker() {};
 	void lookupName();
 
-	void onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
+	void onNameCache(const LLUUID& id, const std::string& full_name, bool is_group);
 
 	bool isInVoiceChannel();
 
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index a372ab44f249a9a79e80bda4ccb23bd8aa328f11..0ba5fa98660065aa1e0e162a4584bebf84040719 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -268,11 +268,11 @@ void apply_udp_blacklist(const std::string& csv);
 bool process_login_success_response();
 void transition_back_to_login_panel(const std::string& emsg);
 
-void callback_cache_name(const LLUUID& id, const std::string& firstname, const std::string& lastname, BOOL is_group)
+void callback_cache_name(const LLUUID& id, const std::string& full_name, bool is_group)
 {
-	LLNameListCtrl::refreshAll(id, firstname, lastname, is_group);
-	LLNameBox::refreshAll(id, firstname, lastname, is_group);
-	LLNameEditor::refreshAll(id, firstname, lastname, is_group);
+	LLNameListCtrl::refreshAll(id, full_name, is_group);
+	LLNameBox::refreshAll(id, full_name, is_group);
+	LLNameEditor::refreshAll(id, full_name, is_group);
 	
 	// TODO: Actually be intelligent about the refresh.
 	// For now, just brute force refresh the dialogs.
diff --git a/indra/newview/llurlentryagent.cpp b/indra/newview/llurlentryagent.cpp
index 6af7c9001db3272a6705f211b8a72a9c335ad0ca..bce64d7140df6377d2e653fc51711b2249ae56fd 100644
--- a/indra/newview/llurlentryagent.cpp
+++ b/indra/newview/llurlentryagent.cpp
@@ -53,10 +53,10 @@ LLUrlEntryAgent::LLUrlEntryAgent()
 }
 
 // IDEVO demo code
-static std::string clean_name(const std::string& first, const std::string& last)
+static std::string clean_name(const std::string& full_name)
 {
 	std::string displayname;
-	if (first == "miyazaki23") // IDEVO demo code
+	if (full_name == "miyazaki23") // IDEVO demo code
 	{
 		// miyazaki
 		displayname += (char)(0xE5);
@@ -77,44 +77,35 @@ static std::string clean_name(const std::string& first, const std::string& last)
 		displayname += (char)(0x82);
 		displayname += (char)(0x93);
 	}
-	else if (first == "Jim")
+	else if (full_name == "Jim Linden")
 	{
 		displayname = "Jos";
 		displayname += (char)(0xC3);
 		displayname += (char)(0xA9);
 		displayname += " Sanchez";
 	}
-	else if (first == "James")
+	else if (full_name == "James Linden")
 	{
 		displayname = "James Cook";
 	}
 
-	std::string fullname = first;
-	if (!last.empty()
-		&& last != "Resident")
-	{
-		fullname += ' ';
-		fullname += last;
-	}
-
 	std::string final;
 	if (!displayname.empty())
 	{
-		final = displayname + " (" + fullname + ")";
+		final = displayname + " (" + full_name + ")";
 	}
 	else
 	{
-		final = fullname;
+		final = full_name;
 	}
 	return final;
 }
 
-void LLUrlEntryAgent::onAgentNameReceived(const LLUUID& id,
-										  const std::string& first,
-										  const std::string& last,
-										  BOOL is_group)
+void LLUrlEntryAgent::onNameCache(const LLUUID& id,
+								  const std::string& full_name,
+								  bool is_group)
 {
-	std::string final = clean_name(first, last);
+	std::string final = clean_name(full_name);
 	// received the agent name from the server - tell our observers
 	callObservers(id.asString(), final);
 }
@@ -135,20 +126,20 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa
 	}
 
 	LLUUID agent_id(agent_id_string);
-	std::string first, last;
+	std::string full_name;
 	if (agent_id.isNull())
 	{
 		return LLTrans::getString("AvatarNameNobody");
 	}
-	else if (gCacheName->getName(agent_id, first, last))
+	else if (gCacheName->getFullName(agent_id, full_name))
 	{
-		return clean_name(first, last);
+		return clean_name(full_name);
 	}
 	else
 	{
-		gCacheName->get(agent_id, FALSE,
-			boost::bind(&LLUrlEntryAgent::onAgentNameReceived,
-				this, _1, _2, _3, _4));
+		gCacheName->get(agent_id, false,
+			boost::bind(&LLUrlEntryAgent::onNameCache,
+				this, _1, _2, _3));
 		addObserver(agent_id_string, url, cb);
 		return LLTrans::getString("LoadingData");
 	}
diff --git a/indra/newview/llurlentryagent.h b/indra/newview/llurlentryagent.h
index 8e5e321a312c058407838af3d7ad02e1b57a6537..76a54dfeb1640ed2a43a52c8678b73008ccd6d63 100644
--- a/indra/newview/llurlentryagent.h
+++ b/indra/newview/llurlentryagent.h
@@ -46,8 +46,7 @@ public:
 	LLUrlEntryAgent();
 	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
 private:
-	void onAgentNameReceived(const LLUUID& id, const std::string& first,
-							 const std::string& last, BOOL is_group);
+	void onNameCache(const LLUUID& id, const std::string& full_name, bool is_group);
 };
 
 #endif
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index b330c1ba83cd653bc32a09706f3d9c730f3980da..189a174d117204ecea602da1816ef1ba97aed04a 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -1432,9 +1432,9 @@ bool LLViewerInventoryItem::checkPermissionsSet(PermissionMask mask) const
 
 //----------
 
-void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name)
+void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std::string& name, bool is_group)
 {
-	rename(first_name + " " + last_name);
+	rename(name);
 	gInventory.addChangedMask(LLInventoryObserver::LABEL, getUUID());
 	gInventory.notifyObservers();
 }
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 917b8747eaab195df6c244bb02263ec5a3ad074e..eb6e0fdc9cda7316563aebdbd95015c901fc745a 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -164,7 +164,7 @@ public:
 	bool checkPermissionsSet(PermissionMask mask) const;
 
 	// callback
-	void onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name);
+	void onCallingCardNameLookup(const LLUUID& id, const std::string& name, bool is_group);
 
 	// If this is a broken link, try to fix it and any other identical link.
 	BOOL regenerateLink();
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index b7d3e407c6496127ae54cb2ca5efdb8e4ede4b19..79e21b3ee7b4795db513f8bcc4513c99b07124c9 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -983,27 +983,24 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f
 }
 
 void inventory_offer_mute_callback(const LLUUID& blocked_id,
-								   const std::string& first_name,
-								   const std::string& last_name,
-								   BOOL is_group, LLOfferInfo* offer = NULL)
+								   const std::string& full_name,
+								   bool is_group,
+								   LLOfferInfo* offer = NULL)
 {
-	std::string from_name;
+	std::string from_name = full_name;
 	LLMute::EType type;
 	if (is_group)
 	{
 		type = LLMute::GROUP;
-		from_name = first_name;
 	}
 	else if(offer && offer->mFromObject)
 	{
 		//we have to block object by name because blocked_id is an id of owner
 		type = LLMute::BY_NAME;
-		from_name = offer->mFromName;
 	}
 	else
 	{
 		type = LLMute::AGENT;
-		from_name = first_name + " " + last_name;
 	}
 
 	// id should be null for BY_NAME mute, see  LLMuteList::add for details  
@@ -1129,7 +1126,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
 	// * we can't build two messages at once.
 	if (2 == button) // Block
 	{
-		gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,_4,this));
+		gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,this));
 	}
 
 	std::string from_string; // Used in the pop-up.
@@ -1270,7 +1267,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
 	// * we can't build two messages at once.
 	if (2 == button)
 	{
-		gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,_4,this));
+		gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,this));
 	}
 	
 	LLMessageSystem* msg = gMessageSystem;
@@ -4761,7 +4758,7 @@ void handle_show_mean_events(void *)
 	//LLFloaterBump::showInstance();
 }
 
-void mean_name_callback(const LLUUID &id, const std::string& first, const std::string& last, BOOL always_false)
+void mean_name_callback(const LLUUID &id, const std::string& full_name, bool is_group)
 {
 	if (gNoRender)
 	{
@@ -4783,8 +4780,7 @@ void mean_name_callback(const LLUUID &id, const std::string& first, const std::s
 		LLMeanCollisionData *mcd = *iter;
 		if (mcd->mPerp == id)
 		{
-			mcd->mFirstName = first;
-			mcd->mLastName = last;
+			mcd->mFullName = full_name;
 		}
 	}
 }
@@ -4838,8 +4834,7 @@ void process_mean_collision_alert_message(LLMessageSystem *msgsystem, void **use
 		{
 			LLMeanCollisionData *mcd = new LLMeanCollisionData(gAgentID, perp, time, type, mag);
 			gMeanCollisionList.push_front(mcd);
-			const BOOL is_group = FALSE;
-			gCacheName->get(perp, is_group, &mean_name_callback);
+			gCacheName->get(perp, false, boost::bind(&mean_name_callback, _1, _2, _3));
 		}
 	}
 }
@@ -5738,7 +5733,7 @@ static LLNotificationFunctorRegistration callback_load_url_reg("LoadWebPage", ca
 
 // We've got the name of the person who owns the object hurling the url.
 // Display confirmation dialog.
-void callback_load_url_name(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
+void callback_load_url_name(const LLUUID& id, const std::string& full_name, bool is_group)
 {
 	std::vector<LLSD>::iterator it;
 	for (it = gLoadUrlList.begin(); it != gLoadUrlList.end(); )
@@ -5751,11 +5746,11 @@ void callback_load_url_name(const LLUUID& id, const std::string& first, const st
 			std::string owner_name;
 			if (is_group)
 			{
-				owner_name = first + LLTrans::getString("Group");
+				owner_name = full_name + LLTrans::getString("Group");
 			}
 			else
 			{
-				owner_name = first + " " + last;
+				owner_name = full_name;
 			}
 
 			// For legacy name-only mutes.
@@ -5815,7 +5810,8 @@ void process_load_url(LLMessageSystem* msg, void**)
 	// Add to list of pending name lookups
 	gLoadUrlList.push_back(payload);
 
-	gCacheName->get(owner_id, owner_is_group, &callback_load_url_name);
+	gCacheName->get(owner_id, owner_is_group,
+		boost::bind(&callback_load_url_name, _1, _2, _3));
 }
 
 
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index c84afa5af12a2fba3299441e8ca3395a58050ffd..1d9297cf2de8d8c496de89c9ec13fec96d0c080d 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -6941,18 +6941,8 @@ void LLVoiceClient::notifyFriendObservers()
 
 void LLVoiceClient::lookupName(const LLUUID &id)
 {
-	BOOL is_group = FALSE;
-	gCacheName->get(id, is_group, &LLVoiceClient::onAvatarNameLookup);
-}
-
-//static
-void LLVoiceClient::onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
-{
-	if(gVoiceClient)
-	{
-		std::string name = llformat("%s %s", first.c_str(), last.c_str());
-		gVoiceClient->avatarNameResolved(id, name);
-	}
+	gCacheName->get(id, false,
+		boost::bind(&LLVoiceClient::avatarNameResolved, this, _1, _2));
 }
 
 void LLVoiceClient::avatarNameResolved(const LLUUID &id, const std::string &name)
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index 6231c6ba29f47b3bb92090a2d93ba986779bd32a..c6f6b2368b2f0aabc06bf08afbaf0e2bb2936c86 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -474,7 +474,6 @@ static	void updatePosition(void);
 		void removeObserver(LLFriendObserver* observer);
 		
 		void lookupName(const LLUUID &id);
-		static void onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
 		void avatarNameResolved(const LLUUID &id, const std::string &name);
 		
 		typedef std::vector<std::string> deviceList;
diff --git a/indra/newview/skins/default/xui/en/floater_bumps.xml b/indra/newview/skins/default/xui/en/floater_bumps.xml
index 303c28d7c88a5bcd8df7a3d7c63444524ff7d4ee..1f2fe62b3cf85edb2dd0daa44f8173c75356ebb6 100644
--- a/indra/newview/skins/default/xui/en/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/en/floater_bumps.xml
@@ -14,23 +14,23 @@
     </floater.string>
     <floater.string
      name="bump">
-        [TIME]  [FIRST] [LAST] bumped you
+        [TIME]  [NAME] bumped you
     </floater.string>
     <floater.string
      name="llpushobject">
-        [TIME]  [FIRST] [LAST] pushed you with a script
+        [TIME]  [NAME] pushed you with a script
     </floater.string>
     <floater.string
      name="selected_object_collide">
-        [TIME]  [FIRST] [LAST] hit you with an object
+        [TIME]  [NAME] hit you with an object
     </floater.string>
     <floater.string
      name="scripted_object_collide">
-        [TIME]  [FIRST] [LAST] hit you with a scripted object
+        [TIME]  [NAME] hit you with a scripted object
     </floater.string>
     <floater.string
      name="physical_object_collide">
-        [TIME]  [FIRST] [LAST] hit you with a physical object
+        [TIME]  [NAME] hit you with a physical object
     </floater.string>
     <floater.string
      name="timeStr">
diff --git a/indra/newview/skins/default/xui/en/floater_pay.xml b/indra/newview/skins/default/xui/en/floater_pay.xml
index 509cffe490b7460add9b0d298a17bef22d0b64e6..8f60dd6f28930a46c00102258d8bac38b13664ec 100644
--- a/indra/newview/skins/default/xui/en/floater_pay.xml
+++ b/indra/newview/skins/default/xui/en/floater_pay.xml
@@ -28,16 +28,6 @@
      width="75">
         Pay:
     </text>
-   <icon
-     height="16"
-     width="16"
-     image_name="Generic_Person"
-     mouse_opaque="true"
-     name="icon_person"
-     tool_tip="Person"
-     top_pad="0"
-     left="10"
-     />
     <text
      type="string"
      length="1"
@@ -45,10 +35,11 @@
      font="SansSerifSmall"
      height="16"
      layout="topleft"
-     left_pad="7"
+     left="10"
      name="payee_name"
-     width="210">
-        [FIRST] [LAST]
+     top_pad="0" 
+     width="230">
+        Test Name
     </text>
     <button
      height="23"
diff --git a/indra/newview/skins/default/xui/en/floater_pay_object.xml b/indra/newview/skins/default/xui/en/floater_pay_object.xml
index 455018f467dc135407a3cf0e777a59e117cc647d..c65dd6e49f321b921c9dcb4eda1e4fd9158556d5 100644
--- a/indra/newview/skins/default/xui/en/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/en/floater_pay_object.xml
@@ -2,7 +2,7 @@
 <floater
  legacy_header_height="18"
  can_minimize="false"
- height="220"
+ height="225"
  layout="topleft"
  name="Give Money"
  help_topic="give_money"
@@ -16,26 +16,14 @@
      name="payee_resident">
         Pay Resident
     </string>
-   <icon
-     height="16"
-     width="16"
-     image_name="Generic_Person"
-     mouse_opaque="true"
-     name="icon_person"
-     tool_tip="Person"
-     top_pad="24"
-     left="10"
-     />
     <text
-     type="string"
-     length="1"
      follows="left|top"
      height="16"
      layout="topleft"
-     left_pad="7"
-     top_delta="3"
+     left="10"
+     top_pad="24"
      name="payee_name"
-     width="184">
+     width="200">
       Ericacita Moostopolison
     </text>
     <text
@@ -45,9 +33,9 @@
      halign="left"
      height="14"
      layout="topleft"
-     left="34"
+     left="10"
      name="object_name_label"
-     top_pad="0"
+     top_pad="5"
      width="180">
         Via object:
     </text>
@@ -58,7 +46,7 @@
      mouse_opaque="true"
      name="icon_object"
      tool_tip="Objects"
-     top_pad="0"
+     top_pad="5"
      left="10"
      />
     <text
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 960da7a27468b1ab25db723893b67cca775d22b1..349833050b7a0ce360dc1120cff33024fb262602 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5579,21 +5579,21 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
    icon="notify.tga"
    name="AutoUnmuteByIM"
    type="notify">
-[FIRST] [LAST] was sent an instant message and has been automatically unblocked.
+[NAME] was sent an instant message and has been automatically unblocked.
   </notification>
 
   <notification
    icon="notify.tga"
    name="AutoUnmuteByMoney"
    type="notify">
-[FIRST] [LAST] was given money and has been automatically unblocked.
+[NAME] was given money and has been automatically unblocked.
   </notification>
 
   <notification
    icon="notify.tga"
    name="AutoUnmuteByInventory"
    type="notify">
-[FIRST] [LAST] was offered inventory and has been automatically unblocked.
+[NAME] was offered inventory and has been automatically unblocked.
   </notification>
 
   <notification