diff --git a/indra/newview/alfloaterlightbox.cpp b/indra/newview/alfloaterlightbox.cpp
index e3385bba452712bbd8d99f7ec72df6bc3e5141f3..39bc592b7aa7e71870c9064519f881281757b75b 100644
--- a/indra/newview/alfloaterlightbox.cpp
+++ b/indra/newview/alfloaterlightbox.cpp
@@ -45,7 +45,6 @@ ALFloaterLightBox::ALFloaterLightBox(const LLSD& key)
     mCommitCallbackRegistrar.add("LightBox.ResetGroupDefault", std::bind(&ALFloaterLightBox::onClickResetGroupDefault, this, std::placeholders::_2));
     mCommitCallbackRegistrar.add("LightBox.CASSelect", boost::bind(&ALFloaterLightBox::updateCAS, this));
     mCommitCallbackRegistrar.add("LightBox.CASCommit", std::bind(&ALFloaterLightBox::commitCAS, this, std::placeholders::_2));
-    mCommitCallbackRegistrar.add("LightBox.SSAOCommit", std::bind(&ALFloaterLightBox::commitSSAO, this, std::placeholders::_2));
 }
 
 ALFloaterLightBox::~ALFloaterLightBox()
@@ -62,7 +61,6 @@ BOOL ALFloaterLightBox::postBuild()
 
 void ALFloaterLightBox::draw()
 {
-    updateSSAO();
     updateCAS();
     LLFloater::draw();
 }
@@ -496,28 +494,6 @@ void ALFloaterLightBox::updateTonemapper()
 	}
 }
 
-void ALFloaterLightBox::updateSSAO() 
-{
-    //TODO: Make generic in case more Vec3 values need to be poked
-    LLVector3 SSAO_PARAMS = gSavedSettings.getVector3("RenderSSAOEffect");
-    F32       SSAO_Strength_Relative = clamp(1 - SSAO_PARAMS[VX], 0.0f, 1.0f);  // Remapped Value to Slider's Expecations, also clamped
-
-    // Init UI
-    LLSpinCtrl*   spinner1 = getChild<LLSpinCtrl>("ssao_strength_spinner");
-    LLSliderCtrl* slider1  = getChild<LLSliderCtrl>("ssao_strength_slider");
-
-    spinner1->setMinValue(0.0f);
-    spinner1->setMaxValue(1.0f);
-    spinner1->setPrecision(2);
-    spinner1->setIncrement(0.01f);
-    spinner1->setValue(SSAO_Strength_Relative);
-
-    slider1->setMinValue(0.0f);
-    slider1->setMaxValue(1.0f);
-    slider1->setIncrement(0.01f);
-    slider1->setValue(SSAO_Strength_Relative);
-}
-
 void ALFloaterLightBox::updateCAS() 
 {
     // Check the state of RenderSharpenMethod
@@ -577,69 +553,6 @@ void ALFloaterLightBox::updateCAS()
     slider2->setValue(CAS_PARAMS[VY]);
 }
 
-void ALFloaterLightBox::commitTonemapper(const LLSD& userdata)
-{
-    const std::string& active_control = userdata.asString();
-    // Check the state of RenderToneMapType
-    U32 TMap = gSavedSettings.getU32("RenderToneMapType");
-
-    LLVector3 vTM_A;
-    LLVector3 vTM_B;
-    LLVector3 vTM_C;
-    if (TMap == 7)  // Uchimura
-    {
-        vTM_A[VX] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "1")->getValue().asReal();
-        vTM_A[VY] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "2")->getValue().asReal();
-        vTM_A[VZ] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "3")->getValue().asReal();
-        vTM_B[VX] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "4")->getValue().asReal();
-        vTM_B[VY] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "5")->getValue().asReal();
-        vTM_B[VZ] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "6")->getValue().asReal();
-        gSavedSettings.setVector3("RenderToneMapUchimuraA", vTM_A);
-        gSavedSettings.setVector3("RenderToneMapUchimuraB", vTM_B);
-    }
-    else if (TMap == 8)  // Lottes
-    {
-        vTM_A[VX] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "1")->getValue().asReal();
-        vTM_A[VY] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "2")->getValue().asReal();
-        vTM_A[VZ] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "3")->getValue().asReal();
-        vTM_B[VX] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "4")->getValue().asReal();
-        vTM_B[VY] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "5")->getValue().asReal();
-        vTM_B[VZ] = 0.0f;
-        gSavedSettings.setVector3("RenderToneMapLottesA", vTM_A);
-        gSavedSettings.setVector3("RenderToneMapLottesB", vTM_B);
-    }
-    else if (TMap == 9)  // Uncharted
-    {
-        vTM_A[VX] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "1")->getValue().asReal();
-        vTM_A[VY] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "2")->getValue().asReal();
-        vTM_A[VZ] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "3")->getValue().asReal();
-        vTM_B[VX] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "4")->getValue().asReal();
-        vTM_B[VY] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "5")->getValue().asReal();
-        vTM_B[VZ] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "6")->getValue().asReal();
-        vTM_C[VX] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "7")->getValue().asReal();
-        vTM_C[VY] = (F32) getChild<LLUICtrl>("tonemapper_dynamic_" + active_control + "8")->getValue().asReal();
-        vTM_C[VZ] = 0.0f;
-        gSavedSettings.setVector3("RenderToneMapUnchartedA", vTM_A);
-        gSavedSettings.setVector3("RenderToneMapUnchartedB", vTM_B);
-        gSavedSettings.setVector3("RenderToneMapUnchartedC", vTM_C);
-    }
-}
-
-void ALFloaterLightBox::commitSSAO(const LLSD& userdata)
-{
-    // TODO: This should probably be more generic in case I need to poke another vec3 setting.
-    const std::string& active_control = userdata.asString();
-
-    // Remap back to what the value expects, also clamp
-    F32 SSAO_Strength_Real = clamp(1 - (F32) getChild<LLUICtrl>("ssao_strength_" + active_control)->getValue().asReal(), 0.0f, 1.0f);
-    
-    LLVector3 SSAO;
-    SSAO[VX] = SSAO_Strength_Real;
-    SSAO[VY] = 1.0f;
-    SSAO[VZ] = 0.0f;
-    gSavedSettings.setVector3("RenderSSAOEffect", SSAO);
-}
-
 void ALFloaterLightBox::commitCAS(const LLSD& userdata)
 {
     const std::string& active_control = userdata.asString();
diff --git a/indra/newview/alfloaterlightbox.h b/indra/newview/alfloaterlightbox.h
index a86877b0755bb4d0c096289a5eff40366c98aff8..315c13be5cc2580976d00dbbaf1b089c26eb903f 100644
--- a/indra/newview/alfloaterlightbox.h
+++ b/indra/newview/alfloaterlightbox.h
@@ -50,12 +50,9 @@ class ALFloaterLightBox final : public LLFloater
 	void onClickResetGroupDefault(const LLSD& userdata);
     void updateTonemapper();
     void updateCAS();
-    void updateSSAO();
-    void commitTonemapper(const LLSD& userdata);
     void commitCAS(const LLSD& userdata);
-    void commitSSAO(const LLSD& userdata);
 
-    boost::signals2::scoped_connection mTonemapConnection;
+    boost::signals2::scoped_connection mTonemapConnection;	
 	
 };
 
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 547a17587b13f46ad0b69a21d48f3dda8eb75fa1..7a09f1c8e009488b1f1073723ef9d323f11bd179 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -9560,6 +9560,28 @@
     <key>Value</key>
     <real>0.30</real>
   </map>
+  <key>RenderSSAOEffectValue</key>
+  <map>
+    <key>Comment</key>
+    <string>Multiplier for value , for areas which are totally occluded.  Blends with original color for partly-occluded areas.</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>F32</string>
+    <key>Value</key>
+    <real>0.80</real>
+  </map>
+  <key>RenderSSAOEffectSat</key>
+  <map>
+    <key>Comment</key>
+    <string>Multiplier for saturation , for areas which are totally occluded.  Blends with original color for partly-occluded areas.</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>F32</string>
+    <key>Value</key>
+    <real>1.00</real>
+  </map>
   <key>RenderSSAOEffect</key>
   <map>
     <key>Comment</key>
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index 14a064a5b37cbfed9ecf453d9120b17d4aa532cb..bb6dde37fb3056f1b50ea78b5523212e07ed82ec 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -74,6 +74,7 @@ RenderGLMultiThreadedTextures      1   0
 RenderGLMultiThreadedMedia         1   1
 RenderReflectionProbeResolution 1 128
 RenderScreenSpaceReflections 1  1
+RenderToneMapType 1 1
 
 
 //
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 52d32622ef23cc84a1a75ba78df0825b4dacaf10..ad740b035974f3127d2e37ff14bb7daa60b27c28 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -72,6 +72,7 @@ RenderGLContextCoreProfile         1   1
 RenderGLMultiThreaded       1   0
 RenderReflectionProbeResolution 1 128
 RenderScreenSpaceReflections 1  1
+RenderToneMapType 1 1
 
 
 //
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index c8f8ce57ae711b3a92f3647459bcdf5c61b7230f..16cc68ae52b86acddcd4d96b26eec419fe6f28da 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -73,6 +73,7 @@ RenderReflectionProbeDetail	1	2
 RenderScreenSpaceReflections 1  1
 RenderReflectionProbeCount  1   256
 RenderReflectionProbeLevel  1   3
+RenderToneMapType 1 1
 
 //
 // Low Graphics Settings
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index f9567805730face8002352df7a1b45ec8a8e8d4b..aa14720243f8f8eb8a01c508ec9c408203f6aa9f 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -512,7 +512,8 @@ void LLPipeline::init()
 	connectRefreshCachedSettingsSafe("RenderSSAOScale");
 	connectRefreshCachedSettingsSafe("RenderSSAOMaxScale");
 	connectRefreshCachedSettingsSafe("RenderSSAOFactor");
-	connectRefreshCachedSettingsSafe("RenderSSAOEffect");
+	connectRefreshCachedSettingsSafe("RenderSSAOEffectValue");
+	connectRefreshCachedSettingsSafe("RenderSSAOEffectSat");
 	connectRefreshCachedSettingsSafe("RenderShadowOffsetError");
 	connectRefreshCachedSettingsSafe("RenderShadowBiasError");
 	connectRefreshCachedSettingsSafe("RenderShadowOffset");
@@ -1047,7 +1048,7 @@ void LLPipeline::refreshCachedSettings()
 	RenderSSAOScale = gSavedSettings.getF32("RenderSSAOScale");
 	RenderSSAOMaxScale = gSavedSettings.getU32("RenderSSAOMaxScale");
 	RenderSSAOFactor = gSavedSettings.getF32("RenderSSAOFactor");
-	RenderSSAOEffect = gSavedSettings.getVector3("RenderSSAOEffect");
+	RenderSSAOEffect = LLVector3(gSavedSettings.getF32("RenderSSAOEffectValue"), gSavedSettings.getF32("RenderSSAOEffectSat"), 0.0f);
 	RenderShadowOffsetError = gSavedSettings.getF32("RenderShadowOffsetError");
 	RenderShadowBiasError = gSavedSettings.getF32("RenderShadowBiasError");
 	RenderShadowOffset = gSavedSettings.getF32("RenderShadowOffset");
@@ -7439,31 +7440,40 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst) {
 				}
 			}
 
-			if (focus_point.isExactlyZero())
+			static LLVector3 last_focus_point{};
+			if (LLPipeline::RenderFocusPointLocked && !last_focus_point.isExactlyZero())
 			{
-				if (LLViewerJoystick::getInstance()->getOverrideCamera())
-				{ // focus on point under cursor
-					focus_point.set(gDebugRaycastIntersection.getF32ptr());
-				}
-				else if (gAgentCamera.cameraMouselook())
-				{ // focus on point under mouselook crosshairs
-					LLVector4a result;
-					result.clear();
+				focus_point = last_focus_point;
+			}
+			else
+			{
+				if (focus_point.isExactlyZero())
+				{
+					if (LLViewerJoystick::getInstance()->getOverrideCamera())
+					{ // focus on point under cursor
+						focus_point.set(gDebugRaycastIntersection.getF32ptr());
+					}
+					else if (gAgentCamera.cameraMouselook())
+					{ // focus on point under mouselook crosshairs
+						LLVector4a result;
+						result.clear();
 
-					gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, FALSE, TRUE, NULL, &result);
+						gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, FALSE, TRUE, NULL, &result);
 
-					focus_point.set(result.getF32ptr());
-				}
-				else
-				{
-					// focus on alt-zoom target
-					LLViewerRegion* region = gAgent.getRegion();
-					if (region)
+						focus_point.set(result.getF32ptr());
+					}
+					else
 					{
-						focus_point = LLVector3(gAgentCamera.getFocusGlobal() - region->getOriginGlobal());
+						// focus on alt-zoom target
+						LLViewerRegion* region = gAgent.getRegion();
+						if (region)
+						{
+							focus_point = LLVector3(gAgentCamera.getFocusGlobal() - region->getOriginGlobal());
+						}
 					}
 				}
 			}
+			last_focus_point = focus_point;
 
 			LLVector3 eye = LLViewerCamera::getInstance()->getOrigin();
 			F32 target_distance = 16.f;
diff --git a/indra/newview/skins/default/xui/en/floater_lightbox_settings.xml b/indra/newview/skins/default/xui/en/floater_lightbox_settings.xml
index 1a566180660836059cf99261a4e4e4861ccba079..cac983236e6fb81016f82e0a185b6e62fb69f240 100644
--- a/indra/newview/skins/default/xui/en/floater_lightbox_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_lightbox_settings.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
  width="365"
- height="330"
+ height="340"
  layout="topleft"
- min_height="330"
+ min_height="340"
  min_width="365"
  name="floater_lightbox_settings"
  positioning="cascading"
@@ -15,13 +15,13 @@
 		top_pad="0" 
 		enabled="true" 
 		follows="left|top" 
-		height="330" 
-		left_delta="5"
+		height="340" 
 		mouse_opaque="false" 
 		name="lightbox_tab_container" 
 		tab_position="top"
 		tab_stop="false" 
-		width="350">
+		tab_min_width="70"
+		width="363">
 			<!--Image Panel-->
 			<panel
 				label="Image"
@@ -34,7 +34,7 @@
 					follows="left|top"
 					height="15"
 					left="10"
-					top_pad="6"
+					top_pad="8"
 					width="60"
 					layout="topleft"
 					tool_tip="What Colorgrading LUT (Look Up Texture) to be used to colorgrade the image. Custom LUTs require the full filename!"
@@ -45,12 +45,11 @@
 					tool_tip="What Colorgrading LUT (Look Up Texture) to be used to colorgrade the image. Custom LUTs require the full filename!"
 					control_name="RenderColorGradeLUT"
 					follows="left|top"
-					height="20"
 					layout="topleft"
 					right="-4"
 					max_chars="200"
 					name="colorlut_combo"
-					top_pad="-18"
+					top_pad="-21"
 					width="265">
 					<combo_box.item
 						label="None"
@@ -1366,12 +1365,12 @@
 					top_pad="4"
 					width="110"
 					layout="topleft"
-					tool_tip="Controls the strength of the SSAO effect."
-					value="SSAO Strength:" />
+					tool_tip="Controls the value of the SSAO HSV transform."
+					value="SSAO Value:" />
 				<slider
 					top_pad="-18"
 					height="20"
-					increment=".1"
+					increment=".01"
 					follows="left|top|right"
 					layout="topleft"
 					max_val="1"
@@ -1379,32 +1378,77 @@
 					left="140"
 					right="-75"
 					show_text="false"
-					name="ssao_strength_slider"
-					tool_tip="Controls the strength of the SSAO effect."
-					control_name="">
-					<slider.commit_callback
-						function="LightBox.SSAOCommit"
-						parameter="slider" />
-					</slider>
+					name="ssao_value_slider"
+					tool_tip="Controls the value of the SSAO HSV transform.."
+					control_name="RenderSSAOEffectValue" />
 				<spinner
 					top_pad="-20"
 					height="15"
 					label_width="0"
 					right="-20"
-					decimal_digits="1"
+					decimal_digits="3"
 					follows="top|right"
 					layout="topleft"
 					max_val="1"
 					min_val="0"
 					width="55"
-					increment=".1"
+					increment=".01"
+					name="ssao_value_spinner"
+					tool_tip="Controls the value of the SSAO HSV transform."
+					control_name="RenderSSAOEffectValue"/>
+				<button
+					name="ssaoVal_default_btn"
+					follows="top|right"
+					layout="topleft"
+					height="22"
+					left_delta="55"
+					top_pad="-15"
+					width="18"
+					scale_image="true"
+					image_overlay="Refresh_Off"
+					image_overlay_alignment="center">
+					<button.commit_callback
+						function="LightBox.ResetControlDefault"
+						parameter="RenderSSAOEffectValue" />
+				</button>
+				<text
+					follows="left|top"
+					height="15"
+					left="30"
+					top_pad="4"
+					width="110"
+					layout="topleft"
+					tool_tip="Controls the saturation of the SSAO HSV transform."
+					value="SSAO Saturation:" />
+				<slider
+					top_pad="-18"
+					height="20"
+					increment=".01"
+					follows="left|top|right"
+					layout="topleft"
+					max_val="1"
+					min_val="0"
+					left="140"
+					right="-75"
+					show_text="false"
+					name="ssao_sat_slider"
+					tool_tip="Controls the saturation of the SSAO HSV transform."
+					control_name="RenderSSAOEffectSat" />
+				<spinner
+					top_pad="-20"
+					height="15"
+					label_width="0"
+					right="-20"
+					decimal_digits="3"
+					follows="top|right"
+					layout="topleft"
+					max_val="1"
+					min_val="0"
+					width="55"
+					increment=".01"
 					name="ssao_strength_spinner"
-					tool_tip="Controls the strength of the SSAO effect."
-					control_name="">
-					<spinner.commit_callback
-						function="LightBox.SSAOCommit"
-						parameter="spinner" />
-					</spinner>
+					tool_tip="Controls the saturation of the SSAO HSV transform."
+					control_name="RenderSSAOEffectSat"/>
 				<button
 					name="ssaoStrength_default_btn"
 					follows="top|right"
@@ -1418,7 +1462,7 @@
 					image_overlay_alignment="center">
 					<button.commit_callback
 						function="LightBox.ResetControlDefault"
-						parameter="RenderSSAOEffect" />
+						parameter="RenderSSAOEffectSat" />
 				</button>
 				<!--SSAO Factor-->
 				<text
@@ -1448,7 +1492,7 @@
 					height="15"
 					label_width="0"
 					right="-20"
-					decimal_digits="1"
+					decimal_digits="3"
 					follows="top|right"
 					layout="topleft"
 					max_val="10"