diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 821d58a9b282c6fe41bf009905588418379224dc..f828b56f7f587099f82a574740acc58cf82c2485 100755
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1600,6 +1600,14 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
 		for (U32 j = 0; j < count; ++j)
 		{
 			LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
+			if (!joint)
+			{
+				joint = avatar->getJoint("mPelvis");
+			}
+			if (!joint)
+			{
+				LL_DEBUGS("Avatar") << "Failed to find " << skin->mJointNames[j] << LL_ENDL;
+			}
 			if (joint)
 			{
 				mat[j] = skin->mInvBindMatrix[j];
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 4b0e4514a0909b54194dc1990fd4fc4764298576..fb34d6f588960474da59ff5dfc7638795836df27 100755
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -4184,11 +4184,23 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
 	for (U32 j = 0; j < maxJoints; ++j)
 	{
 		LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
+        if (!joint)
+        {
+            // Fall back to a point inside the avatar if mesh is
+            // rigged to an unknown joint.
+            joint = avatar->getJoint("mPelvis");
+        }
 		if (joint)
 		{
 			mat[j] = skin->mInvBindMatrix[j];
 			mat[j] *= joint->getWorldMatrix();
 		}
+		else
+		{
+            // This shouldn't be possible unless the avatar skeleton
+            // is corrupt.
+			llassert(false);
+		}
 	}
 
 	for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
@@ -4228,8 +4240,21 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
 						wght[k] = w - floorf(w);
 						scale += wght[k];
 					}
-
-					wght *= 1.f/scale;
+					if (scale > 0.f)
+					{
+						wght *= 1.f / scale;
+					}
+                    else
+                    {
+                        // Complete weighting fail - all zeroes.  Just
+                        // pick some values that add up to 1.0 so we
+                        // don't wind up with garbage vertices
+                        // pointing off at (0,0,0)
+                        wght[0] = 1.f;
+                        wght[1] = 0.f;
+                        wght[2] = 0.f;
+                        wght[3] = 0.f;
+                    }
 
 					for (U32 k = 0; k < 4; k++)
 					{
@@ -4237,9 +4262,8 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
 
 						LLMatrix4a src;
 						// Insure ref'd bone is in our clamped array of mats
-						llassert(idx[k] < kMaxJoints);
-						// clamp k to kMaxJoints to avoid reading garbage off stack in release
-						src.setMul(mp[idx[(k < kMaxJoints) ? k : 0]], w);
+						// clamp idx to maxJoints to avoid reading garbage off stack in release
+						src.setMul(mp[(idx[k]<maxJoints)?idx[k]:0], w);
 						final_mat.add(src);
 					}