diff --git a/autobuild.xml b/autobuild.xml
index 67dfbf0c4155dcfffb2f2870ca56088fa36ea92f..1554adb98a5090fd50046a4d957fa67f609587fe 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -204,11 +204,11 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>0efbda71b890eb506226ec890bfb15e11e6bd725620f6202a99e4da675cd7deda4684dd8a68d4c35d71bcbda4fcafbdfe97824ab4cbbfa70a1561adbb53c7264</string>
+              <string>5265fa05c31a7a8fccca5481192ed4f45863e22620d98515e6f1c343eff0e99bf40e392effa7f2a9ce5562edf7d683ce319694b5163cece9ec9f9fb4bc860ac6</string>
               <key>hash_algorithm</key>
               <string>blake2b</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/92/packages/generic/boost/1.80.0.1699/boost-1.80.0-darwin64-1699.tar.zst</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/92/packages/generic/boost/1.81.0.1768/boost-1.81.0-darwin64-1768.tar.zst</string>
             </map>
             <key>name</key>
             <string>darwin64</string>
@@ -218,11 +218,11 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>6c0ebf87f2765d51c802fd04fc2752a3b179488b2e34e86c80f84d5931b5d4a74136a52e8b80038840741fe61580e0674e151721aaf39e6f2ac6c84922606f57</string>
+              <string>12b8f815fcb740f990a0e7fe68984f9d481ebd41f9d07d99ebad8f14010958467f8cecb692a782b8d70ecb80c17bb8a23e842b5562b033bd444e0febe2f29c79</string>
               <key>hash_algorithm</key>
               <string>blake2b</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/92/packages/generic/boost/1.80.0.1699/boost-1.80.0-linux64-1699.tar.zst</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/92/packages/generic/boost/1.81.0.1768/boost-1.81.0-linux64-1768.tar.zst</string>
             </map>
             <key>name</key>
             <string>linux64</string>
@@ -232,18 +232,18 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>229c29faef184e7fa9c7d17e62cc629e6a5fbb00153a10550143a30551cf4984bb4f62fb5384703d20b872eb0b7f7ef89ba43bc16fed6b4e1db5cb6e2797d406</string>
+              <string>fc6af1d3acd14d7ec9058fdf5bdb363ca9cae1c604414f65f24b48a419919b6c1119fba44805525a2cbfb49fda3d0050e8d4883a52963635220526e01aebd648</string>
               <key>hash_algorithm</key>
               <string>blake2b</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/92/packages/generic/boost/1.80.0.1699/boost-1.80.0-windows64-1699.tar.zst</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/92/packages/generic/boost/1.81.0.1768/boost-1.81.0-windows64-1768.tar.zst</string>
             </map>
             <key>name</key>
             <string>windows64</string>
           </map>
         </map>
         <key>version</key>
-        <string>1.80.0</string>
+        <string>1.81.0</string>
       </map>
       <key>colladadom</key>
       <map>
@@ -262,11 +262,11 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>75fa180957a1b921b11bbc6b3d3f8d04cd5154c8f43b0d8ffeb39a1b020f425826d87f5c15af4978bf21eeb233209f507265fe3cf88fde5604d479f54dcc747a</string>
+              <string>42534634e4d37ca120baaaaf9a6127f1023b92935e0554da0f8b52ea72f3aa6f5f556481fc586e1e6ac7d2ba8ae229c453fb12212cacb052da83622da9a3c130</string>
               <key>hash_algorithm</key>
               <string>blake2b</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/98/packages/generic/colladadom/2.3.0.1705/colladadom-2.3.0-darwin64-1705.tar.zst</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/98/packages/generic/colladadom/2.3.0.1769/colladadom-2.3.0-darwin64-1769.tar.zst</string>
             </map>
             <key>name</key>
             <string>darwin64</string>
@@ -276,11 +276,11 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>95439a509974d258cfffbee1a65c755b5958a5b44e6e5fb15ecb694c5bc41e54c0d04a72d36efdb40de4ed1903779d4c3a8226ba7fb5ae1aac9d98bc7b665d3e</string>
+              <string>427c8c7631dd0a40dcdc1d6230cdc54228d08580ed02aa9ac40b28e0dfd1f9d79fde9a803285e14bbabf2fed082cfd8502cad9f56d9a96df579e5ae68157b548</string>
               <key>hash_algorithm</key>
               <string>blake2b</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/98/packages/generic/colladadom/2.3.0.1705/colladadom-2.3.0-linux64-1705.tar.zst</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/98/packages/generic/colladadom/2.3.0.1769/colladadom-2.3.0-linux64-1769.tar.zst</string>
             </map>
             <key>name</key>
             <string>linux64</string>
@@ -290,11 +290,11 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>cdd00a4d693c1018982e321d01d18da73a67354c6a24ab7cc68d23a1347484b445f3b99c0cd7a990d29af7db1cafa158c91f60c26fa2c476e9855dad22238eef</string>
+              <string>eb467d62914cf31d86ed393ef18304e0bd169f89dabc640a0780b346fc9a00284c5f11ee86adb8cc21b69abef37bc78a3bb7292d8b964d6ad652b3daa6a69ce5</string>
               <key>hash_algorithm</key>
               <string>blake2b</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/98/packages/generic/colladadom/2.3.0.1705/colladadom-2.3.0-windows64-1705.tar.zst</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/98/packages/generic/colladadom/2.3.0.1769/colladadom-2.3.0-windows64-1769.tar.zst</string>
             </map>
             <key>name</key>
             <string>windows64</string>
diff --git a/indra/llappearance/llavatarappearance.h b/indra/llappearance/llavatarappearance.h
index 32a3f263fe10cf381fd5e5b5d5b96ee8255b597f..8540fd526b9eda0d847f14f936259f1bc0791193 100644
--- a/indra/llappearance/llavatarappearance.h
+++ b/indra/llappearance/llavatarappearance.h
@@ -35,7 +35,7 @@
 #include "llviewervisualparam.h"
 #include "llxmltree.h"
 
-#include <absl/container/flat_hash_map.h>
+#include "boost/unordered/unordered_flat_map.hpp"
 
 class LLTexLayerSet;
 class LLTexGlobalColor;
@@ -142,7 +142,7 @@ class LLAvatarAppearance : public LLCharacter
 	LLVector3			mHeadOffset; // current head position
 	LLAvatarJoint		*mRoot;
 
-	typedef absl::flat_hash_map<std::string, LLJoint*> joint_map_t;
+	typedef boost::unordered_flat_map<std::string, LLJoint*> joint_map_t;
 	joint_map_t			mJointMap;
 
     typedef std::map<std::string, LLVector3> joint_state_map_t;
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp
index 314b640e0a2aa04f97cd20e22011465a5eb67a41..49df1c4f1180b3d0e05ee02417c1b581031deb5a 100644
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -1257,23 +1257,23 @@ void LLAudioEngine::logSoundPlay(const LLUUID& id, LLVector3d position, S32 type
 	if (mSoundHistory.size() > 2048)
 		return; // Might clear out oldest entries before giving up?
 
-	LLSoundHistoryItem item;
-	item.mID = id;
-	item.mPosition = position;
-	item.mType = type;
-	item.mAssetID = assetid;
-	item.mOwnerID = ownerid;
-	item.mSourceID = sourceid;
-	item.mPlaying = true;
-	item.mTimeStarted = LLTimer::getElapsedSeconds();
-	item.mTimeStopped = F64_MAX;
-	item.mIsTrigger = is_trigger;
-	item.mIsLooped = is_looped;
+	auto item = std::make_unique<LLSoundHistoryItem>();
+	item->mID = id;
+	item->mPosition = position;
+	item->mType = type;
+	item->mAssetID = assetid;
+	item->mOwnerID = ownerid;
+	item->mSourceID = sourceid;
+	item->mPlaying = true;
+	item->mTimeStarted = LLTimer::getElapsedSeconds();
+	item->mTimeStopped = F64_MAX;
+	item->mIsTrigger = is_trigger;
+	item->mIsLooped = is_looped;
 
-	item.mReviewed = false;
-	item.mReviewedCollision = false;
+	item->mReviewed = false;
+	item->mReviewedCollision = false;
 
-	mSoundHistory.insert_or_assign(id, item);
+	mSoundHistory.insert_or_assign(id, std::move(item));
 }
 
 void LLAudioEngine::logSoundStop(const LLUUID& id)
@@ -1281,7 +1281,7 @@ void LLAudioEngine::logSoundStop(const LLUUID& id)
 	auto iter = mSoundHistory.find(id);
 	if (iter != mSoundHistory.end())
 	{
-		LLSoundHistoryItem& hist_item = iter->second;
+		LLSoundHistoryItem& hist_item = *iter->second;
 		hist_item.mPlaying = false;
 		hist_item.mTimeStopped = LLTimer::getElapsedSeconds();
 		pruneSoundLog();
@@ -1297,13 +1297,13 @@ void LLAudioEngine::pruneSoundLog()
 		{
 			auto iter = mSoundHistory.begin();
 			auto end = mSoundHistory.end();
-			U64 lowest_time = (*iter).second.mTimeStopped;
+			U64 lowest_time = (*iter).second->mTimeStopped;
 			LLUUID lowest_id = (*iter).first;
 			for (; iter != end; ++iter)
 			{
-				if ((*iter).second.mTimeStopped < lowest_time)
+				if ((*iter).second->mTimeStopped < lowest_time)
 				{
-					lowest_time = (*iter).second.mTimeStopped;
+					lowest_time = (*iter).second->mTimeStopped;
 					lowest_id = (*iter).first;
 				}
 			}
diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h
index 95cc3870d764221dc3992065d5095b8d083e38df..5ced89ccfaa16b3cd6250689f409df7c0ec89401 100644
--- a/indra/llaudio/llaudioengine.h
+++ b/indra/llaudio/llaudioengine.h
@@ -40,8 +40,7 @@
 #include "llextendedstatus.h"
 
 #include "lllistener.h"
-#include "absl/container/node_hash_map.h"
-#include "absl/container/flat_hash_map.h"
+#include "boost/unordered/unordered_flat_map.hpp"
 
 const F32 LL_WIND_UPDATE_INTERVAL = 0.1f;
 const F32 LL_WIND_UNDERWATER_CENTER_FREQ = 20.f;
@@ -222,8 +221,8 @@ class LLAudioEngine
 	// A list of all audio sources that are known to the viewer at this time.
 	// This is most likely a superset of the ones that we actually have audio
 	// data for, or are playing back.
-	typedef absl::flat_hash_map<LLUUID, LLAudioSource *> source_map;
-	typedef absl::flat_hash_map<LLUUID, LLAudioData *> data_map;
+	typedef boost::unordered_flat_map<LLUUID, LLAudioSource *> source_map;
+	typedef boost::unordered_flat_map<LLUUID, LLAudioData *> data_map;
 
 	source_map mAllSources;
 	data_map mAllData;
@@ -251,7 +250,7 @@ class LLAudioEngine
 private:
 	S32 mSoundHistoryPruneCounter = 0;
 
-	using sound_history_map = absl::node_hash_map<LLUUID, LLSoundHistoryItem>;
+	using sound_history_map = boost::unordered_flat_map<LLUUID, std::unique_ptr<LLSoundHistoryItem>>;
 	sound_history_map mSoundHistory;
 private:
 	void setDefaults();
@@ -362,7 +361,7 @@ class LLAudioSource
 	LLAudioData		*mCurrentDatap;
 	LLAudioData		*mQueuedDatap;
 
-	typedef absl::flat_hash_map<LLUUID, LLAudioData *> data_map;
+	typedef boost::unordered_flat_map<LLUUID, LLAudioData *> data_map;
 	data_map mPreloadMap;
 
 	LLFrameTimer mAgeTimer;
diff --git a/indra/llcharacter/llanimationstates.h b/indra/llcharacter/llanimationstates.h
index 244f811bf52d608aa7dcbe7805afea4aa30eb04e..69e7316467a6c52aa223a7224fcacdb2cf376740 100644
--- a/indra/llcharacter/llanimationstates.h
+++ b/indra/llcharacter/llanimationstates.h
@@ -28,7 +28,7 @@
 #define LL_LLANIMATIONSTATES_H
 
 #include <map>
-#include <absl/container/flat_hash_map.h>
+#include "boost/unordered/unordered_flat_map.hpp"
 
 #include "llstringtable.h"
 #include "lluuid.h"
@@ -204,7 +204,7 @@ class LLAnimationLibrary
 private:
 	LLStringTable mAnimStringTable;
 
-	typedef absl::flat_hash_map<LLUUID, char *> anim_map_t;
+	typedef boost::unordered_flat_map<LLUUID, char *> anim_map_t;
 	anim_map_t mAnimMap;
 
 public:
diff --git a/indra/llcommon/lluuid.h b/indra/llcommon/lluuid.h
index 78c4bd52c670fe65b65bdcafd068a96628461f63..c11e31127c807b9d5ad88dbdd1e1ab2b40726ae9 100644
--- a/indra/llcommon/lluuid.h
+++ b/indra/llcommon/lluuid.h
@@ -193,9 +193,9 @@ class LL_COMMON_API LLUUID
 	// END BOOST
 
 
-	inline size_t hash() const
+	friend std::size_t hash_value(LLUUID const& id)
 	{
-		return absl::Hash<LLUUID>{}(*this);
+		return boost::hash_range(id.mData, id.mData + UUID_BYTES);
 	}
 
 	template <typename H>
@@ -301,18 +301,7 @@ namespace std {
 	{
 		size_t operator()(const LLUUID & id) const
 		{
-			return id.hash();
-		}
-	};
-}
-
-namespace boost 
-{
-	template <> struct hash<LLUUID>
-	{
-		size_t operator()(const LLUUID& id) const
-		{
-			return id.hash();
+			return boost::hash_range(id.mData, id.mData + UUID_BYTES);
 		}
 	};
 }
diff --git a/indra/newview/alfloaterexploresounds.cpp b/indra/newview/alfloaterexploresounds.cpp
index cde36f30637914e7bfe2ee2885d2fe67f482402d..0a9ff9eb107f1dd052e06d609f7a6137cd4863e4 100644
--- a/indra/newview/alfloaterexploresounds.cpp
+++ b/indra/newview/alfloaterexploresounds.cpp
@@ -113,7 +113,7 @@ LLSoundHistoryItem ALFloaterExploreSounds::getItem(const LLUUID& itemID)
 	auto found = sound_log.find(itemID);
 	if (found != sound_log.end())
 	{
-		return found->second;
+		return *found->second;
 	}
 	else
 	{
@@ -187,7 +187,7 @@ BOOL ALFloaterExploreSounds::tick()
 		{
 			for (const auto& sound_pair : gAudiop->getSoundLog())
 			{
-				history.push_back(sound_pair.second);
+				history.push_back(*sound_pair.second);
 			}
 			LLSoundHistoryItemCompare c;
 			history.sort(c);
@@ -442,8 +442,8 @@ void ALFloaterExploreSounds::handleStop()
 				auto iter = sound_log.find(item.mID);
 				if (iter != sound_log.end())
 				{
-					iter->second.mPlaying = false;
-					iter->second.mTimeStopped = LLTimer::getElapsedSeconds();
+					iter->second->mPlaying = false;
+					iter->second->mTimeStopped = LLTimer::getElapsedSeconds();
 				}
 				else
 				{
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index e8015100ba92fbd898a1e9223613f2f339ab886e..f48797b9190989f079fd8691c4cad9dfe6bdb66d 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -41,7 +41,8 @@
 #include "httphandler.h"
 #include "llthread.h"
 
-#include "absl/container/node_hash_map.h"
+#include "boost/unordered/unordered_map.hpp"
+#include "boost/unordered/unordered_flat_map.hpp"
 
 #define LLCONVEXDECOMPINTER_STATIC 1
 
@@ -212,7 +213,7 @@ class LLMeshRepoThread final : public LLThread
 	LLCondition* mSignal;
 
 	//map of known mesh headers
-	typedef absl::node_hash_map<LLUUID, std::pair<U32, LLSD>> mesh_header_map;
+	typedef boost::unordered_flat_map<LLUUID, std::pair<U32, LLSD>> mesh_header_map;
 	mesh_header_map mMeshHeader;
 
 	class HeaderRequest : public RequestStats
@@ -323,7 +324,7 @@ class LLMeshRepoThread final : public LLThread
 	// End
 
 	//map of pending header requests and currently desired LODs
-	typedef absl::node_hash_map<LLUUID, std::vector<S32>> pending_lod_map;
+	typedef boost::unordered_map<LLUUID, std::vector<S32>> pending_lod_map;
 	pending_lod_map mPendingLOD;
 
 	// llcorehttp library interface objects.
@@ -632,10 +633,10 @@ class LLMeshRepository
 	static void metricsProgress(unsigned int count);
 	static void metricsUpdate();
 	
-	typedef absl::node_hash_map<LLUUID, std::vector<LLVOVolume*> > mesh_load_map;
+	typedef boost::unordered_map<LLUUID, std::vector<LLVOVolume*> > mesh_load_map;
 	mesh_load_map mLoadingMeshes[4];
 	
-	typedef absl::flat_hash_map<LLUUID, LLPointer<LLMeshSkinInfo>> skin_map;
+	typedef boost::unordered_flat_map<LLUUID, LLPointer<LLMeshSkinInfo>> skin_map;
 	skin_map mSkinMap;
 
 	typedef std::map<LLUUID, LLModel::Decomposition*> decomposition_map;
@@ -646,7 +647,7 @@ class LLMeshRepository
 	std::vector<LLMeshRepoThread::LODRequest> mPendingRequests;
 	
 	//list of mesh ids awaiting skin info
-	typedef absl::node_hash_map<LLUUID, std::vector<LLVOVolume*> > skin_load_map;
+	typedef boost::unordered_map<LLUUID, std::vector<LLVOVolume*> > skin_load_map;
 	skin_load_map mLoadingSkins;
 
 	//list of mesh ids that need to send skin info fetch requests