diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index c0a662a6c51ba4fba55dcf857bd27cafa8faf624..c48ec6b6a347e8c561ae3d68e919f171e5e13c1f 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -297,7 +297,15 @@ void LLDrawPoolAvatar::beginPostDeferredAlpha()
 {
 	sSkipOpaque = TRUE;
 	sShaderLevel = mShaderLevel;
-	sVertexProgram = &gDeferredAvatarAlphaProgram;
+	if (LLPipeline::sUnderWaterRender)
+	{
+		sVertexProgram = &gDeferredAvatarAlphaWaterProgram;
+	}
+	else
+	{
+		sVertexProgram = &gDeferredAvatarAlphaProgram;
+	}
+	
 	sRenderingSkinned = TRUE;
 
 	gPipeline.bindDeferredShader(*sVertexProgram);
@@ -309,7 +317,15 @@ void LLDrawPoolAvatar::beginPostDeferredAlpha()
 
 void LLDrawPoolAvatar::beginDeferredRiggedAlpha()
 {
-	sVertexProgram = &gDeferredSkinnedAlphaProgram;
+	if (LLPipeline::sUnderWaterRender)
+	{
+		sVertexProgram = &gDeferredSkinnedAlphaWaterProgram;
+	}
+	else
+	{
+		sVertexProgram = &gDeferredSkinnedAlphaProgram;
+	}
+
 	gPipeline.bindDeferredShader(*sVertexProgram);
 	sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
 	gPipeline.enableLightsDynamic();
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index e21a7f3b1ff14a1226ba121908cbcb02f4a5c9f4..db4323d1fe76500261f97a7ea9a0fa502bf53349 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -190,6 +190,7 @@ LLGLSLShader			gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
 LLGLSLShader			gDeferredSkinnedDiffuseProgram;
 LLGLSLShader			gDeferredSkinnedBumpProgram;
 LLGLSLShader			gDeferredSkinnedAlphaProgram;
+LLGLSLShader			gDeferredSkinnedAlphaWaterProgram;
 LLGLSLShader			gDeferredBumpProgram;
 LLGLSLShader			gDeferredTerrainProgram;
 LLGLSLShader            gDeferredTerrainWaterProgram;
@@ -197,6 +198,7 @@ LLGLSLShader			gDeferredTreeProgram;
 LLGLSLShader			gDeferredTreeShadowProgram;
 LLGLSLShader			gDeferredAvatarProgram;
 LLGLSLShader			gDeferredAvatarAlphaProgram;
+LLGLSLShader			gDeferredAvatarAlphaWaterProgram;
 LLGLSLShader			gDeferredLightProgram;
 LLGLSLShader			gDeferredMultiLightProgram[16];
 LLGLSLShader			gDeferredSpotLightProgram;
@@ -317,6 +319,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
 	mShaderList.push_back(&gDeferredAlphaImpostorProgram);
 	mShaderList.push_back(&gDeferredAlphaWaterProgram);
 	mShaderList.push_back(&gDeferredSkinnedAlphaProgram);
+	mShaderList.push_back(&gDeferredSkinnedAlphaWaterProgram);
 	mShaderList.push_back(&gDeferredFullbrightProgram);
 	mShaderList.push_back(&gDeferredFullbrightAlphaMaskProgram);
 	mShaderList.push_back(&gDeferredFullbrightWaterProgram);
@@ -330,6 +333,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
 	mShaderList.push_back(&gDeferredUnderWaterProgram);	
     mShaderList.push_back(&gDeferredTerrainWaterProgram);
 	mShaderList.push_back(&gDeferredAvatarAlphaProgram);
+	mShaderList.push_back(&gDeferredAvatarAlphaWaterProgram);
 	mShaderList.push_back(&gDeferredWLSkyProgram);
 	mShaderList.push_back(&gDeferredWLCloudProgram);
     mShaderList.push_back(&gDeferredWLMoonProgram);
@@ -817,6 +821,7 @@ void LLViewerShaderMgr::unloadShaders()
 	gDeferredSkinnedDiffuseProgram.unload();
 	gDeferredSkinnedBumpProgram.unload();
 	gDeferredSkinnedAlphaProgram.unload();
+	gDeferredSkinnedAlphaWaterProgram.unload();
 
 	mShaderLevel[SHADER_LIGHTING] = 0;
 	mShaderLevel[SHADER_OBJECT] = 0;
@@ -1207,6 +1212,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredSkinnedDiffuseProgram.unload();
 		gDeferredSkinnedBumpProgram.unload();
 		gDeferredSkinnedAlphaProgram.unload();
+		gDeferredSkinnedAlphaWaterProgram.unload();
 		gDeferredBumpProgram.unload();
 		gDeferredImpostorProgram.unload();
 		gDeferredTerrainProgram.unload();
@@ -1234,6 +1240,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
         gDeferredAttachmentAlphaMaskShadowProgram.unload();
 		gDeferredAvatarProgram.unload();
 		gDeferredAvatarAlphaProgram.unload();
+		gDeferredAvatarAlphaWaterProgram.unload();
 		gDeferredAlphaProgram.unload();
 		gDeferredAlphaWaterProgram.unload();
 		gDeferredFullbrightProgram.unload();
@@ -1446,6 +1453,62 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = true;
 	}
 
+	if (success)
+	{
+		gDeferredSkinnedAlphaWaterProgram.mName = "Deferred Skinned Underwater Alpha Shader";
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.hasObjectSkinning = true;
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.calculatesLighting = false;
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.hasLighting = false;
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.isAlphaLighting = true;
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.disableTextureIndex = true;
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.hasSrgb = true;
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.encodesNormal = true;
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.calculatesAtmospherics = true;
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.hasAtmospherics = true;
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.hasTransport = true;
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.hasGamma = true;
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.hasShadows = true;
+
+		gDeferredSkinnedAlphaWaterProgram.mShaderFiles.clear();
+		gDeferredSkinnedAlphaWaterProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER));
+		gDeferredSkinnedAlphaWaterProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER));
+		gDeferredSkinnedAlphaWaterProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+		gDeferredSkinnedAlphaWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+
+		gDeferredSkinnedAlphaWaterProgram.clearPermutations();
+		gDeferredSkinnedAlphaWaterProgram.addPermutation("USE_DIFFUSE_TEX", "1");
+		gDeferredSkinnedAlphaWaterProgram.addPermutation("WATER_FOG", "1");
+		gDeferredSkinnedAlphaWaterProgram.addPermutation("HAS_SKIN", "1");
+		gDeferredSkinnedAlphaWaterProgram.addPermutation("USE_VERTEX_COLOR", "1");
+
+		if (use_sun_shadow)
+		{
+			gDeferredSkinnedAlphaWaterProgram.addPermutation("HAS_SHADOW", "1");
+		}
+
+		if (ambient_kill)
+		{
+			gDeferredSkinnedAlphaWaterProgram.addPermutation("AMBIENT_KILL", "1");
+		}
+
+		if (sunlight_kill)
+		{
+			gDeferredSkinnedAlphaWaterProgram.addPermutation("SUNLIGHT_KILL", "1");
+		}
+
+		if (local_light_kill)
+		{
+			gDeferredSkinnedAlphaWaterProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
+		}
+
+		success = gDeferredSkinnedAlphaWaterProgram.createShader(NULL, NULL);
+		llassert(success);
+
+		// Hack to include uniforms for lighting without linking in lighting file
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.calculatesLighting = true;
+		gDeferredSkinnedAlphaWaterProgram.mFeatures.hasLighting = true;
+	}
+
 	if (success)
 	{
 		gDeferredBumpProgram.mName = "Deferred Bump Shader";
@@ -2507,7 +2570,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 
 	if (success)
 	{
-		gDeferredAvatarAlphaProgram.mName = "Avatar Alpha Shader";
+		gDeferredAvatarAlphaProgram.mName = "Deferred Avatar Alpha Shader";
 		gDeferredAvatarAlphaProgram.mFeatures.hasSkinning = true;
 		gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = false;
 		gDeferredAvatarAlphaProgram.mFeatures.hasLighting = false;
@@ -2557,6 +2620,61 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true;
 	}
 
+	if (success)
+	{
+		gDeferredAvatarAlphaWaterProgram.mName = "Deferred Avatar Underwater Alpha Shader";
+		gDeferredAvatarAlphaWaterProgram.mFeatures.hasSkinning = true;
+		gDeferredAvatarAlphaWaterProgram.mFeatures.calculatesLighting = false;
+		gDeferredAvatarAlphaWaterProgram.mFeatures.hasLighting = false;
+		gDeferredAvatarAlphaWaterProgram.mFeatures.isAlphaLighting = true;
+		gDeferredAvatarAlphaWaterProgram.mFeatures.disableTextureIndex = true;
+		gDeferredAvatarAlphaWaterProgram.mFeatures.hasSrgb = true;
+		gDeferredAvatarAlphaWaterProgram.mFeatures.encodesNormal = true;
+		gDeferredAvatarAlphaWaterProgram.mFeatures.calculatesAtmospherics = true;
+		gDeferredAvatarAlphaWaterProgram.mFeatures.hasAtmospherics = true;
+		gDeferredAvatarAlphaWaterProgram.mFeatures.hasTransport = true;
+		gDeferredAvatarAlphaWaterProgram.mFeatures.hasGamma = true;
+		gDeferredAvatarAlphaWaterProgram.mFeatures.isDeferred = true;
+		gDeferredAvatarAlphaWaterProgram.mFeatures.hasShadows = true;
+
+		gDeferredAvatarAlphaWaterProgram.mShaderFiles.clear();
+		gDeferredAvatarAlphaWaterProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER));
+		gDeferredAvatarAlphaWaterProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER));
+
+		gDeferredAvatarAlphaWaterProgram.clearPermutations();
+		gDeferredAvatarAlphaWaterProgram.addPermutation("USE_DIFFUSE_TEX", "1");
+		gDeferredAvatarAlphaWaterProgram.addPermutation("IS_AVATAR_SKIN", "1");
+		gDeferredAvatarAlphaWaterProgram.addPermutation("WATER_FOG", "1");
+
+		if (use_sun_shadow)
+		{
+			gDeferredAvatarAlphaWaterProgram.addPermutation("HAS_SHADOW", "1");
+		}
+
+		if (ambient_kill)
+		{
+			gDeferredAvatarAlphaWaterProgram.addPermutation("AMBIENT_KILL", "1");
+		}
+
+		if (sunlight_kill)
+		{
+			gDeferredAvatarAlphaWaterProgram.addPermutation("SUNLIGHT_KILL", "1");
+		}
+
+		if (local_light_kill)
+		{
+			gDeferredAvatarAlphaWaterProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
+		}
+		gDeferredAvatarAlphaWaterProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+		gDeferredAvatarAlphaWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+
+		success = gDeferredAvatarAlphaWaterProgram.createShader(NULL, NULL);
+		llassert(success);
+
+		gDeferredAvatarAlphaWaterProgram.mFeatures.calculatesLighting = true;
+		gDeferredAvatarAlphaWaterProgram.mFeatures.hasLighting = true;
+	}
+
 	if (success)
 	{
 		gDeferredPostGammaCorrectProgram.mName = "Deferred Gamma Correction Post Process";
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index 5b4b9451a5f3dd763fe281951a18dcae9c3a43b9..26ff76ef3dd5b86d96f116fca24d13d327e2e595 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -273,6 +273,7 @@ extern LLGLSLShader			gDeferredNonIndexedDiffuseProgram;
 extern LLGLSLShader			gDeferredSkinnedDiffuseProgram;
 extern LLGLSLShader			gDeferredSkinnedBumpProgram;
 extern LLGLSLShader			gDeferredSkinnedAlphaProgram;
+extern LLGLSLShader			gDeferredSkinnedAlphaWaterProgram;
 extern LLGLSLShader			gDeferredBumpProgram;
 extern LLGLSLShader			gDeferredTerrainProgram;
 extern LLGLSLShader			gDeferredTerrainWaterProgram;
@@ -313,6 +314,7 @@ extern LLGLSLShader			gDeferredFullbrightAlphaMaskWaterProgram;
 extern LLGLSLShader			gDeferredEmissiveProgram;
 extern LLGLSLShader			gDeferredAvatarEyesProgram;
 extern LLGLSLShader			gDeferredAvatarAlphaProgram;
+extern LLGLSLShader			gDeferredAvatarAlphaWaterProgram;
 extern LLGLSLShader			gDeferredWLSkyProgram;
 extern LLGLSLShader			gDeferredWLCloudProgram;
 extern LLGLSLShader			gDeferredWLSunProgram;