diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
new file mode 100644
index 0000000000000000000000000000000000000000..ab48d08bbb070342a2f48402b32859c8aaedf01a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
@@ -0,0 +1,24 @@
+/** 
+ * @file postDeferredF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+ 
+#version 120
+
+#extension GL_ARB_texture_rectangle : enable
+
+uniform sampler2DRect diffuseRect;
+uniform sampler2D bloomMap;
+
+uniform vec2 screen_res;
+varying vec2 vary_fragcoord;
+
+void main() 
+{
+	vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
+	
+	vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
+	gl_FragColor = diff + bloom;
+}
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 2cfd3b0a33b87498d92abd907e1277ec232bf321..8b5a2ce78182d6e4147c73cb09430aaae7453f88 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -107,10 +107,14 @@ S32 LLDrawPoolAlpha::getNumPostDeferredPasses()
 	{ //skip depth buffer filling pass when rendering impostors
 		return 1;
 	}
-	else
+	else if (gSavedSettings.getBOOL("RenderDepthOfField"))
 	{
 		return 2; 
 	}
+	else
+	{
+		return 1;
+	}
 }
 
 void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass) 
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 25cf63a367254a4484f49fd58e21f0937cd5ed95..e81ee72c05d95eb3d83f64563e4e96909f48220a 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -137,6 +137,7 @@ LLGLSLShader			gDeferredGIProgram;
 LLGLSLShader			gDeferredGIFinalProgram;
 LLGLSLShader			gDeferredPostGIProgram;
 LLGLSLShader			gDeferredPostProgram;
+LLGLSLShader			gDeferredPostNoDoFProgram;
 
 LLGLSLShader			gLuminanceGatherProgram;
 
@@ -1246,6 +1247,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		success = gDeferredPostProgram.createShader(NULL, NULL);
 	}
 
+	if (success)
+	{
+		gDeferredPostNoDoFProgram.mName = "Deferred Post Shader";
+		gDeferredPostNoDoFProgram.mShaderFiles.clear();
+		gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
+		gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoDoFF.glsl", GL_FRAGMENT_SHADER_ARB));
+		gDeferredPostNoDoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+		success = gDeferredPostNoDoFProgram.createShader(NULL, NULL);
+	}
+
 	if (mVertexShaderLevel[SHADER_DEFERRED] > 1)
 	{
 		if (success)
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index f31d2d18365572b0d7ec76e0554222f66acbd7d7..72ac5e02ee50d0931bfd595128732d201103f5d2 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -368,6 +368,7 @@ extern LLGLSLShader			gDeferredSoftenProgram;
 extern LLGLSLShader			gDeferredShadowProgram;
 extern LLGLSLShader			gDeferredPostGIProgram;
 extern LLGLSLShader			gDeferredPostProgram;
+extern LLGLSLShader			gDeferredPostNoDoFProgram;
 extern LLGLSLShader			gDeferredAvatarShadowProgram;
 extern LLGLSLShader			gDeferredAttachmentShadowProgram;
 extern LLGLSLShader			gDeferredAlphaProgram;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 21fbe52ccd26fee1418e069c1903e4b504701f48..02c17f9e78ff52a2a5c97d9646f3cfc38bbc4304 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -6275,128 +6275,135 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
 
 	if (LLPipeline::sRenderDeferred && !LLViewerCamera::getInstance()->cameraUnderWater())
 	{
+		bool dof_enabled = true;
+
 		LLGLSLShader* shader = &gDeferredPostProgram;
 		if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
 		{
 			shader = &gDeferredGIFinalProgram;
+			dof_enabled = false;
+		}
+		else if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField"))
+		{ //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult
+			shader = &gDeferredPostNoDoFProgram;
+			dof_enabled = false;
 		}
 		
+		
 		LLGLDisable blend(GL_BLEND);
 		bindDeferredShader(*shader);
 
-		//depth of field focal plane calculations
+		if (dof_enabled)
+		{
+			//depth of field focal plane calculations
 
-		static F32 current_distance = 16.f;
-		static F32 start_distance = 16.f;
-		static F32 transition_time = 1.f;
+			static F32 current_distance = 16.f;
+			static F32 start_distance = 16.f;
+			static F32 transition_time = 1.f;
 
-		LLVector3 focus_point;
+			LLVector3 focus_point;
 
-		LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject();
-		if (obj && obj->mDrawable && obj->isSelected())
-		{
-			S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace();
-			if (obj && obj->mDrawable)
+			LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject();
+			if (obj && obj->mDrawable && obj->isSelected())
 			{
-				LLFace* face = obj->mDrawable->getFace(face_idx);
-				if (face)
+				S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace();
+				if (obj && obj->mDrawable)
 				{
-					focus_point = face->getPositionAgent();
+					LLFace* face = obj->mDrawable->getFace(face_idx);
+					if (face)
+					{
+						focus_point = face->getPositionAgent();
+					}
 				}
 			}
-		}
 		
-		if (focus_point.isExactlyZero())
-		{
-			if (LLViewerJoystick::getInstance()->getOverrideCamera())
+			if (focus_point.isExactlyZero())
 			{
-				focus_point = gDebugRaycastIntersection;
-			}
-			else if (gAgentCamera.cameraMouselook())
-			{
-				gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE,
-											  NULL,
-											  &focus_point);
-			}
-			else
-			{
-				LLViewerObject* obj = gAgentCamera.getFocusObject();
-				if (obj)
+				if (LLViewerJoystick::getInstance()->getOverrideCamera())
 				{
-					focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal());
+					focus_point = gDebugRaycastIntersection;
+				}
+				else if (gAgentCamera.cameraMouselook())
+				{
+					gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE,
+												  NULL,
+												  &focus_point);
 				}
 				else
 				{
-					focus_point = gDebugRaycastIntersection;
+					LLViewerObject* obj = gAgentCamera.getFocusObject();
+					if (obj)
+					{
+						focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal());
+					}
+					else
+					{
+						focus_point = gDebugRaycastIntersection;
+					}
 				}
 			}
-		}
 
-		LLVector3 eye = LLViewerCamera::getInstance()->getOrigin();
-		F32 target_distance = 16.f;
-		if (!focus_point.isExactlyZero())
-		{
-			target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point-eye);
-		}
-
-		if (transition_time >= 1.f &&
-			fabsf(current_distance-target_distance)/current_distance > 0.01f)
-		{ //large shift happened, interpolate smoothly to new target distance
-			transition_time = 0.f;
-			start_distance = current_distance;
-		}
-		else if (transition_time < 1.f)
-		{ //currently in a transition, continue interpolating
-			transition_time += 1.f/gSavedSettings.getF32("CameraFocusTransitionTime")*gFrameIntervalSeconds;
-			transition_time = llmin(transition_time, 1.f);
+			LLVector3 eye = LLViewerCamera::getInstance()->getOrigin();
+			F32 target_distance = 16.f;
+			if (!focus_point.isExactlyZero())
+			{
+				target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point-eye);
+			}
 
-			F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f;
-			current_distance = start_distance + (target_distance-start_distance)*t;
-		}
-		else
-		{ //small or no change, just snap to target distance
-			current_distance = target_distance;
-		}
+			if (transition_time >= 1.f &&
+				fabsf(current_distance-target_distance)/current_distance > 0.01f)
+			{ //large shift happened, interpolate smoothly to new target distance
+				transition_time = 0.f;
+				start_distance = current_distance;
+			}
+			else if (transition_time < 1.f)
+			{ //currently in a transition, continue interpolating
+				transition_time += 1.f/gSavedSettings.getF32("CameraFocusTransitionTime")*gFrameIntervalSeconds;
+				transition_time = llmin(transition_time, 1.f);
 
-		//convert to mm
-		F32 subject_distance = current_distance*1000.f;
-		F32 fnumber = gSavedSettings.getF32("CameraFNumber");
-		F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength");
+				F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f;
+				current_distance = start_distance + (target_distance-start_distance)*t;
+			}
+			else
+			{ //small or no change, just snap to target distance
+				current_distance = target_distance;
+			}
 
-		if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField"))
-		{ //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult
-			default_focal_length = 5.f;
-		}
+			//convert to mm
+			F32 subject_distance = current_distance*1000.f;
+			F32 fnumber = gSavedSettings.getF32("CameraFNumber");
+			F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength");
 
-		F32 fov = LLViewerCamera::getInstance()->getView();
+			F32 fov = LLViewerCamera::getInstance()->getView();
 		
-		const F32 default_fov = gSavedSettings.getF32("CameraFieldOfView") * F_PI/180.f;
-		//const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio");
+			const F32 default_fov = gSavedSettings.getF32("CameraFieldOfView") * F_PI/180.f;
+			//const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio");
 		
-		//F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight();
+			//F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight();
 		
-		F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f);
-		//F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f);
+			F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f);
+			//F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f);
 
-		F32 focal_length = dv/(2*tanf(fov/2.f));
+			F32 focal_length = dv/(2*tanf(fov/2.f));
 		 
-		//F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle);
+			//F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle);
 	
-		// from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f))
-		// where	 N = fnumber
-		//			 s2 = dot distance
-		//			 s1 = subject distance
-		//			 f = focal length
-		//	
-
-		F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length));
-		blur_constant /= 1000.f; //convert to meters for shader
-		F32 magnification = focal_length/(subject_distance-focal_length);
-
-		shader->uniform1f("focal_distance", -subject_distance/1000.f);
-		shader->uniform1f("blur_constant", blur_constant);
-		shader->uniform1f("tan_pixel_angle", tanf(1.f/LLDrawable::sCurPixelAngle));
-		shader->uniform1f("magnification", magnification);
+			// from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f))
+			// where	 N = fnumber
+			//			 s2 = dot distance
+			//			 s1 = subject distance
+			//			 f = focal length
+			//	
+
+			F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length));
+			blur_constant /= 1000.f; //convert to meters for shader
+			F32 magnification = focal_length/(subject_distance-focal_length);
+
+			shader->uniform1f("focal_distance", -subject_distance/1000.f);
+			shader->uniform1f("blur_constant", blur_constant);
+			shader->uniform1f("tan_pixel_angle", tanf(1.f/LLDrawable::sCurPixelAngle));
+			shader->uniform1f("magnification", magnification);
+		}
 
 		S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);
 		if (channel > -1)