diff --git a/README.md b/README.md
index 4096aa0ee6150cb35d4057ce139216c39f61708b..749345ab58722b59cf5626aee200796e10eb3f51 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,4 @@
- [![Alchemy Logo](https://www.alchemyviewer.org/images/banner.png)](https://www.alchemyviewer.org)
-
-[![Alchemy License](https://img.shields.io/badge/license-LGPL%202.1-blue.svg)](https://git.alchemyviewer.org/alchemy/alchemy-next/-/blob/master/LICENSE.md)
-[![pipeline status](https://git.alchemyviewer.org/alchemy/alchemy-next/badges/master/pipeline.svg)](https://git.alchemyviewer.org/alchemy/alchemy-next/-/commits/master)
+ [![Alchemy Logo](https://alchemyviewer.org/assets/images/banner-4bed76df9322897136b74485a58ae2d7.webp)](https://www.alchemyviewer.org)
 
 ## About
 [Alchemy](https://www.alchemyviewer.org) Viewer is a client for Second Life and OpenMetaverse protocol simulators. We focus on creating a smooth and easy to use experience with secure and sane defaults.
diff --git a/autobuild.xml b/autobuild.xml
index aa7ecfefccfeac197c5eaf1801e4a953026715a1..f92ccdbb56e933ce47ae1cb7577a67e5c56c2c4a 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -604,11 +604,11 @@
               <key>creds</key>
               <string>gitlab</string>
               <key>hash</key>
-              <string>a65d0cfb76d5851f628aa2a02716a40225859e24afb81f86e66590e03913f364b56f750daacb58c4a089894230d08a27339eb72cc09677518aaeca73cf513a88</string>
+              <string>acc8170e65090cdf4520f8162ef86f722517e65e1a6286ca4f901ae780a87c15a19acb0ce9f7526f45a18b7a8aa370c20e9e1e7180ed8ef0f99e8f44bf723412</string>
               <key>hash_algorithm</key>
               <string>blake2b</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/49/packages/generic/fmodstudio/2.02.14.2006/fmodstudio-2.02.14-darwin64-2006.tar.zst</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/49/packages/generic/fmodstudio/2.02.16.2109/fmodstudio-2.02.16-darwin64-2109.tar.zst</string>
             </map>
             <key>name</key>
             <string>darwin64</string>
@@ -620,11 +620,11 @@
               <key>creds</key>
               <string>gitlab</string>
               <key>hash</key>
-              <string>75bdf24984317cb71fb0af93ae5a23587f2b52ca87449160b1456e8ea31299632cb95264b04204fe5b71f90482341e76536a64cf998076ff20db12d9a5250d77</string>
+              <string>ab33eff5e647834cb4ef46a8b3122407f4b5ee128d5fab7c0add978d25edecb2e7d48ff73b7165785d111ba8eee58d2d0042b3f84a7506bd0c1b4640a763fd2e</string>
               <key>hash_algorithm</key>
               <string>blake2b</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/49/packages/generic/fmodstudio/2.02.14.2006/fmodstudio-2.02.14-linux64-2006.tar.zst</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/49/packages/generic/fmodstudio/2.02.16.2109/fmodstudio-2.02.16-linux64-2109.tar.zst</string>
             </map>
             <key>name</key>
             <string>linux64</string>
@@ -636,18 +636,18 @@
               <key>creds</key>
               <string>gitlab</string>
               <key>hash</key>
-              <string>0e3742739e5531de176c66436b2d6c3d35943a61c977f8a3d55434a6c869c8a57702b63910d112057352559532b5487b1f6529898828aff702b166719759b012</string>
+              <string>c04212c0f5c83a6da7525fa89a6f2c233882f299f4fc92a47631eed6ae55abe5f7854731f0512157e2c6a691334b9822adb3717954db1e70fa92585df8b83caf</string>
               <key>hash_algorithm</key>
               <string>blake2b</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/49/packages/generic/fmodstudio/2.02.14.2006/fmodstudio-2.02.14-windows64-2006.tar.zst</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/49/packages/generic/fmodstudio/2.02.16.2109/fmodstudio-2.02.16-windows64-2109.tar.zst</string>
             </map>
             <key>name</key>
             <string>windows64</string>
           </map>
         </map>
         <key>version</key>
-        <string>2.02.14</string>
+        <string>2.02.16</string>
       </map>
       <key>fonts</key>
       <map>
@@ -2162,11 +2162,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>019556828ae9209b4fa516a97c69e7c04d3f3388aafc3a53f5306c4b385389fd52d77fa16260b180a1372020b631b2b61c54c815330de7e2be3caf4b9141483a</string>
+              <string>6bc2cec62d4fe84c3980b4b26c351b3adfcfe98a9bf2c8224250357ffb4065c5abc2cfb91d650ce09def862eb5c17376a08e1d7d73f354c02b2095152738749b</string>
               <key>hash_algorithm</key>
               <string>blake2b</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/185/packages/generic/tinygltf/v2.8.13.2095/tinygltf-v2.8.13-common-2095.tar.zst</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/185/packages/generic/tinygltf/v2.8.14.2111/tinygltf-v2.8.14-common-2111.tar.zst</string>
             </map>
             <key>name</key>
             <string>common</string>
@@ -2177,7 +2177,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
         <key>source_type</key>
         <string>git</string>
         <key>version</key>
-        <string>v2.8.13</string>
+        <string>v2.8.14</string>
       </map>
       <key>tracy</key>
       <map>
diff --git a/indra/llfilesystem/lldiskcache.cpp b/indra/llfilesystem/lldiskcache.cpp
index 502fbb0aef26fb9178b31c4e3d9ad85372f15887..c369dbd68a848ac83e0d5106474770437c756fa9 100644
--- a/indra/llfilesystem/lldiskcache.cpp
+++ b/indra/llfilesystem/lldiskcache.cpp
@@ -120,6 +120,11 @@ void LLDiskCache::purge()
         {
             for (auto& entry : boost::make_iterator_range(dir_iter, {}))
             {
+                if(!LLApp::isRunning())
+                {
+                    return;
+                }
+
                 if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed())
                 {
                     if (entry.path().string().rfind(sCacheFilenameExt) != std::string::npos)
@@ -157,9 +162,15 @@ void LLDiskCache::purge()
     {
         file_removed.reserve(file_info.size());
     }
+
     uintmax_t file_size_total = 0;
     for (const file_info_t& entry : file_info)
     {
+		if (!LLApp::isRunning())
+		{
+			return;
+		}
+
         file_size_total += entry.second.first;
 
         bool should_remove = file_size_total > mMaxSizeBytes;
@@ -200,6 +211,11 @@ void LLDiskCache::purge()
         // Logging thousands of file results can take hundreds of milliseconds
         for (size_t i = 0; i < file_info.size(); ++i)
         {
+			if (!LLApp::isRunning())
+			{
+				return;
+			}
+
             const file_info_t& entry = file_info[i];
             const bool removed = file_removed[i];
             const std::string action = removed ? "DELETE:" : "KEEP:";
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 39e9f2e4d2cb7723812bbf72651d8c947a231aa7..25f24525e2a6967891c52d31ced1991deac85236 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -204,6 +204,10 @@ void LLDrawPoolAlpha::renderPostDeferred(S32 pass)
 
     prepare_alpha_shader(pbr_shader, false, true, water_sign);
 
+    // explicitly unbind here so render loop doesn't make assumptions about the last shader
+    // already being setup for rendering
+    LLGLSLShader::unbind();
+
     if (!LLPipeline::sRenderingHUDs)
     {
         // first pass, render rigged objects only and render to depth buffer
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 5c2784b6805d0744168b1f1561d41a2a21f5048b..5a87c43e7d3839c542822f63232c56f10fbda590 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -193,7 +193,7 @@ void LLVoiceChannel::handleError(EStatusType type)
 BOOL LLVoiceChannel::isActive()
 { 
 	// only considered active when currently bound channel matches what our channel
-	return callStarted() && LLVoiceClient::getInstance()->getCurrentChannel() == mURI;
+	return callStarted() && LLVoiceClient::getInstance()->getCurrentChannel() == mURI; 
 }
 
 BOOL LLVoiceChannel::callStarted()
@@ -684,7 +684,7 @@ void LLVoiceChannelProximal::activate()
 	if((LLVoiceChannel::sCurrentVoiceChannel != this) && (LLVoiceChannel::getState() == STATE_CONNECTED))
 	{
 		// we're connected to a non-spatial channel, so disconnect.
-		LLVoiceClient::getInstance()->leaveNonSpatialChannel();
+		LLVoiceClient::getInstance()->leaveNonSpatialChannel();	
 	}
 	LLVoiceChannel::activate();
 	
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 3b04122393d40d335d8f8f5a2365f561d7dea389..2f76239c48d9cf9ac2de3e3a51b241486933e59e 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -5696,9 +5696,9 @@ void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
 
 bool LLVivoxVoiceClient::voiceEnabled()
 {
-	static const LLCachedControl<bool> enable_voice_chat(gSavedSettings, "EnableVoiceChat");
-	static const LLCachedControl<bool> cmd_line_disable_voice(gSavedSettings, "CmdLineDisableVoice");
-	return enable_voice_chat && !cmd_line_disable_voice && !gNonInteractive;
+    return gSavedSettings.getBOOL("EnableVoiceChat") &&
+          !gSavedSettings.getBOOL("CmdLineDisableVoice") &&
+          !gNonInteractive;
 }
 
 void LLVivoxVoiceClient::setLipSyncEnabled(BOOL enabled)
diff --git a/indra/newview/skins/default/xui/en/panel_gltf_material.xml b/indra/newview/skins/default/xui/en/panel_gltf_material.xml
index 6975525b3de86e2e6f9e0efa5b48643dbb77da7f..45df40bc05624e545fcb1ce869a8071d5cfc196d 100644
--- a/indra/newview/skins/default/xui/en/panel_gltf_material.xml
+++ b/indra/newview/skins/default/xui/en/panel_gltf_material.xml
@@ -98,7 +98,7 @@
       top_pad="5"
       width="96"
       name="base_color_transparency_lbl">
-      Transparency
+      Alpha
     </text>
     <spinner
       decimal_digits="3"