diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 0ac30b4d63a52be2763d6fb412525c85a539ef0c..41301b6c852795fbedd03f223384039bc4a41c7e 100755
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -2196,7 +2196,16 @@ void LLRender::texCoord2fv(const GLfloat* tc)
 
 void LLRender::color4ub(const GLubyte& r, const GLubyte& g, const GLubyte& b, const GLubyte& a)
 {
-	mColorsp[mCount] = LLColor4U(r,g,b,a);
+	if (LLGLSLShader::sNoFixedFunction && 
+		(!LLGLSLShader::sCurBoundShaderPtr || 
+		LLGLSLShader::sCurBoundShaderPtr->mAttributeMask & LLVertexBuffer::MAP_COLOR))
+	{
+		mColorsp[mCount] = LLColor4U(r,g,b,a);
+	}
+	else
+	{ //not using shaders or shader reads color from a uniform
+		diffuseColor4ub(r,g,b,a);
+	}
 }
 void LLRender::color4ubv(const GLubyte* c)
 {
diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl
index 67dc5004933fdee792c3bfcc3ffbaafbc7593ec8..da02534dbb59421d80d1e2bbba06a25107923940 100755
--- a/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl
@@ -31,12 +31,13 @@ out vec4 frag_color;
 
 uniform sampler2D tex0;
 
-VARYING vec4 vertex_color;
+uniform vec4 color;
+
 VARYING vec2 vary_texcoord0;
 
 void main() 
 {
-	float alpha = texture2D(tex0, vary_texcoord0.xy).a * vertex_color.a;
+	float alpha = texture2D(tex0, vary_texcoord0.xy).a * color.a;
 
-	frag_color = vec4(vertex_color.rgb, alpha);
+	frag_color = vec4(color.rgb, alpha);
 }
diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl
index c58f9dfdaf84554d27e407035229ae23df175b88..f33115d78d7004aa8726eceff29d2b4673024c88 100755
--- a/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl
@@ -26,16 +26,13 @@
 uniform mat4 modelview_projection_matrix;
  
 ATTRIBUTE vec3 position;
-ATTRIBUTE vec4 diffuse_color;
 ATTRIBUTE vec2 texcoord0;
 
-VARYING vec4 vertex_color;
 VARYING vec2 vary_texcoord0;
 
 void main()
 {
 	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
-	vertex_color = diffuse_color;
 	vary_texcoord0 = texcoord0;
 }
 
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 7b397d46f31d501393dd497be626cac5b3b2f20c..c83b459279c5d04ae2ceb03ba76ea9f2982a8254 100755
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -6187,8 +6187,8 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
 	LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
 
 	if (shader)
-	{ //switch to "solid color" program for SH-2690 -- works around driver bug causing bad triangles when rendering silhouettes
-		gSolidColorProgram.bind();
+	{ //use UI program for selection highlights (texture color modulated by vertex color)
+		gUIProgram.bind();
 	}
 
 	gGL.matrixMode(LLRender::MM_MODELVIEW);
@@ -6243,10 +6243,11 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
 			gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
 			gGL.begin(LLRender::LINES);
 			{
+				gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
+
 				for(S32 i = 0; i < mSilhouetteVertices.size(); i += 2)
 				{
 					u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
-					gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
 					gGL.texCoord2f( u_coord, v_coord );
 					gGL.vertex3fv( mSilhouetteVertices[i].mV);
 					u_coord += u_divisor * LLSelectMgr::sHighlightUScale;