diff --git a/doc/contributions.txt b/doc/contributions.txt
index d1a51033bf8bf906d205a3643d3a6c381d72eaab..26d9b98b955bec8e68c9c39a4c201488508829f4 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -394,15 +394,16 @@ Jonathan Yap
 	STORM-829
 	STORM-844
 	STORM-953
+	STORM-954
 	STORM-960
 	STORM-869
 	STORM-974
 	STORM-975
+	STORM-977
 	STORM-979
 	STORM-980
 	VWR-17801
 	VWR-24347
-	STORM-977
 Kage Pixel
 	VWR-11
 Ken March
@@ -789,6 +790,7 @@ Twisted Laws
 	STORM-467
 	STORM-844
 	STORM-643
+	STORM-954
 Vadim Bigbear
 	VWR-2681
 Vector Hastings
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 9db6d5e08ce5b41cfd05b296fdd3f8401e600792..481148ba4e5f9ea7d07217f89bf5f3e020a464e1 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -1474,6 +1474,42 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
 			}
 		}
 	}
+	// retrieve the list of close avatars from viewer objects as well
+	// for when we are above 1000m, only do this when we are retrieving
+	// uuid's too as there could be duplicates
+	if(avatar_ids != NULL)
+	{
+		for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
+			iter != LLCharacter::sInstances.end(); ++iter)
+		{
+			LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter;
+			if(pVOAvatar->isDead() || pVOAvatar->isSelf())
+				continue;
+			LLUUID uuid = pVOAvatar->getID();
+			if(uuid.isNull())
+				continue;
+			LLVector3d pos_global = pVOAvatar->getPositionGlobal();
+			if(dist_vec(pos_global, relative_to) <= radius)
+			{
+				bool found = false;
+				uuid_vec_t::iterator sel_iter = avatar_ids->begin();
+				for (; sel_iter != avatar_ids->end(); sel_iter++)
+				{
+					if(*sel_iter == uuid)
+					{
+						found = true;
+						break;
+					}
+				}
+				if(!found)
+				{
+					if(positions != NULL)
+						positions->push_back(pos_global);
+					avatar_ids->push_back(uuid);
+				}
+			}
+		}
+	}
 }