diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp
index 6dbbd52fa325fe726b6b0380eb8516eaf273e3ba..67643c4c1c2f3941642b7d12e72a70f63bee3a5f 100644
--- a/indra/llprimitive/lldaeloader.cpp
+++ b/indra/llprimitive/lldaeloader.cpp
@@ -1466,19 +1466,18 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do
 									mat.mMatrix[i][j] = transform[k*16 + i + j*4];
 								}
 							}
-							model->mSkinInfo.mInvBindMatrix.push_back(LLMatrix4a(mat));
+
+							LLMatrix4a inv_bind(mat);
+							model->mSkinInfo.mInvBindMatrix.push_back(inv_bind);
+							LLMatrix4a inv_bind_shape;
+							inv_bind_shape.setMul(inv_bind, model->mSkinInfo.mBindShapeMatrix);
+							model->mSkinInfo.mInvBindShapeMatrix.push_back(inv_bind_shape);
 						}
 					}
 				}
 			}
 		}
 
-		model->mSkinInfo.mInvBindShapeMatrix.resize(llmin(model->mSkinInfo.mInvBindMatrix.size(), (size_t)216));
-		for (U32 i = 0; i < model->mSkinInfo.mInvBindShapeMatrix.size(); ++i)
-		{
-			model->mSkinInfo.mInvBindShapeMatrix[i].setMul(model->mSkinInfo.mInvBindMatrix[i], model->mSkinInfo.mBindShapeMatrix);
-		}
-
 		//Now that we've parsed the joint array, let's determine if we have a full rig
 		//(which means we have all the joint sthat are required for an avatar versus
 		//a skinned asset attached to a node in a file that contains an entire skeleton,
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 60f03cd9db7c49e96f4a90a226260ea242950a72..142b9823c150148c278db03044e80ef0540a3428 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -1450,6 +1450,20 @@ void LLMeshSkinInfo::fromLLSD(const LLSD& skin)
 		}
 	}
 
+	if (skin.has("bind_shape_matrix"))
+	{
+		const auto& bind_shape_mat = skin["bind_shape_matrix"];
+		LLMatrix4 mat;
+		for (auto j = 0; j < 4; j++)
+		{
+			for (auto k = 0; k < 4; k++)
+			{
+				mat.mMatrix[j][k] = bind_shape_mat[j*4+k].asReal();
+			}
+		}
+		mBindShapeMatrix.loadu(mat);
+	}
+
 	if (skin.has("inverse_bind_matrix"))
 	{
 		const auto& inv_bind_mat = skin["inverse_bind_matrix"];
@@ -1464,7 +1478,12 @@ void LLMeshSkinInfo::fromLLSD(const LLSD& skin)
 				}
 			}
 
-			mInvBindMatrix.push_back(LLMatrix4a(mat));
+			LLMatrix4a inv_bind(mat);
+			mInvBindMatrix.push_back(inv_bind);
+
+			LLMatrix4a inv_bind_shape;
+			inv_bind_shape.setMul(inv_bind, mBindShapeMatrix);
+			mInvBindShapeMatrix.push_back(inv_bind_shape);
 		}
 
         if (mJointNames.size() != mInvBindMatrix.size())
@@ -1476,26 +1495,6 @@ void LLMeshSkinInfo::fromLLSD(const LLSD& skin)
         }
 	}
 
-	if (skin.has("bind_shape_matrix"))
-	{
-		const auto& bind_shape_mat = skin["bind_shape_matrix"];
-		LLMatrix4 mat;
-		for (auto j = 0; j < 4; j++)
-		{
-			for (auto k = 0; k < 4; k++)
-			{
-				mat.mMatrix[j][k] = bind_shape_mat[j*4+k].asReal();
-			}
-		}
-		mBindShapeMatrix.loadu(mat);
-	}
-
-	mInvBindShapeMatrix.resize(llmin(mInvBindMatrix.size(), (size_t)216));
-	for (U32 i = 0; i < mInvBindShapeMatrix.size(); ++i)
-	{
-		mInvBindShapeMatrix[i].setMul(mInvBindMatrix[i], mBindShapeMatrix);
-	}
-
 	if (skin.has("alt_inverse_bind_matrix"))
 	{
 		const auto& alt_inv_bind_mat = skin["alt_inverse_bind_matrix"];