diff --git a/autobuild.xml b/autobuild.xml
index 1554adb98a5090fd50046a4d957fa67f609587fe..655dd86b43c4e8c68ff786919577873bfb765731 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -63,68 +63,6 @@
         <key>version</key>
         <string>2.26.1</string>
       </map>
-      <key>abseil-cpp</key>
-      <map>
-        <key>canonical_repo</key>
-        <string>https://git.alchemyviewer.org/alchemy/thirdparty/3p-abseil-cpp</string>
-        <key>copyright</key>
-        <string>Copyright 2018 The Abseil Authors.</string>
-        <key>description</key>
-        <string>Abseil is an open-source collection of C++ code designed to augment the C++ standard library.</string>
-        <key>license</key>
-        <string>Apache 2.0</string>
-        <key>license_file</key>
-        <string>LICENSES/abseil-cpp.txt</string>
-        <key>name</key>
-        <string>abseil-cpp</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin64</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>e9d6e89117a043b7b661889eaaf73eead9b2e172c0b193c7d0a1a09f66e6036acb827263458dff52c40e2777951066f47e8872bae248c5d69e07a1b1b9dec70c</string>
-              <key>hash_algorithm</key>
-              <string>blake2b</string>
-              <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/163/packages/generic/abseil-cpp/522606b.1690/abseil_cpp-522606b-darwin64-1690.tar.zst</string>
-            </map>
-            <key>name</key>
-            <string>darwin64</string>
-          </map>
-          <key>linux64</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>d45b909319a60627b89c70ee70d6883715e11cba39b78ce641e8b85b86f8f30d62083d0652c3083bdb15afcc10522b3b9f47e273ab46b6f0e06ae305fb2ab7e2</string>
-              <key>hash_algorithm</key>
-              <string>blake2b</string>
-              <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/163/packages/generic/abseil-cpp/522606b.1690/abseil_cpp-522606b-linux64-1690.tar.zst</string>
-            </map>
-            <key>name</key>
-            <string>linux64</string>
-          </map>
-          <key>windows64</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>3412d092fed702c2824c742bc4ab9fa3fb574153ac226ca9f4e37d9acc2db6cebb0d8874488eb2849b4782c4f6b4b534570c239e5abe608810a04399246fd566</string>
-              <key>hash_algorithm</key>
-              <string>blake2b</string>
-              <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/163/packages/generic/abseil-cpp/522606b.1690/abseil_cpp-522606b-windows64-1690.tar.zst</string>
-            </map>
-            <key>name</key>
-            <string>windows64</string>
-          </map>
-        </map>
-        <key>version</key>
-        <string>522606b</string>
-      </map>
       <key>apr_suite</key>
       <map>
         <key>copyright</key>
diff --git a/indra/cmake/Abseil.cmake b/indra/cmake/Abseil.cmake
deleted file mode 100644
index b2e14a71aece48446e689c21015afe65a90d654e..0000000000000000000000000000000000000000
--- a/indra/cmake/Abseil.cmake
+++ /dev/null
@@ -1,18 +0,0 @@
-# -*- cmake -*-
-include(Linking)
-include(Prebuilt)
-
-option(USE_BINARY_ABSL "Use binary package for abseil" ON)
-
-if(USE_BINARY_ABSL)
-  if (USESYSTEMLIBS)
-    find_package(absl REQUIRED)
-  else ()
-    use_prebuilt_binary(abseil-cpp)
-    if(CMAKE_BUILD_TYPE STREQUAL "Debug")
-      find_package(absl REQUIRED PATHS "${AUTOBUILD_INSTALL_DIR}/absl/debug" NO_DEFAULT_PATH)
-    else()
-      find_package(absl REQUIRED PATHS "${AUTOBUILD_INSTALL_DIR}/absl/release" NO_DEFAULT_PATH) 
-    endif()
-  endif ()
-endif()
\ No newline at end of file
diff --git a/indra/cmake/LLFileSystem.cmake b/indra/cmake/LLFileSystem.cmake
index 73137bffa5ad996c5a5cf98b0e146b8561c1c1f4..5b50a10d5b3ef53bd3c5d09323253f0f78930aab 100644
--- a/indra/cmake/LLFileSystem.cmake
+++ b/indra/cmake/LLFileSystem.cmake
@@ -1,5 +1,4 @@
 # -*- cmake -*-
-include(Abseil)
 include(Boost)
 
 set(LLFILESYSTEM_INCLUDE_DIRS
diff --git a/indra/deps/CMakeLists.txt b/indra/deps/CMakeLists.txt
index 54fdfbc6832fef12dceee4f4ec5d7f39e392cee1..e863e43df724e8b6da9caf172a3afad8a4f68414 100644
--- a/indra/deps/CMakeLists.txt
+++ b/indra/deps/CMakeLists.txt
@@ -2,7 +2,6 @@ project(deps)
 
 include(00-Common)
 include(FetchContent)
-include(Abseil)
 
 set(CMAKE_FOLDER "Third Party")
 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
@@ -51,37 +50,6 @@ FetchContent_Declare(
   GIT_TAG        v3.11.2
   )
 
-if(NOT USE_BINARY_ABSL)
-  FetchContent_Declare(
-    absl
-    GIT_REPOSITORY https://git.alchemyviewer.org/alchemy/mirrors/abseil-cpp.git
-    GIT_TAG        522606b7fae37836c138e83f6eec0eabb9947dc0
-    )
-
-  # This is a hack because absl has dumb cmake
-  set(OLD_BUILD_TEST ${BUILD_TESTING})
-  set(BUILD_TESTING OFF)
-  FetchContent_MakeAvailable(absl)
-  set(BUILD_TESTING ${OLD_BUILD_TEST})
-
-  # Supress warnings inside abseil under MSVC
-  if(WINDOWS)
-    target_compile_options(absl_strings PRIVATE /wd4018)
-    target_compile_options(absl_str_format_internal PRIVATE /wd4018)
-    target_compile_options(absl_flags_usage_internal PRIVATE /wd4018)
-    target_compile_options(absl_random_internal_distribution_test_util PRIVATE /wd4723)
-  elseif(LINUX) 
-    target_compile_options(absl_flags PRIVATE -Wno-non-virtual-dtor)
-    target_compile_options(absl_flags_commandlineflag PRIVATE -Wno-non-virtual-dtor)
-    target_compile_options(absl_flags_internal PRIVATE -Wno-non-virtual-dtor)
-    target_compile_options(absl_flags_parse PRIVATE -Wno-non-virtual-dtor)
-    target_compile_options(absl_flags_private_handle_accessor PRIVATE -Wno-non-virtual-dtor)
-    target_compile_options(absl_flags_reflection PRIVATE -Wno-non-virtual-dtor)
-    target_compile_options(absl_flags_usage PRIVATE -Wno-non-virtual-dtor)
-    target_compile_options(absl_flags_usage_internal PRIVATE -Wno-non-virtual-dtor)
-  endif()
-endif()
-
 # #Download the rest of the libraries
 FetchContent_MakeAvailable(fmt)
 
diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h
index 5ced89ccfaa16b3cd6250689f409df7c0ec89401..f6c09bfe76aa4b78e0678908219538f6781459bb 100644
--- a/indra/llaudio/llaudioengine.h
+++ b/indra/llaudio/llaudioengine.h
@@ -28,6 +28,7 @@
 #ifndef LL_AUDIOENGINE_H
 #define LL_AUDIOENGINE_H
 
+#include <array>
 #include <list>
 #include <map>
 
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 12de18fba77bb4da3228cc3ff0d91ea4e571f2ed..3157d4a1c7979b99a54ed3ff47b6fbb5825509d4 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -6,7 +6,6 @@ include(00-Common)
 include(LLCommon)
 include(LLMath)
 include(Linking)
-include(Abseil)
 include(Boost)
 include(Sentry)
 include(LLSharedLibs)
@@ -312,8 +311,6 @@ target_link_libraries(
     ${BOOST_SYSTEM_LIBRARY}
     ${GOOGLE_PERFTOOLS_LIBRARIES}
     ${URIPARSER_LIBRARIES}
-    absl::flat_hash_map
-    absl::node_hash_map
     nlohmann_json::nlohmann_json
     fmt::fmt
     ${TRACY_LIBRARY}
diff --git a/indra/llcommon/lluuid.h b/indra/llcommon/lluuid.h
index a7a8f6b47ae1b1a63e2e094d831e344c8b2d2298..8d62e4303611939669b8f3906b63f3c2d5753aca 100644
--- a/indra/llcommon/lluuid.h
+++ b/indra/llcommon/lluuid.h
@@ -35,8 +35,6 @@
 #include "llpreprocessor.h"
 #include <immintrin.h>
 
-#include "absl/hash/hash.h"
-
 class LLMutex;
 
 static constexpr S32 UUID_BYTES = 16;
@@ -197,11 +195,6 @@ class LL_COMMON_API LLUUID
 		return boost::hash_range(id.mData, id.mData + UUID_BYTES);
 	}
 
-	template <typename H>
-	friend H AbslHashValue(H h, const LLUUID& id) {
-		return H::combine_contiguous(std::move(h), id.mData, UUID_BYTES);
-	}
-
 	// xor functions. Useful since any two random uuids xored together
 	// will yield a determinate third random unique id that can be
 	// used as a key in a single uuid that represents 2.
diff --git a/indra/llfilesystem/CMakeLists.txt b/indra/llfilesystem/CMakeLists.txt
index 9ec643ff169a4e7676b20c462c2c4664839d9bb3..2b67f8cee1444312a16cfc23bf4126a85eec0d9a 100644
--- a/indra/llfilesystem/CMakeLists.txt
+++ b/indra/llfilesystem/CMakeLists.txt
@@ -4,7 +4,6 @@ project(llfilesystem)
 
 include(00-Common)
 include(LLCommon)
-include(Abseil)
 include(UnixInstall)
 
 include_directories(
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index 1182d3be814f14aab55b8c5717d19c8f37767919..ec1180bef2089eef46dc48632eecdf8af7dc8a29 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -43,6 +43,8 @@
 
 #include <boost/preprocessor.hpp>
 
+#include <array>
+
 //..................................................................................
 //..................................................................................
 // Helper macrose's for generate cycle unwrap templates
diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt
index e91c322747106bd97fa4cbf5f5b478d24b0bc680..dac96a655d12af815e427052b8cf4c1cd9fc262b 100644
--- a/indra/llmessage/CMakeLists.txt
+++ b/indra/llmessage/CMakeLists.txt
@@ -3,7 +3,6 @@
 project(llmessage)
 
 include(00-Common)
-include(Abseil)
 include(CURL)
 include(OpenSSL)
 include(NGHTTP2)
diff --git a/indra/llmessage/message.h b/indra/llmessage/message.h
index ad08f41532de25c48ee865d8466a70d427f2fa80..a4fda4e2527456ba149f20420c221a4755247ad9 100644
--- a/indra/llmessage/message.h
+++ b/indra/llmessage/message.h
@@ -27,6 +27,7 @@
 #ifndef LL_MESSAGE_H
 #define LL_MESSAGE_H
 
+#include <array>
 #include <cstring>
 #include <set>
 
diff --git a/indra/llprimitive/llmaterialid.h b/indra/llprimitive/llmaterialid.h
index dc790db8f618b2bb82daf03f2585a41617155529..e90deea7c319202ba5f0a9cb209d600a0af6c67d 100644
--- a/indra/llprimitive/llmaterialid.h
+++ b/indra/llprimitive/llmaterialid.h
@@ -144,11 +144,6 @@ class LLMaterialID
 	}
 // END BOOST
 
-	template <typename H>
-	friend H AbslHashValue(H h, const LLMaterialID& id) {
-		return H::combine_contiguous(std::move(h), id.mID, MATERIAL_ID_SIZE);
-	}
-
 	const U8*     get() const;
 	void          set(const void* pMemory);
 	void          clear();
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 7a3696c48c0ece58d0c63574b49fbb73a8f0e21c..1e305f829a7e58092c964f1101a37941ed172821 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -26,6 +26,8 @@
 
 #include "linden_common.h"
 
+#include <array>
+
 #include "llmodel.h"
 #include "llmemory.h"
 #include "llconvexdecomposition.h"
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index cfc87d3fa8db5bd5e2edc222049748585e971822..b9bd35edb242cc3c56aa5c9a5f0a7343de26b606 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -3,7 +3,6 @@
 project(llui)
 
 include(00-Common)
-include(Abseil)
 include(Hunspell)
 include(LLCommon)
 include(LLImage)
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 8ccfb9a5853205d63c8f20236f083cd79d7f7af3..2a3ad5783fb06f9d86057fc9b2cc961b2c32307c 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -7,7 +7,6 @@ include(00-Common)
 # sets variables on which the 3p .cmake files depend.
 include(Linking)
 
-include(Abseil)
 include(Boost)
 include(BuildPackagesInfo)
 include(BuildVersion)
@@ -2227,9 +2226,6 @@ target_link_libraries(${VIEWER_BINARY_NAME}
     ${TRACY_LIBRARY}
     ${MINIZIP_LIBRARIES}
     ${DISCORD_LIBRARIES}
-    absl::flat_hash_map
-    absl::node_hash_map
-    absl::strings
     meshoptimizer
     nlohmann_json::nlohmann_json
     fmt::fmt
diff --git a/indra/newview/alaoset.h b/indra/newview/alaoset.h
index c88b2385f5457650326ca77b1574f95cfa2fc221..5d40068bc9b19fda3c87d6e29f0c3595352111fa 100644
--- a/indra/newview/alaoset.h
+++ b/indra/newview/alaoset.h
@@ -27,6 +27,7 @@
 #ifndef AL_AOSET_H
 #define AL_AOSET_H
 
+#include <array>
 #include <utility>
 #include "lleventtimer.h"
 
diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h
index ec3a97c634d3e9cf2edbee4bb8348d24091561b6..f1c6aced5ccc21010dac1e532f4bdea833c6186e 100644
--- a/indra/newview/llavatariconctrl.h
+++ b/indra/newview/llavatariconctrl.h
@@ -58,7 +58,7 @@ class LLAvatarIconIDCache final : public LLSingleton<LLAvatarIconIDCache>
 	
 
 	std::string	mFilename;
-	absl::flat_hash_map<LLUUID,LLAvatarIconIDCacheItem> mCache;//we cache only LLUID and time
+	boost::unordered_flat_map<LLUUID,LLAvatarIconIDCacheItem> mCache;//we cache only LLUID and time
 };
 
 inline
diff --git a/indra/newview/llcallingcard.h b/indra/newview/llcallingcard.h
index 48012f179bba59a3bc365765a28f109cec692cc7..1cc7b26cf02076e91b1aecfc624b29ea31301250 100644
--- a/indra/newview/llcallingcard.h
+++ b/indra/newview/llcallingcard.h
@@ -32,7 +32,7 @@
 #include <string>
 #include <vector>
 
-#include "absl/container/flat_hash_map.h"
+#include "boost/unordered/unordered_flat_map.hpp"
 
 #include "lluserrelations.h"
 #include "lluuid.h"
@@ -111,7 +111,7 @@ class LLAvatarTracker
 
 	// add or remove agents from buddy list. Each method takes a set
 	// of buddies and returns how many were actually added or removed.
-	typedef absl::flat_hash_map<LLUUID, LLRelationship*> buddy_map_t;
+	typedef boost::unordered_flat_map<LLUUID, LLRelationship*> buddy_map_t;
 
 	S32 addBuddyList(const buddy_map_t& buddies);
 	//S32 removeBuddyList(const buddy_list_t& exes);
diff --git a/indra/newview/llenvironment.h b/indra/newview/llenvironment.h
index 56ba5c6d92d357e17b7a574e42f2d5f5aa4037de..1033c649b233f4363ebf6dd37befa2c48d7721aa 100644
--- a/indra/newview/llenvironment.h
+++ b/indra/newview/llenvironment.h
@@ -27,6 +27,8 @@
 #ifndef LL_ENVIRONMENT_H
 #define LL_ENVIRONMENT_H
 
+#include <array>
+
 #include "llsingleton.h"
 #include "llmemory.h"
 #include "llsd.h"
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
index ded1bdd6c9c9aa483e15965bd59e8fe5248c9c59..d7af1ede37bbef242a5e60f0a09ffff0223a03cb 100644
--- a/indra/newview/llfloaterimcontainer.h
+++ b/indra/newview/llfloaterimcontainer.h
@@ -124,7 +124,7 @@ class LLFloaterIMContainer final
 
 
 private:
-	typedef absl::flat_hash_map<LLUUID,LLFloater*> avatarID_panel_map_t;
+	typedef boost::unordered_flat_map<LLUUID,LLFloater*> avatarID_panel_map_t;
 	avatarID_panel_map_t mSessions;
 	boost::signals2::connection mNewMessageConnection;
 
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index e2ccd6714aa280b674e6e3a804b98cf86e832599..f78ae6834f7374eeee5d0e6b9b7fbbf5dda76dc2 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -77,7 +77,7 @@ class LLGroupMemberData
 friend class LLGroupMgrGroupData;
 
 public:
-	typedef absl::flat_hash_map<LLUUID, LLGroupRoleData*> role_list_t;
+	typedef boost::unordered_flat_map<LLUUID, LLGroupRoleData*> role_list_t;
 	
 	LLGroupMemberData(const LLUUID& id, 
 						S32 contribution,
@@ -273,7 +273,7 @@ friend class LLGroupMgr;
 	void banMemberById(const LLUUID& participant_uuid);
 	
 public:
-	typedef	absl::flat_hash_map<LLUUID, LLGroupMemberData*> member_list_t;
+	typedef	boost::unordered_flat_map<LLUUID, LLGroupMemberData*> member_list_t;
 	typedef	std::map<LLUUID,LLGroupRoleData*> role_list_t;
 	typedef std::map<lluuid_pair,LLRoleMemberChange,lluuid_pair_less> change_map_t;
 	typedef std::map<LLUUID,LLRoleData> role_data_map_t;
@@ -448,11 +448,11 @@ class LLGroupMgr final : public LLSingleton<LLGroupMgr>
 	typedef std::multimap<LLUUID,LLGroupMgrObserver*> observer_multimap_t;
 	observer_multimap_t mObservers;
 
-	typedef absl::flat_hash_map<LLUUID, LLGroupMgrGroupData*> group_map_t;
+	typedef boost::unordered_flat_map<LLUUID, LLGroupMgrGroupData*> group_map_t;
 	group_map_t mGroups;
 
 	const U64MicrosecondsImplicit MIN_GROUP_PROPERTY_REQUEST_FREQ = 100000;//100ms between requests should be enough to avoid spamming.
-	typedef absl::flat_hash_map<LLUUID, U64MicrosecondsImplicit> properties_request_map_t;
+	typedef boost::unordered_flat_map<LLUUID, U64MicrosecondsImplicit> properties_request_map_t;
 	properties_request_map_t mPropRequests;
 
 	typedef std::set<LLParticularGroupObserver*> observer_set_t;
diff --git a/indra/newview/llgroupoptions.h b/indra/newview/llgroupoptions.h
index c8953b980c8feb9ddd82030c682b7c622e2a7b64..ff324778a82256edcf10b4465d0fde69b0553ce7 100644
--- a/indra/newview/llgroupoptions.h
+++ b/indra/newview/llgroupoptions.h
@@ -17,7 +17,7 @@
 #ifndef LL_LLGROUPOPTIONS_H
 #define LL_LLGROUPOPTIONS_H
 
-#include "absl/container/flat_hash_map.h"
+#include "boost/unordered/unordered_flat_map.hpp"
 
 #include "llsd.h"
 #include "llsingleton.h"
@@ -67,7 +67,7 @@ class LLGroupOptionsMgr final : public LLSingleton<LLGroupOptionsMgr>
 	/*
 	 * Member variables
 	 */
-	typedef absl::flat_hash_map<LLUUID, std::unique_ptr<LLGroupOptions>> options_map_t;
+	typedef boost::unordered_flat_map<LLUUID, std::unique_ptr<LLGroupOptions>> options_map_t;
 	options_map_t mGroupOptions;
 };
 
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index a415caf6c03134f1cb7997df24fd7ff7bcb168e0..20b30ce57edc8916f47e375fbc6a39a6ac5bb302 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -170,7 +170,7 @@ class LLIMModel final :  public LLSingleton<LLIMModel>
 
 
 	/** Session id to session object */
-	absl::flat_hash_map<LLUUID, LLIMSession*> mId2SessionMap;
+	boost::unordered_flat_map<LLUUID, LLIMSession*> mId2SessionMap;
 
 	typedef boost::signals2::signal<void(const LLSD&)> session_signal_t;
 	session_signal_t mNewMsgSignal;
@@ -521,7 +521,7 @@ class LLIMMgr final : public LLSingleton<LLIMMgr>
 	LLSD mPendingAgentListUpdates;
 
 // [SL:KB] - Patch: Chat-GroupSnooze | Checked: Catznip-3.3
-	typedef absl::flat_hash_map<LLUUID, F64> snoozed_sessions_t;
+	typedef boost::unordered_flat_map<LLUUID, F64> snoozed_sessions_t;
 	snoozed_sessions_t mSnoozedSessions;
 // [/SL:KB]
 };
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 409fb330a054d88e8154d1f5a5267c9ec03e9fe2..dfab29e470aec75a7dd2def35ffa47b4cb80ed4d 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -2435,7 +2435,7 @@ std::string LLFolderBridge::getLabelSuffix() const
         {
 			static LLUIString ITEM_COUNT_STR = LLTrans::getString("InventoryItemsCount");
 			ITEM_COUNT_STR.setArg("[ITEMS_COUNT]", fmt::to_string(count));
-			suffix = absl::StrCat(" ", ITEM_COUNT_STR.getString());
+			suffix = fmt::format(" {}", ITEM_COUNT_STR.getString());
         }
     }
 
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index 62cef2e60b8a778dcd4adb37dcac245434008484..58319c5e0a66ea99508a97a7fda953cffb575cd0 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -48,8 +48,8 @@
 #include "lleventcoro.h"
 #include "llcoros.h"
 
-#include "absl/container/node_hash_map.h"
-#include "absl/container/flat_hash_map.h"
+#include "boost/unordered/unordered_map.hpp"
+#include "boost/unordered/unordered_flat_map.hpp"
 
 class LLInventoryObserver;
 class LLInventoryObject;
@@ -206,13 +206,13 @@ class LLInventoryModel
 	// the inventory using several different identifiers.
 	// mInventory member data is the 'master' list of inventory, and
 	// mCategoryMap and mItemMap store uuid->object mappings. 
-	typedef absl::flat_hash_map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t;
-	typedef absl::flat_hash_map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t;
+	typedef boost::unordered_flat_map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t;
+	typedef boost::unordered_flat_map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t;
 	cat_map_t mCategoryMap;
 	item_map_t mItemMap;
 	// This last set of indices is used to map parents to children.
-	typedef absl::flat_hash_map<LLUUID, cat_array_t*> parent_cat_map_t;
-	typedef absl::flat_hash_map<LLUUID, item_array_t*> parent_item_map_t;
+	typedef boost::unordered_flat_map<LLUUID, cat_array_t*> parent_cat_map_t;
+	typedef boost::unordered_flat_map<LLUUID, item_array_t*> parent_item_map_t;
 	parent_cat_map_t mParentChildCategoryTree;
 	parent_item_map_t mParentChildItemTree;
 
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index adabb8f05201ec9e134a23250ff14f629a2c246b..b45f0a3f10086096165801d2ea219cfb2f3a43ef 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -39,7 +39,7 @@
 #include "lluictrlfactory.h"
 #include <set>
 
-#include "absl/container/flat_hash_map.h"
+#include "boost/unordered/unordered_flat_map.hpp"
 
 class LLInvFVBridge;
 class LLInventoryFolderViewModelBuilder;
@@ -290,7 +290,7 @@ class LLInventoryPanel : public LLPanel
     LLPointer<LLFolderViewGroupedItemBridge> mGroupedItemBridge;
 	Params						mParams;	// stored copy of parameter block
 
-	absl::flat_hash_map<LLUUID, LLFolderViewItem*> mItemMap;
+	boost::unordered_flat_map<LLUUID, LLFolderViewItem*> mItemMap;
 	/**
 	 * Pointer to LLInventoryFolderViewModelBuilder.
 	 *
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index b3a2f73325a2e74a8f63b91cdb6e3d8e584aa39b..32caf17a405b8224a7737bee804acb6f2ce0f49e 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -559,8 +559,11 @@ void LLLogChat::triggerHistorySignal()
 // static
 std::string LLLogChat::oldLogFileName(std::string filename)
 {
-	// get Users log directory and add final OS dependent delimiter
-	std::string directory = absl::StrCat(gDirUtilp->getPerAccountChatLogsDir(), gDirUtilp->getDirDelimiter());
+	// get Users log directory
+	std::string directory = gDirUtilp->getPerAccountChatLogsDir();
+
+	// add final OS dependent delimiter
+	directory += gDirUtilp->getDirDelimiter();
 
 	// lest make sure the file name has no invalid characters before making the pattern
 	filename = cleanFileName(filename);
@@ -579,12 +582,12 @@ std::string LLLogChat::oldLogFileName(std::string filename)
 
 	if (allfiles.size() == 0)  // if no result from date search, return generic filename
 	{
-		scanResult = absl::StrCat(directory, filename, ".", LL_TRANSCRIPT_FILE_EXTENSION);
+		scanResult = directory + filename + '.' + LL_TRANSCRIPT_FILE_EXTENSION;
 	}
 	else 
 	{
 		sort(allfiles.begin(), allfiles.end());
-		scanResult = absl::StrCat(directory, allfiles.back());
+		scanResult = directory + allfiles.back();
 		// this file is now the most recent version of the file.
 	}
 
@@ -624,7 +627,7 @@ void LLLogChat::getListOfTranscriptFiles(std::vector<std::string>& list_of_trans
 void LLLogChat::getListOfTranscriptBackupFiles(std::vector<std::string>& list_of_transcriptions)
 {
 	// create search pattern
-	std::string pattern = absl::StrCat("*.", LL_TRANSCRIPT_FILE_EXTENSION, ".backup*");
+	std::string pattern = "*." + LL_TRANSCRIPT_FILE_EXTENSION + ".backup*";
 	findTranscriptFiles(pattern, list_of_transcriptions);
 }
 
@@ -657,7 +660,7 @@ bool LLLogChat::moveTranscripts(const std::string originDirectory,
 		//The target directory contains that file already, so lets store it
 		if(LLFile::isfile(newFullPath))
 		{
-			backupFileName = absl::StrCat(newFullPath, ".backup");
+			backupFileName = newFullPath + ".backup";
 
 			//If needed store backup file as .backup1 etc.
 			while(LLFile::isfile(backupFileName))
@@ -720,7 +723,7 @@ void LLLogChat::deleteTranscripts()
 	getListOfTranscriptFiles(list_of_transcriptions);
 	getListOfTranscriptBackupFiles(list_of_transcriptions);
 
-	for (const std::string& fullpath : list_of_transcriptions)
+	for(const std::string& fullpath : list_of_transcriptions)
 	{
 		S32 retry_count = 0;
 		while (retry_count < 5)
diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h
index bb619f3041c837db27403043a7426c48417e072a..f0fad3857513ade3c9ba0fd5f8fffa00cf4aecbc 100644
--- a/indra/newview/llmaterialmgr.h
+++ b/indra/newview/llmaterialmgr.h
@@ -33,9 +33,9 @@
 #include "httprequest.h"
 #include "httpheaders.h"
 #include "httpoptions.h"
-#include "absl/container/flat_hash_map.h"
-#include "absl/container/node_hash_map.h"
-#include "absl/container/flat_hash_set.h"
+#include "boost/unordered/unordered_map.hpp"
+#include "boost/unordered/unordered_flat_map.hpp"
+#include "boost/unordered/unordered_flat_set.hpp"
 
 class LLViewerRegion;
 
@@ -45,7 +45,7 @@ class LLMaterialMgr final : public LLSingleton<LLMaterialMgr>
 	virtual ~LLMaterialMgr();
 
 public:
-	typedef absl::node_hash_map<LLMaterialID, LLMaterialPtr> material_map_t;
+	typedef boost::unordered_map<LLMaterialID, LLMaterialPtr> material_map_t;
 
 	typedef boost::signals2::signal<void (const LLMaterialID&, const LLMaterialPtr)> get_callback_t;
 	const LLMaterialPtr         get(const LLUUID& region_id, const LLMaterialID& material_id);
@@ -93,28 +93,31 @@ class LLMaterialMgr final : public LLSingleton<LLMaterialMgr>
 		U32 te;
 		LLMaterialID materialID;
 
-		template <typename H>
-		friend H AbslHashValue(H h, const TEMaterialPair& m) {
-			return H::combine(std::move(h), m.materialID, m.te);
+		friend std::size_t hash_value(TEMaterialPair const& id)
+		{
+			std::size_t seed = 0;
+			boost::hash_combine(seed, id.te);
+			boost::hash_combine(seed, id.materialID);
+			return seed;
 		}
 
-		bool operator==(const TEMaterialPair& b) const { return (materialID == b.materialID) && (te == b.te); }
+		bool operator==(const TEMaterialPair& b) const { return (te == b.te) && (materialID == b.materialID); }
 		bool operator<(const TEMaterialPair& b) const { return (te < b.te) ? TRUE : (materialID < b.materialID);}
 	};
 	
-	typedef absl::flat_hash_set<LLMaterialID> material_queue_t;
-	typedef absl::flat_hash_map<LLUUID, material_queue_t> get_queue_t;
+	typedef boost::unordered_flat_set<LLMaterialID> material_queue_t;
+	typedef boost::unordered_flat_map<LLUUID, material_queue_t> get_queue_t;
 	typedef std::pair<const LLUUID, LLMaterialID> pending_material_t;
-	typedef absl::flat_hash_map<const pending_material_t, F64> get_pending_map_t;
-	typedef absl::flat_hash_map<LLMaterialID, std::unique_ptr<get_callback_t> > get_callback_map_t;
+	typedef boost::unordered_flat_map<const pending_material_t, F64> get_pending_map_t;
+	typedef boost::unordered_flat_map<LLMaterialID, std::unique_ptr<get_callback_t> > get_callback_map_t;
 
 
-	typedef absl::flat_hash_map<TEMaterialPair, std::unique_ptr<get_callback_te_t> > get_callback_te_map_t;
-	typedef absl::flat_hash_set<LLUUID> getall_queue_t;
-	typedef absl::flat_hash_map<LLUUID, F64> getall_pending_map_t;
-	typedef absl::flat_hash_map<LLUUID, std::unique_ptr<getall_callback_t> > getall_callback_map_t;
-	typedef absl::flat_hash_map<U8, LLMaterial> facematerial_map_t;
-	typedef absl::flat_hash_map<LLUUID, facematerial_map_t> put_queue_t;
+	typedef boost::unordered_flat_map<TEMaterialPair, std::unique_ptr<get_callback_te_t> > get_callback_te_map_t;
+	typedef boost::unordered_flat_set<LLUUID> getall_queue_t;
+	typedef boost::unordered_flat_map<LLUUID, F64> getall_pending_map_t;
+	typedef boost::unordered_flat_map<LLUUID, std::unique_ptr<getall_callback_t> > getall_callback_map_t;
+	typedef boost::unordered_flat_map<U8, LLMaterial> facematerial_map_t;
+	typedef boost::unordered_flat_map<LLUUID, facematerial_map_t> put_queue_t;
 
 
 	get_queue_t				mGetQueue;
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index e34c27d7dceb3c8b476df02841320bcda054e229..a8a61170bd60bf28f7c0da190ce6674b02c1a58c 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -1250,7 +1250,7 @@ void LLMeshRepoThread::constructUrl(LLUUID mesh_id, std::string * url, int * leg
 
 		if (!res_url.empty())
 		{
-			absl::StrAppend(&res_url, "/?mesh_id=", mesh_id.asString());
+			res_url += "/?mesh_id=" + mesh_id.asString();
 		}
 		else
 		{
@@ -3941,7 +3941,7 @@ void LLMeshRepository::notifyLoadedMeshes()
 				//calculate "score" for pending requests
 
 				//create score map
-				absl::flat_hash_map<LLUUID, F32> score_map;
+				boost::unordered_flat_map<LLUUID, F32> score_map;
 
 				for (const auto& lod : mLoadingMeshes)
 				{
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index 5a26ce83bc7f29b0714893f4e7a767e3b67f8417..5e479dcc1d8fc4b5adfbe4a6fa12a624650eadf0 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -192,7 +192,7 @@ class LLOutfitGallery : public LLOutfitListBase
 
     LLHandle<LLFloater> mFloaterHandle;
 
-    typedef absl::flat_hash_map<LLUUID, LLOutfitGalleryItem*>      outfit_map_t;
+    typedef boost::unordered_flat_map<LLUUID, LLOutfitGalleryItem*>      outfit_map_t;
     typedef outfit_map_t::value_type                    outfit_map_value_t;
     outfit_map_t                                        mOutfitMap;
     typedef std::map<LLOutfitGalleryItem*, int>         item_num_map_t;
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index 7cc76d5fcdcb96b762e0938239bc956469bb20f0..93a939157d6dd38341ec9b04bfe3a7a7b2eea05d 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -339,7 +339,7 @@ class LLOutfitsList : public LLOutfitListBase
 	typedef wearables_lists_map_t::value_type			wearables_lists_map_value_t;
 	wearables_lists_map_t			mSelectedListsMap;
 
-	typedef	absl::flat_hash_map<LLUUID, LLAccordionCtrlTab*>		outfits_map_t;
+	typedef	boost::unordered_flat_map<LLUUID, LLAccordionCtrlTab*>		outfits_map_t;
 	typedef outfits_map_t::value_type					outfits_map_value_t;
 	outfits_map_t					mOutfitsMap;
 
diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h
index f97029f33ccf80933f08d94bf37a99a6ebc2d2cf..31488ce2b3b0e47ae2c56048ebe6728e835889ce 100644
--- a/indra/newview/llpanelobjectinventory.h
+++ b/indra/newview/llpanelobjectinventory.h
@@ -99,7 +99,7 @@ class LLPanelObjectInventory : public LLPanel, public LLVOInventoryListener
 	BOOL			isSelectionRemovable();
 
 private:
-	absl::flat_hash_map<LLUUID, LLFolderViewItem*> mItemMap;
+	boost::unordered_flat_map<LLUUID, LLFolderViewItem*> mItemMap;
 
 	LLScrollContainer* mScroller;
 	LLFolderView* mFolders;
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index e55acf96c1718311dccef0bcd903793c337b7ee4..7c83bd7b13bc725fc5cef492113a7217cb001093 100644
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -404,14 +404,14 @@ std::string LLSLURL::getSLURLString() const
 		case APP:
 		{
 			std::string app_url;
-			absl::StrAppend(&app_url, LLGridManager::getInstance()->getAppSLURLBase(), "/", mAppCmd);
+			app_url += LLGridManager::getInstance()->getAppSLURLBase() + "/" + mAppCmd;
 			for(const LLSD& entry : mAppPath.array())
 			{
-				absl::StrAppend(&app_url, "/", entry.asString());
+				app_url += "/" + entry.asString();
 			}
 			if(mAppQuery.length() > 0)
 			{
-				absl::StrAppend(&app_url, "?", mAppQuery);
+				app_url += "?" + mAppQuery;
 			}
 			return app_url;
 		}	
diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h
index 34de72df3ea5a9fdb00892e5e2846575c3b3f079..e14110515a218cedf1543af30f21050c1b01d055 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -256,7 +256,7 @@ class LLSpeakerMgr : public LLOldEvents::LLObservable
 	void setSpeakerNotInChannel(LLPointer<LLSpeaker> speackerp);
 	bool removeSpeaker(const LLUUID& speaker_id);
 
-	typedef absl::flat_hash_map<LLUUID, LLPointer<LLSpeaker> > speaker_map_t;
+	typedef boost::unordered_flat_map<LLUUID, LLPointer<LLSpeaker> > speaker_map_t;
 	speaker_map_t		mSpeakers;
 	bool                mSpeakerListUpdated;
     LLTimer             mGetListTime;
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 2aabb6a5c3c7c4fcc160edf6d439d98c79f9e443..ce8082478af9fa09a0f9084b24ade9b8ac1ab462 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -931,8 +931,7 @@ std::string LLTextureCache::getTextureFileName(const LLUUID& id)
 {
 	std::string idstr = id.asString();
 	const std::string& delem = gDirUtilp->getDirDelimiter();
-	std::string filename = absl::StrCat(mTexturesDirName, delem, absl::string_view(&idstr[0], 1), delem, idstr, ".texture");
-	return filename;
+	return fmt::format(FMT_COMPILE("{}{}{}{}{}.texture"), mTexturesDirName, delem, std::string_view(&idstr[0], 1), delem, idstr);
 }
 
 //debug
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index 24b2c0d02fc601031a06e8cf96d0de6a01633220..473450fa7d4bd69fee6651596bc94fb9e610a0cc 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -34,6 +34,8 @@
 
 #include "llworkerthread.h"
 
+#include <boost/unordered/unordered_flat_map.hpp>
+
 class LLImageFormatted;
 class LLTextureCacheWorker;
 class LLImageRaw;
@@ -204,7 +206,7 @@ class LLTextureCache final : public LLWorkerThread
 	// so it needs own pool (not thread safe by itself, relies onto header's mutex)
 	LLVolatileAPRPool*   mHeaderAPRFilePoolp;
 	
-	typedef absl::flat_hash_map<handle_t, LLTextureCacheWorker*> handle_map_t;
+	typedef boost::unordered_flat_map<handle_t, LLTextureCacheWorker*> handle_map_t;
 	handle_map_t mReaders;
 	handle_map_t mWriters;
 
@@ -225,7 +227,7 @@ class LLTextureCache final : public LLWorkerThread
 	EntriesInfo mHeaderEntriesInfo;
 	std::set<S32> mFreeList; // deleted entries
 	std::set<LLUUID> mLRU;
-	typedef absl::flat_hash_map<LLUUID, S32> id_map_t;
+	typedef boost::unordered_flat_map<LLUUID, S32> id_map_t;
 	id_map_t mHeaderIDMap;
 
 	LLAPRFile*   mFastCachep;
@@ -234,12 +236,12 @@ class LLTextureCache final : public LLWorkerThread
 
 	// BODIES (TEXTURES minus headers)
 	std::string mTexturesDirName;
-	typedef absl::flat_hash_map<LLUUID,S32> size_map_t;
+	typedef boost::unordered_flat_map<LLUUID,S32> size_map_t;
 	size_map_t mTexturesSizeMap;
 	S64 mTexturesSizeTotal;
 	LLAtomicBool mDoPurge;
 
-	typedef absl::flat_hash_map<S32, Entry> idx_entry_map_t;
+	typedef boost::unordered_flat_map<S32, Entry> idx_entry_map_t;
 	idx_entry_map_t mUpdatedEntryMap;
 	typedef std::vector<std::pair<S32, Entry> > idx_entry_vector_t;
 	idx_entry_vector_t mPurgeEntryList;
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 34bbf381d7ab2d1fc79ca0d71c1adf6144d35dfc..ff32630033e061f18bba0e10bae87fa2b24b1443 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -1373,7 +1373,8 @@ bool LLTextureFetchWorker::doWork(S32 param)
 					{
 						LL_WARNS(LOG_TXT) << "trying to seek a non-default texture on the sim. Bad!" << LL_ENDL;
 					}
-					absl::StrAppend(&http_url, "/?texture_id=", mID.asString());
+					http_url += "/?texture_id=";
+					http_url += mID.asString();
 					setUrl(std::move(http_url));
 #ifdef SHOW_DEBUG
 					LL_DEBUGS(LOG_TXT) << "Texture URL: " << mUrl << LL_ENDL;
@@ -4214,7 +4215,7 @@ S32 LLTextureFetchDebugger::fillCurlQueue()
 		{
 			continue;
 		}
-		std::string texture_url = absl::StrCat(mHTTPUrl, "/?texture_id=", mFetchingHistory[i].mID.asString());
+		std::string texture_url = fmt::format(FMT_COMPILE("{}/?texture_id={}"), mHTTPUrl, mFetchingHistory[i].mID.asString());
 		S32 requestedSize = mFetchingHistory[i].mRequestedSize;
 		// We request the whole file if the size was not set.
 		requestedSize = llmax(0,requestedSize);
@@ -4639,7 +4640,7 @@ void LLTextureFetchDebugger::callbackHTTP(FetchEntry & fetch, LLCore::HttpRespon
 			llassert_always(fetch.mFormattedImage.isNull());
 			{
 				// For now, create formatted image based on extension
-				std::string texture_url = absl::StrCat(mHTTPUrl, "/?texture_id=", fetch.mID.asString());
+				std::string texture_url = fmt::format(FMT_COMPILE("{}/?texture_id={}"), mHTTPUrl, fetch.mID.asString());
 				std::string extension = gDirUtilp->getExtension(texture_url);
 				fetch.mFormattedImage = LLImageFormatted::createFromType(LLImageBase::getCodecFromExtension(extension));
 				if (fetch.mFormattedImage.isNull())
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index 3ce1b8729f866c7c7845af622a44399f53cc170c..7ec95b76fa6b294d91cf3de2783329a20b158a6f 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -310,7 +310,7 @@ class LLTextureFetch final : public LLWorkerThread
 	LLImageDecodeThread* mImageDecodeThread;
 	
 	// Map of all requests by UUID
-	typedef absl::flat_hash_map<LLUUID,LLTextureFetchWorker*> map_t;
+	typedef boost::unordered_flat_map<LLUUID,LLTextureFetchWorker*> map_t;
 	map_t mRequestMap;													// Mfq
 
 	// Set of requests that require network data
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index 9a1ce36737618764dd469b65958bdc065df91ff4..6023c53684821a607a84486d36c60c89a53ed56c 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -257,7 +257,8 @@ std::string LLViewerChat::getSenderSLURL(const LLChat& chat, const LLSD& args)
 std::string LLViewerChat::getObjectImSLURL(const LLChat& chat, const LLSD& args)
 {
 	std::string url = LLSLURL("objectim", chat.mFromID, "").getSLURLString();
-	absl::StrAppend(&url, "?name=", chat.mFromName, "&owner=", chat.mOwnerID.asString());
+	url += "?name=" + chat.mFromName;
+	url += "&owner=" + chat.mOwnerID.asString();
 
 	std::string slurl = args["slurl"].asString();
 	if (slurl.empty())
@@ -270,7 +271,7 @@ std::string LLViewerChat::getObjectImSLURL(const LLChat& chat, const LLSD& args)
 		}
 	}
 
-	absl::StrAppend(&url, "&slurl=", LLURI::escape(slurl));
+	url += "&slurl=" + LLURI::escape(slurl);
 
 	return url;
 }
diff --git a/indra/newview/llviewerinput.h b/indra/newview/llviewerinput.h
index 2315f2bf4e4d80afe5701e7b7fadceb8f02966c9..e2383b3b1cf4b3537d11e1635fe1f497bc76cd7d 100644
--- a/indra/newview/llviewerinput.h
+++ b/indra/newview/llviewerinput.h
@@ -30,8 +30,8 @@
 #include "llkeyboard.h" // For EKeystate
 #include "llinitparam.h"
 
-#include "absl/container/flat_hash_set.h"
-#include "absl/container/flat_hash_map.h"
+#include <boost/unordered/unordered_flat_map.hpp>
+#include <boost/unordered/unordered_flat_set.hpp>
 
 const S32 MAX_KEY_BINDINGS = 128; // was 60
 const S32 keybindings_xml_version = 1;
@@ -183,9 +183,9 @@ class LLViewerInput
     std::vector<LLKeyboardBinding>	mGlobalKeyBindings[MODE_COUNT];
     std::vector<LLMouseBinding>		mGlobalMouseBindings[MODE_COUNT];
 
-	typedef absl::flat_hash_map<U32, U32> key_remap_t;
+	typedef boost::unordered_flat_map<U32, U32> key_remap_t;
 	key_remap_t		mRemapKeys[MODE_COUNT];
-	absl::flat_hash_set<KEY>	mKeysSkippedByUI;
+	boost::unordered_flat_set<KEY>	mKeysSkippedByUI;
 	BOOL			mKeyHandledByUI[KEY_COUNT];		// key processed successfully by UI
 
     // This is indentical to what llkeyboard does (mKeyRepeated, mKeyLevel, mKeyDown e t c),
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index b1c72bb986b0db5dc572b511d39cedc7e2488c91..37075fad8c1dad89d95bf4042f04745fbea7485e 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -148,13 +148,13 @@
 #include "rlvlocks.h"
 // [/RLVa:KB]
 
-#include <absl/container/flat_hash_map.h>
+#include <boost/unordered/unordered_flat_map.hpp>
 
 using namespace LLAvatarAppearanceDefines;
 
 typedef LLPointer<LLViewerObject> LLViewerObjectPtr;
 
-static absl::flat_hash_map<std::string, LLStringExplicit> sDefaultItemLabels;
+static boost::unordered_flat_map<std::string, LLStringExplicit> sDefaultItemLabels;
 
 BOOL enable_land_build(void*);
 BOOL enable_object_build(void*);
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index e49f08460d9121b8a6cb6484ed696171d5917c84..d341b66d734be26ef9fcd970e194afc424c556b6 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -37,7 +37,7 @@
 #include "lltrans.h"
 #include "llxmlnode.h"
 
-#include "absl/strings/match.h"
+#include "boost/algorithm/string.hpp"
 
 /// key used to store the grid, and the name attribute in the grid data
 const std::string  GRID_VALUE = "keyname";
@@ -743,7 +743,7 @@ std::string LLGridManager::getGrid(const std::string& grid) const
 		{
 			if (grid_pair.second.has(GRID_ID_VALUE))
 			{
-				if (absl::EqualsIgnoreCase(grid, grid_pair.second[GRID_ID_VALUE].asStringRef()))
+				if (0 == (LLStringUtil::compareInsensitive(grid, grid_pair.second[GRID_ID_VALUE].asStringRef())))
 				{
 					// found a matching label, return this name
 					grid_name = grid_pair.first;
@@ -752,7 +752,7 @@ std::string LLGridManager::getGrid(const std::string& grid) const
 			}
 			if (grid_pair.second.has(GRID_GATEKEEPER))
 			{
-				if (absl::StartsWithIgnoreCase(grid, grid_pair.second[GRID_GATEKEEPER].asStringRef()))
+				if (boost::algorithm::istarts_with(grid, grid_pair.second[GRID_GATEKEEPER].asStringRef()))
 				{
 					// found a matching label, return this name
 					grid_name = grid_pair.first;
@@ -778,7 +778,7 @@ std::string LLGridManager::getGridByProbing(const std::string& grid) const
 		{
 			if (grid_pair.second.has(GRID_ID_VALUE))
 			{
-				if (absl::EqualsIgnoreCase(grid, grid_pair.second[GRID_ID_VALUE].asStringRef()))
+				if (0 == (LLStringUtil::compareInsensitive(grid, grid_pair.second[GRID_ID_VALUE].asStringRef())))
 				{
 					// found a matching label, return this name
 					return grid_pair.first;
@@ -787,7 +787,7 @@ std::string LLGridManager::getGridByProbing(const std::string& grid) const
 			}
 			if (grid_pair.second.has(GRID_GATEKEEPER))
 			{
-				if (absl::StartsWithIgnoreCase(grid, grid_pair.second[GRID_GATEKEEPER].asStringRef()))
+				if (boost::algorithm::istarts_with(grid, grid_pair.second[GRID_GATEKEEPER].asStringRef()))
 				{
 					// found a matching label, return this name
 					return grid_pair.first;
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 631cf0fdf23af84f137795643c1244c6fd522df6..df25750af922f91f1360ccb9adf939a6200d0ec1 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -99,8 +99,8 @@ extern LLPipeline	gPipeline;
 
 // Statics for object lookup tables.
 U32						LLViewerObjectList::sSimulatorMachineIndex = 1; // Not zero deliberately, to speed up index check.
-absl::flat_hash_map<U64, U32>		LLViewerObjectList::sIPAndPortToIndex;
-absl::node_hash_map<U64, LLUUID>	LLViewerObjectList::sIndexAndLocalIDToUUID;
+boost::unordered_flat_map<U64, U32>		LLViewerObjectList::sIPAndPortToIndex;
+boost::unordered_map<U64, LLUUID>		LLViewerObjectList::sIndexAndLocalIDToUUID;
 
 LLViewerObjectList::LLViewerObjectList()
 {
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index 79ca0d0dd8d622ee5ca76b799a665a35d26f4499..7b546da2bc5b0fd1b407b9b5b2522d7b22063b65 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -40,8 +40,8 @@
 #include "llcoros.h"
 
 // system includes
-#include <absl/container/flat_hash_map.h>
-#include <absl/container/node_hash_map.h>
+#include <boost/unordered/unordered_flat_map.hpp>
+#include <boost/unordered/unordered_map.hpp>
 
 class LLCamera;
 class LLNetMap;
@@ -214,7 +214,7 @@ class LLViewerObjectList
 
     uuid_set_t   mDeadObjects;
 
-	absl::flat_hash_map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
+	boost::unordered_flat_map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
 
 	//set of objects that need to update their cost
     uuid_set_t   mStaleObjectCost;
@@ -229,9 +229,9 @@ class LLViewerObjectList
 	S32 mCurLazyUpdateIndex;
 
 	static U32 sSimulatorMachineIndex;
-	static absl::flat_hash_map<U64, U32> sIPAndPortToIndex;
+	static boost::unordered_flat_map<U64, U32> sIPAndPortToIndex;
 
-	static absl::node_hash_map<U64, LLUUID> sIndexAndLocalIDToUUID;
+	static boost::unordered_map<U64, LLUUID> sIndexAndLocalIDToUUID;
 
 	std::set<LLViewerObject *> mSelectPickList;
 
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index 5c3b31c84621e62f8a1d77f36a761d9f21a237ad..5210df1fd9301f50d6a7a231bf88afb0a72cdc30 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -45,8 +45,8 @@
 #include <string>
 #include <string_view>
 
-#include "absl/container/flat_hash_set.h"
-#include "absl/container/flat_hash_map.h"
+#include "boost/unordered/unordered_flat_set.hpp"
+#include "boost/unordered/unordered_flat_map.hpp"
 
 #include <fmt/format.h>
 #include <fmt/compile.h>
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 7d6ee3e7c324a4af0559ba7b1c6f34260d033fab..d1422cb4c10d777d985ee0b77509ad1ec0da4569 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -31,7 +31,7 @@
 // that are in to a particular region.
 #include <string>
 #include <boost/signals2.hpp>
-#include <absl/container/flat_hash_set.h>
+#include <boost/unordered/unordered_flat_set.hpp>
 
 #include "xform.h"
 #include "llwind.h"
@@ -659,7 +659,7 @@ class LLViewerRegion final : public LLCapabilityProvider // implements this inte
 	LLFrameTimer mRenderInfoReportTimer;
 
 	mutable tex_matrix_t mWorldMapTiles;
-	absl::flat_hash_set<std::string> mGodNames;
+	boost::unordered_flat_set<std::string> mGodNames;
 
 	LLEasyMessageSender mMessageSender;
 	using url_mapping_t = std::unordered_multimap<std::string, std::string>;
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index a797b6f70cdcdd1506c03533520d686a287fc0eb..69128587317b4e3998f7fecb0d96d32a7fbc41c2 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -36,7 +36,7 @@
 #include <set>
 #include "lluiimage.h"
 
-#include "absl/container/flat_hash_map.h"
+#include "boost/unordered/unordered_flat_map.hpp"
 
 const U32 LL_IMAGE_REZ_LOSSLESS_CUTOFF = 128;
 
@@ -91,10 +91,12 @@ struct LLTextureKey
 		return lhs.textureId == rhs.textureId && lhs.textureType == rhs.textureType;
 	}
 
-	template <typename H>
-	friend H AbslHashValue(H h, const LLTextureKey& id) 
+	friend std::size_t hash_value(LLTextureKey const& id)
 	{
-		return H::combine(std::move(h), id.textureId, id.textureType);
+		std::size_t seed = 0;
+		boost::hash_combine(seed, id.textureId);
+		boost::hash_combine(seed, id.textureType);
+		return seed;
 	}
 };
 
@@ -229,7 +231,7 @@ class LLViewerTextureList
     
 private:
     using uuid_map_t = std::map< LLTextureKey, LLPointer<LLViewerFetchedTexture> >;
-    using uuid_hash_map_t = absl::flat_hash_map< LLTextureKey, LLViewerFetchedTexture* >;
+    using uuid_hash_map_t = boost::unordered_flat_map< LLTextureKey, LLViewerFetchedTexture* >;
     uuid_map_t mUUIDMap;
     uuid_hash_map_t mUUIDHashMap;
     LLTextureKey mLastUpdateKey;
@@ -288,7 +290,7 @@ class LLUIImageList final : public LLImageProviderInterface, public LLSingleton<
 		LLRect mImageClipRegion;
 	};
 
-	typedef absl::flat_hash_map< std::string, LLPointer<LLUIImage> > uuid_ui_image_map_t;
+	typedef boost::unordered_flat_map< std::string, LLPointer<LLUIImage> > uuid_ui_image_map_t;
 	uuid_ui_image_map_t mUIImages;
 
 	//
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 2a25f6e8a184ffc26799de7b5aedf1dd01453f68..582396f50dbe61d2e8ffce1704c232249356bcc3 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -74,9 +74,6 @@
 // for base64 decoding
 #include "apr_base64.h"
 
-#include <absl/strings/escaping.h>
-#include <absl/strings/str_replace.h>
-
 #define USE_SESSION_GROUPS 0
 #define VX_NULL_POSITION -2147483648.0 /*The Silence*/
 
@@ -5288,7 +5285,7 @@ bool LLVivoxVoiceClient::inProximalChannel()
 
 std::string LLVivoxVoiceClient::sipURIFromID(const LLUUID &id)
 {
-	std::string result = absl::StrCat("sip:", nameFromID(id), "@", mVoiceSIPURIHostName);
+	std::string result = fmt::format(FMT_COMPILE("sip:{}@{}"), nameFromID(id), mVoiceSIPURIHostName);
 	return result;
 }
 
@@ -5297,7 +5294,7 @@ std::string LLVivoxVoiceClient::sipURIFromAvatar(LLVOAvatar *avatar)
 	std::string result;
 	if(avatar)
 	{
-		result = absl::StrCat("sip:", nameFromID(avatar->getID()), "@", mVoiceSIPURIHostName);
+		result = fmt::format(FMT_COMPILE("sip:{}@{}"), nameFromID(avatar->getID()), mVoiceSIPURIHostName);
 	}
 	return result;
 }
@@ -5322,15 +5319,16 @@ std::string LLVivoxVoiceClient::nameFromID(const LLUUID &uuid)
 		LLStringUtil::replaceChar(result, '_', ' ');
 		return result;
 	}
+	// Prepending this apparently prevents conflicts with reserved names inside the vivox code.
+	result = "x";
 	
 	// Base64 encode and replace the pieces of base64 that are less compatible 
 	// with e-mail local-parts.
 	// See RFC-4648 "Base 64 Encoding with URL and Filename Safe Alphabet"
-
-	// Prepending this apparently prevents conflicts with reserved names inside the vivox code.
-	result = absl::StrCat("x", absl::Base64Escape(std::string((char*)uuid.mData, UUID_BYTES)));
-	absl::StrReplaceAll({ {"+", "-"}, {"/", "_"} }, &result);
-
+	result += LLBase64::encode(uuid.mData, UUID_BYTES);
+	LLStringUtil::replaceChar(result, '+', '-');
+	LLStringUtil::replaceChar(result, '/', '_');
+	
 	// If you need to transform a GUID to this form on the Mac OS X command line, this will do so:
 	// echo -n x && (echo e669132a-6c43-4ee1-a78d-6c82fff59f32 |xxd -r -p |openssl base64|tr '/+' '_-')
 	
@@ -5388,7 +5386,7 @@ std::string LLVivoxVoiceClient::displayNameFromAvatar(LLVOAvatar *avatar)
 
 std::string LLVivoxVoiceClient::sipURIFromName(std::string_view name)
 {
-	std::string result = absl::StrCat("sip:", name, "@", mVoiceSIPURIHostName);
+	std::string result = fmt::format(FMT_COMPILE("sip:{}@{}"), name, mVoiceSIPURIHostName);
 //	LLStringUtil::toLower(result);
 	return result;
 }
diff --git a/indra/newview/llwind.h b/indra/newview/llwind.h
index 6ff52e40a46102462556db719d41de8efdffcfa0..9a9e08515f9920bd8eadca4d78ba946817117978 100644
--- a/indra/newview/llwind.h
+++ b/indra/newview/llwind.h
@@ -27,6 +27,8 @@
 #ifndef LL_LLWIND_H
 #define LL_LLWIND_H
 
+#include <array>
+
 #include "llmath.h"
 #include "v3math.h"
 #include "v3dmath.h"