diff --git a/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl b/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl
index 00ba0e8fad8f072391fedacc9f4e4fdfa11f905c..bc3324f543845d86bcfa74e86edac1749cc4a079 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl
@@ -48,7 +48,6 @@ vec3 srgb_to_linear(vec3 cs)
 
 	bvec3 lte = lessThanEqual(cs,vec3(0.04045));
 	return mix(high_range, low_range, lte);
-
 }
 
 vec3 linear_to_srgb(vec3 cl)
@@ -59,6 +58,4 @@ vec3 linear_to_srgb(vec3 cl)
 
 	bvec3 lt = lessThan(cl,vec3(0.0031308));
 	return mix(high_range, low_range, lt);
-
 }
-
diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
index 73f6d9fec32fd91d81eb35d39176de7bd27d6e23..69543b93eadf19163ae4b6e43ed56f58b003a7a7 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
@@ -41,15 +41,6 @@ uniform sampler2D bumpMap2;
 uniform float blend_factor;
 uniform sampler2D screenTex;
 uniform sampler2D refTex;
-uniform sampler2DRectShadow shadowMap0;
-uniform sampler2DRectShadow shadowMap1;
-uniform sampler2DRectShadow shadowMap2;
-uniform sampler2DRectShadow shadowMap3;
-uniform sampler2D noiseMap;
-
-uniform mat4 shadow_matrix[6];
-uniform vec4 shadow_clip;
-
 uniform float sunAngle;
 uniform float sunAngle2;
 uniform vec3 lightDir;
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index a3886b916a440739cf5d62ba3426188a232ea8b2..cabfd3d2eb9d7246859c73526da7950671e9de6a 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -483,6 +483,8 @@ void LLViewerShaderMgr::setShaders()
         S32 shadow_detail            = gSavedSettings.getS32("RenderShadowDetail");
         bool useRenderDeferred       = canRenderDeferred && gSavedSettings.getBOOL("RenderDeferred") && gSavedSettings.getBOOL("RenderAvatarVP");
         bool doingWindLight          = hasWindLightShaders && gSavedSettings.getBOOL("WindLightUseAtmosShaders");
+        bool useAdvancedAtmospherics = doingWindLight && gSavedSettings.getBOOL("RenderUseAdvancedAtmospherics");
+        (void)useAdvancedAtmospherics;
 
 		//using shaders, disable fixed function
 		LLGLSLShader::sNoFixedFunction = true;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index e605f5b420df03bdc59d1059392c6c5830e4388f..b8de59b6b8877a9a1541ba26dcb839050d5ff8e8 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -951,8 +951,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 		{
 			for (U32 i = 0; i < 4; i++)
 			{
-				mShadow[i].release();
-				mShadowOcclusion[i].release();
+                releaseShadowTarget(i);
 			}
 		}
 
@@ -990,8 +989,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 		{
 			for (U32 i = 4; i < 6; i++)
 			{
-				mShadow[i].release();
-				mShadowOcclusion[i].release();
+                releaseShadowTarget(i);
 			}
 		}
 
@@ -1005,11 +1003,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 	{
 		mDeferredLight.release();
 				
-		for (U32 i = 0; i < 6; i++)
-		{
-			mShadow[i].release();
-			mShadowOcclusion[i].release();
-		}
+		releaseShadowTargets();
 		mFXAABuffer.release();
 		mScreen.release();
 		mDeferredScreen.release(); //make sure to release any render targets that share a depth buffer with mDeferredScreen first
@@ -1206,11 +1200,7 @@ void LLPipeline::releaseScreenBuffers()
 	mDeferredLight.release();
 	mOcclusionDepth.release();
 		
-	for (U32 i = 0; i < 6; i++)
-	{
-		mShadow[i].release();
-		mShadowOcclusion[i].release();
-	}
+	releaseShadowTargets();
 
 	mInscatter.release();
 }
@@ -8326,20 +8316,24 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, U32 n
 
 	for (U32 i = 0; i < 4; i++)
 	{
-		channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0+i, LLTexUnit::TT_TEXTURE);
-		stop_glerror();
-		if (channel > -1)
-		{
-			stop_glerror();
-			gGL.getTexUnit(channel)->bind(&mShadow[i], TRUE);
-			gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
-			gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
-			stop_glerror();
+        LLRenderTarget* shadow_target = getShadowTarget(i);
+        if (shadow_target)
+        {
+		    channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0+i, LLTexUnit::TT_TEXTURE);
+		    stop_glerror();
+		    if (channel > -1)
+		    {
+			    stop_glerror();
+			    gGL.getTexUnit(channel)->bind(getShadowTarget(i), TRUE);
+			    gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
+			    gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+			    stop_glerror();
 			
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
-			stop_glerror();
-		}
+			    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
+			    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
+			    stop_glerror();
+		    }
+        }
 	}
 
 	for (U32 i = 4; i < 6; i++)
@@ -8349,14 +8343,18 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, U32 n
 		if (channel > -1)
 		{
 			stop_glerror();
-			gGL.getTexUnit(channel)->bind(&mShadow[i], TRUE);
-			gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
-			gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
-			stop_glerror();
+            LLRenderTarget* shadow_target = getShadowTarget(i);
+            if (shadow_target)
+            {
+			    gGL.getTexUnit(channel)->bind(shadow_target, TRUE);
+			    gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
+			    gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+			    stop_glerror();
 			
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
-			stop_glerror();
+			    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
+			    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
+			    stop_glerror();
+            }
 		}
 	}
 
@@ -10849,9 +10847,13 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 
 		for (S32 j = 0; j < 4; j++)
 		{
-			mShadow[j].bindTarget();
-			mShadow[j].clear();
-			mShadow[j].flush();
+            LLRenderTarget* shadow_target = getShadowTarget(j);
+            if (shadow_target)
+            {
+			    shadow_target->bindTarget();
+			    shadow_target->clear();
+			    shadow_target->flush();
+            }
 		}
 	}
 	else
@@ -10917,12 +10919,16 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 					mShadowCamera[j+4] = shadow_cam;
 				}
 
-				mShadow[j].bindTarget();
-				{
-					LLGLDepthTest depth(GL_TRUE);
-					mShadow[j].clear();
-				}
-				mShadow[j].flush();
+                LLRenderTarget* shadow_target = getShadowTarget(j);
+                if (shadow_target)
+                {
+				    shadow_target->bindTarget();
+				    {
+					    LLGLDepthTest depth(GL_TRUE);
+					    shadow_target->clear();
+				    }
+				    shadow_target->flush();
+                }
 
 				mShadowError.mV[j] = 0.f;
 				mShadowFOV.mV[j] = 0.f;
@@ -11211,20 +11217,24 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 		
 			stop_glerror();
 
-			mShadow[j].bindTarget();
-			mShadow[j].getViewport(gGLViewport);
-			mShadow[j].clear();
-		
-			U32 target_width = mShadow[j].getWidth();
+            LLRenderTarget* shadow_target = getShadowTarget(j);
 
-			{
-				static LLCullResult result[4];
+            if (shadow_target)
+            {
+			    shadow_target->bindTarget();
+			    shadow_target->getViewport(gGLViewport);
+			    shadow_target->clear();			
 
-				renderShadow(view[j], proj[j], shadow_cam, result[j], TRUE, TRUE, target_width);
-			}
+			    U32 target_width = shadow_target->getWidth();
+
+			    {
+				    static LLCullResult result[4];
+				    renderShadow(view[j], proj[j], shadow_cam, result[j], TRUE, TRUE, target_width);
+			    }
+
+			    shadow_target->flush();
+            }
 
-			mShadow[j].flush();
- 
 			if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
 			{
 				LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
@@ -11357,19 +11367,23 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 
 			stop_glerror();
 
-			mShadow[i+4].bindTarget();
-			mShadow[i+4].getViewport(gGLViewport);
-			mShadow[i+4].clear();
-
-			U32 target_width = mShadow[i+4].getWidth();
+            LLRenderTarget* shadow_target = getShadowTarget(i + 4);
 
-			static LLCullResult result[2];
+            if (shadow_target)
+            {
+			    shadow_target->bindTarget();
+			    shadow_target->getViewport(gGLViewport);
+			    shadow_target->clear();
+            
+                U32 target_width = shadow_target->getWidth();
 
-			LLViewerCamera::sCurCameraID = (LLViewerCamera::eCameraID)(LLViewerCamera::CAMERA_SHADOW0 + i + 4);
+			    static LLCullResult result[2];
+			    LLViewerCamera::sCurCameraID = (LLViewerCamera::eCameraID)(LLViewerCamera::CAMERA_SHADOW0 + i + 4);
 
-			renderShadow(view[i+4], proj[i+4], shadow_cam, result[i], FALSE, FALSE, target_width);
+			    renderShadow(view[i+4], proj[i+4], shadow_cam, result[i], FALSE, FALSE, target_width);
 
-			mShadow[i+4].flush();
+			    shadow_target->flush();
+            }
  		}
 	}
 	else