diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 28fed67cb24cfa6e43a9e8d535c0f8c329110a1d..1138410a076bc2cb01d9976054dd30067154acb7 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -12356,6 +12356,39 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+  <key>AmbientDisable</key>
+  <map>
+    <key>Comment</key>
+    <string>If TRUE, ambient light has no effect</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <integer>0</integer>
+  </map>
+  <key>SunlightDisable</key>
+  <map>
+    <key>Comment</key>
+    <string>If TRUE, sunlight has no effect</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <integer>0</integer>
+  </map>
+  <key>LocalLightDisable</key>
+  <map>
+    <key>Comment</key>
+    <string>If TRUE, local lights have no effect</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <integer>0</integer>
+  </map>
     <key>TextureDiscardLevel</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
index 1c826790fb32a38b688ebecbf2f1fe598db86205..4a12659d56c10c809c58e969b49066c670189789 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
@@ -88,64 +88,49 @@ float getAmbientClamp();
 
 vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 diffuse, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, float ambiance)
 {
-    //get light vector
-    vec3 lv = lp.xyz-v;
-
-    vec4 proj_tc = proj_mat * lp;
-
-    //get distance
-    float d = length(lv);
-    float da = 1.0;
-    vec3 col = vec3(0);
-    if (proj_tc.z < 0
-     || proj_tc.z > 1
-     || proj_tc.x < 0
-     || proj_tc.x > 1
-     || proj_tc.y < 0
-     || proj_tc.y > 1)
-    {
-        return col;
-    }
+	//get light vector
+	vec3 lv = lp.xyz-v;
 
-    if (d > 0.0 && la > 0.0 && fa > 0.0)
-    {
-        //normalize light vector
-        lv = normalize(lv);
-        vec3 norm = normalize(n);
+la /= 20.0f;
 
-        da = dot(norm, lv);
-        da = clamp(da, 0.0, 1.0);
+	//get distance
+	float d = length(lv);
+	
+	float da = 1.0;
 
-la /= 20.0f;
- 
-        //distance attenuation
-        float dist = d/la;
-        
-        float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);
-        dist_atten *= dist_atten;
+	vec3 col = vec3(0);
 
-        if (dist_atten < 0.0)
-        {
-            return col;
-        }
+	if (d > 0.0 && la > 0.0 && fa > 0.0)
+	{
+		//normalize light vector
+		lv = normalize(lv);
+	
+		//distance attenuation
+		float dist = d/la;
+		float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);
+		dist_atten *= dist_atten;
+        dist_atten *= 2.0f;
+
+		// spotlight coefficient.
+		float spot = max(dot(-ln, lv), is_pointlight);
+		da *= spot*spot; // GL_SPOT_EXPONENT=2
 
-        // spotlight coefficient.
-        float spot = max(dot(-ln, lv), is_pointlight);
-        da *= spot*spot; // GL_SPOT_EXPONENT=2
+		//angular attenuation
+		da *= max(dot(n, lv), 0.0);		
 
-        // to match spotLight (but not multiSpotLight) *sigh*
-        float lit = max(da * dist_atten,0.0);
+		float lit = max(da * dist_atten,0.0);
 
+ambiance = 0.0f;
         float amb_da = ambiance;
         if (lit > 0)
         {
             col = lit * light_col * diffuse;
             amb_da += (da*0.5+0.5) * ambiance;
-            amb_da += (da*da*0.5 + 0.5) * ambiance;
         }
+        amb_da += (da*da*0.5 + 0.5) * ambiance;
         amb_da *= dist_atten;
         amb_da = min(amb_da, 1.0f - lit);
-        col.rgb += amb_da * 0.5 * light_col * diffuse;
+        col.rgb += amb_da * light_col * diffuse;
 
         // no spec for alpha shader...
     }
@@ -223,7 +208,6 @@ void main()
 
     vec4 color = vec4(0.0);
 
-    color.rgb = amblit;
     color.a   = final_alpha;
 
     float ambient = da;
@@ -235,11 +219,16 @@ void main()
 
     vec3 sun_contrib = min(final_da, shadow) * sunlit;
 
+#if !defined(AMBIENT_KILL)
+    color.rgb = amblit;
     color.rgb *= ambient;
+#endif
 
 vec3 post_ambient = color.rgb;
 
+#if !defined(SUNLIGHT_KILL)
     color.rgb += sun_contrib;
+#endif
 
 vec3 post_sunlight = color.rgb;
 
@@ -257,7 +246,7 @@ vec3 post_atmo = color.rgb;
     // to linear!
     color.rgb = srgb_to_linear(color.rgb);
 
-   #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, diffuse_linear.rgb, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, light_attenuation[i].w * 0.5);
+   #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, diffuse_linear.rgb, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, light_attenuation[i].w);
 
     LIGHT_LOOP(1)
     LIGHT_LOOP(2)
@@ -268,7 +257,9 @@ vec3 post_atmo = color.rgb;
     LIGHT_LOOP(7)
 
     // sum local light contrib in linear colorspace
+#if !defined(LOCAL_LIGHT_KILL)
     color.rgb += light.rgb;
+#endif
 
     // back to sRGB as we're going directly to the final RT post-deferred gamma correction
     color.rgb = linear_to_srgb(color.rgb);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
index 373727f57253602235c030d3dec039aa9627fe14..1c0516923e39a6b59bde989124303fa94d55f708 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
@@ -88,17 +88,19 @@ float getAmbientClamp();
 
 vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spec, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, inout float glare, float ambiance)
 {
-    //get light vector
-    vec3 lv = lp.xyz-v;
-    
-    //get distance
-    float d = length(lv);
-    
-    float da = 1.0;
+	vec3 col = vec3(0);
+
+la /= 20.0f;
 
-    vec3 col = vec3(0,0,0);
+	//get light vector
+	vec3 lv = lp.xyz-v;
+	
+	//get distance
+	float d = length(lv);
+	
+	float da = 1.0;
 
-    vec4 proj_tc = proj_mat * lp;
+    /*vec4 proj_tc = proj_mat * lp;
 
     if (proj_tc.z < 0
      || proj_tc.z > 1
@@ -108,77 +110,68 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe
      || proj_tc.y > 1)
     {
         return col;
-    }
+    }*/
 
-    if (d > 0.0 && la > 0.0 && fa > 0.0)
+	if (d > 0.0 && la > 0.0 && fa > 0.0)
 	{
-        //normalize light vector
-        lv = normalize(lv);
-   
-la /= 20.0f;
- 
-        //distance attenuation
-        float dist = d/la;
-        
-        float dist_atten = (fa > 0) ? clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0) : 1.0f;
-        dist_atten *= dist_atten;
-
-        if (dist_atten <= 0)
-        {
-            return col;
-        }
-
-        // spotlight coefficient.
-        float spot = max(dot(-ln, lv), is_pointlight);
-
-        //angular attenuation
-        da = dot(n, lv);
-        da = clamp(da, 0.0, 1.0);
-
-        da *= spot*spot; // GL_SPOT_EXPONENT=2
-
-        float lit = max(da * dist_atten, 0.0);
+		//normalize light vector
+		lv = normalize(lv);
+	
+		//distance attenuation
+		float dist = d/la;
+		float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);
+		dist_atten *= dist_atten;
+        dist_atten *= 2.0f;
+
+		// spotlight coefficient.
+		float spot = max(dot(-ln, lv), is_pointlight);
+		da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+		//angular attenuation
+		da *= max(dot(n, lv), 0.0);		
+		
+		float lit = max(da * dist_atten, 0.0);
 
         float amb_da = ambiance;
         if (lit > 0)
         {            
             col = light_col*lit*diffuse;
             amb_da += (da*0.5 + 0.5) * ambiance;
-            amb_da += (da*da*0.5+0.5) * ambiance;
         }
+        amb_da += (da*da*0.5+0.5) * ambiance;
         amb_da *= dist_atten;
         amb_da = min(amb_da, 1.0f - lit);
-        col.rgb += amb_da * 0.5 * light_col * diffuse;
-
-        if (spec.a > 0.0)
-        {
-            //vec3 ref = dot(pos+lv, norm);
-            vec3 h = normalize(lv+npos);
-            float nh = dot(n, h);
-            float nv = dot(n, npos);
-            float vh = dot(npos, h);
-            float sa = nh;
-            float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
-
-            float gtdenom = 2 * nh;
-            float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
-                                
-            if (nh > 0.0)
-            {
-                float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
-                vec3 speccol = lit*scol*light_col.rgb*spec.rgb;
+        col.rgb += amb_da * light_col * diffuse;
+
+		if (spec.a > 0.0)
+		{
+			//vec3 ref = dot(pos+lv, norm);
+			vec3 h = normalize(lv+npos);
+			float nh = dot(n, h);
+			float nv = dot(n, npos);
+			float vh = dot(npos, h);
+			float sa = nh;
+			float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
+
+			float gtdenom = 2 * nh;
+			float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
+								
+			if (nh > 0.0)
+			{
+				float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
+				vec3 speccol = lit*scol*light_col.rgb*spec.rgb;
                 speccol = clamp(speccol, vec3(0), vec3(1));
-                col += speccol;
+				col += speccol;
 
-                float cur_glare = max(speccol.r, speccol.g);
-                cur_glare = max(cur_glare, speccol.b);
-                glare = max(glare, speccol.r);
-                glare += max(cur_glare, 0.0);
-            }
-        }
-    }
+				float cur_glare = max(speccol.r, speccol.g);
+				cur_glare = max(cur_glare, speccol.b);
+				glare = max(glare, speccol.r);
+				glare += max(cur_glare, 0.0);
+			}
+		}
+	}
 
-    return max(col, vec3(0.0,0.0,0.0)); 
+	return max(col, vec3(0.0,0.0,0.0));	
 }
 
 #else
@@ -321,18 +314,22 @@ void main()
     float ambient = da;
     ambient *= 0.5;
     ambient *= ambient;
- 
+
     float ambient_clamp = getAmbientClamp() + 0.1;
     ambient = (1.0 - ambient) * ambient_clamp;
 
     vec3 sun_contrib = min(final_da, shadow) * sunlit;
    
+#if !defined(AMBIENT_KILL)
     color.rgb = amblit;
     color.rgb *= ambient;
+#endif
 
 vec3 post_ambient = color.rgb;
 
+#if !defined(SUNLIGHT_KILL)
     color.rgb += sun_contrib;
+#endif
 
 vec3 post_sunlight = color.rgb;
 
@@ -398,7 +395,7 @@ vec3 post_atmo = color.rgb;
             
     vec3 light = vec3(0,0,0);
 
- #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse_linear.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w);
+ #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse_linear.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w );
 
         LIGHT_LOOP(1)
         LIGHT_LOOP(2)
@@ -408,11 +405,12 @@ vec3 post_atmo = color.rgb;
         LIGHT_LOOP(6)
         LIGHT_LOOP(7)
 
-
     glare = min(glare, 1.0);
     float al = max(diffuse_linear.a,glare)*vertex_color.a;
 
+#if !defined(LOCAL_LIGHT_KILL)
     color.rgb += light.rgb;
+#endif
 
     // (only) post-deferred needs inline gamma correction
     color.rgb = linear_to_srgb(color.rgb);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
index 29298d7c073b3792c58799d755a2133a12bf4d2c..367680556a06730d5c78ad10f6dc8136bae4bd29 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
@@ -61,6 +61,11 @@ vec3 getNorm(vec2 pos_screen);
 
 void main() 
 {
+	vec3 out_col = vec3(0,0,0);
+
+#if defined(LOCAL_LIGHT_KILL)
+    discard;
+#else
 	vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res;
 	vec3 pos = getPosition(frag.xy).xyz;
 	if (pos.z < far_z)
@@ -74,7 +79,6 @@ void main()
 	vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb;
 	
 	float noise = texture2D(noiseMap, frag.xy/128.0).b;
-	vec3 out_col = vec3(0,0,0);
 	vec3 npos = normalize(-pos);
 
 	// As of OSX 10.6.7 ATI Apple's crash when using a variable size loop
@@ -130,7 +134,7 @@ void main()
 		}
 	}
 	}
-	
+#endif
 	
 	frag_color.rgb = out_col;
 	frag_color.a = 0.0;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
index 2dd9c1f057704b39580c0a4af04d549017e67b19..c81d63388078e2b1d156bb1ef24e267b5416f3b2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
@@ -130,6 +130,11 @@ vec4 getPosition(vec2 pos_screen);
 
 void main() 
 {
+	vec3 col = vec3(0,0,0);
+
+#if defined(LOCAL_LIGHT_KILL)
+    discard;
+#else
 	vec4 frag = vary_fragcoord;
 	frag.xyz /= frag.w;
 	frag.xyz = frag.xyz*0.5+0.5;
@@ -171,7 +176,6 @@ void main()
 	lv = normalize(lv);
 	float da = dot(norm, lv);
 		
-	vec3 col = vec3(0,0,0);
 		
 	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb;
 	vec3 dlit = vec3(0, 0, 0);
@@ -267,7 +271,8 @@ void main()
 			}
 		}
 	}
-//col.rgb = vec3(0);
+#endif
+
 	frag_color.rgb = col;	
 	frag_color.a = 0.0;
 }
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index 4ab68eaf3b6101941f6f93b6ca7e30a19e884742..c7426788c4ba2926a032646485ee43fcb3b1b252 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -113,12 +113,16 @@ void main()
 
         vec3 sun_contrib = final_da * sunlit;
 
+#if !defined(AMBIENT_KILL)
         color.rgb = amblit;
         color.rgb *= ambient;
+#endif
 
 vec3 post_ambient = color.rgb;
 
+#if !defined(SUNLIGHT_KILL)
         color.rgb += sun_contrib;
+#endif
 
 vec3 post_sunlight = color.rgb;
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
index c6417fa53222e8d3fab82528c85f5adb6c6ae659..55c740d10061e3a93f46d132906f821828f8a614 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
@@ -129,6 +129,11 @@ vec4 getPosition(vec2 pos_screen);
 
 void main() 
 {
+	vec3 col = vec3(0,0,0);
+
+#if defined(LOCAL_LIGHT_KILL)
+    discard;
+#else
 	vec4 frag = vary_fragcoord;
 	frag.xyz /= frag.w;
 	frag.xyz = frag.xyz*0.5+0.5;
@@ -142,12 +147,10 @@ void main()
 	{
 		discard;
 	}
-	
 		
 	vec3 norm = texture2DRect(normalMap, frag.xy).xyz;
 	float envIntensity = norm.z;
 	norm = getNorm(frag.xy);
-	
 	norm = normalize(norm);
 	float l_dist = -dot(lv, proj_n);
 	
@@ -173,14 +176,9 @@ void main()
 	lv = normalize(lv);
 	float da = dot(norm, lv);
 		
-	vec3 col = vec3(0,0,0);
-		
 	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb;
-		
 	vec4 spec = texture2DRect(specularRect, frag.xy);
 
-	
-
 	float noise = texture2D(noiseMap, frag.xy/128.0).b;
 	vec3 dlit = vec3(0, 0, 0);
 	
@@ -216,7 +214,6 @@ void main()
 		amb_da = min(amb_da, 1.0-lit);
 		col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a*diff_tex.rgb;
 	}
-	
 
 	if (spec.a > 0.0)
 	{
@@ -243,7 +240,6 @@ void main()
 		}
 	}	
 
-
 	if (envIntensity > 0.0)
 	{
 		vec3 ref = reflect(normalize(pos), norm);
@@ -272,7 +268,8 @@ void main()
 			}
 		}
 	}
-//col.rgb = vec3(0);	
+#endif
+
 	frag_color.rgb = col;	
 	frag_color.a = 0.0;
 }
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
index cf635ffa3f3303136d991abcad656c30f0b1637f..5e39d1629d20355eee7c3b0d80ee4f89c89df692 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
@@ -33,7 +33,11 @@ float getAmbientClamp();
 vec4 calcLighting(vec3 pos, vec3 norm, vec4 color)
 {
 	vec4 c = sumLights(pos, norm, color);
+
+#if !defined(AMBIENT_KILL)
     c.rgb += atmosAmbient() * color.rgb * 0.5 * getAmbientClamp();
+#endif
+
     return c;
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
index 761ac29ee22c679fcccc53c8252c7fd017c2cf05..0c3ea4231e97b820ae0232f522fef6960fcd2cb3 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
@@ -39,7 +39,15 @@ vec4 sumLights(vec3 pos, vec3 norm, vec4 color)
 	
 	col.rgb = light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);
 	col.rgb = scaleDownLight(col.rgb);
+
+#if defined(LOCAL_LIGHT_KILL)
+    col.rgb = vec3(0);
+#endif
+
+#if !defined(SUNLIGHT_KILL)
 	col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, light_position[0].xyz));
+#endif
+
 	col.rgb = min(col.rgb*color.rgb, 1.0);
 	return col;	
 }
diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
index bc879948e42cd6c5d04faa76170871ad2f18de03..bcce4c041a418d361384ac1c8a1d7288a60a97d4 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
@@ -129,6 +129,12 @@ vec4 getPosition(vec2 pos_screen);
 
 void main() 
 {
+
+    vec3 col = vec3(0,0,0);
+
+#if defined(LOCAL_LIGHT_KILL)
+    discard;
+#else
     vec4 frag = vary_fragcoord;
     frag.xyz /= frag.w;
     frag.xyz = frag.xyz*0.5+0.5;
@@ -183,8 +189,6 @@ void main()
     lv = proj_origin-pos.xyz;
     lv = normalize(lv);
     float da = dot(norm, lv);
-
-    vec3 col = vec3(0,0,0);
         
     vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb;
     
@@ -284,10 +288,11 @@ void main()
             }
         }
     }
+#endif
 
     //not sure why, but this line prevents MATBUG-194
     col = max(col, vec3(0.0));
-//col.rgb = vec3(0);
+
     frag_color.rgb = col;   
     frag_color.a = 0.0;
 }
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index 94abcf08ed7e64ba02b6e5a44704e44040ec8782..7f83e168bb67087823bef83763b6f7c525659fc8 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -121,12 +121,16 @@ void main()
 
         vec3 sun_contrib = min(scol, final_da) * sunlit;
 
+#if !defined(AMBIENT_KILL)
         color.rgb = amblit;
         color.rgb *= ambient;
+#endif
 
 vec3 post_ambient = color.rgb;
 
+#if !defined(SUNLIGHT_KILL)
         color.rgb += sun_contrib;
+#endif
 
 vec3 post_sunlight = color.rgb;
 
diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
index 43f283beded07c94d526574ffe2d95a73e9b164a..77f6e6f7ac874fc2bc985842e796cb6d0d7645be 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
@@ -130,6 +130,11 @@ vec4 getPosition(vec2 pos_screen);
 
 void main() 
 {
+	vec3 col = vec3(0,0,0);
+
+#if defined(LOCAL_LIGHT_KILL)
+    discard;
+#else
 	vec4 frag = vary_fragcoord;
 	frag.xyz /= frag.w;
 	frag.xyz = frag.xyz*0.5+0.5;
@@ -184,12 +189,8 @@ void main()
 	lv = normalize(lv);
 	float da = dot(norm, lv);
 		
-	vec3 col = vec3(0,0,0);
-		
 	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb;
-		
 	vec4 spec = texture2DRect(specularRect, frag.xy);
-
 	vec3 dlit = vec3(0, 0, 0);
 
 	float noise = texture2D(noiseMap, frag.xy/128.0).b;
@@ -227,7 +228,6 @@ void main()
 	
 	    col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
 	}
-	
 
 	if (spec.a > 0.0)
 	{
@@ -253,10 +253,6 @@ void main()
 			col += speccol;
 		}
 	}	
-	
-	
-	
-	
 
 	if (envIntensity > 0.0)
 	{
@@ -286,10 +282,11 @@ void main()
 			}
 		}
 	}
+#endif
 	
 	//not sure why, but this line prevents MATBUG-194
 	col = max(col, vec3(0.0));
-//col.rgb = vec3(0);
+
 	frag_color.rgb = col;	
 	frag_color.a = 0.0;
 }
diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
index 57f93a8b360a300a4cfe941577540980368d0652..8795d69a3a112c7627863519888de20e5b8044d4 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
@@ -44,9 +44,16 @@ vec4 sumLights(vec3 pos, vec3 norm, vec4 color)
 	col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);
 	col.rgb = scaleDownLight(col.rgb);
 
+#if defined(LOCAL_LIGHT_KILL)
+    col.rgb = vec3(0);
+i#endif
+
 	// Add windlight lights
 	col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, light_position[0].xyz));
+#if !defined(SUNLIGHT_KILL)
 	col.rgb = min(col.rgb*color.rgb, 1.0);
+#endif
+
 	return col;	
 }
 
diff --git a/indra/newview/app_settings/shaders/class3/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class3/lighting/lightV.glsl
index effe4c59719d21071ca8c77a33aea9c147f0a02a..eca8515212357a5909bbbb79c745751a959adee6 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/lightV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/lightV.glsl
@@ -33,7 +33,11 @@ float getAmbientClamp();
 vec4 calcLighting(vec3 pos, vec3 norm, vec4 color)
 {
 	vec4 c = sumLights(pos, norm, color);
+
+#if !defined(AMBIENT_KILL)
     c.rgb += atmosAmbient() * color.rgb * getAmbientClamp();
+#endif
+
     return c; 
 }
 
diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
index 81da6688c25ae31010c2ead5c934f37c124467f3..38dd850296f4dfb7f84275f8feebf75517908079 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
@@ -51,8 +51,15 @@ vec4 sumLights(vec3 pos, vec3 norm, vec4 color)
 	col.rgb += light_diffuse[1].rgb*calcDirectionalLight(norm, light_position[1].xyz);
     col.rgb = scaleDownLight(col.rgb);
 
+#if defined(LOCAL_LIGHT_KILL)
+    col.rgb = vec3(0);
+#endif
+
 	// Add windlight lights
+#if !defined(SUNLIGHT_KILL)
 	col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, light_position[0].xyz));
+#endif
+
 	col.rgb = min(col.rgb*color.rgb, 1.0);
 	
 	return col;	
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index d791c927a413e27f85fbbe4e4774127a457bfef1..2f9cc3acffb64b3e3676496395e837c2ee3d53b2 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -7389,6 +7389,8 @@ void handle_dump_attachments(void*)
 // these are used in the gl menus to set control values, generically.
 class LLToggleControl : public view_listener_t
 {
+protected:
+
 	bool handleEvent(const LLSD& userdata)
 	{
 		std::string control_name = userdata.asString();
@@ -7465,6 +7467,24 @@ class LLAdvancedClickRenderBenchmark: public view_listener_t
 	}
 };
 
+// these are used in the gl menus to set control values that require shader recompilation
+class LLToggleShaderControl : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+	{
+        std::string control_name = userdata.asString();
+		BOOL checked = gSavedSettings.getBOOL( control_name );
+		gSavedSettings.setBOOL( control_name, !checked );
+        LLPipeline::refreshCachedSettings();
+        //gPipeline.updateRenderDeferred();
+		//gPipeline.releaseGLBuffers();
+		//gPipeline.createGLBuffers();
+		//gPipeline.resetVertexBuffers();
+        LLViewerShaderMgr::instance()->setShaders();
+		return !checked;
+	}
+};
+
 void menu_toggle_attached_lights(void* user_data)
 {
 	LLPipeline::sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
@@ -9268,6 +9288,7 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile");
 	view_listener_t::addMenu(new LLToggleAgentProfile(), "ToggleAgentProfile");
 	view_listener_t::addMenu(new LLToggleControl(), "ToggleControl");
+    view_listener_t::addMenu(new LLToggleShaderControl(), "ToggleShaderControl");
 	view_listener_t::addMenu(new LLCheckControl(), "CheckControl");
 	view_listener_t::addMenu(new LLGoToObject(), "GoToObject");
 	commit.add("PayObject", boost::bind(&handle_give_money_dialog));
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index c77a63155486a80d5aea18dee411f420e10357b4..ea43203f1c8e96a1117c2e4c505079ae5f13d723 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -927,7 +927,7 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
 	if (gGLManager.mIsMobileGF)
 		sum_lights_class = 3;
 #endif
-	
+
 	// Use the feature table to mask out the max light level to use.  Also make sure it's at least 1.
 	S32 max_light_class = gSavedSettings.getS32("RenderShaderLightingMaxLevel");
 	sum_lights_class = llclamp(sum_lights_class, 1, max_light_class);
@@ -959,6 +959,25 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
 	attribs["MAX_JOINTS_PER_MESH_OBJECT"] = 
 		boost::lexical_cast<std::string>(LLSkinningUtil::getMaxJointCount());
 
+    BOOL ambient_kill = gSavedSettings.getBOOL("AmbientDisable");
+	BOOL sunlight_kill = gSavedSettings.getBOOL("SunlightDisable");
+    BOOL local_light_kill = gSavedSettings.getBOOL("LocalLightDisable");
+
+    if (ambient_kill)
+    {
+        attribs["AMBIENT_KILL"] = "1";
+    }
+
+    if (sunlight_kill)
+    {
+        attribs["SUNLIGHT_KILL"] = "1";
+    }
+
+    if (local_light_kill)
+    {
+       attribs["LOCAL_LIGHT_KILL"] = "1";
+    }
+
 	// We no longer have to bind the shaders to global glhandles, they are automatically added to a map now.
 	for (U32 i = 0; i < shaders.size(); i++)
 	{
@@ -1232,6 +1251,10 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 {
     bool use_sun_shadow = mShaderLevel[SHADER_DEFERRED] > 1;
 
+    BOOL ambient_kill = gSavedSettings.getBOOL("AmbientDisable");
+	BOOL sunlight_kill = gSavedSettings.getBOOL("SunlightDisable");
+    BOOL local_light_kill = gSavedSettings.getBOOL("LocalLightDisable");
+
 	if (mShaderLevel[SHADER_DEFERRED] == 0)
 	{
 		gDeferredTreeProgram.unload();
@@ -1457,6 +1480,22 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		{
 			gDeferredSkinnedAlphaProgram.addPermutation("HAS_SHADOW", "1");
 		}
+
+        if (ambient_kill)
+        {
+            gDeferredSkinnedAlphaProgram.addPermutation("AMBIENT_KILL", "1");
+        }
+
+        if (sunlight_kill)
+        {
+            gDeferredSkinnedAlphaProgram.addPermutation("SUNLIGHT_KILL", "1");
+        }
+
+        if (local_light_kill)
+        {
+            gDeferredSkinnedAlphaProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
+        }
+
 		success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL);
 		llassert(success);
 
@@ -1525,6 +1564,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 				gDeferredMaterialProgram[i].addPermutation("HAS_SPECULAR_MAP", "1");
 			}
 
+            if (ambient_kill)
+            {
+                gDeferredMaterialProgram[i].addPermutation("AMBIENT_KILL", "1");
+            }
+
+            if (sunlight_kill)
+            {
+                gDeferredMaterialProgram[i].addPermutation("SUNLIGHT_KILL", "1");
+            }
+
+            if (local_light_kill)
+            {
+                gDeferredMaterialProgram[i].addPermutation("LOCAL_LIGHT_KILL", "1");
+            }
+
             gDeferredMaterialProgram[i].addPermutation("DIFFUSE_ALPHA_MODE", llformat("%d", alpha_mode));
 
             if (use_sun_shadow)
@@ -1593,6 +1647,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
             }
             gDeferredMaterialWaterProgram[i].addPermutation("WATER_FOG","1");
 
+            if (ambient_kill)
+            {
+                gDeferredMaterialWaterProgram[i].addPermutation("AMBIENT_KILL", "1");
+            }
+
+            if (sunlight_kill)
+            {
+                gDeferredMaterialWaterProgram[i].addPermutation("SUNLIGHT_KILL", "1");
+            }
+
+            if (local_light_kill)
+            {
+                gDeferredMaterialWaterProgram[i].addPermutation("LOCAL_LIGHT_KILL", "1");
+            }
+
             gDeferredMaterialWaterProgram[i].mFeatures.hasWaterFog = true;
             gDeferredMaterialWaterProgram[i].mFeatures.hasSrgb = true;
             gDeferredMaterialWaterProgram[i].mFeatures.encodesNormal = true;
@@ -1681,6 +1750,23 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
 		gDeferredLightProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
 
+        gDeferredLightProgram.clearPermutations();
+
+        if (ambient_kill)
+        {
+            gDeferredLightProgram.addPermutation("AMBIENT_KILL", "1");
+        }
+
+        if (sunlight_kill)
+        {
+            gDeferredLightProgram.addPermutation("SUNLIGHT_KILL", "1");
+        }
+
+        if (local_light_kill)
+        {
+            gDeferredLightProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
+        }
+
 		success = gDeferredLightProgram.createShader(NULL, NULL);
         llassert(success);
 	}
@@ -1693,11 +1779,28 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 			gDeferredMultiLightProgram[i].mFeatures.isDeferred = true;
 			gDeferredMultiLightProgram[i].mFeatures.hasShadows = true;
 
+            gDeferredMultiLightProgram[i].clearPermutations();
 			gDeferredMultiLightProgram[i].mShaderFiles.clear();
 			gDeferredMultiLightProgram[i].mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));
 			gDeferredMultiLightProgram[i].mShaderFiles.push_back(make_pair("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
 			gDeferredMultiLightProgram[i].mShaderLevel = mShaderLevel[SHADER_DEFERRED];
 			gDeferredMultiLightProgram[i].addPermutation("LIGHT_COUNT", llformat("%d", i+1));
+
+            if (ambient_kill)
+            {
+                gDeferredMultiLightProgram[i].addPermutation("AMBIENT_KILL", "1");
+            }
+
+            if (sunlight_kill)
+            {
+                gDeferredMultiLightProgram[i].addPermutation("SUNLIGHT_KILL", "1");
+            }
+
+            if (local_light_kill)
+            {
+                gDeferredMultiLightProgram[i].addPermutation("LOCAL_LIGHT_KILL", "1");
+            }
+
 			success = gDeferredMultiLightProgram[i].createShader(NULL, NULL);
             llassert(success);
 		}
@@ -1711,10 +1814,26 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredSpotLightProgram.mFeatures.isDeferred = true;
 		gDeferredSpotLightProgram.mFeatures.hasShadows = true;
 
+        gDeferredSpotLightProgram.clearPermutations();
 		gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
 		gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/spotLightF.glsl", GL_FRAGMENT_SHADER_ARB));
 		gDeferredSpotLightProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
 
+        if (ambient_kill)
+        {
+            gDeferredSpotLightProgram.addPermutation("AMBIENT_KILL", "1");
+        }
+
+        if (sunlight_kill)
+        {
+            gDeferredSpotLightProgram.addPermutation("SUNLIGHT_KILL", "1");
+        }
+
+        if (local_light_kill)
+        {
+            gDeferredSpotLightProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
+        }
+
 		success = gDeferredSpotLightProgram.createShader(NULL, NULL);
         llassert(success);
 	}
@@ -1726,11 +1845,17 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredMultiSpotLightProgram.mFeatures.isDeferred = true;
 		gDeferredMultiSpotLightProgram.mFeatures.hasShadows = true;
 
+        gDeferredMultiSpotLightProgram.clearPermutations();
 		gDeferredMultiSpotLightProgram.mShaderFiles.clear();
 		gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));
 		gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));
 		gDeferredMultiSpotLightProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
 
+        if (local_light_kill)
+        {
+            gDeferredMultiSpotLightProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
+        }
+
 		success = gDeferredMultiSpotLightProgram.createShader(NULL, NULL);
         llassert(success);
 	}
@@ -1821,6 +1946,22 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
             gDeferredAlphaProgram.addPermutation("HAS_SHADOW", "1");
         }
         gDeferredAlphaProgram.addPermutation("USE_VERTEX_COLOR", "1");
+
+        if (ambient_kill)
+        {
+            gDeferredAlphaProgram.addPermutation("AMBIENT_KILL", "1");
+        }
+
+        if (sunlight_kill)
+        {
+            gDeferredAlphaProgram.addPermutation("SUNLIGHT_KILL", "1");
+        }
+
+        if (local_light_kill)
+        {
+            gDeferredAlphaProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
+        }
+
         gDeferredAlphaProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
 
         success = gDeferredAlphaProgram.createShader(NULL, NULL);
@@ -1914,6 +2055,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		{
 			gDeferredAlphaWaterProgram.addPermutation("HAS_SHADOW", "1");
 		}
+
+        if (ambient_kill)
+        {
+            gDeferredAlphaWaterProgram.addPermutation("AMBIENT_KILL", "1");
+        }
+
+        if (sunlight_kill)
+        {
+            gDeferredAlphaWaterProgram.addPermutation("SUNLIGHT_KILL", "1");
+        }
+
+        if (local_light_kill)
+        {
+            gDeferredAlphaWaterProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
+        }
         gDeferredAlphaWaterProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
 
 		success = gDeferredAlphaWaterProgram.createShader(NULL, NULL);
@@ -2129,11 +2285,27 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredSoftenProgram.mFeatures.isDeferred = true;
 		gDeferredSoftenProgram.mFeatures.hasShadows = use_sun_shadow;
 
+        gDeferredSoftenProgram.clearPermutations();
 		gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightV.glsl", GL_VERTEX_SHADER_ARB));
 		gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightF.glsl", GL_FRAGMENT_SHADER_ARB));
 
 		gDeferredSoftenProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
 
+        if (ambient_kill)
+        {
+            gDeferredSoftenProgram.addPermutation("AMBIENT_KILL", "1");
+        }
+
+        if (sunlight_kill)
+        {
+            gDeferredSoftenProgram.addPermutation("SUNLIGHT_KILL", "1");
+        }
+
+        if (local_light_kill)
+        {
+            gDeferredSoftenProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
+        }
+
 		if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
 		{ //if using SSAO, take screen space light map into account as if shadows are enabled
 			gDeferredSoftenProgram.mShaderLevel = llmax(gDeferredSoftenProgram.mShaderLevel, 2);
@@ -2150,6 +2322,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredSoftenWaterProgram.mShaderFiles.push_back(make_pair("deferred/softenLightV.glsl", GL_VERTEX_SHADER_ARB));
 		gDeferredSoftenWaterProgram.mShaderFiles.push_back(make_pair("deferred/softenLightF.glsl", GL_FRAGMENT_SHADER_ARB));
 
+        gDeferredSoftenWaterProgram.clearPermutations();
 		gDeferredSoftenWaterProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
 		gDeferredSoftenWaterProgram.addPermutation("WATER_FOG", "1");
 		gDeferredSoftenWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
@@ -2162,6 +2335,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
         gDeferredSoftenWaterProgram.mFeatures.isDeferred = true;
         gDeferredSoftenWaterProgram.mFeatures.hasShadows = use_sun_shadow;
 
+        if (ambient_kill)
+        {
+            gDeferredSoftenWaterProgram.addPermutation("AMBIENT_KILL", "1");
+        }
+
+        if (sunlight_kill)
+        {
+            gDeferredSoftenWaterProgram.addPermutation("SUNLIGHT_KILL", "1");
+        }
+
+        if (local_light_kill)
+        {
+            gDeferredSoftenWaterProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
+        }
+
 		if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
 		{ //if using SSAO, take screen space light map into account as if shadows are enabled
 			gDeferredSoftenWaterProgram.mShaderLevel = llmax(gDeferredSoftenWaterProgram.mShaderLevel, 2);
@@ -2397,6 +2585,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		{
 			gDeferredAvatarAlphaProgram.addPermutation("HAS_SHADOW", "1");
 		}
+
+        if (ambient_kill)
+        {
+            gDeferredAvatarAlphaProgram.addPermutation("AMBIENT_KILL", "1");
+        }
+
+        if (sunlight_kill)
+        {
+            gDeferredAvatarAlphaProgram.addPermutation("SUNLIGHT_KILL", "1");
+        }
+
+        if (local_light_kill)
+        {
+            gDeferredAvatarAlphaProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
+        }
 		gDeferredAvatarAlphaProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
 
 		success = gDeferredAvatarAlphaProgram.createShader(NULL, NULL);
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 8aa2c8d931ac58b7d4da30677bb546a3a621e999..d9b06347ca532d39b31acbe805f3259c80889e6c 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2951,6 +2951,36 @@
                  function="ToggleControl"
                  parameter="TextureDisable" />
             </menu_item_check>
+          <menu_item_check
+             label="Disable Ambient"
+             name="Disable Ambient">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="AmbientDisable" />
+            <menu_item_check.on_click
+             function="ToggleShaderControl"
+             parameter="AmbientDisable" />
+          </menu_item_check>
+          <menu_item_check
+             label="Disable Sunlight"
+             name="Disable Sunlight">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="SunlightDisable" />
+            <menu_item_check.on_click
+             function="ToggleShaderControl"
+             parameter="SunlightDisable" />
+          </menu_item_check>
+          <menu_item_check
+             label="Disable Local Lights"
+             name="Disable Local Lights">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="LocalLightDisable" />
+            <menu_item_check.on_click
+             function="ToggleShaderControl"
+             parameter="LocalLightDisable" />
+          </menu_item_check>
             <menu_item_check
               label="Full Res Textures"
              name="Rull Res Textures">