diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index 5047f312f0aa94d14c6fe1e54fdfa13ced9de2a4..75b4415086a6bd1aa6054e957e30003097120cba 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -1184,24 +1184,34 @@ LLColor3 LLSettingsSky::getLightAttenuation(F32 distance) const
     return light_atten;
 }
 
-LLColor3 LLSettingsSky::getLightTransmittance() const
+LLColor3 LLSettingsSky::getLightTransmittance(F32 distance) const
 {
     LLColor3 total_density      = getTotalDensity();
     F32      density_multiplier = getDensityMultiplier();
     // Transparency (-> density) from Beer's law
-    LLColor3 transmittance = componentExp(total_density * -density_multiplier);
+    LLColor3 transmittance = componentExp(total_density * -(density_multiplier * distance));
     return transmittance;
 }
 
+// performs soft scale clip and gamma correction ala the shader implementation
+// scales colors down to 0 - 1 range preserving relative ratios
 LLColor3 LLSettingsSky::gammaCorrect(const LLColor3& in) const
 {
     F32 gamma = getGamma();
+
     LLColor3 v(in);
-    v.clamp();
-    v= smear(1.0f) - v;
-    v = componentPow(v, gamma);
-    v = smear(1.0f) - v;
-    return v;
+    // scale down to 0 to 1 range preserving relative ratio (aka homegenize)
+    F32 max_color = llmax(llmax(in.mV[0], in.mV[1]), in.mV[2]);
+    if (max_color > 1.0f)
+    {
+        v *= 1.0f / max_color;
+    }
+
+    LLColor3 color = in * 2.0f;
+	color = smear(1.f) - componentSaturate(color); // clamping after mul seems wrong, but prevents negative colors...
+	componentPow(color, gamma);
+	color = smear(1.f) - color;
+    return color;
 }
 
 LLVector3 LLSettingsSky::getSunDirection() const
@@ -1240,6 +1250,12 @@ LLColor3 LLSettingsSky::getSunDiffuse() const
     return mSunDiffuse;
 }
 
+LLColor4 LLSettingsSky::getHazeColor() const
+{
+    update();
+    return mHazeColor;
+}
+
 LLColor4 LLSettingsSky::getTotalAmbient() const
 {
     update();
@@ -1255,14 +1271,19 @@ LLColor3 LLSettingsSky::getMoonlightColor() const
     return moonlight;
 }
 
-void LLSettingsSky::clampColor(LLColor3& color) const
+void LLSettingsSky::clampColor(LLColor3& color, F32 gamma, F32 scale) const
 {
     F32 max_color = llmax(color.mV[0], color.mV[1], color.mV[2]);
-    if (max_color > 1.f)
+    if (max_color > scale)
     {
-        color *= 1.f/max_color;
+        color *= scale/max_color;
     }
-    color.clamp();
+    LLColor3 linear(color);
+    linear *= 1.0 / scale;
+    linear = smear(1.0f) - linear;
+    linear = componentPow(linear, gamma);
+    linear *= scale;
+    color = linear;
 }
 
 void LLSettingsSky::calculateLightSettings() const
@@ -1278,7 +1299,7 @@ void LLSettingsSky::calculateLightSettings() const
     // this is used later for sunlight modulation at various altitudes
     F32         max_y               = getMaxY();
     LLColor3    light_atten         = getLightAttenuation(max_y);
-    LLColor3    light_transmittance = getLightTransmittance();
+    LLColor3    light_transmittance = getLightTransmittance(max_y);
 
     // and vary_sunlight will work properly with moon light
     const F32 LIMIT = FLT_EPSILON * 8.0f;
@@ -1291,16 +1312,34 @@ void LLSettingsSky::calculateLightSettings() const
     lighty = llmax(LIMIT, lighty);
     componentMultBy(sunlight, componentExp((light_atten * -1.f) * lighty));
     componentMultBy(sunlight, light_transmittance);
-    clampColor(sunlight);
+
+    F32 max_color = llmax(sunlight.mV[0], sunlight.mV[1], sunlight.mV[2]);
+    if (max_color > 1.0f)
+    {
+        sunlight *= 1.0f/max_color;
+    }
 
     //increase ambient when there are more clouds
     LLColor3 tmpAmbient = ambient + (smear(1.f) - ambient) * cloud_shadow * 0.5;
     componentMultBy(tmpAmbient, light_transmittance);
-    clampColor(tmpAmbient);
+
+    //tmpAmbient = LLColor3::clamp(tmpAmbient, getGamma(), 1.0f);
+    max_color = llmax(tmpAmbient.mV[0], tmpAmbient.mV[1], tmpAmbient.mV[2]);
+    if (max_color > 1.0f)
+    {
+        tmpAmbient *= 1.0f/max_color;
+    }
 
     //brightness of surface both sunlight and ambient
-    mSunDiffuse = gammaCorrect(sunlight);
-    mSunAmbient = gammaCorrect(tmpAmbient);
+    mSunDiffuse = sunlight;
+    mSunAmbient = tmpAmbient;
+    F32 haze_horizon = getHazeHorizon();
+    
+    sunlight *= 1.0 - cloud_shadow;
+    sunlight += tmpAmbient;
+
+    mHazeColor = getBlueHorizon() * getBlueDensity() * sunlight;
+    mHazeColor += LLColor4(haze_horizon, haze_horizon, haze_horizon, haze_horizon) * getHazeDensity() * sunlight;
 
     F32 moon_brightness = getIsMoonUp() ? getMoonBrightness() : 0.001f;
 
@@ -1308,10 +1347,10 @@ void LLSettingsSky::calculateLightSettings() const
     LLColor3 moonlight_b(0.66, 0.66, 1.2); // scotopic ambient value
 
     componentMultBy(moonlight, componentExp((light_atten * -1.f) * lighty));
-    clampColor(moonlight);
+    clampColor(moonlight, getGamma(), 1.0f);
 
-    mMoonDiffuse  = gammaCorrect(componentMult(moonlight, light_transmittance) * moon_brightness);
-    mMoonAmbient  = gammaCorrect(componentMult(moonlight_b, light_transmittance) * 0.0125f);
+    mMoonDiffuse  = componentMult(moonlight, light_transmittance) * moon_brightness;
+    mMoonAmbient  = componentMult(moonlight_b, light_transmittance) * 0.0125f;
 
     mTotalAmbient = mSunAmbient;
 }
diff --git a/indra/llinventory/llsettingssky.h b/indra/llinventory/llsettingssky.h
index d04209a1a1704f330027ea6eaa2e7defe90076d1..e562fe38ff3e79716f50b6b1f3b28c81b4f87723 100644
--- a/indra/llinventory/llsettingssky.h
+++ b/indra/llinventory/llsettingssky.h
@@ -251,7 +251,7 @@ class LLSettingsSky: public LLSettingsBase
     static LLSD translateLegacyHazeSettings(const LLSD& legacy);
 
     LLColor3 getLightAttenuation(F32 distance) const;
-    LLColor3 getLightTransmittance() const;
+    LLColor3 getLightTransmittance(F32 distance) const;
     LLColor3 getTotalDensity() const;
     LLColor3 gammaCorrect(const LLColor3& in) const;
 
@@ -290,6 +290,7 @@ class LLSettingsSky: public LLSettingsBase
     LLColor4  getSunAmbient() const;
     LLColor3  getSunDiffuse() const;
     LLColor4  getTotalAmbient() const;
+    LLColor4  getHazeColor() const;
 
     virtual LLSettingsBase::ptr_t buildDerivedClone() const SETTINGS_OVERRIDE { return buildClone(); }
 
@@ -346,7 +347,7 @@ class LLSettingsSky: public LLSettingsBase
 
     void        calculateHeavenlyBodyPositions() const;
     void        calculateLightSettings() const;
-    void        clampColor(LLColor3& color) const;
+    void        clampColor(LLColor3& color, F32 gamma, const F32 scale = 1.0f) const;
 
     mutable LLVector3   mSunDirection;
     mutable LLVector3   mMoonDirection;
@@ -360,6 +361,7 @@ class LLSettingsSky: public LLSettingsBase
     mutable LLColor4    mSunAmbient;
     mutable LLColor3    mSunDiffuse;
     mutable LLColor4    mTotalAmbient;
+    mutable LLColor4    mHazeColor;
 
     typedef std::map<std::string, S32> mapNameToUniformId_t;
 
diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp
index 516302676d83c0818af1cb0454aa75feba130254..12614b5e2d6adf742648d8c9c00db812283b609f 100644
--- a/indra/newview/lldrawpoolsky.cpp
+++ b/indra/newview/lldrawpoolsky.cpp
@@ -129,7 +129,9 @@ void LLDrawPoolSky::renderSkyCubeFace(U8 side)
 
 	llassert(mSkyTex);
 	mSkyTex[side].bindTexture(TRUE);
-	
+
+    gGL.getTexUnit(0)->setTextureColorSpace(LLTexUnit::TCS_SRGB);
+
 	face.renderIndexed();
 
 	if (LLSkyTex::doInterpolate())
diff --git a/indra/newview/lllegacyatmospherics.cpp b/indra/newview/lllegacyatmospherics.cpp
index b6c46b9ff9dd17b12c67f02ee16871e032256dbd..d56e6bd5d63e7b4fd62025394655e4fd3b2e5e6b 100644
--- a/indra/newview/lllegacyatmospherics.cpp
+++ b/indra/newview/lllegacyatmospherics.cpp
@@ -204,6 +204,8 @@ void LLAtmospherics::init()
 
 LLColor4 LLAtmospherics::calcSkyColorInDir(AtmosphericsVars& vars, const LLVector3 &dir, bool isShiny)
 {
+    LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
+
 	F32 saturation = 0.3f;
 
 	if (isShiny && dir.mV[VZ] < -0.02f)
@@ -240,17 +242,8 @@ LLColor4 LLAtmospherics::calcSkyColorInDir(AtmosphericsVars& vars, const LLVecto
 
 	calcSkyColorWLVert(Pn, vars);
 
-#if SL_11371
-    if (dir.mV[VZ] < 0.4f)
-    {
-        LLColor4 col = LLColor4(llmax(mFogColor[0],0.2f), llmax(mFogColor[1],0.2f), llmax(mFogColor[2],0.22f),0.f);   
-        col *= dir * LLVector3(0,1,0);
-        col += vars.hazeColor;
-        return col;
-    }	
-#endif
-
-	LLColor3 sky_color =  calcSkyColorWLFrag(Pn, vars);
+	LLColor3 sky_color =  psky->gammaCorrect(vars.hazeColor * 2.0f);
+
 	if (isShiny)
 	{
 		F32 brightness = sky_color.brightness();
@@ -261,17 +254,19 @@ LLColor4 LLAtmospherics::calcSkyColorInDir(AtmosphericsVars& vars, const LLVecto
 	return LLColor4(sky_color, 0.0f);
 }
 
+const F32 NIGHTTIME_ELEVATION = -8.0f; // degrees
+const F32 NIGHTTIME_ELEVATION_SIN = (F32)sinf(NIGHTTIME_ELEVATION*DEG_TO_RAD);
+
 void LLAtmospherics::calcSkyColorWLVert(LLVector3 & Pn, AtmosphericsVars& vars)
 {
-// LEGACY_ATMOSPHERICS
-    //LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
+    LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
 
     LLColor3    blue_density = vars.blue_density;
     LLColor3    blue_horizon = vars.blue_horizon;
     F32         haze_horizon = vars.haze_horizon;
     F32         haze_density = vars.haze_density;
     F32         density_multiplier = vars.density_multiplier;
-    //F32         distance_multiplier = vars.distance_multiplier;
+    F32         distance_multiplier = vars.distance_multiplier;
     F32         max_y = vars.max_y;
     LLVector4   sun_norm = vars.sun_norm;
 
@@ -287,9 +282,6 @@ void LLAtmospherics::calcSkyColorWLVert(LLVector3 & Pn, AtmosphericsVars& vars)
 
 	Pn *= Plen;
 
-	vars.horizontalProjection[0] = LLVector2(Pn[0], Pn[2]);
-	vars.horizontalProjection[0] /= - 2.f * Plen;
-
 	// Set altitude
 	if (Pn[1] > 0.f)
 	{
@@ -313,26 +305,38 @@ void LLAtmospherics::calcSkyColorWLVert(LLVector3 & Pn, AtmosphericsVars& vars)
 	// Sunlight attenuation effect (hue and brightness) due to atmosphere
 	// this is used later for sunlight modulation at various altitudes
 	LLColor3 light_atten = vars.light_atten;
+    LLColor3 light_transmittance = psky->getLightTransmittance(Plen);
 
 	// Calculate relative weights
 	LLColor3 temp2(0.f, 0.f, 0.f);
-	LLColor3 temp1 = vars.light_transmittance;
+	LLColor3 temp1 = vars.total_density;
 
 	LLColor3 blue_weight = componentDiv(blue_density, temp1);
 	LLColor3 haze_weight = componentDiv(smear(haze_density), temp1);
 
+    F32 lighty = sun_norm.mV[1];
+	if(lighty < NIGHTTIME_ELEVATION_SIN)
+	{
+		lighty = -lighty;
+	}
+
 	// Compute sunlight from P & lightnorm (for long rays like sky)
-	temp2.mV[1] = llmax(F_APPROXIMATELY_ZERO, llmax(0.f, Pn[1]) * 1.0f + sun_norm[1] );
+    temp2.mV[1] = llmax(F_APPROXIMATELY_ZERO, llmax(0.f, lighty));
+
+    if (temp2.mV[1] > 0.0000001f)
+    {
+	    temp2.mV[1] = 1.f / temp2.mV[1];
+    }
+    temp2.mV[1] = llmax(temp2.mV[1], 0.0000001f);
 
-	temp2.mV[1] = 1.f / temp2.mV[1];
-	componentMultBy(sunlight, componentExp((light_atten * -1.f) * temp2.mV[1]));
+    componentMultBy(sunlight, componentExp((light_atten * -1.f) * temp2.mV[1]));
+    componentMultBy(sunlight, light_transmittance);
 
-	// Distance
+    // Distance
 	temp2.mV[2] = Plen * density_multiplier;
 
-	// Transparency (-> temp1)
-	temp1 = componentExp((temp1 * -1.f) * temp2.mV[2]);// * distance_multiplier);
-
+    // Transparency (-> temp1)
+	temp1 = componentExp((temp1 * -1.f) * temp2.mV[2] * distance_multiplier);
 
 	// Compute haze glow
 	temp2.mV[0] = Pn * LLVector3(sun_norm);
@@ -342,15 +346,8 @@ void LLAtmospherics::calcSkyColorWLVert(LLVector3 & Pn, AtmosphericsVars& vars)
 	temp2.mV[0] = llmax(temp2.mV[0], .001f);	
 		// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
 
-	if (glow.mV[0] > 0) // don't pow(zero,negative value), glow from 0 to 2
-	{
-		// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
-		temp2.mV[0] *= glow.mV[0];
-	}
-	else
-	{
-		temp2.mV[0] = F32_MIN;
-	}
+	// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
+	temp2.mV[0] *= (glow.mV[0] > 0) ? glow.mV[0] : F32_MIN;
 
 	temp2.mV[0] = pow(temp2.mV[0], glow.mV[2]);
 		// glow.z should be negative, so we're doing a sort of (1 / "angle") function
@@ -371,95 +368,16 @@ void LLAtmospherics::calcSkyColorWLVert(LLVector3 & Pn, AtmosphericsVars& vars)
 	// Haze color below cloud
 	vars.hazeColorBelowCloud = (blue_horizon * blue_weight * (sunlight + tmpAmbient) + componentMult(haze_horizon * haze_weight, sunlight * temp2.mV[0] + tmpAmbient));	
 
-	// Final atmosphere additive
-	componentMultBy(vars.hazeColor, LLColor3::white - temp1);
-
-	sunlight = vars.sunlight;
-	temp2.mV[1] = llmax(F_APPROXIMATELY_ZERO, sun_norm[1] * 2.f);
-	temp2.mV[1] = 1.f / temp2.mV[1];
-	componentMultBy(sunlight, componentExp((light_atten * -1.f) * temp2.mV[1]));
+    LLColor3 final_atten = LLColor3::white - temp1;
+    final_atten.mV[0] = llmax(final_atten.mV[0], 0.0f);
+    final_atten.mV[1] = llmax(final_atten.mV[1], 0.0f);
+    final_atten.mV[2] = llmax(final_atten.mV[2], 0.0f);
 
-	// Attenuate cloud color by atmosphere
-	temp1 = componentSqrt(temp1);	//less atmos opacity (more transparency) below clouds
+	// Final atmosphere additive
+	componentMultBy(vars.hazeColor, final_atten);
 
 	// At horizon, blend high altitude sky color towards the darker color below the clouds
-	vars.hazeColor += componentMult(vars.hazeColorBelowCloud - vars.hazeColor, LLColor3::white - componentSqrt(temp1));
-
-#if SL_11371
-	if (Pn[1] < 0.f)
-	{
-		// Eric's original: 
-		// LLColor3 dark_brown(0.143f, 0.129f, 0.114f);
-		LLColor3 dark_brown(0.082f, 0.076f, 0.066f);
-		LLColor3 brown(0.430f, 0.386f, 0.322f);
-		LLColor3 sky_lighting = sunlight + ambient;
-		F32 haze_brightness = vars.hazeColor.brightness();
-
-		if (Pn[1] < -0.05f)
-		{
-			vars.hazeColor = colorMix(dark_brown, brown, -Pn[1] * 0.9f) * sky_lighting * haze_brightness;
-		}
-		
-		if (Pn[1] > -0.1f)
-		{
-			vars.hazeColor = colorMix(LLColor3::white * haze_brightness, vars.hazeColor, fabs((Pn[1] + 0.05f) * -20.f));
-		}
-	}
-#endif
-
-}
-
-LLColor3 LLAtmospherics::calcSkyColorWLFrag(LLVector3 & Pn, AtmosphericsVars& vars)
-{
-    LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
-    
-
-	LLColor3 res;
-	LLColor3 color0 = vars.hazeColor;
-	
-	if (!gPipeline.canUseWindLightShaders())
-	{
-		res = psky->gammaCorrect(color0 * 2.0f);
-	} 
-	else 
-	{
-		res = color0;
-	}
-
-#ifndef LL_RELEASE_FOR_DOWNLOAD
-    F32 gamma = psky->getGamma();
-	LLColor3 color2 = 2.f * color0;
-	LLColor3 color3 = LLColor3(1.f, 1.f, 1.f) - componentSaturate(color2);
-	componentPow(color3, gamma);
-	color3 = LLColor3(1.f, 1.f, 1.f) - color3;
-
-	static enum {
-		OUT_DEFAULT		= 0,
-		OUT_SKY_BLUE	= 1,
-		OUT_RED			= 2,
-		OUT_PN			= 3,
-		OUT_HAZE		= 4,
-	} debugOut = OUT_DEFAULT;
-
-	switch(debugOut) 
-	{
-		case OUT_DEFAULT:
-			break;
-		case OUT_SKY_BLUE:
-			res = LLColor3(0.4f, 0.4f, 0.9f);
-			break;
-		case OUT_RED:
-			res = LLColor3(1.f, 0.f, 0.f);
-			break;
-		case OUT_PN:
-			res = LLColor3(Pn[0], Pn[1], Pn[2]);
-			break;
-		case OUT_HAZE:
-			res = vars.hazeColor;
-			break;
-	}
-#endif // LL_RELEASE_FOR_DOWNLOAD
-	return res;
+	vars.hazeColor += componentMult(vars.hazeColorBelowCloud - vars.hazeColor, final_atten);
 }
 
 void LLAtmospherics::updateFog(const F32 distance, const LLVector3& tosun_in)
@@ -520,10 +438,10 @@ void LLAtmospherics::updateFog(const F32 distance, const LLVector3& tosun_in)
     vars.blue_horizon = psky->getBlueHorizon();
     vars.haze_density = psky->getHazeDensity();
     vars.haze_horizon = psky->getHazeHorizon();
-    vars.density_multiplier = psky->getDensityMultiplier();
+    vars.density_multiplier = psky->getDensityMultiplier();    
     vars.distance_multiplier = psky->getDistanceMultiplier();
     vars.max_y = psky->getMaxY();
-    vars.sun_norm = LLEnvironment::instance().getClampedSunNorm();
+    vars.sun_norm = LLEnvironment::instance().getLightDirectionCFR();
     vars.sunlight = psky->getSunlightColor();
     vars.ambient = psky->getAmbientColor();    
     vars.glow = psky->getGlow();
@@ -531,7 +449,9 @@ void LLAtmospherics::updateFog(const F32 distance, const LLVector3& tosun_in)
     vars.dome_radius = psky->getDomeRadius();
     vars.dome_offset = psky->getDomeOffset();
     vars.light_atten = psky->getLightAttenuation(vars.max_y);
-    vars.light_transmittance = psky->getLightTransmittance();
+    vars.light_transmittance = psky->getLightTransmittance(vars.max_y);
+    vars.total_density = psky->getTotalDensity();
+    vars.gamma = psky->getGamma();
 
 	res_color[0] = calcSkyColorInDir(vars, tosun);
 	res_color[1] = calcSkyColorInDir(vars, perp_tosun);
diff --git a/indra/newview/lllegacyatmospherics.h b/indra/newview/lllegacyatmospherics.h
index 22ed37f830d58662b1d26d5ab759754b2519227b..e304ac3043cc141b4068e8fe3a2ae2f5fcb7c64f 100644
--- a/indra/newview/lllegacyatmospherics.h
+++ b/indra/newview/lllegacyatmospherics.h
@@ -204,8 +204,6 @@ class AtmosphericsVars
     , light_atten()
     , light_transmittance()
     {
-        horizontalProjection[0] = LLVector2(0,0);
-        horizontalProjection[1] = LLVector2(0,0);
     }
 
     LLColor3  hazeColor;
@@ -213,7 +211,6 @@ class AtmosphericsVars
 	LLColor3  cloudColorSun;
 	LLColor3  cloudColorAmbient;
 	F32       cloudDensity;
-	LLVector2 horizontalProjection[2];
     LLColor3  blue_density;
     LLColor3  blue_horizon;
     F32       haze_density;
@@ -231,6 +228,7 @@ class AtmosphericsVars
     F32       dome_offset;
     LLColor3 light_atten;
     LLColor3 light_transmittance;
+    LLColor3 total_density;
 };
 
 class LLAtmospherics
@@ -260,7 +258,6 @@ class LLAtmospherics
 protected:    
 
     void     calcSkyColorWLVert(LLVector3 & Pn, AtmosphericsVars& vars);
-    LLColor3 calcSkyColorWLFrag(LLVector3 & Pn, AtmosphericsVars& vars);
     LLColor3 getHazeColor(LLSettingsSky::ptr_t psky, AtmosphericsVars& vars, F32 costheta, F32 cloud_shadow);
 
     LLHaze              mHaze;
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 745278bf0c72208c52cb370845b41c74ad19d1e0..3afc57d9ba164e17e3c3d0e8c17ca891cf2bfee3 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -207,16 +207,7 @@ void LLSkyTex::create(const F32 brightness)
 
 void LLSkyTex::createGLImage(S32 which)
 {	
-#if USE_SRGB_DECODE
-    if (LLPipeline::RenderDeferred)
-    {
-        mTexture[which]->setExplicitFormat(GL_SRGB8_ALPHA8, GL_RGBA);
-    }
-    else
-#endif
-    {
-        mTexture[which]->setExplicitFormat(GL_RGBA8, GL_RGBA);
-    }
+    mTexture[which]->setExplicitFormat(GL_SRGB8_ALPHA8, GL_RGBA);
 	mTexture[which]->createGLTexture(0, mImageRaw[which], 0, TRUE, LLGLTexture::LOCAL);
 	mTexture[which]->setAddressMode(LLTexUnit::TAM_CLAMP);
 }
@@ -478,7 +469,7 @@ void LLVOSky::init()
     m_atmosphericsVars.haze_horizon = psky->getHazeHorizon();
     m_atmosphericsVars.density_multiplier = psky->getDensityMultiplier();
     m_atmosphericsVars.max_y = psky->getMaxY();
-    m_atmosphericsVars.sun_norm = LLEnvironment::instance().getClampedSunNorm();
+    m_atmosphericsVars.sun_norm = LLEnvironment::instance().getClampedLightNorm();
     m_atmosphericsVars.sunlight = psky->getSunlightColor();
     m_atmosphericsVars.ambient = psky->getAmbientColor();    
     m_atmosphericsVars.glow = psky->getGlow();
@@ -486,7 +477,8 @@ void LLVOSky::init()
     m_atmosphericsVars.dome_radius = psky->getDomeRadius();
     m_atmosphericsVars.dome_offset = psky->getDomeOffset();
     m_atmosphericsVars.light_atten = psky->getLightAttenuation(m_atmosphericsVars.max_y);
-    m_atmosphericsVars.light_transmittance = psky->getLightTransmittance();
+    m_atmosphericsVars.light_transmittance = psky->getLightTransmittance(m_atmosphericsVars.max_y);
+    m_atmosphericsVars.total_density = psky->getTotalDensity();
     m_atmosphericsVars.gamma = psky->getGamma();
 
 	// Initialize the cached normalized direction vectors
@@ -496,7 +488,7 @@ void LLVOSky::init()
 		{
 			initSkyTextureDirs(side, tile);
 			createSkyTexture(m_atmosphericsVars, side, tile, mSkyTex);
-            createSkyTexture(m_atmosphericsVars, side, tile, mShinyTex);
+            createSkyTexture(m_atmosphericsVars, side, tile, mShinyTex, true);
 		}
 	}
 
@@ -527,8 +519,9 @@ void LLVOSky::calc()
     m_atmosphericsVars.haze_density = psky->getHazeDensity();
     m_atmosphericsVars.haze_horizon = psky->getHazeHorizon();
     m_atmosphericsVars.density_multiplier = psky->getDensityMultiplier();
+    m_atmosphericsVars.distance_multiplier = psky->getDistanceMultiplier();
     m_atmosphericsVars.max_y = psky->getMaxY();
-    m_atmosphericsVars.sun_norm = LLEnvironment::instance().getClampedSunNorm();
+    m_atmosphericsVars.sun_norm = LLEnvironment::instance().getClampedLightNorm();
     m_atmosphericsVars.sunlight = psky->getSunlightColor();
     m_atmosphericsVars.ambient = psky->getAmbientColor();    
     m_atmosphericsVars.glow = psky->getGlow();
@@ -536,72 +529,10 @@ void LLVOSky::calc()
     m_atmosphericsVars.dome_radius = psky->getDomeRadius();
     m_atmosphericsVars.dome_offset = psky->getDomeOffset();
     m_atmosphericsVars.light_atten = psky->getLightAttenuation(m_atmosphericsVars.max_y);
-    m_atmosphericsVars.light_transmittance = psky->getLightTransmittance();
+    m_atmosphericsVars.light_transmittance = psky->getLightTransmittance(m_atmosphericsVars.max_y);
     m_atmosphericsVars.gamma = psky->getGamma();
 
-	LLColor3 vary_HazeColor;
-	LLColor3 vary_SunlightColor;
-	LLColor3 vary_AmbientColor;
-	{
-		// Initialize temp variables
-		LLColor3 sunlight = m_atmosphericsVars.sunlight;
-
-		// Sunlight attenuation effect (hue and brightness) due to atmosphere
-		// this is used later for sunlight modulation at various altitudes
-		LLColor3 light_atten =
-			(m_atmosphericsVars.blue_density * 1.0 + smear(m_atmosphericsVars.haze_density * 0.25f)) * (m_atmosphericsVars.density_multiplier * m_atmosphericsVars.max_y);
-
-		// Calculate relative weights
-		LLColor3 temp2(0.f, 0.f, 0.f);
-		LLColor3 temp1 = m_atmosphericsVars.blue_density + smear(m_atmosphericsVars.haze_density);
-		LLColor3 blue_weight = componentDiv(m_atmosphericsVars.blue_density, temp1);
-		LLColor3 haze_weight = componentDiv(smear(m_atmosphericsVars.haze_density), temp1);
-
-		// Compute sunlight from P & lightnorm (for long rays like sky)
-		/// USE only lightnorm.
-		// temp2[1] = llmax(0.f, llmax(0.f, Pn[1]) * 1.0f + lightnorm[1] );
-		F32 lighty = getSun().getDirection().mV[2];
-		temp2.mV[1] = llmax(0.f, lighty);
-		if(temp2.mV[1] > 0.f)
-		{
-			temp2.mV[1] = 1.f / temp2.mV[1];
-		}
-		componentMultBy(sunlight, componentExp((light_atten * -1.f) * temp2.mV[1]));
-
-		// Distance
-		temp2.mV[2] = m_atmosphericsVars.density_multiplier;
-
-		// Transparency (-> temp1)
-		temp1 = componentExp((temp1 * -1.f) * temp2.mV[2]);
-
-		// vary_AtmosAttenuation = temp1; 
-
-		//increase ambient when there are more clouds
-		LLColor3 tmpAmbient = m_atmosphericsVars.ambient + (smear(1.f) - m_atmosphericsVars.ambient) * m_atmosphericsVars.cloud_shadow * 0.5f;
-
-		//haze color
-		vary_HazeColor =
-			(m_atmosphericsVars.blue_horizon * blue_weight * (sunlight * (1.f - m_atmosphericsVars.cloud_shadow) + tmpAmbient)	
-			+ componentMult(m_atmosphericsVars.haze_horizon * haze_weight, sunlight * (1.f - m_atmosphericsVars.cloud_shadow) * temp2.mV[0] + tmpAmbient)
-				 );	
-
-		//brightness of surface both sunlight and ambient
-		vary_SunlightColor = componentMult(sunlight, temp1) * 1.f;
-		vary_SunlightColor.clamp();
-		vary_SunlightColor = smear(1.0f) - vary_SunlightColor;
-		vary_SunlightColor = componentPow(vary_SunlightColor, m_atmosphericsVars.gamma);
-		vary_SunlightColor = smear(1.0f) - vary_SunlightColor;
-		vary_AmbientColor = componentMult(tmpAmbient, temp1) * 0.5;
-		vary_AmbientColor.clamp();
-		vary_AmbientColor = smear(1.0f) - vary_AmbientColor;
-		vary_AmbientColor = componentPow(vary_AmbientColor, m_atmosphericsVars.gamma);
-		vary_AmbientColor = smear(1.0f) - vary_AmbientColor;
-
-		componentMultBy(vary_HazeColor, LLColor3(1.f, 1.f, 1.f) - temp1);
-
-	}
-
-	mSun.setColor(vary_SunlightColor);
+	mSun.setColor(psky->getSunDiffuse());
 	mMoon.setColor(LLColor3(1.0f, 1.0f, 1.0f));
 
 	mSun.renewDirection();
@@ -617,17 +548,17 @@ void LLVOSky::initCubeMap()
 	{
 		images.push_back(mShinyTex[side].getImageRaw());
 	}
-	if (mCubeMap)
+	
+	if (!mCubeMap && gSavedSettings.getBOOL("RenderWater") && gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps)
+	{
+        mCubeMap = new LLCubeMap(true);
+	}
+
+    if (mCubeMap)
 	{
 		mCubeMap->init(images);
 	}
-	else if (gSavedSettings.getBOOL("RenderWater") && gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps)
-	{
-        bool wantsRGB = LLPipeline::RenderDeferred;
 
-        mCubeMap = new LLCubeMap(wantsRGB);
-        mCubeMap->init(images);
-	}
 	gGL.getTexUnit(0)->disable();
 }
 
@@ -709,7 +640,7 @@ void LLVOSky::initSkyTextureDirs(const S32 side, const S32 tile)
 	}
 }
 
-void LLVOSky::createSkyTexture(AtmosphericsVars& vars, const S32 side, const S32 tile, LLSkyTex* tex)
+void LLVOSky::createSkyTexture(AtmosphericsVars& vars, const S32 side, const S32 tile, LLSkyTex* tex, bool is_shiny)
 {
 	S32 tile_x = tile % NUM_TILES_X;
 	S32 tile_y = tile / NUM_TILES_X;
@@ -722,7 +653,7 @@ void LLVOSky::createSkyTexture(AtmosphericsVars& vars, const S32 side, const S32
 	{
 		for (x = tile_x_pos; x < (tile_x_pos + sTileResX); ++x)
 		{
-			tex[side].setPixel(m_legacyAtmospherics.calcSkyColorInDir(vars, tex[side].getDir(x, y), true), x, y);
+			tex[side].setPixel(m_legacyAtmospherics.calcSkyColorInDir(vars, tex[side].getDir(x, y), is_shiny), x, y);
 		}
 	}
 }
@@ -740,9 +671,6 @@ void LLVOSky::updateDirections(void)
     mSun.setRotation(psky->getSunRotation());
 	mMoon.setRotation(psky->getMoonRotation());
 
-    mSun.setColor(psky->getSunlightColor());
-	mMoon.setColor(psky->getMoonDiffuse());
-
 	mSun.renewDirection();
 	mSun.renewColor();
 	mMoon.renewDirection();
@@ -834,7 +762,7 @@ bool LLVOSky::updateSky()
 				{
 					for (int tile = 0; tile < NUM_TILES; tile++) 
 					{
-						createSkyTexture(m_atmosphericsVars, side, tile, mShinyTex);
+						createSkyTexture(m_atmosphericsVars, side, tile, mShinyTex, true);
 					}
 				}
 
diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h
index e118cc7200a9e33395d011feb146e663056500cb..3c7ce4004cb2f3e6a1c38cc4a687e350800f23fc 100644
--- a/indra/newview/llvosky.h
+++ b/indra/newview/llvosky.h
@@ -303,7 +303,7 @@ class LLVOSky : public LLStaticViewerObject
 	void updateDirections(void);
 
 	void initSkyTextureDirs(const S32 side, const S32 tile);
-	void createSkyTexture(AtmosphericsVars& vars, const S32 side, const S32 tile, LLSkyTex* tex);
+	void createSkyTexture(AtmosphericsVars& vars, const S32 side, const S32 tile, LLSkyTex* tex, bool is_shiny = false);
 
 	LLPointer<LLViewerFetchedTexture> mSunTexturep[2];
 	LLPointer<LLViewerFetchedTexture> mMoonTexturep[2];