diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index 83a92f08d0ec2e1695e0fbb424a5c8e1d1eebd0c..d4e616abc2d464013e0205dd10609dbdc8bdcaa1 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -131,6 +131,8 @@ const std::string LLSettingsSky::SETTING_SKY_MOISTURE_LEVEL("moisture_level");
 const std::string LLSettingsSky::SETTING_SKY_DROPLET_RADIUS("droplet_radius");
 const std::string LLSettingsSky::SETTING_SKY_ICE_LEVEL("ice_level");
 
+const std::string LLSettingsSky::SETTING_REFLECTION_PROBE_AMBIANCE("reflection_probe_ambiance");
+
 const LLUUID LLSettingsSky::DEFAULT_ASSET_ID("3ae23978-ac82-bcf3-a9cb-ba6e52dcb9ad");
 
 static const LLUUID DEFAULT_SUN_ID("32bfbcea-24b1-fb9d-1ef9-48a28a63730f"); // dataserver
@@ -630,6 +632,9 @@ LLSettingsSky::validation_list_t LLSettingsSky::validationList()
         validation.push_back(Validator(SETTING_SKY_ICE_LEVEL,      false,  LLSD::TypeReal,  
             boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
 
+        validation.push_back(Validator(SETTING_REFLECTION_PROBE_AMBIANCE, false, LLSD::TypeReal,
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
+
         validation.push_back(Validator(SETTING_RAYLEIGH_CONFIG, true, LLSD::TypeArray, &validateRayleighLayers));
         validation.push_back(Validator(SETTING_ABSORPTION_CONFIG, true, LLSD::TypeArray, &validateAbsorptionLayers));
         validation.push_back(Validator(SETTING_MIE_CONFIG, true, LLSD::TypeArray, &validateMieLayers));
@@ -755,6 +760,8 @@ LLSD LLSettingsSky::defaults(const LLSettingsBase::TrackPosition& position)
         dfltsetting[SETTING_SKY_DROPLET_RADIUS] = 800.0f;
         dfltsetting[SETTING_SKY_ICE_LEVEL]      = 0.0f;
 
+        dfltsetting[SETTING_REFLECTION_PROBE_AMBIANCE] = 0.0f;
+
         dfltsetting[SETTING_RAYLEIGH_CONFIG]    = rayleighConfigDefault();
         dfltsetting[SETTING_MIE_CONFIG]         = mieConfigDefault();
         dfltsetting[SETTING_ABSORPTION_CONFIG]  = absorptionConfigDefault();
@@ -1132,6 +1139,11 @@ void LLSettingsSky::setSkyIceLevel(F32 ice_level)
     setValue(SETTING_SKY_ICE_LEVEL, ice_level);
 }
 
+void LLSettingsSky::setReflectionProbeAmbiance(F32 ambiance)
+{
+    setValue(SETTING_REFLECTION_PROBE_AMBIANCE, ambiance);
+}
+
 void LLSettingsSky::setAmbientColor(const LLColor3 &val)
 {
     mSettings[SETTING_LEGACY_HAZE][SETTING_AMBIENT] = val.getValue();
@@ -1420,6 +1432,11 @@ F32 LLSettingsSky::getSkyIceLevel() const
     return mSettings[SETTING_SKY_ICE_LEVEL].asReal();
 }
 
+F32 LLSettingsSky::getReflectionProbeAmbiance() const
+{
+    return mSettings[SETTING_REFLECTION_PROBE_AMBIANCE].asReal();
+}
+
 F32 LLSettingsSky::getSkyBottomRadius() const
 {
     return mSettings[SETTING_SKY_BOTTOM_RADIUS].asReal();
diff --git a/indra/llinventory/llsettingssky.h b/indra/llinventory/llsettingssky.h
index fa9326f0069f62b0d97a9da1568f49a2f7602656..715d31518b99f181205e11cbe22c9a748774a3db 100644
--- a/indra/llinventory/llsettingssky.h
+++ b/indra/llinventory/llsettingssky.h
@@ -97,6 +97,8 @@ class LLSettingsSky: public LLSettingsBase
     static const std::string SETTING_SKY_DROPLET_RADIUS;
     static const std::string SETTING_SKY_ICE_LEVEL;
 
+    static const std::string SETTING_REFLECTION_PROBE_AMBIANCE;
+
     static const std::string SETTING_LEGACY_HAZE;
 
     static const LLUUID DEFAULT_ASSET_ID;
@@ -131,6 +133,8 @@ class LLSettingsSky: public LLSettingsBase
     F32 getSkyDropletRadius() const;
     F32 getSkyIceLevel() const;
 
+    F32 getReflectionProbeAmbiance() const;
+
     // Return first (only) profile layer represented in LLSD
     LLSD getRayleighConfig() const;
     LLSD getMieConfig() const;
@@ -159,6 +163,8 @@ class LLSettingsSky: public LLSettingsBase
     void setSkyDropletRadius(F32 radius);
     void setSkyIceLevel(F32 ice_level);
 
+    void setReflectionProbeAmbiance(F32 ambiance);
+
     //---------------------------------------------------------------------
     LLColor3 getAmbientColor() const;
     void setAmbientColor(const LLColor3 &val);
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index bdc1f78201cb44328f9624705990a5886ef37159..e2e1ff9714e04b9bed1790d356cca7afe16946b5 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -1342,6 +1342,7 @@ void LLShaderMgr::initAttribsAndUniforms()
     mReservedUniforms.push_back("halo_map");
     mReservedUniforms.push_back("moon_brightness");
     mReservedUniforms.push_back("cloud_variance");
+    mReservedUniforms.push_back("reflection_probe_ambiance");
 
     mReservedUniforms.push_back("sh_input_r");
     mReservedUniforms.push_back("sh_input_g");
diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h
index 663ba28b6d8ce26802a56c621a1424c091024232..d3bb2b9db414c49e1e1948c0fe24c879b9d753ee 100644
--- a/indra/llrender/llshadermgr.h
+++ b/indra/llrender/llshadermgr.h
@@ -243,6 +243,7 @@ class LLShaderMgr
 
         CLOUD_VARIANCE,                     //  "cloud_variance"
 
+        REFLECTION_PROBE_AMBIANCE,          //  "reflection_probe_ambiance"
         SH_INPUT_L1R,                       //  "sh_input_r"
         SH_INPUT_L1G,                       //  "sh_input_g"
         SH_INPUT_L1B,                       //  "sh_input_b"
diff --git a/indra/newview/llpaneleditsky.cpp b/indra/newview/llpaneleditsky.cpp
index a169712bd885804a03d1240ec1d81e38268f2dc9..d17845ebc508564fb9c3a64622f0bd69408459a5 100644
--- a/indra/newview/llpaneleditsky.cpp
+++ b/indra/newview/llpaneleditsky.cpp
@@ -108,6 +108,8 @@ namespace
     const std::string   FIELD_SKY_DENSITY_DROPLET_RADIUS("droplet_radius");
     const std::string   FIELD_SKY_DENSITY_ICE_LEVEL("ice_level");
 
+    const std::string   FIELD_REFLECTION_PROBE_AMBIANCE("probe_ambiance");
+
     const F32 SLIDER_SCALE_SUN_AMBIENT(3.0f);
     const F32 SLIDER_SCALE_BLUE_HORIZON_DENSITY(2.0f);
     const F32 SLIDER_SCALE_GLOW_R(20.0f);
@@ -150,6 +152,7 @@ BOOL LLPanelSettingsSkyAtmosTab::postBuild()
     getChild<LLUICtrl>(FIELD_SKY_DENSITY_MOISTURE_LEVEL)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onMoistureLevelChanged(); });
     getChild<LLUICtrl>(FIELD_SKY_DENSITY_DROPLET_RADIUS)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onDropletRadiusChanged(); });
     getChild<LLUICtrl>(FIELD_SKY_DENSITY_ICE_LEVEL)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onIceLevelChanged(); });
+    getChild<LLUICtrl>(FIELD_REFLECTION_PROBE_AMBIANCE)->setCommitCallback([this](LLUICtrl*, const LLSD&) { onReflectionProbeAmbianceChanged(); });
     refresh();
 
     return TRUE;
@@ -172,6 +175,7 @@ void LLPanelSettingsSkyAtmosTab::setEnabled(BOOL enabled)
         getChild<LLUICtrl>(FIELD_SKY_DENSITY_MOISTURE_LEVEL)->setEnabled(enabled);
         getChild<LLUICtrl>(FIELD_SKY_DENSITY_DROPLET_RADIUS)->setEnabled(enabled);
         getChild<LLUICtrl>(FIELD_SKY_DENSITY_ICE_LEVEL)->setEnabled(enabled);
+        getChild<LLUICtrl>(FIELD_REFLECTION_PROBE_AMBIANCE)->setEnabled(enabled);
     }
 }
 
@@ -203,10 +207,12 @@ void LLPanelSettingsSkyAtmosTab::refresh()
     F32 moisture_level  = mSkySettings->getSkyMoistureLevel();
     F32 droplet_radius  = mSkySettings->getSkyDropletRadius();
     F32 ice_level       = mSkySettings->getSkyIceLevel();
+    F32 rp_ambiance     = mSkySettings->getReflectionProbeAmbiance();
 
     getChild<LLUICtrl>(FIELD_SKY_DENSITY_MOISTURE_LEVEL)->setValue(moisture_level);
     getChild<LLUICtrl>(FIELD_SKY_DENSITY_DROPLET_RADIUS)->setValue(droplet_radius);
     getChild<LLUICtrl>(FIELD_SKY_DENSITY_ICE_LEVEL)->setValue(ice_level);
+    getChild<LLUICtrl>(FIELD_REFLECTION_PROBE_AMBIANCE)->setValue(rp_ambiance);
 }
 
 //-------------------------------------------------------------------------
@@ -311,6 +317,15 @@ void LLPanelSettingsSkyAtmosTab::onIceLevelChanged()
     setIsDirty();
 }
 
+void LLPanelSettingsSkyAtmosTab::onReflectionProbeAmbianceChanged()
+{
+    if (!mSkySettings) return;
+    F32 ambiance = getChild<LLUICtrl>(FIELD_REFLECTION_PROBE_AMBIANCE)->getValue().asReal();
+    mSkySettings->setReflectionProbeAmbiance(ambiance);
+    mSkySettings->update();
+    setIsDirty();
+}
+
 //==========================================================================
 LLPanelSettingsSkyCloudTab::LLPanelSettingsSkyCloudTab() :
     LLPanelSettingsSky()
diff --git a/indra/newview/llpaneleditsky.h b/indra/newview/llpaneleditsky.h
index cb63d40b0c0c83deb6ba5af26adb3cab1ee7f446..cd89e02eeac3a647d9e69aaf38f37a3309442e69 100644
--- a/indra/newview/llpaneleditsky.h
+++ b/indra/newview/llpaneleditsky.h
@@ -79,6 +79,7 @@ class LLPanelSettingsSkyAtmosTab : public LLPanelSettingsSky
     void                    onMoistureLevelChanged();
     void                    onDropletRadiusChanged();
     void                    onIceLevelChanged();
+    void                    onReflectionProbeAmbianceChanged();
 
 };
 
diff --git a/indra/newview/llreflectionmap.cpp b/indra/newview/llreflectionmap.cpp
index 500485fc70f48e97ad28275017de1a2649e66802..4d4eb802f1bef33aff03cdc2278736f4721ba929 100644
--- a/indra/newview/llreflectionmap.cpp
+++ b/indra/newview/llreflectionmap.cpp
@@ -196,15 +196,13 @@ extern LLControlGroup gSavedSettings;
 
 F32 LLReflectionMap::getAmbiance()
 {
-    static LLCachedControl<F32> minimum_ambiance(gSavedSettings, "RenderReflectionProbeAmbiance", 0.f);
-
     F32 ret = 0.f;
     if (mViewerObject && mViewerObject->getVolume())
     {
         ret = ((LLVOVolume*)mViewerObject)->getReflectionProbeAmbiance();
     }
 
-    return llmax(ret, minimum_ambiance());
+    return ret;
 }
 
 F32 LLReflectionMap::getNearClip()
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index dc733687c32388861c473e6d32f1d86ea5085acf..48ed22d79f4144e9c9b3c1c2cd70c161cfdb84a2 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -33,6 +33,7 @@
 #include "pipeline.h"
 #include "llviewershadermgr.h"
 #include "llviewercontrol.h"
+#include "llenvironment.h"
 
 extern BOOL gCubeSnapshot;
 extern BOOL gTeleportDisplay;
@@ -559,6 +560,11 @@ void LLReflectionMapManager::updateUniforms()
     S32 count = 0;
     U32 nc = 0; // neighbor "cursor" - index into refNeighbor to start writing the next probe's list of neighbors
 
+    LLEnvironment& environment = LLEnvironment::instance();
+    LLSettingsSky::ptr_t psky = environment.getCurrentSky();
+
+    F32 minimum_ambiance = psky->getReflectionProbeAmbiance();
+
     for (auto* refmap : mReflectionMaps)
     {
         if (refmap == nullptr)
@@ -591,7 +597,7 @@ void LLReflectionMapManager::updateUniforms()
             rpd.refIndex[count][3] = -rpd.refIndex[count][3];
         }
 
-        rpd.refParams[count].set(refmap->getAmbiance(), 0.f, 0.f, 0.f);
+        rpd.refParams[count].set(llmax(minimum_ambiance, refmap->getAmbiance()), 0.f, 0.f, 0.f);
 
         S32 ni = nc; // neighbor ("index") - index into refNeighbor to write indices for current reflection probe's neighbors
         {
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index 14a9f4aa3012526b1abf8505b4f8b84b91876009..ed823fbba432d264b4905ce4cfa1a484fb28ab72 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -758,6 +758,7 @@ LLSettingsSky::parammapping_t LLSettingsVOSky::getParameterMap() const
         param_map[SETTING_SKY_DROPLET_RADIUS] = DefaultParam(LLShaderMgr::DROPLET_RADIUS, sky_defaults[SETTING_SKY_DROPLET_RADIUS]);
         param_map[SETTING_SKY_ICE_LEVEL] = DefaultParam(LLShaderMgr::ICE_LEVEL, sky_defaults[SETTING_SKY_ICE_LEVEL]);
 
+        param_map[SETTING_REFLECTION_PROBE_AMBIANCE] = DefaultParam(LLShaderMgr::REFLECTION_PROBE_AMBIANCE, sky_defaults[SETTING_REFLECTION_PROBE_AMBIANCE]);
 // AdvancedAtmospherics TODO
 // Provide mappings for new shader params here
     }
diff --git a/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml b/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml
index 6f82a0efa1a42fa21ca3162c91b9864c15d03fe6..094be36b01f9b2ccb22c88c3cae32818fbde4e67 100644
--- a/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml
+++ b/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml
@@ -315,6 +315,29 @@
                             top_delta="20"
                             width="219"
                             can_edit_text="true"/>
+                  <text
+                            follows="left|top"
+                            height="10"
+                            layout="topleft"
+                            left_delta="-5"
+                            top_delta="25"
+                            width="200">
+                    Reflection Probe Ambiance:
+                  </text>
+                  <slider
+                          decimal_digits="3"
+                          follows="left|top"
+                          height="16"
+                          increment="0.01"
+                          initial_value="0"
+                          layout="topleft"
+                          left_delta="5"
+                          min_val="0"
+                          max_val="1"
+                          name="probe_ambiance"
+                          top_delta="20"
+                          width="219"
+                          can_edit_text="true"/>
                 </layout_panel>            
             </layout_stack>                
         </layout_panel>