diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index beefcf13528d361ecb688ffa296903f8559bb36b..37ac88369c125d9159e7460bab5b366bc0f4b02b 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -575,10 +575,8 @@ void LLDrawPoolWater::shade2(bool edge, LLGLSLShader* shader, const LLColor3& li
 	shader->uniform1f(LLShaderMgr::WATER_SPECULAR_EXP, light_exp);
     if (LLEnvironment::instance().isCloudScrollPaused())
     {
-        static const std::array<F32, 2> zerowave{ {0.0f, 0.0f} };
-        
-        shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR1, 1, zerowave.data());
-        shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR2, 1, zerowave.data());
+        shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR1, 1, LLVector2::zero.mV);
+        shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR2, 1, LLVector2::zero.mV);
     }
     else
     {
@@ -599,7 +597,6 @@ void LLDrawPoolWater::shade2(bool edge, LLGLSLShader* shader, const LLColor3& li
 	shader->uniform1f(LLShaderMgr::WATER_SUN_ANGLE, sunAngle);
 	shader->uniform1f(LLShaderMgr::WATER_SCALED_ANGLE, scaledAngle);
 	shader->uniform1f(LLShaderMgr::WATER_SUN_ANGLE2, 0.1f + 0.2f*sunAngle);
-    shader->uniform1i(LLShaderMgr::WATER_EDGE_FACTOR, edge ? 1 : 0);
 
     LLVector4 rotated_light_direction = LLEnvironment::instance().getRotatedLightNorm();
     shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, rotated_light_direction.mV);
@@ -614,61 +611,39 @@ void LLDrawPoolWater::shade2(bool edge, LLGLSLShader* shader, const LLColor3& li
 		shader->uniform1f(LLShaderMgr::WATER_REFSCALE, pwater->getScaleAbove());
 	}
 
-	{		
+	{
+		LLGLEnable depth_clamp(gGLManager.mHasDepthClamp ? GL_DEPTH_CLAMP : 0);
 		LLGLDisable cullface(GL_CULL_FACE);
+		for (LLFace* face : mDrawFace)
+		{
+			if (gSky.mVOSkyp->isReflFace(face))
+			{
+				continue;
+			}
 
-        if (edge)
-        {
-            for (std::vector<LLFace*>::iterator iter = mDrawFace.begin(); iter != mDrawFace.end(); iter++)
-		    {
-			    LLFace *face = *iter;
-                if (face)
-                {
-                    LLVOWater* water = (LLVOWater*) face->getViewerObject();
-					if (diffTex > -1)
-					{
-						gGL.getTexUnit(diffTex)->bind(face->getTexture());
-					}
-
-                    if (water)
-                    {
-                        bool edge_patch = water->getIsEdgePatch();
-                        if (edge_patch)
-                        {
-                            //sNeedsReflectionUpdate = TRUE;
-                            face->renderIndexed();
-                        }
-                    }
-                }
-		    }
-        }
-        else
-        {
-            for (std::vector<LLFace*>::iterator iter = mDrawFace.begin(); iter != mDrawFace.end(); iter++)
-		    {
-			    LLFace *face = *iter;
-                if (face)
-                {
-                    LLVOWater* water = (LLVOWater*) face->getViewerObject();
-					if (diffTex > -1)
-					{
-						gGL.getTexUnit(diffTex)->bind(face->getTexture());
-					}
-
-                    if (water)
-                    {
-                        bool edge_patch = water->getIsEdgePatch();
-                        if (!edge_patch)
-                        {
-                            sNeedsReflectionUpdate = TRUE;
-                            sNeedsDistortionUpdate = TRUE;
-                            face->renderIndexed();
-                        }
-                    }
-                }
-		    }
-        }
-    }
+			LLVOWater* water = (LLVOWater*)face->getViewerObject();
+			if (diffTex > -1)
+			{
+				gGL.getTexUnit(diffTex)->bind(face->getTexture());
+			}
+
+			if (!water->getIsEdgePatch())
+			{
+				sNeedsReflectionUpdate = TRUE;
+				sNeedsDistortionUpdate = TRUE;
+			}
+
+			if (water->getUseTexture() || !water->getIsEdgePatch() || gGLManager.mHasDepthClamp || deferred_render)
+			{
+				face->renderIndexed();
+			}
+			else
+			{
+				LLGLSquashToFarClip far_clip(get_current_projection());
+				face->renderIndexed();
+			}
+		}
+	}
 
     gGL.getTexUnit(bumpTex)->unbind(LLTexUnit::TT_TEXTURE);
     gGL.getTexUnit(bumpTex2)->unbind(LLTexUnit::TT_TEXTURE);
@@ -762,7 +737,7 @@ void LLDrawPoolWater::shade()
 	else
 	{
 		shader = &gWaterProgram;
-        edge_shader = &gWaterEdgeProgram;
+        edge_shader = nullptr;
 	}
 
 	static const LLCachedControl<bool> render_water_mip_normal(gSavedSettings, "RenderWaterMipNormal");
@@ -792,7 +767,7 @@ void LLDrawPoolWater::shade()
 	}
 
     shade2(false, shader, light_diffuse, light_dir, light_exp);
-    shade2(true, edge_shader ? edge_shader : shader, light_diffuse, light_dir, light_exp);
+    //shade2(true, edge_shader ? edge_shader : shader, light_diffuse, light_dir, light_exp);
 
 	gGL.getTexUnit(0)->activate();
 	gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp
index 6365df09e13834e241806460fa332d85b8f6fc8e..81bb95cb2424262881ad862fac8a66c55119e96d 100644
--- a/indra/newview/llvieweroctree.cpp
+++ b/indra/newview/llvieweroctree.cpp
@@ -1197,12 +1197,6 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh
 			bounds[0].add(*shift);
 		}
 
-		F32 OCCLUSION_FUDGE_Z = SG_OCCLUSION_FUDGE; //<-- #Solution #2
-		if (LLDrawPool::POOL_WATER == mSpatialPartition->mDrawableType)
-		{
-			OCCLUSION_FUDGE_Z = 1.;
-		}
-
 		// Don't cull hole/edge water, unless we have the GL_ARB_depth_clamp extension
 		if (earlyFail(camera, bounds))
 		{
@@ -1262,7 +1256,7 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh
 						shader->uniform3fv(LLShaderMgr::BOX_CENTER, 1, bounds[0].getF32ptr());
 						shader->uniform3f(LLShaderMgr::BOX_SIZE, bounds[1][0]+SG_OCCLUSION_FUDGE, 
 																 bounds[1][1]+SG_OCCLUSION_FUDGE, 
-																 bounds[1][2]+OCCLUSION_FUDGE_Z);
+																 bounds[1][2]+SG_OCCLUSION_FUDGE);
 
 						if (!use_depth_clamp && mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER)
 						{
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index d4c379e9bacc6d72ed8df2d4ddb32c573e39db81..eda9560f37cd145b4288b0a1479019d99c862cce 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -9398,7 +9398,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
             set_current_modelview(current);         
 		}
 
-        //LLPipeline::sUseOcclusion = occlusion;
+        LLPipeline::sUseOcclusion = occlusion;
 
 		camera.setOrigin(camera_in.getOrigin());
 		//render distortion map
@@ -9441,10 +9441,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 			
                 mWaterDis.bindTarget();
 			mWaterDis.getViewport(gGLViewport);
-			
-                gGL.setColorMask(true, true);
-                mWaterDis.clear();
-                gGL.setColorMask(true, false);
 
                 F32 water_dist = water_height * LLPipeline::sDistortionWaterClipPlaneMargin;