diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index b494c7d403deb7e633aa347abc485e255bb75439..0e6f5b89247d1c4f9fa9385bc2de2b5ab98f553a 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -33,7 +33,7 @@
 
 class LLOfferInfo;
 
-const S32 UPDATE_MEMBERS_PER_FRAME = 500;
+const F32 UPDATE_MEMBERS_SECONDS_PER_FRAME = 0.005; // 5ms
 
 // Forward declares
 class LLPanelGroupTab;
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index f6ce7de47e09d608381d7fc066d0f349d2559d0d..294b65e99400e72542d61c582817919cc9ef97a1 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -28,8 +28,10 @@
 
 #include "llpanelgroupgeneral.h"
 
-#include "lluictrlfactory.h"
+#include "llavatarnamecache.h"
 #include "llagent.h"
+#include "llsdparam.h"
+#include "lluictrlfactory.h"
 #include "roles_constants.h"
 
 // UI elements
@@ -668,6 +670,7 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
 		{
 			mMemberProgress = gdatap->mMembers.begin();
 			mPendingMemberUpdate = TRUE;
+			mUdpateSessionID.generate();
 
 			sSDTime = 0.0f;
 			sElementTime = 0.0f;
@@ -696,76 +699,47 @@ void LLPanelGroupGeneral::updateMembers()
 
 	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
 
-	if (!mListVisibleMembers || !gdatap 
+	if (!mListVisibleMembers 
+		|| !gdatap 
 		|| !gdatap->isMemberDataComplete()
 		|| gdatap->mMembers.empty())
 	{
 		return;
 	}
 
-	static LLTimer all_timer;
-	static LLTimer sd_timer;
-	static LLTimer element_timer;
+	LLTimer update_time;
+	update_time.setTimerExpirySec(UPDATE_MEMBERS_SECONDS_PER_FRAME);
 
-	all_timer.reset();
-	S32 i = 0;
+	LLAvatarName av_name;
 
-	for( ; mMemberProgress != gdatap->mMembers.end() && i<UPDATE_MEMBERS_PER_FRAME; 
+	S32 i = 0;
+	for( ; mMemberProgress != gdatap->mMembers.end() && !update_time.hasExpired(); 
 			++mMemberProgress, ++i)
 	{
-		lldebugs << "Adding " << mMemberProgress->first << ", " << mMemberProgress->second->getTitle() << llendl;
 		LLGroupMemberData* member = mMemberProgress->second;
 		if (!member)
 		{
 			continue;
 		}
-		// Owners show up in bold.
-		std::string style = "NORMAL";
-		sd_timer.reset();
-		LLSD row;
-		row["id"] = member->getID();
 
-		row["columns"][0]["column"] = "name";
-		row["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";
-		row["columns"][0]["font"]["style"] = style;
-		// value is filled in by name list control
-
-		row["columns"][1]["column"] = "title";
-		row["columns"][1]["value"] = member->getTitle();
-		row["columns"][1]["font"]["name"] = "SANSSERIF_SMALL";
-		row["columns"][1]["font"]["style"] = style;
-
-		std::string status = member->getOnlineStatus();
-		
-		row["columns"][2]["column"] = "status";
-		row["columns"][2]["value"] = status;
-		row["columns"][2]["font"]["name"] = "SANSSERIF_SMALL";
-		row["columns"][2]["font"]["style"] = style;
-
-		sSDTime += sd_timer.getElapsedTimeF32();
-
-		element_timer.reset();
-		LLScrollListItem* member_row = mListVisibleMembers->addElement(row);
-		
-		if ( member->isOwner() )
+		if (LLAvatarNameCache::get(mMemberProgress->first, &av_name))
+		{
+			addMember(mMemberProgress->second);
+		}
+		else
 		{
-			LLScrollListText* name_textp = dynamic_cast<LLScrollListText*>(member_row->getColumn(0));
-			if (name_textp)
-				name_textp->setFontStyle(LLFontGL::BOLD);
+			// If name is not cached, onNameCache() should be called when it is cached and add this member to list.
+			LLAvatarNameCache::get(mMemberProgress->first, 
+									boost::bind(&LLPanelGroupGeneral::onNameCache,
+												this, mUdpateSessionID, member, _1, _2));
 		}
-		sElementTime += element_timer.getElapsedTimeF32();
 	}
-	sAllTime += all_timer.getElapsedTimeF32();
 
-	lldebugs << "Updated " << i << " of " << UPDATE_MEMBERS_PER_FRAME << "members in the list." << llendl;
+	llinfos << "Updated " << i << " members in " << (F32)(1000.0 * update_time.getElapsedTimeF32()) << "ms this frame." << llendl;
 	if (mMemberProgress == gdatap->mMembers.end())
 	{
 		lldebugs << "   member list completed." << llendl;
 		mListVisibleMembers->setEnabled(TRUE);
-
-		lldebugs << "All Time: " << sAllTime << llendl;
-		lldebugs << "SD Time: " << sSDTime << llendl;
-		lldebugs << "Element Time: " << sElementTime << llendl;
 	}
 	else
 	{
@@ -774,6 +748,39 @@ void LLPanelGroupGeneral::updateMembers()
 	}
 }
 
+void LLPanelGroupGeneral::addMember(LLGroupMemberData* member)
+{
+	LLNameListCtrl::NameItem item_params;
+	item_params.value = member->getID();
+
+	LLScrollListCell::Params column;
+	item_params.columns.add().column("name").font.name("SANSSERIF_SMALL");
+
+	item_params.columns.add().column("title").value(member->getTitle()).font.name("SANSSERIF_SMALL");
+
+	item_params.columns.add().column("status").value(member->getOnlineStatus()).font.name("SANSSERIF_SMALL");
+
+	LLScrollListItem* member_row = mListVisibleMembers->addNameItemRow(item_params);
+
+	if ( member->isOwner() )
+	{
+		LLScrollListText* name_textp = dynamic_cast<LLScrollListText*>(member_row->getColumn(0));
+		if (name_textp)
+			name_textp->setFontStyle(LLFontGL::BOLD);
+	}
+}
+
+void LLPanelGroupGeneral::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name)
+{
+	if (!member 
+		|| update_id != mUdpateSessionID)
+	{
+		return;
+	}
+
+	addMember(member);
+}
+
 void LLPanelGroupGeneral::updateChanged()
 {
 	// List all the controls we want to check for changes...
diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h
index 88c092c461bc9c88dc47a6f67aae19acd9abbe30..b179f78c56781336107387a3416404507e1a8579 100644
--- a/indra/newview/llpanelgroupgeneral.h
+++ b/indra/newview/llpanelgroupgeneral.h
@@ -38,6 +38,7 @@ class LLNameListCtrl;
 class LLCheckBoxCtrl;
 class LLComboBox;
 class LLSpinCtrl;
+class LLAvatarName;
 
 class LLPanelGroupGeneral : public LLPanelGroupTab
 {
@@ -62,6 +63,7 @@ class LLPanelGroupGeneral : public LLPanelGroupTab
 
 	virtual void setupCtrls	(LLPanel* parent);
 
+	void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name);
 private:
 	void	reset();
 
@@ -75,7 +77,8 @@ class LLPanelGroupGeneral : public LLPanelGroupTab
 	static void onReceiveNotices(LLUICtrl* ctrl, void* data);
 	static void openProfile(void* data);
 
-	S32		sortMembersList(S32,const LLScrollListItem*,const LLScrollListItem*);
+	S32	 sortMembersList(S32,const LLScrollListItem*,const LLScrollListItem*);
+	void addMember(LLGroupMemberData* member);
 
     static bool joinDlgCB(const LLSD& notification, const LLSD& response);
 
@@ -87,6 +90,7 @@ class LLPanelGroupGeneral : public LLPanelGroupTab
 	BOOL			mChanged;
 	BOOL			mFirstUse;
 	std::string		mIncompleteMemberDataStr;
+	LLUUID			mUdpateSessionID;
 
 	// Group information (include any updates in updateChanged)
 	LLLineEditor		*mGroupNameEditor;
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index bbe47ae94395ae26b9e4b941cab080986915eba7..5720168f8122f52a6c02535050f0d96f998dd0a7 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -29,6 +29,7 @@
 #include "llcheckboxctrl.h"
 
 #include "llagent.h"
+#include "llavatarnamecache.h"
 #include "llbutton.h"
 #include "llfiltereditor.h"
 #include "llfloatergroupinvite.h"
@@ -1584,25 +1585,22 @@ void LLPanelGroupMembersSubTab::addMemberToList(LLUUID id, LLGroupMemberData* da
 	LLUIString donated = getString("donation_area");
 	donated.setArg("[AREA]", llformat("%d", data->getContribution()));
 
-	LLSD row;
-	row["id"] = id;
+	LLNameListCtrl::NameItem item_params;
+	item_params.value = id;
 
-	row["columns"][0]["column"] = "name";
-	// value is filled in by name list control
+	item_params.columns.add().column("name").font.name("SANSSERIF_SMALL").style("NORMAL");
 
-	row["columns"][1]["column"] = "donated";
-	row["columns"][1]["value"] = donated.getString();
+	item_params.columns.add().column("donated").value(donated.getString())
+			.font.name("SANSSERIF_SMALL").style("NORMAL");
 
-	row["columns"][2]["column"] = "online";
-	row["columns"][2]["value"] = data->getOnlineStatus();
-	row["columns"][2]["font"] = "SANSSERIF_SMALL";
-
-	mMembersList->addElement(row);
+	item_params.columns.add().column("online").value(data->getOnlineStatus())
+			.font.name("SANSSERIF_SMALL").style("NORMAL");
+	mMembersList->addNameItemRow(item_params);
 
 	mHasMatch = TRUE;
 }
 
-void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, const LLUUID& id)
+void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name)
 {
 	// Update ID is used to determine whether member whose id is passed
 	// into onNameCache() was passed after current or previous user-initiated update.
@@ -1612,21 +1610,15 @@ void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, const LLUUI
 	// we do nothing.
 	if (mUdpateSessionID != update_id) return;
 	
-	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
-		if (!gdatap) 
+	if (!member)
 	{
-		llwarns << "LLPanelGroupMembersSubTab::updateMembers() -- No group data!" << llendl;
 		return;
 	}
 	
-	std::string fullname;
-	gCacheName->getFullName(id, fullname);
-
-	LLGroupMemberData* data;
 	// trying to avoid unnecessary hash lookups
-	if (matchesSearchFilter(fullname) && ((data = gdatap->mMembers[id]) != NULL))
+	if (matchesSearchFilter(av_name.getLegacyName()))
 	{
-		addMemberToList(id, data);
+		addMemberToList(id, member);
 		if(!mMembersList->getEnabled())
 		{
 			mMembersList->setEnabled(TRUE);
@@ -1665,18 +1657,20 @@ void LLPanelGroupMembersSubTab::updateMembers()
 
 
 	LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end();
-	
-	S32 i = 0;
-	for( ; mMemberProgress != end && i<UPDATE_MEMBERS_PER_FRAME; 
-			++mMemberProgress, ++i)
+
+	LLTimer update_time;
+	update_time.setTimerExpirySec(UPDATE_MEMBERS_SECONDS_PER_FRAME);
+
+	for( ; mMemberProgress != end && !update_time.hasExpired(); ++mMemberProgress)
 	{
 		if (!mMemberProgress->second)
 			continue;
+
 		// Do filtering on name if it is already in the cache.
-		std::string fullname;
-		if (gCacheName->getFullName(mMemberProgress->first, fullname))
+		LLAvatarName av_name;
+		if (LLAvatarNameCache::get(mMemberProgress->first, &av_name))
 		{
-			if (matchesSearchFilter(fullname))
+			if (matchesSearchFilter(av_name.getLegacyName()))
 			{
 				addMemberToList(mMemberProgress->first, mMemberProgress->second);
 			}
@@ -1684,8 +1678,8 @@ void LLPanelGroupMembersSubTab::updateMembers()
 		else
 		{
 			// If name is not cached, onNameCache() should be called when it is cached and add this member to list.
-			gCacheName->get(mMemberProgress->first, FALSE, boost::bind(&LLPanelGroupMembersSubTab::onNameCache,
-																	   this, mUdpateSessionID, _1));
+			LLAvatarNameCache::get(mMemberProgress->first, boost::bind(&LLPanelGroupMembersSubTab::onNameCache,
+																	   this, mUdpateSessionID, mMemberProgress->second, _1, _2));
 		}
 	}
 
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index a55e26415077d169adc18333384aeee57b546403..8b454e020aec016f89b15521cfb2389ecda1d47d 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -188,7 +188,7 @@ class LLPanelGroupMembersSubTab : public LLPanelGroupSubTab
 	virtual void setGroupID(const LLUUID& id);
 
 	void addMemberToList(LLUUID id, LLGroupMemberData* data);
-	void onNameCache(const LLUUID& update_id, const LLUUID& id);
+	void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name);
 
 protected:
 	typedef std::map<LLUUID, LLRoleMemberChangeType> role_change_data_map_t;