diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 9256e3959cdfa96912b7a9a62f5ce552c70d5f0b..f59bac8c3cc0ae8fbc6e65526a188995fe03f375 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -709,7 +709,15 @@ GLint LLGLSLShader::getUniformLocation(const string& uniform)
 		std::map<string, GLint>::iterator iter = mUniformMap.find(uniform);
 		if (iter != mUniformMap.end())
 		{
-			llassert(iter->second == glGetUniformLocationARB(mProgramObject, uniform.c_str()));
+			if (gDebugGL)
+			{
+				stop_glerror();
+				if (iter->second != glGetUniformLocationARB(mProgramObject, uniform.c_str()))
+				{
+					llerrs << "Uniform does not match." << llendl;
+				}
+				stop_glerror();
+			}
 			return iter->second;
 		}
 	}
@@ -900,7 +908,9 @@ void LLGLSLShader::uniformMatrix4fv(const string& uniform, U32 count, GLboolean
 				
 	if (location >= 0)
 	{
+		stop_glerror();
 		glUniformMatrix4fvARB(location, count, transpose, v);
+		stop_glerror();
 	}
 }
 
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 1788a3da3d907683bd3e7612a53eaad1649d4410..af082eea3e3bb0516f19a978757ae566d64b5b5f 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -838,7 +838,14 @@ void LLDrawPoolAvatar::endRiggedSimple()
 
 void LLDrawPoolAvatar::beginRiggedAlpha()
 {
-	sVertexProgram = &gSkinnedObjectSimpleProgram;
+	if (LLPipeline::sUnderWaterRender)
+	{
+		sVertexProgram = &gSkinnedObjectSimpleWaterProgram;
+	}
+	else
+	{
+		sVertexProgram = &gSkinnedObjectSimpleProgram;
+	}
 	sDiffuseChannel = 0;
 	sVertexProgram->bind();
 	LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
@@ -855,7 +862,14 @@ void LLDrawPoolAvatar::endRiggedAlpha()
 
 void LLDrawPoolAvatar::beginRiggedFullbrightAlpha()
 {
-	sVertexProgram = &gSkinnedObjectFullbrightProgram;
+	if (LLPipeline::sUnderWaterRender)
+	{
+		sVertexProgram = &gSkinnedObjectFullbrightWaterProgram;
+	}
+	else
+	{
+		sVertexProgram = &gSkinnedObjectFullbrightProgram;
+	}
 	sDiffuseChannel = 0;
 	sVertexProgram->bind();
 	LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
@@ -871,7 +885,14 @@ void LLDrawPoolAvatar::endRiggedFullbrightAlpha()
 
 void LLDrawPoolAvatar::beginRiggedGlow()
 {
-	sVertexProgram = &gSkinnedObjectFullbrightProgram;
+	if (LLPipeline::sUnderWaterRender)
+	{
+		sVertexProgram = &gSkinnedObjectFullbrightWaterProgram;
+	}
+	else
+	{
+		sVertexProgram = &gSkinnedObjectFullbrightProgram;
+	}
 	sDiffuseChannel = 0;
 	sVertexProgram->bind();
 	LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
@@ -887,23 +908,37 @@ void LLDrawPoolAvatar::endRiggedGlow()
 
 void LLDrawPoolAvatar::beginRiggedFullbright()
 {
-	sVertexProgram = &gSkinnedObjectFullbrightProgram;
+	if (LLPipeline::sUnderWaterRender)
+	{
+		sVertexProgram = &gSkinnedObjectFullbrightWaterProgram;
+	}
+	else
+	{
+		sVertexProgram = &gSkinnedObjectFullbrightProgram;
+	}
 	sDiffuseChannel = 0;
-	gSkinnedObjectFullbrightProgram.bind();
+	sVertexProgram->bind();
 	LLVertexBuffer::sWeight4Loc = gSkinnedObjectFullbrightProgram.getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
 }
 
 void LLDrawPoolAvatar::endRiggedFullbright()
 {
-	sVertexProgram = NULL;
 	LLVertexBuffer::unbind();
-	gSkinnedObjectFullbrightProgram.unbind();
+	sVertexProgram->unbind();
+	sVertexProgram = NULL;
 	LLVertexBuffer::sWeight4Loc = -1;
 }
 
 void LLDrawPoolAvatar::beginRiggedShinySimple()
 {
-	sVertexProgram = &gSkinnedObjectShinySimpleProgram;
+	if (LLPipeline::sUnderWaterRender)
+	{
+		sVertexProgram = &gSkinnedObjectShinySimpleWaterProgram;
+	}
+	else
+	{
+		sVertexProgram = &gSkinnedObjectShinySimpleProgram;
+	}
 	sVertexProgram->bind();
 	LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
 	LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
@@ -920,7 +955,14 @@ void LLDrawPoolAvatar::endRiggedShinySimple()
 
 void LLDrawPoolAvatar::beginRiggedFullbrightShiny()
 {
-	sVertexProgram = &gSkinnedObjectFullbrightShinyProgram;
+	if (LLPipeline::sUnderWaterRender)
+	{
+		sVertexProgram = &gSkinnedObjectFullbrightShinyWaterProgram;
+	}
+	else
+	{
+		sVertexProgram = &gSkinnedObjectFullbrightShinyProgram;
+	}
 	sVertexProgram->bind();
 	LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
 	LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
@@ -1288,6 +1330,8 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
 		return;
 	}
 
+	stop_glerror();
+
 	for (U32 i = 0; i < mRiggedFace[type].size(); ++i)
 	{
 		LLFace* face = mRiggedFace[type][i];
@@ -1324,9 +1368,13 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
 			continue;
 		}
 
+		stop_glerror();
+
 		const LLVolumeFace& vol_face = volume->getVolumeFace(te);
 		updateRiggedFaceVertexBuffer(face, skin, volume, vol_face);
 		
+		stop_glerror();
+
 		U32 data_mask = rigged_data_mask[type];
 
 		LLVertexBuffer* buff = face->mVertexBuffer;
@@ -1345,6 +1393,8 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
 				}
 			}
 			
+			stop_glerror();
+
 			LLDrawPoolAvatar::sVertexProgram->uniformMatrix4fv("matrixPalette", 
 				skin->mJointNames.size(),
 				FALSE,
@@ -1354,6 +1404,8 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
 				FALSE,
 				(GLfloat*) mat[0].mMatrix);
 
+			stop_glerror();
+
 			buff->setBuffer(data_mask);
 
 			U16 start = face->getGeomStart();
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index e8877664927a0cc5c56cf2567f1237e6dd4886b9..20e4333209260496c384a5fc858556e58d154487 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -84,9 +84,9 @@ LLGLSLShader		gSkinnedObjectFullbrightShinyProgram;
 LLGLSLShader		gSkinnedObjectShinySimpleProgram;
 
 LLGLSLShader		gSkinnedObjectSimpleWaterProgram;
-//LLGLSLShader		gSkinnedObjectFullbrightProgram;
-//LLGLSLShader		gSkinnedObjectFullbrightShinyProgram;
-//LLGLSLShader		gSkinnedObjectShinySimpleProgram;
+LLGLSLShader		gSkinnedObjectFullbrightWaterProgram;
+LLGLSLShader		gSkinnedObjectFullbrightShinyWaterProgram;
+LLGLSLShader		gSkinnedObjectShinySimpleWaterProgram;
 
 //environment shaders
 LLGLSLShader		gTerrainProgram;
@@ -164,10 +164,13 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
 	mShaderList.push_back(&gObjectFullbrightProgram);
 	mShaderList.push_back(&gObjectFullbrightShinyProgram);
 	mShaderList.push_back(&gSkinnedObjectSimpleProgram);
-	mShaderList.push_back(&gSkinnedObjectSimpleWaterProgram);
 	mShaderList.push_back(&gSkinnedObjectFullbrightProgram);
 	mShaderList.push_back(&gSkinnedObjectFullbrightShinyProgram);
 	mShaderList.push_back(&gSkinnedObjectShinySimpleProgram);
+	mShaderList.push_back(&gSkinnedObjectSimpleWaterProgram);
+	mShaderList.push_back(&gSkinnedObjectFullbrightWaterProgram);
+	mShaderList.push_back(&gSkinnedObjectFullbrightShinyWaterProgram);
+	mShaderList.push_back(&gSkinnedObjectShinySimpleWaterProgram);
 	mShaderList.push_back(&gTerrainProgram);
 	mShaderList.push_back(&gTerrainWaterProgram);
 	mShaderList.push_back(&gObjectSimpleWaterProgram);
@@ -576,11 +579,15 @@ void LLViewerShaderMgr::unloadShaders()
 	gObjectShinyWaterProgram.unload();
 
 	gSkinnedObjectSimpleProgram.unload();
-	gSkinnedObjectSimpleWaterProgram.unload();
 	gSkinnedObjectFullbrightProgram.unload();
 	gSkinnedObjectFullbrightShinyProgram.unload();
 	gSkinnedObjectShinySimpleProgram.unload();
 	
+	gSkinnedObjectSimpleWaterProgram.unload();
+	gSkinnedObjectFullbrightWaterProgram.unload();
+	gSkinnedObjectFullbrightShinyWaterProgram.unload();
+	gSkinnedObjectShinySimpleWaterProgram.unload();
+	
 
 	gWaterProgram.unload();
 	gUnderWaterProgram.unload();
@@ -1306,10 +1313,13 @@ BOOL LLViewerShaderMgr::loadShadersObject()
 		gObjectFullbrightProgram.unload();
 		gObjectFullbrightWaterProgram.unload();
 		gSkinnedObjectSimpleProgram.unload();
-		gSkinnedObjectSimpleWaterProgram.unload();
 		gSkinnedObjectFullbrightProgram.unload();
 		gSkinnedObjectFullbrightShinyProgram.unload();
 		gSkinnedObjectShinySimpleProgram.unload();
+		gSkinnedObjectSimpleWaterProgram.unload();
+		gSkinnedObjectFullbrightWaterProgram.unload();
+		gSkinnedObjectFullbrightShinyWaterProgram.unload();
+		gSkinnedObjectShinySimpleWaterProgram.unload();
 	
 		return FALSE;
 	}
@@ -1436,23 +1446,6 @@ BOOL LLViewerShaderMgr::loadShadersObject()
 		success = gSkinnedObjectSimpleProgram.createShader(NULL, NULL);
 	}
 
-	if (success)
-	{
-		gSkinnedObjectSimpleWaterProgram.mName = "Skinned Simple Water Shader";
-		gSkinnedObjectSimpleWaterProgram.mFeatures.calculatesLighting = true;
-		gSkinnedObjectSimpleWaterProgram.mFeatures.calculatesAtmospherics = true;
-		gSkinnedObjectSimpleWaterProgram.mFeatures.hasGamma = true;
-		gSkinnedObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true;
-		gSkinnedObjectSimpleWaterProgram.mFeatures.hasLighting = true;
-		gSkinnedObjectSimpleWaterProgram.mFeatures.hasWaterFog = true;
-		gSkinnedObjectSimpleWaterProgram.mFeatures.hasObjectSkinning = true;
-		gSkinnedObjectSimpleWaterProgram.mShaderFiles.clear();
-		gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
-		gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
-		gSkinnedObjectSimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
-		success = gSkinnedObjectSimpleWaterProgram.createShader(NULL, NULL);
-	}
-
 	if (success)
 	{
 		gSkinnedObjectFullbrightProgram.mName = "Skinned Fullbright Shader";
@@ -1500,6 +1493,77 @@ BOOL LLViewerShaderMgr::loadShadersObject()
 		success = gSkinnedObjectShinySimpleProgram.createShader(NULL, &mShinyUniforms);
 	}
 
+	if (success)
+	{
+		gSkinnedObjectSimpleWaterProgram.mName = "Skinned Simple Water Shader";
+		gSkinnedObjectSimpleWaterProgram.mFeatures.calculatesLighting = true;
+		gSkinnedObjectSimpleWaterProgram.mFeatures.calculatesAtmospherics = true;
+		gSkinnedObjectSimpleWaterProgram.mFeatures.hasGamma = true;
+		gSkinnedObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true;
+		gSkinnedObjectSimpleWaterProgram.mFeatures.hasLighting = true;
+		gSkinnedObjectSimpleWaterProgram.mFeatures.hasWaterFog = true;
+		gSkinnedObjectSimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+		gSkinnedObjectSimpleWaterProgram.mFeatures.hasObjectSkinning = true;
+		gSkinnedObjectSimpleWaterProgram.mShaderFiles.clear();
+		gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+		gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+		gSkinnedObjectSimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+		success = gSkinnedObjectSimpleWaterProgram.createShader(NULL, NULL);
+	}
+
+	if (success)
+	{
+		gSkinnedObjectFullbrightWaterProgram.mName = "Skinned Fullbright Water Shader";
+		gSkinnedObjectFullbrightWaterProgram.mFeatures.calculatesAtmospherics = true;
+		gSkinnedObjectFullbrightWaterProgram.mFeatures.hasGamma = true;
+		gSkinnedObjectFullbrightWaterProgram.mFeatures.hasTransport = true;
+		gSkinnedObjectFullbrightWaterProgram.mFeatures.isFullbright = true;
+		gSkinnedObjectFullbrightWaterProgram.mFeatures.hasObjectSkinning = true;
+		gSkinnedObjectFullbrightWaterProgram.mFeatures.hasWaterFog = true;
+		gSkinnedObjectFullbrightWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+		gSkinnedObjectFullbrightWaterProgram.mShaderFiles.clear();
+		gSkinnedObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+		gSkinnedObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+		gSkinnedObjectFullbrightWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+		success = gSkinnedObjectFullbrightWaterProgram.createShader(NULL, NULL);
+	}
+
+	if (success)
+	{
+		gSkinnedObjectFullbrightShinyWaterProgram.mName = "Skinned Fullbright Shiny Water Shader";
+		gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.calculatesAtmospherics = true;
+		gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasGamma = true;
+		gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasTransport = true;
+		gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.isShiny = true;
+		gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.isFullbright = true;
+		gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasObjectSkinning = true;
+		gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true;
+		gSkinnedObjectFullbrightShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+		gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.clear();
+		gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+		gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+		gSkinnedObjectFullbrightShinyWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+		success = gSkinnedObjectFullbrightShinyWaterProgram.createShader(NULL, &mShinyUniforms);
+	}
+
+	if (success)
+	{
+		gSkinnedObjectShinySimpleWaterProgram.mName = "Skinned Shiny Simple Water Shader";
+		gSkinnedObjectShinySimpleWaterProgram.mFeatures.calculatesLighting = true;
+		gSkinnedObjectShinySimpleWaterProgram.mFeatures.calculatesAtmospherics = true;
+		gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasGamma = true;
+		gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasAtmospherics = true;
+		gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasObjectSkinning = true;
+		gSkinnedObjectShinySimpleWaterProgram.mFeatures.isShiny = true;
+		gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasWaterFog = true;
+		gSkinnedObjectShinySimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+		gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.clear();
+		gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+		gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+		gSkinnedObjectShinySimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+		success = gSkinnedObjectShinySimpleWaterProgram.createShader(NULL, &mShinyUniforms);
+	}
+
 	if( !success )
 	{
 		mVertexShaderLevel[SHADER_OBJECT] = 0;
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index 99787f3c0a85c730fc96885aa99135f850204d31..b6fa86081c93adaf91f4dba2762071a8e42cc21d 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -320,9 +320,9 @@ extern LLGLSLShader			gSkinnedObjectFullbrightShinyProgram;
 extern LLGLSLShader			gSkinnedObjectShinySimpleProgram;
 
 extern LLGLSLShader			gSkinnedObjectSimpleWaterProgram;
-//extern LLGLSLShader			gSkinnedObjectFullbrightProgram;
-//extern LLGLSLShader			gSkinnedObjectFullbrightShinyProgram;
-//extern LLGLSLShader			gSkinnedObjectShinySimpleProgram;
+extern LLGLSLShader			gSkinnedObjectFullbrightWaterProgram;
+extern LLGLSLShader			gSkinnedObjectFullbrightShinyWaterProgram;
+extern LLGLSLShader			gSkinnedObjectShinySimpleWaterProgram;
 
 //environment shaders
 extern LLGLSLShader			gTerrainProgram;