diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp
index 55e87c1550576699cc941f946362f74059a1ab82..f0a09f22efe172676c981feb957e20187cdaff29 100644
--- a/indra/llcharacter/llbvhloader.cpp
+++ b/indra/llcharacter/llbvhloader.cpp
@@ -515,7 +515,7 @@ ELoadStatus LLBVHLoader::loadAliases(const char * filename)
     {
         if ( LLSDSerialize::fromXML(aliases_sd, input_stream) )
         {
-            for(const auto& alias_pair : aliases_sd.map())
+            for(const auto& alias_pair : aliases_sd.asMap())
             {
                 LLSD::String alias_name = alias_pair.first;
                 LLSD::String joint_name = alias_pair.second;
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index fb2e6d6ef120a974d592257507058c870daa7828..636083787d86c1d3e2bc368ff52ce554befa9d0a 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -922,7 +922,7 @@ namespace LLError
 namespace {
 	void setLevels(LevelMap& map, const LLSD& list, LLError::ELevel level)
 	{
-		for (const auto& i : list.array())
+		for (const auto& i : list.asArray())
 		{
 			map[i.asString()] = level;
 		}
diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp
index 6942655025c56e6aef7c3456e284ffeecaa9d1ba..50d554ba18742585a78b97c9e00a45b325489a4c 100644
--- a/indra/llcommon/llprocessor.cpp
+++ b/indra/llcommon/llprocessor.cpp
@@ -325,7 +325,7 @@ class LLProcessorInfoImpl
 		out << "// CPU Extensions" << std::endl;
 		out << "//////////////////////////" << std::endl;
 		
-		for(const auto& llsd_pair : mProcessorInfo["extension"].map())
+		for(const auto& llsd_pair : mProcessorInfo["extension"].asMap())
 		{
 			out << "  " << llsd_pair.first << std::endl;
 		}
diff --git a/indra/llcommon/llsd.cpp b/indra/llcommon/llsd.cpp
index 378c070d74adf0bec419b274b8e5c25ab9df5917..eb402f2723bf96b565eaa101805b8eed5fafb662 100644
--- a/indra/llcommon/llsd.cpp
+++ b/indra/llcommon/llsd.cpp
@@ -100,6 +100,9 @@ class LLSD::Impl
 	
 	U32 mUseCount;
 
+	const LLSD::map_t& map() const { static thread_local const LLSD::map_t empty; return empty; }
+	const std::vector<LLSD>& array() const { static thread_local const std::vector<LLSD> empty; return empty; }
+
 public:
 	static void reset(Impl*& var, Impl* impl);
 		///< safely set var to refer to the new impl (possibly shared)
@@ -140,7 +143,9 @@ class LLSD::Impl
 	virtual UUID	asUUID() const				{ return LLUUID(); }
 	virtual Date	asDate() const				{ return LLDate(); }
 	virtual URI		asURI() const				{ return LLURI(); }
-	virtual const Binary&	asBinary() const	{ static const std::vector<U8> empty; return empty; }
+	virtual const Binary&	asBinary() const	{ static thread_local const std::vector<U8> empty; return empty; }
+	virtual const map_t& asMap() const			{ return map(); };
+	virtual const array_t& asArray() const		{ return array(); };
 
 	virtual const String& asStringRef() const { static const std::string empty; return empty; } 
 	
@@ -155,15 +160,10 @@ class LLSD::Impl
 	virtual void erase(size_t)					{ }
 	virtual const LLSD& ref(size_t) const		{ return undef(); }
 
-	virtual const LLSD::map_t& map() const { static const LLSD::map_t empty; return empty; }
-	virtual LLSD::map_t& map() { static LLSD::map_t empty; return empty; }
-	LLSD::map_const_iterator beginMap() const { return endMap(); }
-	LLSD::map_const_iterator endMap() const { return map().end(); }
-	virtual const std::vector<LLSD>& array() const { static const std::vector<LLSD> empty; return empty; }
-	virtual std::vector<LLSD>& array() { static std::vector<LLSD> empty; return empty; }
-	LLSD::array_const_iterator beginArray() const { return endArray(); }
-	LLSD::array_const_iterator endArray() const { return array().end(); }
-
+	virtual LLSD::map_const_iterator beginMap() const { return endMap(); }
+	virtual LLSD::map_const_iterator endMap() const { return map().end(); }
+	virtual LLSD::array_const_iterator beginArray() const { return endArray(); }
+	virtual LLSD::array_const_iterator endArray() const { return array().end(); }
 
 	virtual void dumpStats() const;
 	virtual void calcStats(S32 type_counts[], S32 share_counts[]) const;
@@ -393,6 +393,9 @@ namespace
 
         LLSD::Boolean asBoolean() const override { return !mData.empty(); }
 
+		LLSD::map_t& asMap() { return mData; };
+		const LLSD::map_t& asMap() const override { return mData; };
+
         bool has(const std::string_view) const override;
 
 		using LLSD::Impl::get; // Unhiding get(size_t)
@@ -407,8 +410,10 @@ namespace
 
 		size_t size() const override { return mData.size(); }
 
-		DataMap& map() final override { return mData; }
-		const DataMap& map() const final override { return mData; }
+		LLSD::map_iterator beginMap() { return mData.begin(); }
+		LLSD::map_iterator endMap() { return mData.end(); }
+		LLSD::map_const_iterator beginMap() const override { return mData.begin(); }
+		LLSD::map_const_iterator endMap() const override { return mData.end(); }
 
         void dumpStats() const override;
         void calcStats(S32 type_counts[], S32 share_counts[]) const override;
@@ -537,6 +542,9 @@ namespace
 
         LLSD::Boolean asBoolean() const override { return !mData.empty(); }
 
+		DataVector& asArray() { return mData; };
+		const DataVector& asArray() const override { return mData; };
+
 		using LLSD::Impl::get; // Unhiding get(LLSD::String)
 		using LLSD::Impl::erase; // Unhiding erase(LLSD::String)
 		using LLSD::Impl::ref; // Unhiding ref(LLSD::String)
@@ -549,8 +557,12 @@ namespace
 		              LLSD& ref(size_t);
 		virtual const LLSD& ref(size_t) const override; 
 
-		DataVector& array() final override { return mData; }
-		const DataVector& array() const final override { return mData; }
+		LLSD::array_iterator beginArray() { return mData.begin(); }
+		LLSD::array_iterator endArray() { return mData.end(); }
+		LLSD::reverse_array_iterator rbeginArray() { return mData.rbegin(); }
+		LLSD::reverse_array_iterator rendArray() { return mData.rend(); }
+		virtual LLSD::array_const_iterator beginArray() const { return mData.begin(); }
+		virtual LLSD::array_const_iterator endArray() const { return mData.end(); }
 
         void calcStats(S32 type_counts[], S32 share_counts[]) const override;
 	};
@@ -906,6 +918,11 @@ LLSD::Date		LLSD::asDate() const	{ return safe(impl).asDate(); }
 LLSD::URI		LLSD::asURI() const		{ return safe(impl).asURI(); }
 const LLSD::Binary&	LLSD::asBinary() const	{ return safe(impl).asBinary(); }
 
+LLSD::map_t& LLSD::asMap() { return makeMap(impl).asMap(); };
+const LLSD::map_t& LLSD::asMap() const { return safe(impl).asMap(); };
+LLSD::array_t& LLSD::asArray() { return makeArray(impl).asArray(); };
+const LLSD::array_t& LLSD::asArray() const { return safe(impl).asArray(); };
+
 const LLSD::String& LLSD::asStringRef() const { return safe(impl).asStringRef(); }
 
 // const char * helpers
@@ -1017,24 +1034,18 @@ const char *LLSD::dump(const LLSD &llsd)
 	return llsd_dump(llsd, false);
 }
 
-LLSD::map_t& LLSD::map() { return makeMap(impl).map(); }
-const LLSD::map_t& LLSD::map() const { return safe(impl).map(); }
-
-LLSD::map_iterator			LLSD::beginMap()		{ return map().begin(); }
-LLSD::map_iterator			LLSD::endMap()			{ return map().end(); }
-LLSD::map_const_iterator	LLSD::beginMap() const	{ return map().cbegin(); }
-LLSD::map_const_iterator	LLSD::endMap() const	{ return map().cend(); }
-
-std::vector<LLSD>& LLSD::array() { return makeArray(impl).array(); }
-const std::vector<LLSD>& LLSD::array() const { return safe(impl).array(); }
+LLSD::map_iterator			LLSD::beginMap()		{ return makeMap(impl).beginMap(); }
+LLSD::map_iterator			LLSD::endMap()			{ return makeMap(impl).endMap(); }
+LLSD::map_const_iterator	LLSD::beginMap() const	{ return safe(impl).beginMap(); }
+LLSD::map_const_iterator	LLSD::endMap() const	{ return safe(impl).endMap(); }
 
-LLSD::array_iterator		LLSD::beginArray()		{ return array().begin(); }
-LLSD::array_iterator		LLSD::endArray()		{ return array().end(); }
-LLSD::array_const_iterator	LLSD::beginArray() const{ return array().cbegin(); }
-LLSD::array_const_iterator	LLSD::endArray() const	{ return array().cend(); }
+LLSD::array_iterator		LLSD::beginArray()		{ return makeArray(impl).beginArray(); }
+LLSD::array_iterator		LLSD::endArray()		{ return makeArray(impl).endArray(); }
+LLSD::array_const_iterator	LLSD::beginArray() const{ return safe(impl).beginArray(); }
+LLSD::array_const_iterator	LLSD::endArray() const	{ return safe(impl).endArray(); }
 
-LLSD::reverse_array_iterator	LLSD::rbeginArray()		{ return array().rbegin(); }
-LLSD::reverse_array_iterator	LLSD::rendArray()		{ return array().rend(); }
+LLSD::reverse_array_iterator	LLSD::rbeginArray()		{ return makeArray(impl).rbeginArray(); }
+LLSD::reverse_array_iterator	LLSD::rendArray()		{ return makeArray(impl).rendArray(); }
 
 namespace llsd
 {
diff --git a/indra/llcommon/llsd.h b/indra/llcommon/llsd.h
index dbe43f37df7cc56c58123a3a8c77a38f5121b407..b1017873e9a3cc50b754fb5c4f63b09d93717198 100644
--- a/indra/llcommon/llsd.h
+++ b/indra/llcommon/llsd.h
@@ -184,6 +184,8 @@ class LL_COMMON_API LLSD final
 		typedef LLDate			Date;
 		typedef LLURI			URI;
 		typedef std::vector<U8>	Binary;
+		typedef std::map<String, LLSD, std::less<>>					map_t;
+		typedef std::vector<LLSD> array_t;
 	//@}
 	
 	/** @name Scalar Constructors */
@@ -286,6 +288,14 @@ class LL_COMMON_API LLSD final
 		URI		asURI() const;
 		const Binary&	asBinary() const;
 
+		// Direct access to underlying map. Will return empty map on any non-map type.
+		map_t& asMap();
+		const map_t& asMap() const; 
+
+		// Direct access to underlying std::vector. Will return empty vector on any non-map type.
+		array_t& asArray();
+		const array_t& asArray() const;
+
 		// asStringRef on any non-string type will return a ref to an empty string.
 		const String&	asStringRef() const;
 
@@ -359,25 +369,18 @@ class LL_COMMON_API LLSD final
 	//@{
 		size_t size() const;
 
-		typedef std::map<String, LLSD, std::less<>>					map_t;
 		typedef map_t::iterator		map_iterator;
 		typedef map_t::const_iterator	map_const_iterator;
 		
-		map_t& map();
-		const map_t& map() const;
-
 		map_iterator		beginMap();
 		map_iterator		endMap();
 		map_const_iterator	beginMap() const;
 		map_const_iterator	endMap() const;
 		
-		typedef std::vector<LLSD>::iterator			array_iterator;
-		typedef std::vector<LLSD>::const_iterator	array_const_iterator;
-		typedef std::vector<LLSD>::reverse_iterator reverse_array_iterator;
+		typedef array_t::iterator			array_iterator;
+		typedef array_t::const_iterator	array_const_iterator;
+		typedef array_t::reverse_iterator reverse_array_iterator;
 		
-		std::vector<LLSD>& array();
-		const std::vector<LLSD>& array() const;
-
 		array_iterator			beginArray();
 		array_iterator			endArray();
 		array_const_iterator	beginArray() const;
diff --git a/indra/llcommon/llsdparam.cpp b/indra/llcommon/llsdparam.cpp
index c81a84935aecb1ebb93d72bc1ca04c6d03d9d092..7bcea2b71c1cea68eb022e906580e6756e076aec 100644
--- a/indra/llcommon/llsdparam.cpp
+++ b/indra/llcommon/llsdparam.cpp
@@ -254,7 +254,7 @@ void LLParamSDParserUtilities::readSDValues(read_sd_cb_t cb, const LLSD& sd, LLI
 {
 	if (sd.isMap())
 	{
-		for (const auto& llsd_pair : sd.map())
+		for (const auto& llsd_pair : sd.asMap())
 		{
 			stack.push_back(make_pair(llsd_pair.first, true));
 			readSDValues(cb, llsd_pair.second, stack);
@@ -263,7 +263,7 @@ void LLParamSDParserUtilities::readSDValues(read_sd_cb_t cb, const LLSD& sd, LLI
 	}
 	else if (sd.isArray())
 	{
-		for (const auto& llsd_val : sd.array())
+		for (const auto& llsd_val : sd.asArray())
 		{
 			stack.push_back(make_pair(std::string(), true));
 			readSDValues(cb, llsd_val, stack);
diff --git a/indra/llcommon/llsdutil.cpp b/indra/llcommon/llsdutil.cpp
index 330936444fb18d19d38aa8f03f4e2c57221b4380..dd2ecda802bda1f032c0d1796f700b7a6bb8563d 100644
--- a/indra/llcommon/llsdutil.cpp
+++ b/indra/llcommon/llsdutil.cpp
@@ -286,7 +286,7 @@ BOOL compare_llsd_with_template(
 		LLSD value;
 
 		resultant_llsd = LLSD::emptyMap();
-		for (const auto& template_pair : template_llsd.map())
+		for (const auto& template_pair : template_llsd.asMap())
 		{
 			if ( llsd_to_test.has(template_pair.first) )
 			{
@@ -680,7 +680,7 @@ std::string llsd_matches(const LLSD& prototype, const LLSD& data, const std::str
         out << colon(pfx);
         const char* init = "Map missing keys: ";
         const char* sep = init;
-        for (const auto& prototype_pair : prototype.map())
+        for (const auto& prototype_pair : prototype.asMap())
         {
             if (! data.has(prototype_pair.first))
             {
@@ -695,7 +695,7 @@ std::string llsd_matches(const LLSD& prototype, const LLSD& data, const std::str
         }
         // Good, the data block contains all the keys required by the
         // prototype. Now match the prototype entries.
-        for (const auto& prototype_pair : prototype.map())
+        for (const auto& prototype_pair : prototype.asMap())
         {
             std::string match(llsd_matches(prototype_pair.second, data[prototype_pair.first],
                                            STRINGIZE("['" << prototype_pair.first << "']")));
@@ -957,7 +957,7 @@ LLSD llsd_clone(LLSD value, LLSD filter)
     {
     case LLSD::TypeMap:
         clone = LLSD::emptyMap();
-        for (const auto& value_pair : value.map())
+        for (const auto& value_pair : value.asMap())
         {
             if (has_filter)
             {
@@ -981,7 +981,7 @@ LLSD llsd_clone(LLSD value, LLSD filter)
         break;
     case LLSD::TypeArray:
         clone = LLSD::emptyArray();
-        for (const auto& llsd_val : value.array())
+        for (const auto& llsd_val : value.asArray())
         {
             clone.append(llsd_clone(llsd_val, filter));
         }
@@ -1008,7 +1008,7 @@ LLSD llsd_shallow(LLSD value, LLSD filter)
     if (value.isMap())
     {
         shallow = LLSD::emptyMap();
-        for (const auto& value_pair : value.map())
+        for (const auto& value_pair : value.asMap())
         {
             if (has_filter)
             {
@@ -1033,7 +1033,7 @@ LLSD llsd_shallow(LLSD value, LLSD filter)
     else if (value.isArray())
     {
         shallow = LLSD::emptyArray();
-        for (const auto& llsd_val : value.array())
+        for (const auto& llsd_val : value.asArray())
         {
             shallow.append(llsd_val);
         }
diff --git a/indra/llcommon/lluri.cpp b/indra/llcommon/lluri.cpp
index 51a45d28753e4bbb0b67106b3d96a2c28403882d..f8cc1deff3278fe7614ce4d73974176931afc4f1 100644
--- a/indra/llcommon/lluri.cpp
+++ b/indra/llcommon/lluri.cpp
@@ -446,7 +446,7 @@ LLURI LLURI::buildHTTP(const std::string& prefix,
 	if (path.isArray())
 	{
 		// break out and escape each path component
-		for (const auto& llsd_val : path.array())
+		for (const auto& llsd_val : path.asArray())
 		{
 			const std::string& str = llsd_val.asStringRef();
 			LL_DEBUGS() << "PATH: inserting " << str << LL_ENDL;
diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp
index 53af26ced7682addab0bb15e1d2b529f7f7fc8e2..f17bf07afaea75a35d22848b312c29e5af533af7 100644
--- a/indra/llinventory/llinventory.cpp
+++ b/indra/llinventory/llinventory.cpp
@@ -900,7 +900,7 @@ bool LLInventoryItem::fromLLSD(const LLSD& sd, bool is_new)
     // TODO - figure out if this should be moved into the noclobber fields above
     mThumbnailUUID.setNull();
 
-	const auto& sdMap = sd.map();
+	const auto& sdMap = sd.asMap();
 	auto itEnd = sdMap.end();
 
 	auto it = sdMap.find(INV_ITEM_ID_LABEL);
@@ -1171,7 +1171,7 @@ bool LLInventoryCategory::fromLLSD(const LLSD& sd)
 {
 	mThumbnailUUID.setNull();
 
-	const auto& sdMap = sd.map();
+	const auto& sdMap = sd.asMap();
 	auto itEnd = sdMap.end();
 
 	auto it = sdMap.find(INV_FOLDER_ID_LABEL_WS);
@@ -1366,7 +1366,7 @@ LLSD LLInventoryCategory::exportLLSD() const
 
 bool LLInventoryCategory::importLLSD(const LLSD& cat_data)
 {
-	const auto& sdMap = cat_data.map();
+	const auto& sdMap = cat_data.asMap();
 	auto itEnd = sdMap.end();
 
 	auto it = sdMap.find(INV_FOLDER_ID_LABEL);
diff --git a/indra/llinventory/llsettingsbase.cpp b/indra/llinventory/llsettingsbase.cpp
index 93e33c2e1e0bc3ef2351eaa50fdb89f5b48eba95..6618d5cfbe058be8f8d304af20307385b9f885db 100644
--- a/indra/llinventory/llsettingsbase.cpp
+++ b/indra/llinventory/llsettingsbase.cpp
@@ -93,7 +93,7 @@ LLSD LLSettingsBase::combineSDMaps(const LLSD &settings, const LLSD &other) cons
 {
     LLSD newSettings;
 
-    for (const auto& llsd_pair : settings.map())
+    for (const auto& llsd_pair : settings.asMap())
     {
         const std::string& key_name = llsd_pair.first;
         const LLSD& value = llsd_pair.second;
@@ -106,7 +106,7 @@ LLSD LLSettingsBase::combineSDMaps(const LLSD &settings, const LLSD &other) cons
             break;
         case LLSD::TypeArray:
             newSettings[key_name] = LLSD::emptyArray();
-            for (const auto& llsd_val : value.array())
+            for (const auto& llsd_val : value.asArray())
             {
                 newSettings[key_name].append(llsd_val);
             }
@@ -127,7 +127,7 @@ LLSD LLSettingsBase::combineSDMaps(const LLSD &settings, const LLSD &other) cons
 
     if (!other.isUndefined())
     {
-        for (const auto& llsd_pair : other.map())
+        for (const auto& llsd_pair : other.asMap())
         {
             const std::string& key_name = llsd_pair.first;
             const LLSD& value = llsd_pair.second;
@@ -140,7 +140,7 @@ LLSD LLSettingsBase::combineSDMaps(const LLSD &settings, const LLSD &other) cons
                 break;
             case LLSD::TypeArray:
                 newSettings[key_name] = LLSD::emptyArray();
-                for (const auto& llsd_val : value.array())
+                for (const auto& llsd_val : value.asArray())
                 {
                     newSettings[key_name].append(llsd_val);
                 }
@@ -172,8 +172,8 @@ LLSD LLSettingsBase::interpolateSDMap(const LLSD &settings, const LLSD &other, c
 
     //llassert(mix >= 0.0f && mix <= 1.0f);
 
-    const auto& other_map = other.map();
-    const auto& settings_map = settings.map();
+    const auto& other_map = other.asMap();
+    const auto& settings_map = settings.asMap();
     const auto skipEnd = skip.end();
     const auto settingsEnd = settings_map.end();
 
@@ -231,7 +231,7 @@ LLSD LLSettingsBase::interpolateSDMap(const LLSD &settings, const LLSD &other, c
     }
 
     // Now add anything that is in other but not in the settings
-    for (const auto& llsd_pair : other.map())
+    for (const auto& llsd_pair : other.asMap())
     {
         const std::string& key_name = llsd_pair.first;
 
@@ -257,7 +257,7 @@ LLSD LLSettingsBase::interpolateSDMap(const LLSD &settings, const LLSD &other, c
     }
 
     // Note: writes variables from skip list, bug?
-    for (const auto& llsd_pair : other.map())
+    for (const auto& llsd_pair : other.asMap())
     {
         // TODO: Should I blend this in instead?
         if (skip.find(llsd_pair.first) == skipEnd)
@@ -512,7 +512,7 @@ LLSD LLSettingsBase::settingValidation(LLSD &settings, const validation_list_t &
     }
 
     // strip extra entries
-    for (const auto& setting_pair : settings.map())
+    for (const auto& setting_pair : settings.asMap())
     {
         if (validated.find(setting_pair.first) == validated.end())
         {
diff --git a/indra/llinventory/llsettingsdaycycle.cpp b/indra/llinventory/llsettingsdaycycle.cpp
index c549507e61ddeb8459f1001aeb94c2902d1fbc5f..a463fa275a9ec00a83a220c2476be2e3a144d979 100644
--- a/indra/llinventory/llsettingsdaycycle.cpp
+++ b/indra/llinventory/llsettingsdaycycle.cpp
@@ -204,7 +204,7 @@ bool LLSettingsDay::initialize(bool validate_frames)
 
     std::map<std::string, LLSettingsBase::ptr_t> used;
 
-    for (const auto& llsd_pair : frames.map())
+    for (const auto& llsd_pair : frames.asMap())
     {
         const std::string& name = llsd_pair.first;
         const LLSD& data = llsd_pair.second;
@@ -238,7 +238,7 @@ bool LLSettingsDay::initialize(bool validate_frames)
     {
         mDayTracks[i].clear();
         LLSD curtrack = tracks[i];
-        for (const auto& llsd_val : curtrack.array())
+        for (const auto& llsd_val : curtrack.asArray())
         {
             LLSettingsBase::TrackPosition keyframe = LLSettingsBase::TrackPosition(llsd_val[SETTING_KEYKFRAME].asReal());
             keyframe = llclamp(keyframe, 0.0f, 1.0f);
@@ -467,7 +467,7 @@ namespace
 
         S32 framecount(0);
 
-        for (auto& llsd_val : value.array())
+        for (auto& llsd_val : value.asArray())
         {
             S32 index = 0;
             while (index < llsd_val.size())
@@ -533,7 +533,7 @@ namespace
         bool hasSky(false);
         bool hasWater(false);
 
-        for (const auto& llsd_pair : value.map())
+        for (const auto& llsd_pair : value.asMap())
         {
             LLSD frame = llsd_pair.second;
 
diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index 6ad2e9c260b733090e02fc675cb4e203e67df750..7a2e325d808c6c9f0fa9a76c60f2e49f3d9cdf2f 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -276,7 +276,7 @@ bool validateRayleighLayers(LLSD &value, U32 flags)
     if (value.isArray())
     {
         bool allGood = true;
-        for (LLSD& layerConfig : value.array())
+        for (LLSD& layerConfig : value.asArray())
         {
             if (layerConfig.type() == LLSD::TypeMap)
             {
@@ -317,7 +317,7 @@ bool validateAbsorptionLayers(LLSD &value, U32 flags)
     if (value.isArray())
     {
         bool allGood = true;   
-        for (LLSD& layerConfig : value.array())
+        for (LLSD& layerConfig : value.asArray())
         {
             if (layerConfig.type() == LLSD::TypeMap)
             {
@@ -358,7 +358,7 @@ bool validateMieLayers(LLSD &value, U32 flags)
     if (value.isArray())
     {
         bool allGood = true;
-        for (LLSD& layerConfig : value.array())
+        for (LLSD& layerConfig : value.asArray())
         {
             if (layerConfig.type() == LLSD::TypeMap)
             {
@@ -1028,11 +1028,11 @@ LLColor3 LLSettingsSky::getLightDiffuse() const
 LLColor3 LLSettingsSky::getColor(const std::string& key, const LLColor3& default_value) const
 {
     LL_PROFILE_ZONE_SCOPED_CATEGORY_ENVIRONMENT;
-    const auto& settings_map = mSettings.map();
+    const auto& settings_map = mSettings.asMap();
     auto legacy_it = settings_map.find(SETTING_LEGACY_HAZE);
     if (legacy_it != settings_map.end())
     {
-        const auto& legacy_map = legacy_it->second.map();
+        const auto& legacy_map = legacy_it->second.asMap();
         auto legacy_settings_it = legacy_map.find(key);
         if (legacy_settings_it != legacy_map.end())
         {
@@ -1052,11 +1052,11 @@ LLColor3 LLSettingsSky::getColor(const std::string& key, const LLColor3& default
 F32 LLSettingsSky::getFloat(const std::string& key, F32 default_value) const
 {
     LL_PROFILE_ZONE_SCOPED_CATEGORY_ENVIRONMENT;
-    const auto& settings_map = mSettings.map();
+    const auto& settings_map = mSettings.asMap();
     auto legacy_it = settings_map.find(SETTING_LEGACY_HAZE);
     if (legacy_it != settings_map.end())
     {
-        const auto& legacy_map = legacy_it->second.map();
+        const auto& legacy_map = legacy_it->second.asMap();
         auto legacy_settings_it = legacy_map.find(key);
         if (legacy_settings_it != legacy_map.end())
         {
diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp
index 52bf38d3afa890da0e0847862d00c0f303c0b001..debf87aafc572b5b1177a565a9f76812a4217b28 100644
--- a/indra/llmessage/llavatarnamecache.cpp
+++ b/indra/llmessage/llavatarnamecache.cpp
@@ -222,7 +222,7 @@ void LLAvatarNameCache::handleAvNameCacheSuccess(const LLSD &data, const LLSD &h
     F64 now = LLFrameTimer::getTotalSeconds();
 
     const LLSD& agents = data["agents"];
-    for (const LLSD& row : agents.array())
+    for (const LLSD& row : agents.asArray())
     {
         LLUUID agent_id = row["id"].asUUID();
 
@@ -249,7 +249,7 @@ void LLAvatarNameCache::handleAvNameCacheSuccess(const LLSD &data, const LLSD &h
         LL_WARNS("AvNameCache") << "LLAvatarNameResponder::result " << num_unresolved << " unresolved ids; "
             << "expires in " << expires - now << " seconds"
             << LL_ENDL;
-        for (const LLSD& llsd_val : unresolved_agents.array())
+        for (const LLSD& llsd_val : unresolved_agents.asArray())
         {
             const LLUUID& agent_id = llsd_val.asUUID();
 
@@ -489,7 +489,7 @@ bool LLAvatarNameCache::importFile(std::istream& istr)
 
 	LLUUID agent_id;
 	LLAvatarName av_name;
-	for (const auto& llsd_pair : agents.map())
+	for (const auto& llsd_pair : agents.asMap())
 	{
 		agent_id.set(llsd_pair.first);
 		av_name.fromLLSD(llsd_pair.second );
diff --git a/indra/llprimitive/llmaterial.cpp b/indra/llprimitive/llmaterial.cpp
index 945453230625fcf4ce7d0591e9b8ada70ee89ce1..682260633a99e4284ca5f5e58c94f8f21a85a1ed 100644
--- a/indra/llprimitive/llmaterial.cpp
+++ b/indra/llprimitive/llmaterial.cpp
@@ -372,7 +372,7 @@ void LLMaterial::fromLLSD(const LLSD& material_data)
 {
     if (!material_data.isMap()) return;
 
-    const auto& material_map = material_data.map();
+    const auto& material_map = material_data.asMap();
     const auto& material_end = material_map.end();
 
     auto it = material_map.find(MATERIALS_CAP_NORMAL_MAP_FIELD);
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 5517159a2d9c0e7367d50699478efb9d9e29ee9c..28f36c0387e9c71893f98f2715b19e221e2745f4 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -1172,7 +1172,7 @@ bool LLModel::loadModel(std::istream& is)
 		}
 	}
 	
-	const auto& header_map = header.map();
+	const auto& header_map = header.asMap();
 
 	auto it = header_map.find("material_list");
 	if (it != header_map.end())
@@ -1460,13 +1460,13 @@ LLMeshSkinInfo::LLMeshSkinInfo(const LLUUID& mesh_id, const LLSD& skin) :
 
 void LLMeshSkinInfo::fromLLSD(const LLSD& skin)
 {
-	const auto& skin_map = skin.map();
+	const auto& skin_map = skin.asMap();
 
 	auto it = skin_map.find("joint_names");
 	if (it != skin_map.end())
 	{
 		const auto& joint_names = it->second;
-		for(const auto& jnt_llsd : joint_names.array())
+		for(const auto& jnt_llsd : joint_names.asArray())
 		{
 			mJointNames.emplace_back(jnt_llsd.asString());
 			mJointNums.emplace_back(-1);
@@ -1476,7 +1476,7 @@ void LLMeshSkinInfo::fromLLSD(const LLSD& skin)
 	it = skin_map.find("bind_shape_matrix");
 	if (it != skin_map.end())
 	{
-		const auto& bind_shape_mat = it->second.array();
+		const auto& bind_shape_mat = it->second.asArray();
 		LLMatrix4 mat;
 		for (auto j = 0; j < 4; j++)
 		{
@@ -1491,7 +1491,7 @@ void LLMeshSkinInfo::fromLLSD(const LLSD& skin)
 	it = skin_map.find("inverse_bind_matrix");
 	if (it != skin_map.end())
 	{
-		const auto& inv_bind_mat = it->second.array();
+		const auto& inv_bind_mat = it->second.asArray();
 		for (size_t i = 0, size = inv_bind_mat.size(); i < size; ++i)
 		{
 			LLMatrix4 mat;
@@ -1523,7 +1523,7 @@ void LLMeshSkinInfo::fromLLSD(const LLSD& skin)
 	it = skin_map.find("alt_inverse_bind_matrix");
 	if (it != skin_map.end())
 	{
-		const auto& alt_inv_bind_mat = it->second.array();
+		const auto& alt_inv_bind_mat = it->second.asArray();
 		for (size_t i = 0, size = alt_inv_bind_mat.size(); i < size; ++i)
 		{
 			LLMatrix4 mat;
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index c155d92e6a2b5d1daf85b95f59d85b0eca5be4e7..9e06857e951f3325271f305557c58f5def785b77 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -1029,7 +1029,7 @@ void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version,
 
 			if (old_cache_version == current_cache_version)
 			{
-				for (const auto& data_pair : in_data.map())
+				for (const auto& data_pair : in_data.asMap())
 				{
 					ProgramBinaryData binary_info = ProgramBinaryData();
 					binary_info.mBinaryFormat = data_pair.second["binary_format"].asInteger();
diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp
index 5f3397845bf96aaeefb0f0eba02263c39c9c5fbe..6b6d50288c8be72d401dae5d2c7499ce1dab9829 100644
--- a/indra/llui/llconsole.cpp
+++ b/indra/llui/llconsole.cpp
@@ -254,7 +254,7 @@ void LLConsole::Paragraph::makeParagraphColorSegments (const LLColor4 &color)
 	LLSD color_sd = color.getValue();
 	paragraph_color_segments[0]["color"]=color_sd;
 
-	for(const auto& color_segment_it : paragraph_color_segments.array())
+	for(const auto& color_segment_it : paragraph_color_segments.asArray())
 	{			
 		LLSD color_llsd = color_segment_it["color"];
 		std::string color_str  = color_segment_it["text"].asString();
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index ef9b7aeace08ee0cafd9072ee1ce4bb50aa12232..4d6c2f32c7b54607bf162bba1171607bb553660d 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -482,7 +482,7 @@ void LLFloaterReg::registerControlVariables()
 	}
 
 	const LLSD& exclude_list = LLUI::getInstance()->mSettingGroups["config"]->getLLSD("always_showable_floaters");
-	for (const auto& llsd_var : exclude_list.array())
+	for (const auto& llsd_var : exclude_list.asArray())
 	{
 		sAlwaysShowableList.insert(llsd_var.asString());
 	}
diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp
index 56b4e559a24ca6c42ab7805760980f06531340c8..26582bed1a5a82f2230b7a9813cbd645184d21b6 100644
--- a/indra/llui/llkeywords.cpp
+++ b/indra/llui/llkeywords.cpp
@@ -137,11 +137,11 @@ std::string LLKeywords::getArguments(LLSD& arguments)
 	if (arguments.isArray())
 	{
 		U32 argsCount = arguments.size();
-		for (const LLSD& args : arguments.array())
+		for (const LLSD& args : arguments.asArray())
 		{
 			if (args.isMap())
 			{
-				for (const auto& llsd_pair : args.map())
+				for (const auto& llsd_pair : args.asMap())
 				{
 					argString += llsd_pair.second.get("type").asString() + " " + llsd_pair.first;
 					if (argsCount-- > 1)
@@ -290,7 +290,7 @@ void LLKeywords::processTokens()
 	addToken(LLKeywordToken::TT_TWO_SIDED_DELIMITER, "/*", syntax_lsl_comment_color, "Comment (multi-line)\nNon-functional commentary or disabled code", "*/" );
 	addToken(LLKeywordToken::TT_DOUBLE_QUOTATION_MARKS, "\"", syntax_lsl_comment_color, "String literal", "\"" );
 
-	for (const auto& llsd_pair : mSyntax.map())
+	for (const auto& llsd_pair : mSyntax.asMap())
 	{
 		if (llsd_pair.first == "llsd-lsl-syntax-version")
 		{
@@ -354,13 +354,13 @@ void LLKeywords::processTokensGroup(const LLSD& tokens, std::string_view group)
 
 	if (tokens.isMap())
 	{
-		for (const auto& token_pair : tokens.map())
+		for (const auto& token_pair : tokens.asMap())
 		{
 			if (token_pair.second.isMap())
 			{
 				mAttributes.clear();
 				LLSD arguments = LLSD();
-				for (const auto& token_inner_pair : token_pair.second.map())
+				for (const auto& token_inner_pair : token_pair.second.asMap())
 				{
 					if (token_inner_pair.first == "arguments")
 					{ 
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index 42f98fd532980ebd88491e4af29f9cfaadd21b90..1bac017fc771b07ec6bf0f1bf81341a9103b4767 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -268,7 +268,7 @@ LLSD LLNotificationForm::asLLSD() const
 
 LLSD LLNotificationForm::getElement(std::string_view element_name)
 {
-	for (const LLSD& llsd_val : mFormData.array())
+	for (const LLSD& llsd_val : mFormData.asArray())
 	{
 		if (llsd_val["name"].asString() == element_name) return llsd_val;
 	}
@@ -278,7 +278,7 @@ LLSD LLNotificationForm::getElement(std::string_view element_name)
 
 bool LLNotificationForm::hasElement(std::string_view element_name) const
 {
-	for (const LLSD& llsd_val : mFormData.array())
+	for (const LLSD& llsd_val : mFormData.asArray())
 	{
 		if (llsd_val["name"].asString() == element_name) return true;
 	}
@@ -300,7 +300,7 @@ void LLNotificationForm::getElements(LLSD& elements, S32 offset)
 
 bool LLNotificationForm::getElementEnabled(std::string_view element_name) const
 {
-	for (const LLSD& llsd_val : mFormData.array())
+	for (const LLSD& llsd_val : mFormData.asArray())
 	{
 		if (llsd_val["name"].asString() == element_name)
 		{
@@ -313,7 +313,7 @@ bool LLNotificationForm::getElementEnabled(std::string_view element_name) const
 
 void LLNotificationForm::setElementEnabled(std::string_view element_name, bool enabled)
 {
-	for (LLSD& llsd_val : mFormData.array())
+	for (LLSD& llsd_val : mFormData.asArray())
 	{
 		if (llsd_val["name"].asString() == element_name)
 		{
@@ -339,7 +339,7 @@ void LLNotificationForm::append(const LLSD& sub_form)
 {
 	if (sub_form.isArray())
 	{
-		for (const auto& llsd_val : sub_form.array())
+		for (const auto& llsd_val : sub_form.asArray())
 		{
 			mFormData.append(llsd_val);
 		}
@@ -348,7 +348,7 @@ void LLNotificationForm::append(const LLSD& sub_form)
 
 void LLNotificationForm::formatElements(const LLSD& substitutions)
 {
-	for (LLSD& llsd_val : mFormData.array())
+	for (LLSD& llsd_val : mFormData.asArray())
 	{
 		// format "text" component of each form element
 		if (llsd_val.has("text"))
@@ -368,7 +368,7 @@ void LLNotificationForm::formatElements(const LLSD& substitutions)
 
 std::string LLNotificationForm::getDefaultOption()
 {
-	for (const LLSD& llsd_val : mFormData.array())
+	for (const LLSD& llsd_val : mFormData.asArray())
 	{
 		if (llsd_val["default"]) return llsd_val["name"].asString();
 	}
@@ -648,7 +648,7 @@ S32 LLNotification::getSelectedOption(const LLSD& notification, const LLSD& resp
 //static
 std::string LLNotification::getSelectedOptionName(const LLSD& response)
 {
-	for (const auto& llsd_pair : response.map())
+	for (const auto& llsd_pair : response.asMap())
 	{
 		if (llsd_pair.second.isBoolean() && llsd_pair.second.asBoolean())
 		{
diff --git a/indra/llui/lltextparser.cpp b/indra/llui/lltextparser.cpp
index f432cef46ee3c02c4f8efaf7359364cca4578a81..daf85493f97c88e5e0ed7174ba867512862a2699 100644
--- a/indra/llui/lltextparser.cpp
+++ b/indra/llui/lltextparser.cpp
@@ -402,7 +402,7 @@ bool LLTextParser::loadKeywords()
 		return false;
 	}
 
-	for (const LLSD& sdEntry : sdIn.array())
+	for (const LLSD& sdEntry : sdIn.asArray())
 	{
 		mHighlightEntries.push_back(LLHighlightEntry(sdEntry));
 	}
diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp
index 9d0dc1d013d154b033bd783f01223c9917d84b6b..5e1ced247df7c0a8c23070e2d74c56b4e13ab8a0 100644
--- a/indra/llui/lluistring.cpp
+++ b/indra/llui/lluistring.cpp
@@ -70,7 +70,7 @@ void LLUIString::setArgs(const LLSD& sd)
 	LL_PROFILE_ZONE_SCOPED_CATEGORY_UI;
 	
 	if (!sd.isMap()) return;
-	for(const auto& llsd_pair : sd.map())
+	for(const auto& llsd_pair : sd.asMap())
 	{
 		setArg(llsd_pair.first, llsd_pair.second.asString());
 	}
diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp
index 3a2eb513f885872384aca7af59788b662d4e11b3..82f759f8dcb3fde07f35a47b4d0c4dcc1486dff4 100644
--- a/indra/llxml/llcontrol.cpp
+++ b/indra/llxml/llcontrol.cpp
@@ -1106,7 +1106,7 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v
 	U32	validitems = 0;
 	bool hidefromsettingseditor = false;
 	
-	for(const auto& e : settings.map())
+	for(const auto& e : settings.asMap())
 	{
 		LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT;
 		std::string const & name = e.first;
diff --git a/indra/newview/llderenderlist.cpp b/indra/newview/llderenderlist.cpp
index 528d8f3e83164e4eca79e08ccbbdbb1490df2657..d7be63f5ddaa2c17bf39528ac5707b431b48d632 100644
--- a/indra/newview/llderenderlist.cpp
+++ b/indra/newview/llderenderlist.cpp
@@ -177,7 +177,7 @@ void LLDerenderList::load()
 		return;
 	}
 
-	for (const LLSD& sdEntry : inSD.array())
+	for (const LLSD& sdEntry : inSD.asArray())
 	{
 		auto pEntry = LLDerenderEntry::fromLLSD(sdEntry);
 		if (pEntry->isValid())
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index 7bc45ffc46f6454eaa2000e1571264b22f1c9919..853ed090e562164d1bd5b73a7f03d9f3b2a1df9c 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -1683,7 +1683,7 @@ void LLEnvironment::updateGLVariablesForSettings(LLShaderUniforms* uniforms, con
     LLShaderUniforms* shader = &uniforms[LLGLSLShader::SG_ANY];
     //_WARNS("RIDER") << "----------------------------------------------------------------" << LL_ENDL;
     const LLSettingsBase::parammapping_t& params = psetting->getParameterMap();
-    const auto& settings_map = psetting->mSettings.map();
+    const auto& settings_map = psetting->mSettings.asMap();
     for (const auto &it: params)
     {
         LLSD value;
@@ -1691,7 +1691,7 @@ void LLEnvironment::updateGLVariablesForSettings(LLShaderUniforms* uniforms, con
         auto legacy_haze_it = settings_map.find(LLSettingsSky::SETTING_LEGACY_HAZE);
         if (legacy_haze_it != settings_map.end())
         {
-            const auto& legacy_map = legacy_haze_it->second.map();
+            const auto& legacy_map = legacy_haze_it->second.asMap();
             auto legacy_setting_it = legacy_map.find(it.first);
             if (legacy_setting_it != legacy_map.end())
             {
diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp
index 09b8279025726dfb899625066b8293d7edfc547e..5cd5f69d09e8f180413d3586e9fba2a24c17daed 100644
--- a/indra/newview/llfloaterimsession.cpp
+++ b/indra/newview/llfloaterimsession.cpp
@@ -1190,7 +1190,7 @@ void LLFloaterIMSession::processAgentListUpdates(const LLSD& body)
 	if (body.isMap() && body.has("agent_updates") && body["agent_updates"].isMap())
 	{
 		LLSD::map_const_iterator update_it;
-		for(const auto& agent_update : body["agent_updates"].map())
+		for(const auto& agent_update : body["agent_updates"].asMap())
 		{
 			LLUUID agent_id(agent_update.first);
 			LLSD agent_data = agent_update.second;
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 2ec19d50d41a9b80e6df606eadbba629f978f0be..3795e0db2e257345008b19be2105941ed7a41ca8 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -3555,7 +3555,7 @@ void LLPanelEstateAccess::requestEstateGetAccessCoro(std::string url)
 
 		allowed_agent_name_list->clearSortOrder();
 		allowed_agent_name_list->deleteAllItems();
-		for (const auto& llsd_val : result["AllowedAgents"].array())
+		for (const auto& llsd_val : result["AllowedAgents"].asArray())
 		{ 
 			LLUUID id = llsd_val["id"].asUUID();
 			allowed_agent_name_list->addNameItem(id);
@@ -3574,7 +3574,7 @@ void LLPanelEstateAccess::requestEstateGetAccessCoro(std::string url)
 
 		banned_agent_name_list->clearSortOrder();
 		banned_agent_name_list->deleteAllItems();
-		for (const auto& llsd_val : result["BannedAgents"].array())
+		for (const auto& llsd_val : result["BannedAgents"].asArray())
 		{
 			LLSD item;
 			item["id"] = llsd_val["id"].asUUID();
@@ -3617,7 +3617,7 @@ void LLPanelEstateAccess::requestEstateGetAccessCoro(std::string url)
 
 		allowed_group_name_list->clearSortOrder();
 		allowed_group_name_list->deleteAllItems();
-		for (const auto& llsd_val : result["AllowedGroups"].array())
+		for (const auto& llsd_val : result["AllowedGroups"].asArray())
 		{
 			LLUUID id = llsd_val["id"].asUUID();
 			allowed_group_name_list->addGroupNameItem(id);
@@ -3636,7 +3636,7 @@ void LLPanelEstateAccess::requestEstateGetAccessCoro(std::string url)
 
 		estate_manager_name_list->clearSortOrder();
 		estate_manager_name_list->deleteAllItems();
-		for (const auto& llsd_val : result["Managers"].array())
+		for (const auto& llsd_val : result["Managers"].asArray())
 		{
 			LLUUID id = llsd_val["agent_id"].asUUID();
 			estate_manager_name_list->addNameItem(id);
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index c4e19f20658ec40b1144397ba493b4e4d8f46305..1792af64f978a3d4e958e354d9c3ec91cfd43732 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -2243,7 +2243,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
 		if (!member_iter_start->second.isMap()) continue;
 
 		const LLUUID member_id(member_iter_start->first);
-		const auto& member_info = member_iter_start->second.map();
+		const auto& member_info = member_iter_start->second.asMap();
 		const auto member_info_end = member_info.end();
 
 		auto it = member_info.find("last_login");
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index e7a0b69f5efd88683831415b3b6bcf20f3402199..37637458a3406416cb4acb64ce07ea67b8606aec 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -3762,12 +3762,12 @@ void LLIMMgr::addPendingAgentListUpdates(
 		update_types.append("agent_updates");
 		update_types.append("updates");
 
-		for (const auto& update_type : update_types.array())
+		for (const auto& update_type : update_types.asArray())
 		{
 			//we only want to include the last update for a given agent
-			for (const auto& update_pair : updates[update_type.asStringRef()].map())
+			for (const auto& update_pair : updates[update_type.asString()].asMap())
 			{
-				mPendingAgentListUpdates[session_id.asString()][update_type.asStringRef()][update_pair.first] =
+				mPendingAgentListUpdates[session_id.asString()][update_type.asString()][update_pair.first] =
 					update_pair.second;
 			}
 		}
@@ -3780,7 +3780,7 @@ void LLIMMgr::addPendingAgentListUpdates(
 		//of agent_id -> "LEAVE"/"ENTER"
 
 		//only want to keep last update for each agent
-		for (const auto& update_pair : updates["updates"].map())
+		for (const auto& update_pair : updates["updates"].asMap())
 		{
 			mPendingAgentListUpdates[session_id.asString()]["updates"][update_pair.first] =
 				update_pair.second;
diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp
index 148718fad2144485ae531791451f6839b94ea58d..706c768250419b7b51be334858bd7b4b98f2d24e 100644
--- a/indra/newview/llinventorymodelbackgroundfetch.cpp
+++ b/indra/newview/llinventorymodelbackgroundfetch.cpp
@@ -1234,7 +1234,7 @@ void BGFolderHttpHandler::processData(LLSD & content, LLCore::HttpResponse * res
 	{
 		LLSD folders(content["folders"]);
 		
-		for (const auto& folder_sd : folders.array())
+		for (const auto& folder_sd : folders.asArray())
 		{	
 			//LLUUID agent_id = folder_sd["agent_id"];
 
@@ -1256,7 +1256,7 @@ void BGFolderHttpHandler::processData(LLSD & content, LLCore::HttpResponse * res
 				LLSD items(folder_sd["items"]);
 			    LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
 				
-				for (const auto& item : items.array())
+				for (const auto& item : items.asArray())
 			    {	
                     const LLUUID lost_uuid(gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));
 
@@ -1284,7 +1284,7 @@ void BGFolderHttpHandler::processData(LLSD & content, LLCore::HttpResponse * res
 			}
 
 			LLSD categories(folder_sd["categories"]);
-			for (const auto& category : categories.array())
+			for (const auto& category : categories.asArray())
 			{	
 				tcategory->fromLLSD(category); 
 				
@@ -1301,7 +1301,7 @@ void BGFolderHttpHandler::processData(LLSD & content, LLCore::HttpResponse * res
 
 			LLSD items(folder_sd["items"]);
 			LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
-			for (const auto& item : items.array())
+			for (const auto& item : items.asArray())
 			{	
 				titem->unpackMessage(item);
 				
@@ -1322,7 +1322,7 @@ void BGFolderHttpHandler::processData(LLSD & content, LLCore::HttpResponse * res
 	if (content.has("bad_folders"))
 	{
 		LLSD bad_folders(content["bad_folders"]);
-		for (const auto& folder_sd : bad_folders.array())
+		for (const auto& folder_sd : bad_folders.asArray())
 		{
 			// These folders failed on the dataserver.  We probably don't want to retry them.
 			LL_WARNS(LOG_INV) << "Folder " << folder_sd["folder_id"].asString() 
@@ -1416,7 +1416,7 @@ void BGFolderHttpHandler::processFailure(LLCore::HttpStatus status, LLCore::Http
 	if (false)
 	{
 		// timed out or curl failure
-		for (const auto& folder_sd : mRequestSD["folders"].array())
+		for (const auto& folder_sd : mRequestSD["folders"].asArray())
 		{
 			LLUUID folder_id(folder_sd["folder_id"].asUUID());
 			const BOOL recursive = getIsRecursive(folder_id);
@@ -1450,7 +1450,7 @@ void BGFolderHttpHandler::processFailure(const char * const reason, LLCore::Http
 	LLInventoryModelBackgroundFetch *fetcher = LLInventoryModelBackgroundFetch::getInstance();
 	if (true)
 	{
-		for (const auto& folder_sd : mRequestSD["folders"].array())
+		for (const auto& folder_sd : mRequestSD["folders"].asArray())
 		{
 			LLUUID folder_id(folder_sd["folder_id"].asUUID());
 			const BOOL recursive = getIsRecursive(folder_id);
diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp
index c5526af89fc5ecdbb2157d4f18991d3f87fdd194..6990ba2fe0b5e248d644c0af37819dbfbf2e20ca 100644
--- a/indra/newview/llmarketplacefunctions.cpp
+++ b/indra/newview/llmarketplacefunctions.cpp
@@ -933,7 +933,7 @@ void LLMarketplaceData::getSLMListingsCoro(LLUUID folderId)
     log_SLM_infos("Get /listings", static_cast<U32>(status.getType()), result);
 
     // Extract the info from the results
-    for (const LLSD& listing : result["listings"].array())
+    for (const LLSD& listing : result["listings"].asArray())
     { 
         int listingId = listing["id"].asInteger();
         bool isListed = listing["is_listed"].asBoolean();
@@ -1004,7 +1004,7 @@ void LLMarketplaceData::getSingleListingCoro(S32 listingId, LLUUID folderId)
 
 
     // Extract the info from the results
-    for (const LLSD& listing : result["listings"].array())
+    for (const LLSD& listing : result["listings"].asArray())
     {
         int resListingId = listing["id"].asInteger();
         bool isListed = listing["is_listed"].asBoolean();
@@ -1079,7 +1079,7 @@ void LLMarketplaceData::createSLMListingCoro(LLUUID folderId, LLUUID versionId,
     }
 
     // Extract the info from the results
-    for (const LLSD& listing : result["listings"].array())
+    for (const LLSD& listing : result["listings"].asArray())
     {
         int listingId = listing["id"].asInteger();
         bool isListed = listing["is_listed"].asBoolean();
@@ -1156,7 +1156,7 @@ void LLMarketplaceData::updateSLMListingCoro(LLUUID folderId, S32 listingId, LLU
     }
 
     // Extract the info from the Json string
-    for (const LLSD& listing : result["listings"].array())
+    for (const LLSD& listing : result["listings"].asArray())
     {
         int listing_id = listing["id"].asInteger();
         bool is_listed = listing["is_listed"].asBoolean();
@@ -1236,7 +1236,7 @@ void LLMarketplaceData::associateSLMListingCoro(LLUUID folderId, S32 listingId,
 
     log_SLM_infos("Put /associate_inventory", status.getType(), result);
 
-    for (const LLSD& listing : result["listings"].array())
+    for (const LLSD& listing : result["listings"].asArray())
     {
         int listing_id = listing["id"].asInteger();
         bool is_listed = listing["is_listed"].asBoolean();
@@ -1305,7 +1305,7 @@ void LLMarketplaceData::deleteSLMListingCoro(S32 listingId)
 
     log_SLM_infos("Delete /listing", status.getType(), result);
 
-    for (const LLSD& listing : result["listings"].array())
+    for (const LLSD& listing : result["listings"].asArray())
     {
         int listing_id = listing["id"].asInteger();
         LLUUID folder_id = LLMarketplaceData::instance().getListingFolder(listing_id);
diff --git a/indra/newview/llpipelinelistener.cpp b/indra/newview/llpipelinelistener.cpp
index 4f67984b027b0abc2a18162fab170f47b27c1dc0..ef9276cb41cfa6bf3fe34f5ae772f01a44376bea 100644
--- a/indra/newview/llpipelinelistener.cpp
+++ b/indra/newview/llpipelinelistener.cpp
@@ -41,7 +41,7 @@ namespace {
 	// Render Types
 	void toggle_render_types_wrapper(LLSD const& request)
 	{
-		for (const LLSD& llsd_val : request["types"].array())
+		for (const LLSD& llsd_val : request["types"].asArray())
 		{
 			U32 render_type = render_type_from_string( llsd_val.asString() );
 			if ( render_type != 0 )
@@ -78,7 +78,7 @@ namespace {
 	// Render Features
 	void toggle_render_features_wrapper(LLSD const& request)
 	{
-		for (const LLSD& llsd_val : request["features"].array())
+		for (const LLSD& llsd_val : request["features"].asArray())
 		{
 			U32 render_feature = feature_from_string( llsd_val.asString() );
 			if ( render_feature != 0 )
@@ -115,7 +115,7 @@ namespace {
 	// Render Info Displays
 	void toggle_info_displays_wrapper(LLSD const& request)
 	{
-		for (const LLSD& llsd_val : request["displays"].array())
+		for (const LLSD& llsd_val : request["displays"].asArray())
 		{
 			U64 info_display = info_display_from_string( llsd_val.asString() );
 			if ( info_display != 0 )
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index 27053b507a1bf83a9f858e2e313efbf03baf5ed4..485b8af58b07930fd28644097c211ec10787a5e6 100644
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -412,7 +412,7 @@ std::string LLSLURL::getSLURLString() const
 		{
 			std::string app_url;
 			app_url += LLGridManager::getInstance()->getAppSLURLBase() + "/" + mAppCmd;
-			for(const LLSD& entry : mAppPath.array())
+			for(const LLSD& entry : mAppPath.asArray())
 			{
 				app_url += "/" + entry.asString();
 			}
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index e6008b1adccf25f2931e0c667985cb4a4d82e5d1..938666a487373d6958f7d187386dbfbd86809736 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -677,7 +677,7 @@ void LLIMSpeakerMgr::setSpeakers(const LLSD& speakers)
 
 	if ( speakers.has("agent_info") && speakers["agent_info"].isMap() )
 	{
-		for(const auto& llsd_pair : speakers["agent_info"].map())
+		for(const auto& llsd_pair : speakers["agent_info"].asMap())
 		{
 			const LLUUID agent_id(llsd_pair.first);
 
@@ -705,7 +705,7 @@ void LLIMSpeakerMgr::setSpeakers(const LLSD& speakers)
 	{
 		//older, more decprecated way.  Need here for
 		//using older version of servers
-		for(const auto& llsd_val : speakers["agents"].array())
+		for(const auto& llsd_val : speakers["agents"].asArray())
 		{
 			const LLUUID agent_id = llsd_val.asUUID();
 
@@ -723,7 +723,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
 
 	if ( update.has("agent_updates") && update["agent_updates"].isMap() )
 	{
-		for(const auto& llsd_pair : update["agent_updates"].map())
+		for(const auto& llsd_pair : update["agent_updates"].asMap())
 		{
 			LLUUID agent_id(llsd_pair.first);
 			LLPointer<LLSpeaker> speakerp = findSpeaker(agent_id);
@@ -775,7 +775,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
 	}
 	else if ( update.has("updates") && update["updates"].isMap() )
 	{
-		for (const auto& llsd_pair : update["updates"].map())
+		for (const auto& llsd_pair : update["updates"].asMap())
 		{
 			LLUUID agent_id(llsd_pair.first);
 			LLPointer<LLSpeaker> speakerp = findSpeaker(agent_id);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 04eb687eb924dae10901c832d52719377da7266c..e3339d215b9b308871eb8a5fdde8f1d131fbf31e 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -6775,7 +6775,7 @@ void send_lures(const LLSD& notification, const LLSD& response)
 	msg->nextBlockFast(_PREHASH_Info);
 	msg->addU8Fast(_PREHASH_LureType, (U8)0); // sim will fill this in.
 	msg->addStringFast(_PREHASH_Message, text);
-	for(const auto& llsd_val : notification["payload"]["ids"].array())
+	for(const auto& llsd_val : notification["payload"]["ids"].asArray())
 	{
 		LLUUID target_id = llsd_val.asUUID();
 
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index f4b46153a358a574b05ae86938f4ca6c09c887b4..01b826627d299ccc86c081d3e5c1d6a1730004f1 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -346,7 +346,7 @@ bool LLGridManager::addGrid(LLSD& grid_data)
 										 <<"  login page:  "<<grid_data[GRID_LOGIN_PAGE_VALUE].asString()<<"\n"
 										 <<"  web profile: "<<grid_data[GRID_WEB_PROFILE_VALUE].asString()<<"\n";
 				/* still in LL_DEBUGS */ 
-				for (const LLSD& login_uris : grid_data[GRID_LOGIN_URI_VALUE].array())
+				for (const LLSD& login_uris : grid_data[GRID_LOGIN_URI_VALUE].asArray())
 				{
 					LL_CONT << "  login uri:   "<<login_uris.asString()<<"\n";
 				}
@@ -670,7 +670,7 @@ void LLGridManager::saveGridList()
 std::map<std::string, std::string> LLGridManager::getKnownGrids() const
 {
 	std::map<std::string, std::string> result;
-	for(const auto& grid_pair : mGridList.map())
+	for(const auto& grid_pair : mGridList.asMap())
 	{
 		// skip temp grids. since this is just for "grid label mappings for UI purposes"
 		if (grid_pair.second.has(GRID_TEMPORARY) && grid_pair.second[GRID_TEMPORARY].asBoolean())
@@ -738,7 +738,7 @@ std::string LLGridManager::getGrid(const std::string& grid) const
 	else
 	{
 		// search the grid list for a grid with a matching id
-		for(const auto& grid_pair : mGridList.map())
+		for(const auto& grid_pair : mGridList.asMap())
 		{
 			if (grid_pair.second.has(GRID_ID_VALUE))
 			{
@@ -773,7 +773,7 @@ std::string LLGridManager::getGridByProbing(const std::string& grid) const
 	else
 	{
 		// search the grid list for a grid with a matching id
-		for (const auto& grid_pair : mGridList.map())
+		for (const auto& grid_pair : mGridList.asMap())
 		{
 			if (grid_pair.second.has(GRID_ID_VALUE))
 			{
@@ -802,7 +802,7 @@ std::string LLGridManager::getGridByAttribute(const std::string& attribute, cons
 {
 	if (attribute.empty() || value.empty()) return LLStringUtil::null;
 	
-	for(const auto& grid_iter : mGridList.map())
+	for(const auto& grid_iter : mGridList.asMap())
 	{
 		if (grid_iter.second.has(attribute)
 			&& LLStringUtil::compareInsensitive(value, grid_iter.second[attribute].asString()) == 0)
@@ -871,7 +871,7 @@ void LLGridManager::getLoginURIs(const std::string& grid, std::vector<std::strin
 	{
         if (mGridList[grid_name][GRID_LOGIN_URI_VALUE].isArray())
         {
-		    for (const LLSD& llsd_uri : mGridList[grid_name][GRID_LOGIN_URI_VALUE].array())
+		    for (const LLSD& llsd_uri : mGridList[grid_name][GRID_LOGIN_URI_VALUE].asArray())
 		    {
 			    uris.push_back(llsd_uri.asString());
 		    }
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 725ac76c5a104561c982e1407467704bb073b198..586795ba25462055a490a861b4282c9ade8d878c 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -385,7 +385,7 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)
             continue;
         }
 
-        for (const auto& iter : result.map())
+        for (const auto& iter : result.asMap())
         {
             regionp->setCapability(iter.first, iter.second);
 
@@ -495,7 +495,7 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro(U64 regionHandle)
         // remove the http_result from the llsd
         result.erase("http_result");
 
-         for (const auto& llsd_pair : result.map())
+         for (const auto& llsd_pair : result.asMap())
         {
             regionp->setCapabilityDebug(llsd_pair.first, llsd_pair.second);
             //LL_INFOS()<<"BaseCapabilitiesCompleteTracker New Caps "<<iter->first<<" "<< iter->second<<LL_ENDL;