diff --git a/indra/llinventory/llsettingsbase.cpp b/indra/llinventory/llsettingsbase.cpp
index 80680948b53cb374ebc688a336e07213e16e8e90..4b8be043557f17c4645b520a54b5d43c8cd41dc3 100644
--- a/indra/llinventory/llsettingsbase.cpp
+++ b/indra/llinventory/llsettingsbase.cpp
@@ -230,6 +230,11 @@ LLSD LLSettingsBase::interpolateSDMap(const LLSD &settings, const LLSD &other, c
             // Blend against default value
             newSettings[key_name] = interpolateSDValue(key_name, def_iter->second.getDefaultValue(), (*it).second, defaults, mix, slerps);
         }
+        else if ((*it).second.type() == LLSD::TypeMap)
+        {
+            // interpolate in case there are defaults inside (part of legacy)
+            newSettings[key_name] = interpolateSDValue(key_name, LLSDMap(), (*it).second, defaults, mix, slerps);
+        }
         // else do nothing when no known defaults
         // TODO: Should I blend this out instead?
     }
diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index aff8bec1cd551120c2a9018edf56d4e692e41848..f21cca34a6847f8e0e7d2cd48fc971871235fe65 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -438,18 +438,56 @@ void LLSettingsSky::blend(const LLSettingsBase::ptr_t &end, F64 blendf)
     LLSettingsSky::ptr_t other = PTR_NAMESPACE::dynamic_pointer_cast<LLSettingsSky>(end);
     if (other)
     {
-        if (!mSettings.has(SETTING_LEGACY_HAZE) && !mSettings[SETTING_LEGACY_HAZE].has(SETTING_AMBIENT))
+        if (other->mSettings.has(SETTING_LEGACY_HAZE))
         {
-            // Special case since SETTING_AMBIENT is both in outer and legacy maps, we prioritize legacy one
-            // see getAmbientColor()
-            setAmbientColor(getAmbientColor());
+            if (!mSettings.has(SETTING_LEGACY_HAZE) || !mSettings[SETTING_LEGACY_HAZE].has(SETTING_AMBIENT))
+            {
+                // Special case since SETTING_AMBIENT is both in outer and legacy maps, we prioritize legacy one
+                // see getAmbientColor(), we are about to replaceSettings(), so we are free to set it
+                setAmbientColor(getAmbientColor());
+            }
+        }
+        else
+        {
+            if (mSettings.has(SETTING_LEGACY_HAZE) && mSettings[SETTING_LEGACY_HAZE].has(SETTING_AMBIENT))
+            {
+                // Special case due to ambient's duality
+                // We need to match 'other's' structure for interpolation.
+                // We are free to change mSettings, since we are about to reset it
+                mSettings[SETTING_AMBIENT] = getAmbientColor().getValue();
+                mSettings[SETTING_LEGACY_HAZE].erase(SETTING_AMBIENT);
+            }
+        }
+
+        LLUUID cloud_noise_id = getCloudNoiseTextureId();
+        LLUUID cloud_noise_id_next = other->getCloudNoiseTextureId();
+        F64 cloud_shadow = 0;
+        if (!cloud_noise_id.isNull() && cloud_noise_id_next.isNull())
+        {
+            // If there is no cloud texture in destination, reduce coverage to imitate disappearance
+            // See LLDrawPoolWLSky::renderSkyClouds... we don't blend present texture with null
+            // Note: Probably can be done by shader
+            cloud_shadow = lerp(mSettings[SETTING_CLOUD_SHADOW].asReal(), (F64)0.f, blendf);
+            cloud_noise_id_next = cloud_noise_id;
+        }
+        else if (cloud_noise_id.isNull() && !cloud_noise_id_next.isNull())
+        {
+            // Source has no cloud texture, reduce initial coverage to imitate appearance
+            // use same texture as destination
+            cloud_shadow = lerp((F64)0.f, other->mSettings[SETTING_CLOUD_SHADOW].asReal(), blendf);
+            setCloudNoiseTextureId(cloud_noise_id_next);
+        }
+        else
+        {
+            cloud_shadow = lerp(mSettings[SETTING_CLOUD_SHADOW].asReal(), other->mSettings[SETTING_CLOUD_SHADOW].asReal(), blendf);
         }
 
         LLSD blenddata = interpolateSDMap(mSettings, other->mSettings, other->getParameterMap(), blendf);
+        blenddata[SETTING_CLOUD_SHADOW] = LLSD::Real(cloud_shadow);
         replaceSettings(blenddata);
         mNextSunTextureId = other->getSunTextureId();
         mNextMoonTextureId = other->getMoonTextureId();
-        mNextCloudTextureId = other->getCloudNoiseTextureId();
+        mNextCloudTextureId = cloud_noise_id_next;
         mNextBloomTextureId = other->getBloomTextureId();
         mNextRainbowTextureId = other->getRainbowTextureId();
         mNextHaloTextureId = other->getHaloTextureId();
@@ -472,6 +510,7 @@ LLSettingsSky::stringset_t LLSettingsSky::getSkipInterpolateKeys() const
         skipSet.insert(SETTING_RAYLEIGH_CONFIG);
         skipSet.insert(SETTING_MIE_CONFIG);
         skipSet.insert(SETTING_ABSORPTION_CONFIG);
+        skipSet.insert(SETTING_CLOUD_SHADOW);
     }
 
     return skipSet;
diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index 3d3ab9e80bfe6bb59b1acb0083bce599b33b8d71..aff9dec0dbce685bfdfdd64a6bfa801b0859834c 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -51,6 +51,7 @@
 
 // newview
 #include "llagent.h"
+#include "llappviewer.h" //gDisconected
 #include "llparcel.h"
 #include "llflyoutcombobtn.h" //Todo: make a proper UI element/button/panel instead
 #include "llregioninfomodel.h"
@@ -1523,17 +1524,19 @@ void LLFloaterEditExtDayCycle::stopPlay()
 //static
 void LLFloaterEditExtDayCycle::onIdlePlay(void* user_data)
 {
-    LLFloaterEditExtDayCycle* self = (LLFloaterEditExtDayCycle*)user_data;
-
-    F32 prcnt_played = self->mPlayTimer.getElapsedTimeF32() / DAY_CYCLE_PLAY_TIME_SECONDS;
-    F32 new_frame = fmod(self->mPlayStartFrame + prcnt_played, 1.f);
+    if (!gDisconnected)
+    {
+        LLFloaterEditExtDayCycle* self = (LLFloaterEditExtDayCycle*)user_data;
 
-    self->mTimeSlider->setCurSliderValue(new_frame); // will do the rounding
-    self->mSkyBlender->setPosition(new_frame);
-    self->mWaterBlender->setPosition(new_frame);
-    self->synchronizeTabs();
-    self->updateTimeAndLabel();
+        F32 prcnt_played = self->mPlayTimer.getElapsedTimeF32() / DAY_CYCLE_PLAY_TIME_SECONDS;
+        F32 new_frame = fmod(self->mPlayStartFrame + prcnt_played, 1.f);
 
+        self->mTimeSlider->setCurSliderValue(new_frame); // will do the rounding
+        self->mSkyBlender->setPosition(new_frame);
+        self->mWaterBlender->setPosition(new_frame);
+        self->synchronizeTabs();
+        self->updateTimeAndLabel();
+    }
 }
 
 
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 1147f5485359b9b4de06709a6a6c002cae76c81d..0ff660fcadacc6dc712cb0b68ada7e0d908db5c9 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -255,7 +255,7 @@ LLPanelLandCovenant* LLFloaterLand::getCurrentPanelLandCovenant()
 // static
 void LLFloaterLand::refreshAll()
 {
-	LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
+	LLFloaterLand* land_instance = LLFloaterReg::findTypedInstance<LLFloaterLand>("about_land");
 	if(land_instance)
 	{
 		land_instance->refresh();
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index fe45bdc6716178e47f450715bb8f2c54c25f0f2a..b890e21e418351ed271845419def010ee2b80609 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -1001,7 +1001,7 @@ void LLVOSky::setMoonTextures(const LLUUID& moon_texture, const LLUUID& moon_tex
     LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
 
     LLUUID moon_tex = moon_texture.isNull() ? psky->GetDefaultMoonTextureId() : moon_texture;
-    LLUUID moon_tex_next = moon_texture_next.isNull() ? (moon_texture.isNull() ? psky->GetDefaultMoonTextureId() : moon_texture) : moon_texture_next;
+    LLUUID moon_tex_next = moon_texture_next.isNull() ? psky->GetDefaultMoonTextureId() : moon_texture_next;
 
     mMoonTexturep[0] = moon_tex.isNull() ? nullptr : LLViewerTextureManager::getFetchedTexture(moon_tex, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI);
     mMoonTexturep[1] = moon_tex_next.isNull() ? nullptr : LLViewerTextureManager::getFetchedTexture(moon_tex_next, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI);
@@ -1026,10 +1026,8 @@ void LLVOSky::setCloudNoiseTextures(const LLUUID& cloud_noise_texture, const LLU
 {
     LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
 
-    LLUUID cloud_noise_tex_next = cloud_noise_texture_next.isNull() ? (cloud_noise_texture.isNull() ? LLUUID() : cloud_noise_texture) : cloud_noise_texture_next;
-
     mCloudNoiseTexturep[0] = cloud_noise_texture.isNull() ? nullptr : LLViewerTextureManager::getFetchedTexture(cloud_noise_texture, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI);
-    mCloudNoiseTexturep[1] = cloud_noise_tex_next.isNull() ? nullptr : LLViewerTextureManager::getFetchedTexture(cloud_noise_tex_next, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI);
+    mCloudNoiseTexturep[1] = cloud_noise_texture_next.isNull() ? nullptr : LLViewerTextureManager::getFetchedTexture(cloud_noise_texture_next, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI);
 
     if (mCloudNoiseTexturep[0])
     {