diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index abbfe25fe274a2005034368dceadc29dc6a20128..2bb154ca04e240470fac6f6da308357b1d7dca74 100755
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -4923,6 +4923,7 @@ void LLAppViewer::idle()
 		
 		gIdleCallbacks.callFunctions();
 		gInventory.idleNotifyObservers();
+		LLAvatarTracker::instance().idleNotifyObservers();
 	}
 	
 	// Metrics logging (LLViewerAssetStats, etc.)
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index b6c5496c17d22f84e5964df190e4d7454cef385d..f79d1aa609a2af5c31a01b044f170b481518372b 100755
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -97,7 +97,8 @@ static void on_avatar_name_cache_notify(const LLUUID& agent_id,
 LLAvatarTracker::LLAvatarTracker() :
 	mTrackingData(NULL),
 	mTrackedAgentValid(false),
-	mModifyMask(0x0)	
+	mModifyMask(0x0),
+	mIsNotifyObservers(FALSE)
 {
 }
 
@@ -272,7 +273,7 @@ S32 LLAvatarTracker::addBuddyList(const LLAvatarTracker::buddy_map_t& buds)
 					<< "]" << LL_ENDL;
 		}
 	}
-	notifyObservers();
+	// do not notify observers here - list can be large so let it be done on idle.
 	
 	return new_buddy_count;
 }
@@ -473,8 +474,25 @@ void LLAvatarTracker::removeObserver(LLFriendObserver* observer)
 		mObservers.end());
 }
 
+void LLAvatarTracker::idleNotifyObservers()
+{
+	if (mModifyMask == LLFriendObserver::NONE && mChangedBuddyIDs.size() == 0)
+	{
+		return;
+	}
+	notifyObservers();
+}
+
 void LLAvatarTracker::notifyObservers()
 {
+	if (mIsNotifyObservers)
+	{
+		// Don't allow multiple calls.
+		// new masks and ids will be processed later from idle.
+		return;
+	}
+	mIsNotifyObservers = TRUE;
+
 	observer_list_t observers(mObservers);
 	observer_list_t::iterator it = observers.begin();
 	observer_list_t::iterator end = observers.end();
@@ -490,6 +508,7 @@ void LLAvatarTracker::notifyObservers()
 
 	mModifyMask = LLFriendObserver::NONE;
 	mChangedBuddyIDs.clear();
+	mIsNotifyObservers = FALSE;
 }
 
 void LLAvatarTracker::addParticularFriendObserver(const LLUUID& buddy_id, LLFriendObserver* observer)
@@ -531,7 +550,7 @@ void LLAvatarTracker::notifyParticularFriendObservers(const LLUUID& buddy_id)
 // store flag for change
 // and id of object change applies to
 void LLAvatarTracker::addChangedMask(U32 mask, const LLUUID& referent)
-{ 
+{
 	mModifyMask |= mask; 
 	if (referent.notNull())
 	{
diff --git a/indra/newview/llcallingcard.h b/indra/newview/llcallingcard.h
index 6e5fc01cd8511dfa025330f9db126f2c0d7c5c60..1f819a42fdcd874831be4432c8c112d8fccfea74 100755
--- a/indra/newview/llcallingcard.h
+++ b/indra/newview/llcallingcard.h
@@ -143,6 +143,7 @@ class LLAvatarTracker
 	// observers left behind.
 	void addObserver(LLFriendObserver* observer);
 	void removeObserver(LLFriendObserver* observer);
+	void idleNotifyObservers();
 	void notifyObservers();
 
 	// Observers interested in updates of a particular avatar.
@@ -209,6 +210,8 @@ class LLAvatarTracker
 	LLAvatarTracker(const LLAvatarTracker&);
 	bool operator==(const LLAvatarTracker&);
 
+	BOOL mIsNotifyObservers;
+
 public:
 	// don't you dare create or delete this object
 	LLAvatarTracker();