diff --git a/autobuild.xml b/autobuild.xml
index 204f81406d63ebdaa8a268e5811eb037298c9bf4..71f2316ae1d0acbb523d258fa061f4b9917ceaef 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -500,11 +500,11 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>96b9850aeb24d1fd40383e2559847785b2e2017e101d08294682db6403965a8c9d4df9cbc80f00823f04d08ee503778b</string>
+              <string>49cda7b3a00499dd43a619f73ca18aebd6fafe282d793ac87d6a1a9c7de94f4fa748a652d957237c61a0bd8049aea4af</string>
               <key>hash_algorithm</key>
               <string>sha3_384</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/103/packages/generic/dullahan-916/0.0.916/dullahan-1.9.0_91.1.20_g5800665_chromium-91.0.4472.101-darwin64-916.tar.xz</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/103/packages/generic/dullahan/0.0.0.1137/dullahan-1.12.2_92.0.15_g159e655_chromium-92.0.4515.101-darwin64-1137.tar.xz</string>
             </map>
             <key>name</key>
             <string>darwin64</string>
@@ -514,11 +514,11 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>69c8a7fbb353aa6110d494eeb81436ff4bf98f608408cb9a9507cf9a8227ec4b0e6ef6a87b4684c1adefb52716729e38</string>
+              <string>e017aeea4431f68e83b9db1064b6a10a486d30aa6f08de9a3d1d921752bb8ace8b1fb988cdb7c1079a9c2d985bc7c3e1</string>
               <key>hash_algorithm</key>
               <string>sha3_384</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/103/packages/generic/dullahan-916/0.0.916/dullahan-1.9.0_91.1.20_g5800665_chromium-91.0.4472.101-linux64-916.tar.xz</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/103/packages/generic/dullahan/0.0.0.1137/dullahan-1.12.2_92.0.15_g159e655_chromium-92.0.4515.101-linux64-1137.tar.xz</string>
             </map>
             <key>name</key>
             <string>linux64</string>
@@ -542,18 +542,18 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>243c5504e130dcd4707fd76bcd25f16196b97c42d40eefc1cd0b122ffb4d30fac4edb6a87bde1be621dbc26bcd387102</string>
+              <string>d7cb823a92a33f0b2a18a0f0718a9c20a6d8ce06fb615854f72efd7f8a556b2d217c64c07446c6d98b35b8b855bce5c9</string>
               <key>hash_algorithm</key>
               <string>sha3_384</string>
               <key>url</key>
-              <string>https://git.alchemyviewer.org/api/v4/projects/103/packages/generic/dullahan-916/0.0.916/dullahan-1.9.0_91.1.20_g5800665_chromium-91.0.4472.101-windows64-916.tar.xz</string>
+              <string>https://git.alchemyviewer.org/api/v4/projects/103/packages/generic/dullahan/0.0.0.1137/dullahan-1.12.2_92.0.16_g3492b1b_chromium-92.0.4515.107-windows64-1137.tar.xz</string>
             </map>
             <key>name</key>
             <string>windows64</string>
           </map>
         </map>
         <key>version</key>
-        <string>1.9.0_91.1.20_g5800665_chromium-91.0.4472.101</string>
+        <string>1.12.2_92.0.15_g159e655_chromium-92.0.4515.101</string>
       </map>
       <key>expat</key>
       <map>
diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index 55e6c3f4db9cb80b5b12a94a59f73727af222898..802098d08339cb5d28d1dfafbe9bd9bf8a9cd69f 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -73,6 +73,7 @@ class MediaPluginCEF :
 	void onCursorChangedCallback(dullahan::ECursorType type);
 	const std::vector<std::string> onFileDialog(dullahan::EFileDialogType dialog_type, const std::string dialog_title, const std::string default_file, const std::string dialog_accept_filter, bool& use_default);
 	bool onJSDialogCallback(const std::string origin_url, const std::string message_text, const std::string default_prompt_text);
+	bool onJSBeforeUnloadCallback();
 
 	void postDebugMessage(const std::string& msg);
 	void authResponse(LLPluginMessage &message);
@@ -404,6 +405,14 @@ bool MediaPluginCEF::onJSDialogCallback(const std::string origin_url, const std:
 	return true;
 }
 
+////////////////////////////////////////////////////////////////////////////////
+//
+bool MediaPluginCEF::onJSBeforeUnloadCallback()
+{
+	// return true indicates we suppress the JavaScript UI entirely
+	return true;
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 //
 void MediaPluginCEF::onCursorChangedCallback(dullahan::ECursorType type)
@@ -552,10 +561,25 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 				mCEFLib->setOnCursorChangedCallback(std::bind(&MediaPluginCEF::onCursorChangedCallback, this, std::placeholders::_1));
 				mCEFLib->setOnRequestExitCallback(std::bind(&MediaPluginCEF::onRequestExitCallback, this));
 				mCEFLib->setOnJSDialogCallback(std::bind(&MediaPluginCEF::onJSDialogCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
+				mCEFLib->setOnJSBeforeUnloadCallback(std::bind(&MediaPluginCEF::onJSBeforeUnloadCallback, this));
 				
 				dullahan::dullahan_settings settings;
+#if LL_WINDOWS
+				// As of CEF version 83+, for Windows versions, we need to tell CEF 
+				// where the host helper process is since this DLL is not in the same
+				// dir as the executable that loaded it (SLPlugin.exe). The code in 
+				// Dullahan that tried to figure out the location automatically uses 
+				// the location of the exe which isn't helpful so we tell it explicitly.
+				settings.host_process_path = mHelperPath;
+
+#endif
 				settings.accept_language_list = mHostLanguage;
-				settings.background_color = 0xffffffff;
+
+				// SL-15560: Product team overruled my change to set the default
+				// embedded background color to match the floater background
+				// and set it to white
+				settings.background_color = 0xffffffff;	// white 
+
 				settings.cache_enabled = true;
 				settings.root_cache_path = mRootCachePath;
 				settings.cache_path = mCachePath;
@@ -566,6 +590,16 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 				settings.disable_network_service = mDisableNetworkService;
 				settings.use_mock_keychain = mUseMockKeyChain;
 #endif
+				// This setting applies to all plugins, not just Flash
+				// Regarding, SL-15559 PDF files do not load in CEF v91,
+				// it turns out that on Windows, PDF support is treated
+				// as a plugin on Windows only so turning all plugins
+				// off, disabled built in PDF support.  (Works okay in
+				// macOS surprisingly). To mitigrate this, we set the global
+				// media enabled flag to whatever the consumer wants and 
+				// explicitly disable Flash with a different setting (below)
+				settings.plugins_enabled = mPluginsEnabled;
+
 				settings.flip_mouse_y = false;
 				settings.flip_pixels_y = true;
 				settings.frame_rate = 60;
@@ -573,8 +607,8 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 				settings.initial_height = 1024;
 				settings.initial_width = 1024;
 				settings.javascript_enabled = mJavascriptEnabled;
-				settings.media_stream_enabled = false; // MAINT-6060 - WebRTC media removed until we can add granualrity/query UI
-				settings.plugins_enabled = mPluginsEnabled;
+				settings.media_stream_enabled = false; // MAINT-6060 - WebRTC media removed until we can add granularity/query UI
+				
 				settings.user_agent_substring = mCEFLib->makeCompatibleUserAgentString(mUserAgentSubtring);
 				settings.webgl_enabled = true;
 				settings.log_file = mCefLogFile;
@@ -589,7 +623,6 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 
 				// Set subprocess helper and cef app data paths
 #if !LL_DARWIN
-				settings.browser_subprocess_path = mHelperPath;
 				settings.resources_dir_path = mResourcesPath;
 #endif
                 settings.locales_dir_path = mLocalesPath;
@@ -598,10 +631,10 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 				mCEFLib->setCustomSchemes(custom_schemes);
 
 				bool result = mCEFLib->init(settings);
-				if (!result)
-				{
-					// if this fails, the media system in viewer will put up a message
-				}
+                if (!result)
+                {
+                    // if this fails, the media system in viewer will put up a message
+                }
 
 				// now we can set page zoom factor
 				F32 factor = (F32)message_in.getValueReal("factor");
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index a15225fad629f11d6477d6a7cbac1dfea7ad05e2..4c8366c8645cc259c9a3c8622d1684ad4620c611 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.4.22
+6.4.23
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index b2bdd195294dc423cfca19a39c8860d9db9b221e..b5853a3f37252bb1dee6cdef101566564c3a403a 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2454,17 +2454,6 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
-    <key>BrowserPluginsEnabled</key>
-    <map>
-      <key>Comment</key>
-      <string>Enable Web plugins in the built-in Web browser?</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
     <key>ChatBarCustomWidth</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 65398aad6995671f793756c7c9f2ad8045f4cf8f..d8633e0db7db7e6c86cd38dc237c8ac5236d4f0a 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -1755,14 +1755,14 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
 			bool cookies_enabled = gSavedSettings.getBOOL( "CookiesEnabled" );
 			media_source->cookies_enabled( cookies_enabled || clean_browser);
 
-			// collect 'plugins enabled' setting from prefs and send to embedded browser
-			bool plugins_enabled = gSavedSettings.getBOOL( "BrowserPluginsEnabled" );
-			media_source->setPluginsEnabled( plugins_enabled  || clean_browser);
-
 			// collect 'javascript enabled' setting from prefs and send to embedded browser
 			bool javascript_enabled = gSavedSettings.getBOOL( "BrowserJavascriptEnabled" );
 			media_source->setJavascriptEnabled( javascript_enabled || clean_browser);
 
+			// As of SL-15559 PDF files do not load in CEF v91 we enable plugins
+			// but explicitly disable Flash (PDF support in CEF is now treated as a plugin)
+			media_source->setPluginsEnabled(true);
+
 			bool media_plugin_debugging_enabled = gSavedSettings.getBOOL("MediaPluginDebugging");
 			media_source->enableMediaPluginDebugging( media_plugin_debugging_enabled  || clean_browser);
 
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index 6732f4ff1c4464d54bd511690590d5cb2a0ed426..89a5a5ca6f096efe2d4d62529557b801df4637e3 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -147,20 +147,6 @@
       width="480" />
   </radio_group>
 
-  <check_box
-    top_delta="2"
-    enabled="true"
-    follows="left|top"
-    height="18"
-    initial_value="true"
-    control_name="BrowserPluginsEnabled"
-    label="Enable plugins"
-    left_delta="20"
-    mouse_opaque="true"
-    name="browser_plugins_enabled"
-    radio_style="false"
-    width="400"
-    top_pad="5"/>
   <check_box
     top_delta="4"
     enabled="true"