diff --git a/indra/llcommon/llstl.h b/indra/llcommon/llstl.h
index b024b47225a873814b081e773fa8e5c5efb1c829..cdc24d4918d88a3aa750cc9b7774c42d2e820668 100644
--- a/indra/llcommon/llstl.h
+++ b/indra/llcommon/llstl.h
@@ -214,33 +214,9 @@ void delete_and_clear_array(T*& ptr)
 	ptr = NULL;
 }
 
-// Simple function to help with finding pointers in maps.
-// For example:
-// 	typedef  map_t;
-//  std::map<int, const char*> foo;
-//	foo[18] = "there";
-//	foo[2] = "hello";
-// 	const char* bar = get_ptr_in_map(foo, 2); // bar -> "hello"
-//  const char* baz = get_ptr_in_map(foo, 3); // baz == NULL
-template <typename K, typename T>
-inline T* get_ptr_in_map(const std::map<K,T*>& inmap, const K& key)
-{
-	// Typedef here avoids warnings because of new c++ naming rules.
-	typedef typename std::map<K,T*>::const_iterator map_iter;
-	map_iter iter = inmap.find(key);
-	if(iter == inmap.end())
-	{
-		return NULL;
-	}
-	else
-	{
-		return iter->second;
-	}
-};
-
 // helper function which returns true if key is in inmap.
-template <typename K, typename T>
-inline bool is_in_map(const std::map<K,T>& inmap, const K& key)
+template <typename T>
+inline bool is_in_map(const T& inmap, typename T::key_type const& key)
 {
 	if(inmap.find(key) == inmap.end())
 	{
@@ -256,11 +232,11 @@ inline bool is_in_map(const std::map<K,T>& inmap, const K& key)
 // To replace LLSkipMap getIfThere, use:
 //   get_if_there(map, key, 0)
 // WARNING: Make sure default_value (generally 0) is not a valid map entry!
-template <typename K, typename T>
-inline T get_if_there(const std::map<K,T>& inmap, const K& key, T default_value)
+template <typename T>
+inline typename T::mapped_type get_if_there(const T& inmap, typename T::key_type const& key, typename T::mapped_type default_value)
 {
 	// Typedef here avoids warnings because of new c++ naming rules.
-	typedef typename std::map<K,T>::const_iterator map_iter;
+	typedef typename T::const_iterator map_iter;
 	map_iter iter = inmap.find(key);
 	if(iter == inmap.end())
 	{
@@ -272,6 +248,21 @@ inline T get_if_there(const std::map<K,T>& inmap, const K& key, T default_value)
 	}
 };
 
+// Simple function to help with finding pointers in maps.
+// For example:
+// 	typedef  map_t;
+//  std::map<int, const char*> foo;
+//	foo[18] = "there";
+//	foo[2] = "hello";
+// 	const char* bar = get_ptr_in_map(foo, 2); // bar -> "hello"
+//  const char* baz = get_ptr_in_map(foo, 3); // baz == NULL
+// <alchemy/> - This has been generalized to support a broader range of map-esque containers
+template <typename T>
+inline typename T::mapped_type get_ptr_in_map(const T& inmap, typename T::key_type const& key)
+{
+	return get_if_there(inmap,key,NULL);
+};
+
 // Useful for replacing the removeObj() functionality of LLDynamicArray
 // Example:
 //  for (std::vector<T>::iterator iter = mList.begin(); iter != mList.end(); )
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index ac9120004bdfa628dc20b396889f92e0cdf5aaaf..37617c8687f08023995574b0b3ff90b3f4636eb6 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -98,8 +98,8 @@ extern LLPipeline	gPipeline;
 
 // Statics for object lookup tables.
 U32						LLViewerObjectList::sSimulatorMachineIndex = 1; // Not zero deliberately, to speed up index check.
-std::map<U64, U32>		LLViewerObjectList::sIPAndPortToIndex;
-std::map<U64, LLUUID>	LLViewerObjectList::sIndexAndLocalIDToUUID;
+std::unordered_map<U64, U32>		LLViewerObjectList::sIPAndPortToIndex;
+std::unordered_map<U64, LLUUID>	LLViewerObjectList::sIndexAndLocalIDToUUID;
 
 LLViewerObjectList::LLViewerObjectList()
 {
@@ -180,7 +180,7 @@ BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp)
 		
 		U64	indexid = (((U64)index) << 32) | (U64)local_id;
 		
-		std::map<U64, LLUUID>::iterator iter = sIndexAndLocalIDToUUID.find(indexid);
+		auto iter = sIndexAndLocalIDToUUID.find(indexid);
 		if (iter == sIndexAndLocalIDToUUID.end())
 		{
 			return FALSE;
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index d5588ab804de7531a2837d97733767a481470738..5ac11271c490f13c38008fbc0fa1b6a5f017050e 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -39,6 +39,9 @@
 #include "lleventcoro.h"
 #include "llcoros.h"
 
+// system includes
+#include <unordered_map>
+
 class LLCamera;
 class LLNetMap;
 class LLDebugBeacon;
@@ -210,7 +213,7 @@ class LLViewerObjectList
 
     uuid_set_t   mDeadObjects;
 
-	std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
+	std::unordered_map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
 
 	//set of objects that need to update their cost
     uuid_set_t   mStaleObjectCost;
@@ -225,9 +228,9 @@ class LLViewerObjectList
 	S32 mCurLazyUpdateIndex;
 
 	static U32 sSimulatorMachineIndex;
-	static std::map<U64, U32> sIPAndPortToIndex;
+	static std::unordered_map<U64, U32> sIPAndPortToIndex;
 
-	static std::map<U64, LLUUID> sIndexAndLocalIDToUUID;
+	static std::unordered_map<U64, LLUUID> sIndexAndLocalIDToUUID;
 
 	std::set<LLViewerObject *> mSelectPickList;
 
@@ -268,7 +271,7 @@ extern LLViewerObjectList gObjectList;
  */
 inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id)
 {
-	std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id);
+	auto iter = mUUIDObjectMap.find(id);
 	if(iter != mUUIDObjectMap.end())
 	{
 		return iter->second;