diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
index c2e1ddf734fb30b384e92a7e184dfdeeee4251d8..101458c438d53bf1dada4564e9e07b83d25e5f97 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
@@ -12,7 +12,7 @@ uniform vec4 origin;
 void main()
 {
 	//transform vertex
-	gl_Position = ftransform(); //gl_ModelViewProjectionMatrix * gl_Vertex;
+	gl_Position = ftransform();
 	
 	vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
 	vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 02c7e3bb6f639be7964d7761ba5046af4d43d724..9463be6059f080497cb1eee984e7adbaba56aef9 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -364,7 +364,7 @@ S32 LLDrawPoolAvatar::getNumPasses()
 	}
 	else if (getVertexShaderLevel() > 0)
 	{
-		return 5;
+		return 6;
 	}
 	else
 	{
@@ -411,6 +411,9 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass)
 		beginRiggedSimple();
 		break;
 	case 4:
+		beginRiggedFullbright();
+		break;
+	case 5:
 		beginRiggedShinySimple();
 		break;
 	}
@@ -441,6 +444,9 @@ void LLDrawPoolAvatar::endRenderPass(S32 pass)
 		endRiggedSimple();
 		break;
 	case 4:
+		endRiggedFullbright();
+		break;
+	case 5:
 		endRiggedShinySimple();
 		break;
 	}
@@ -644,6 +650,22 @@ void LLDrawPoolAvatar::endRiggedSimple()
 	LLVertexBuffer::sWeight4Loc = -1;
 }
 
+void LLDrawPoolAvatar::beginRiggedFullbright()
+{
+	sVertexProgram = &gSkinnedObjectFullbrightProgram;
+	diffuse_channel = 0;
+	gSkinnedObjectFullbrightProgram.bind();
+	LLVertexBuffer::sWeight4Loc = gSkinnedObjectFullbrightProgram.getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
+}
+
+void LLDrawPoolAvatar::endRiggedFullbright()
+{
+	sVertexProgram = NULL;
+	LLVertexBuffer::unbind();
+	gSkinnedObjectFullbrightProgram.unbind();
+	LLVertexBuffer::sWeight4Loc = -1;
+}
+
 void LLDrawPoolAvatar::beginRiggedShinySimple()
 {
 	sVertexProgram = &gSkinnedObjectShinySimpleProgram;
@@ -825,6 +847,12 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
 	}
 
 	if (pass == 4)
+	{
+		renderRiggedFullbright(avatarp);
+		return;
+	}
+
+	if (pass == 5)
 	{
 		renderRiggedShinySimple(avatarp);
 		return;
@@ -990,6 +1018,16 @@ void LLDrawPoolAvatar::renderRiggedSimple(LLVOAvatar* avatar)
 	renderRigged(avatar, RIGGED_SIMPLE, data_mask);
 }
 
+void LLDrawPoolAvatar::renderRiggedFullbright(LLVOAvatar* avatar)
+{
+	const U32 data_mask =	LLVertexBuffer::MAP_VERTEX | 
+							LLVertexBuffer::MAP_TEXCOORD0 |
+							LLVertexBuffer::MAP_COLOR |
+							LLVertexBuffer::MAP_WEIGHT4;
+
+	renderRigged(avatar, RIGGED_FULLBRIGHT, data_mask);
+}
+
 	
 void LLDrawPoolAvatar::renderRiggedShinySimple(LLVOAvatar* avatar)
 {
diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h
index 0ebb035f2a42d2fb730666cd532c5790f2d70fa4..84430693768d46f27824883c36969c484d1307ef 100644
--- a/indra/newview/lldrawpoolavatar.h
+++ b/indra/newview/lldrawpoolavatar.h
@@ -97,12 +97,14 @@ class LLDrawPoolAvatar : public LLFacePool
 	void beginImpostor();
 	void beginSkinned();
 	void beginRiggedSimple();
+	void beginRiggedFullbright();
 	void beginRiggedShinySimple();
 
 	void endRigid();
 	void endImpostor();
 	void endSkinned();
 	void endRiggedSimple();
+	void endRiggedFullbright();
 	void endRiggedShinySimple();
 
 	void beginDeferredImpostor();
@@ -123,6 +125,7 @@ class LLDrawPoolAvatar : public LLFacePool
 
 	void renderRigged(LLVOAvatar* avatar, U32 type, const U32 data_mask);
 	void renderRiggedSimple(LLVOAvatar* avatar);
+	void renderRiggedFullbright(LLVOAvatar* avatar);
 	void renderRiggedShinySimple(LLVOAvatar* avatar);
 
 	/*virtual*/ LLViewerTexture *getDebugTexture();
@@ -133,11 +136,11 @@ class LLDrawPoolAvatar : public LLFacePool
 	typedef enum
 	{
 		RIGGED_SIMPLE = 0,
+		RIGGED_FULLBRIGHT,
 		RIGGED_SHINY_SIMPLE,
 		RIGGED_SHINY_FULLBRIGHT,
 		RIGGED_SHINY_BUMP,
 		RIGGED_BUMP,
-		RIGGED_FULLBRIGHT,
 		RIGGED_ALPHA,
 		NUM_RIGGED_PASSES,
 		RIGGED_UNKNOWN,
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 0e0b8447caff81a3da49e3c7f878e6fa61e11379..9df692e787e42632f12210e4c8b66a8890b1a2f0 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -41,6 +41,7 @@
 #include "m3math.h"
 #include "v3color.h"
 
+#include "lldrawpoolavatar.h"
 #include "lldrawpoolbump.h"
 #include "llgl.h"
 #include "llrender.h"
@@ -207,10 +208,14 @@ void LLFace::destroy()
 		LLFastTimer t(FTM_DESTROY_DRAWPOOL);
 
 		if (this->isState(LLFace::RIGGED) && mDrawPoolp->getType() == LLDrawPool::POOL_AVATAR)
-		mDrawPoolp->removeFace(this);
-
-		
-		
+		{
+			((LLDrawPoolAvatar*) mDrawPoolp)->removeRiggedFace(this);
+		}
+		else
+		{
+			mDrawPoolp->removeFace(this);
+		}
+	
 		mDrawPoolp = NULL;
 	}
 
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index fe68d6eaa4cc2854ff2bf685f10c94906f3bdaa8..3cc5b4357ac500c89542fb359de4202c80dc6b27 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -79,6 +79,7 @@ LLGLSLShader		gObjectShinyWaterProgram;
 
 //object hardware skinning shaders
 LLGLSLShader		gSkinnedObjectSimpleProgram;
+LLGLSLShader		gSkinnedObjectFullbrightProgram;
 LLGLSLShader		gSkinnedObjectShinySimpleProgram;
 
 //environment shaders
@@ -155,6 +156,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
 	mShaderList.push_back(&gObjectFullbrightProgram);
 	mShaderList.push_back(&gObjectFullbrightShinyProgram);
 	mShaderList.push_back(&gSkinnedObjectSimpleProgram);
+	mShaderList.push_back(&gSkinnedObjectFullbrightProgram);
 	mShaderList.push_back(&gSkinnedObjectShinySimpleProgram);
 	mShaderList.push_back(&gTerrainProgram);
 	mShaderList.push_back(&gTerrainWaterProgram);
@@ -562,6 +564,7 @@ void LLViewerShaderMgr::unloadShaders()
 	gObjectShinyWaterProgram.unload();
 
 	gSkinnedObjectSimpleProgram.unload();
+	gSkinnedObjectFullbrightProgram.unload();
 	gSkinnedObjectShinySimpleProgram.unload();
 	
 
@@ -1258,6 +1261,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
 		gObjectFullbrightProgram.unload();
 		gObjectFullbrightWaterProgram.unload();
 		gSkinnedObjectSimpleProgram.unload();
+		gSkinnedObjectFullbrightProgram.unload();
 		gSkinnedObjectShinySimpleProgram.unload();
 	
 		return FALSE;
@@ -1385,6 +1389,21 @@ BOOL LLViewerShaderMgr::loadShadersObject()
 		success = gSkinnedObjectSimpleProgram.createShader(NULL, NULL);
 	}
 
+	if (success)
+	{
+		gSkinnedObjectFullbrightProgram.mName = "Skinned Fullbright Shader";
+		gSkinnedObjectFullbrightProgram.mFeatures.calculatesAtmospherics = true;
+		gSkinnedObjectFullbrightProgram.mFeatures.hasGamma = true;
+		gSkinnedObjectFullbrightProgram.mFeatures.hasTransport = true;
+		gSkinnedObjectFullbrightProgram.mFeatures.isFullbright = true;
+		gSkinnedObjectFullbrightProgram.mFeatures.hasObjectSkinning = true;
+		gSkinnedObjectFullbrightProgram.mShaderFiles.clear();
+		gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+		gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+		gSkinnedObjectFullbrightProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+		success = gSkinnedObjectFullbrightProgram.createShader(NULL, NULL);
+	}
+
 	if (success)
 	{
 		gSkinnedObjectShinySimpleProgram.mName = "Skinned Shiny Simple Shader";
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index beac5462e2d91ee0ab856ce903ba398b6f180716..b4fc336bf310293fba1f55d6c0fb4c43df349389 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -315,6 +315,7 @@ extern LLGLSLShader			gObjectShinyProgram;
 extern LLGLSLShader			gObjectShinyWaterProgram;
 
 extern LLGLSLShader			gSkinnedObjectSimpleProgram;
+extern LLGLSLShader			gSkinnedObjectFullbrightProgram;
 extern LLGLSLShader			gSkinnedObjectShinySimpleProgram;
 
 //environment shaders
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index e49b33bd80d4504c9d18eaf7eeb65675fe132b5e..3449c05be8e9f87f62878bc2e3703b8513af9d6a 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -3551,7 +3551,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 						}
 						else
 						{
-							pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
+							if (te->getFullbright())
+							{
+								pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT);
+							}
+							else
+							{
+								pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
+							}
 						}
 					}