diff --git a/doc/contributions.txt b/doc/contributions.txt
index 5739894fa9c027e87c95e2f592c1f57ff7b76bae..017e77994b2573721109687443c5c991dcf24372 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -1235,6 +1235,7 @@ Shnurui Troughton
 Shyotl Kuhr
 	MAINT-1138
 	MAINT-2334
+	MAINT-6913
 Siana Gearz
 	STORM-960
 	STORM-1088
@@ -1268,6 +1269,7 @@ Sovereign Engineer
     MAINT-6107
     STORM-2107
     MAINT-6218
+    MAINT-6913
 SpacedOut Frye
 	VWR-34
 	VWR-45
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index e24d3bb5ba2388ebbe4e7585d394b445c648b7ec..7757198af525935904294419c8e4752decee956e 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -306,6 +306,7 @@ PFNGLUNIFORM3IVARBPROC glUniform3ivARB = NULL;
 PFNGLUNIFORM4IVARBPROC glUniform4ivARB = NULL;
 PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB = NULL;
 PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB = NULL;
+PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv = NULL;
 PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB = NULL;
 PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB = NULL;
 PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB = NULL;
@@ -1333,6 +1334,7 @@ void LLGLManager::initExtensions()
 		glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform4ivARB");
 		glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix2fvARB");
 		glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix3fvARB");
+		glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix3x4fv");
 		glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix4fvARB");
 		glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetObjectParameterfvARB");
 		glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetObjectParameterivARB");
diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h
index a95872e883edc17ea44672dcb5b919cb2ddf458f..722dd9050bc1819fb31c72382226805e04f5593b 100644
--- a/indra/llrender/llglheaders.h
+++ b/indra/llrender/llglheaders.h
@@ -155,6 +155,7 @@ extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB;
 extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB;
 extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB;
 extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB;
+extern PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv;
 extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB;
 extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB;
 extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
@@ -422,6 +423,7 @@ extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB;
 extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB;
 extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB;
 extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB;
+extern PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv;
 extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB;
 extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB;
 extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
@@ -668,6 +670,7 @@ extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB;
 extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB;
 extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB;
 extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB;
+extern PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv;
 extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB;
 extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB;
 extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 58c1186a3e7c9e11a28549b11208af177a06e64c..5d669fb955b086b9c9a3dbec3e8bccbb0ab67dc0 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -1257,6 +1257,23 @@ void LLGLSLShader::uniformMatrix3fv(U32 index, U32 count, GLboolean transpose, c
     }
 }
 
+void LLGLSLShader::uniformMatrix3x4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v)
+{
+	if (mProgramObject > 0)
+	{	
+		if (mUniform.size() <= index)
+		{
+			UNIFORM_ERRS << "Uniform index out of bounds." << LL_ENDL;
+			return;
+		}
+
+		if (mUniform[index] >= 0)
+		{
+			glUniformMatrix3x4fv(mUniform[index], count, transpose, v);
+		}
+	}
+}
+
 void LLGLSLShader::uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v)
 {
     if (mProgramObject > 0)
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 0746e8760abfbd5426f60502f631d812f10d12b4..6f10d122cb1d19ffcdf6664b38ba667218876b43 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -115,6 +115,7 @@ class LLGLSLShader
 	void uniform2i(const LLStaticHashedString& uniform, GLint i, GLint j);
 	void uniformMatrix2fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
 	void uniformMatrix3fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
+	void uniformMatrix3x4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
 	void uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
 	void uniform1i(const LLStaticHashedString& uniform, GLint i);
 	void uniform1f(const LLStaticHashedString& uniform, GLfloat v);
diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
index 8f754fe82b04d90fb61559f18985547d5c4cc802..90bf2851c9e0f49534f19e18a07c6ecdefb66c91 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
@@ -24,11 +24,7 @@
 
 ATTRIBUTE vec4 weight4;  
 
-/* BENTO JOINT COUNT LIMITS
- * Note that the value in these two lines also needs to be updated to value-1 several places below.
- */
-uniform mat3 matrixPalette[MAX_JOINTS_PER_MESH_OBJECT];
-uniform vec3 translationPalette[MAX_JOINTS_PER_MESH_OBJECT];
+uniform mat3x4 matrixPalette[MAX_JOINTS_PER_MESH_OBJECT];
 
 mat4 getObjectSkinnedTransform()
 {
@@ -37,8 +33,8 @@ mat4 getObjectSkinnedTransform()
 	vec4 w = fract(weight4);
 	vec4 index = floor(weight4);
 	
-		 index = min(index, vec4(MAX_JOINTS_PER_MESH_OBJECT-1));
-		 index = max(index, vec4( 0.0));
+    index = min(index, vec4(MAX_JOINTS_PER_MESH_OBJECT-1));
+    index = max(index, vec4( 0.0));
 
     w *= 1.0/(w.x+w.y+w.z+w.w);
 	
@@ -46,16 +42,16 @@ mat4 getObjectSkinnedTransform()
 	int i2 = int(index.y);
 	int i3 = int(index.z);
 	int i4 = int(index.w);
-		
-	mat3 mat  = matrixPalette[i1]*w.x;
-		 mat += matrixPalette[i2]*w.y;
-		 mat += matrixPalette[i3]*w.z;
-		 mat += matrixPalette[i4]*w.w;
 
-	vec3 trans = translationPalette[i1]*w.x;
-	trans += translationPalette[i2]*w.y;
-	trans += translationPalette[i3]*w.z;
-	trans += translationPalette[i4]*w.w;
+	mat3 mat = mat3(matrixPalette[i1])*w.x;
+		 mat += mat3(matrixPalette[i2])*w.y;
+		 mat += mat3(matrixPalette[i3])*w.z;
+		 mat += mat3(matrixPalette[i4])*w.w;
+
+	vec3 trans = vec3(matrixPalette[i1][0].w,matrixPalette[i1][1].w,matrixPalette[i1][2].w)*w.x;
+		 trans += vec3(matrixPalette[i2][0].w,matrixPalette[i2][1].w,matrixPalette[i2][2].w)*w.y;
+		 trans += vec3(matrixPalette[i3][0].w,matrixPalette[i3][1].w,matrixPalette[i3][2].w)*w.z;
+		 trans += vec3(matrixPalette[i4][0].w,matrixPalette[i4][1].w,matrixPalette[i4][2].w)*w.w;
 
 	mat4 ret;
 
@@ -68,10 +64,8 @@ mat4 getObjectSkinnedTransform()
 
 #ifdef IS_AMD_CARD
    // If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage awawy which leads to unfun crashes and artifacts.
-   mat3 dummy1 = matrixPalette[0];
-   vec3 dummy2 = translationPalette[0];
-   mat3 dummy3 = matrixPalette[MAX_JOINTS_PER_MESH_OBJECT-1];
-   vec3 dummy4 = translationPalette[MAX_JOINTS_PER_MESH_OBJECT-1];
+   mat3x4 dummy1 = matrixPalette[0];
+   mat3x4 dummy2 = matrixPalette[MAX_JOINTS_PER_MESH_OBJECT-1];
 #endif
 
 }
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 517c69305a8dfa6c41c545dea91cb5c72ddf9af7..10311044d2d9ef3d62f35528cbc02136a370a979 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1708,43 +1708,35 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
 
 				stop_glerror();
 
-				F32 mp[LL_MAX_JOINTS_PER_MESH_OBJECT*9];
-
-				F32 transp[LL_MAX_JOINTS_PER_MESH_OBJECT*3];
+				F32 mp[LL_MAX_JOINTS_PER_MESH_OBJECT*12];
 
 				for (U32 i = 0; i < count; ++i)
 				{
 					F32* m = (F32*) mat[i].mMatrix[0].getF32ptr();
 
-					U32 idx = i*9;
+					U32 idx = i*12;
 
 					mp[idx+0] = m[0];
 					mp[idx+1] = m[1];
 					mp[idx+2] = m[2];
+					mp[idx+3] = m[12];
 
-					mp[idx+3] = m[4];
-					mp[idx+4] = m[5];
-					mp[idx+5] = m[6];
-
-					mp[idx+6] = m[8];
-					mp[idx+7] = m[9];
-					mp[idx+8] = m[10];
-
-					idx = i*3;
+					mp[idx+4] = m[4];
+					mp[idx+5] = m[5];
+					mp[idx+6] = m[6];
+					mp[idx+7] = m[13];
 
-					transp[idx+0] = m[12];
-					transp[idx+1] = m[13];
-					transp[idx+2] = m[14];
+					mp[idx+8] = m[8];
+					mp[idx+9] = m[9];
+					mp[idx+10] = m[10];
+					mp[idx+11] = m[14];
 				}
 
-				LLDrawPoolAvatar::sVertexProgram->uniformMatrix3fv(LLViewerShaderMgr::AVATAR_MATRIX, 
+				LLDrawPoolAvatar::sVertexProgram->uniformMatrix3x4fv(LLViewerShaderMgr::AVATAR_MATRIX, 
 					count,
 					FALSE,
 					(GLfloat*) mp);
 
-				LLDrawPoolAvatar::sVertexProgram->uniform3fv(LLShaderMgr::AVATAR_TRANSLATION, count, transp);
-
-				
 				stop_glerror();
 			}
 			else