diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp
index 9df033a4ca592c47f9f71bb5eb4f39034899f8d5..c6f45bffa2e941760730056b9c8b5a1af8ef7ae9 100644
--- a/indra/llcharacter/llkeyframemotion.cpp
+++ b/indra/llcharacter/llkeyframemotion.cpp
@@ -467,13 +467,15 @@ LLPointer<LLJointState>& LLKeyframeMotion::getJointState(U32 index)
 }
 
 //-----------------------------------------------------------------------------
-// getJoin()
+// getJoint()
 //-----------------------------------------------------------------------------
 LLJoint* LLKeyframeMotion::getJoint(U32 index)
 {
 	llassert_always (index < mJointStates.size());
 	LLJoint* joint = mJointStates[index]->getJoint();
-	llassert_always (joint);
+	
+	//Commented out 06-28-11 by Aura.
+	//llassert_always (joint);
 	return joint;
 }
 
@@ -821,7 +823,11 @@ void LLKeyframeMotion::initializeConstraint(JointConstraint* constraint)
 	S32 joint_num;
 	LLVector3 source_pos = mCharacter->getVolumePos(shared_data->mSourceConstraintVolume, shared_data->mSourceConstraintOffset);
 	LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[0]);
-
+	if ( !cur_joint )
+	{
+		return;
+	}
+	
 	F32 source_pos_offset = dist_vec(source_pos, cur_joint->getWorldPosition());
 
 	constraint->mTotalLength = constraint->mJointLengths[0] = dist_vec(cur_joint->getParent()->getWorldPosition(), source_pos);
@@ -872,6 +878,10 @@ void LLKeyframeMotion::activateConstraint(JointConstraint* constraint)
 	for (joint_num = 1; joint_num < shared_data->mChainLength; joint_num++)
 	{
 		LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+		if ( !cur_joint )
+		{
+			return;
+		}
 		constraint->mPositions[joint_num] = (cur_joint->getWorldPosition() - mPelvisp->getWorldPosition()) * ~mPelvisp->getWorldRotation();
 	}
 
@@ -932,6 +942,11 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 	}
 
 	LLJoint* root_joint = getJoint(shared_data->mJointStateIndices[shared_data->mChainLength]);
+	if (! root_joint) 
+	{
+		return;
+	}
+	
 	LLVector3 root_pos = root_joint->getWorldPosition();
 //	LLQuaternion root_rot = 
 	root_joint->getParent()->getWorldRotation();
@@ -943,6 +958,11 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 	for (joint_num = 0; joint_num <= shared_data->mChainLength; joint_num++)
 	{
 		LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+		if (!cur_joint)
+		{
+			return;
+		}
+		
 		if (joint_mask[cur_joint->getJointNum()] >= (0xff >> (7 - getPriority())))
 		{
 			// skip constraint
@@ -1033,7 +1053,14 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 
 	if (shared_data->mChainLength)
 	{
-		LLQuaternion end_rot = getJoint(shared_data->mJointStateIndices[0])->getWorldRotation();
+		LLJoint* end_joint = getJoint(shared_data->mJointStateIndices[0]);
+		
+		if (!end_joint)
+		{
+			return;
+		}
+		
+		LLQuaternion end_rot = end_joint->getWorldRotation();
 
 		// slam start and end of chain to the proper positions (rest of chain stays put)
 		positions[0] = lerp(keyframe_source_pos, target_pos, weight);
@@ -1042,7 +1069,14 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 		// grab keyframe-specified positions of joints	
 		for (joint_num = 1; joint_num < shared_data->mChainLength; joint_num++)
 		{
-			LLVector3 kinematic_position = getJoint(shared_data->mJointStateIndices[joint_num])->getWorldPosition() + 
+			LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+			
+			if (!cur_joint)
+			{
+				return;
+			}
+			
+			LLVector3 kinematic_position = cur_joint->getWorldPosition() + 
 				(source_to_target * constraint->mJointLengthFractions[joint_num]);
 
 			// convert intermediate joint positions to world coordinates
@@ -1088,7 +1122,17 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 		for (joint_num = shared_data->mChainLength; joint_num > 0; joint_num--)
 		{
 			LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+			
+			if (!cur_joint)
+			{
+				return;
+			}
 			LLJoint* child_joint = getJoint(shared_data->mJointStateIndices[joint_num - 1]);
+			if (!child_joint)
+			{
+				return;
+			}
+			
 			LLQuaternion parent_rot = cur_joint->getParent()->getWorldRotation();
 
 			LLQuaternion cur_rot = cur_joint->getWorldRotation();
@@ -1122,7 +1166,6 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 			cur_joint->setRotation(target_rot);
 		}
 
-		LLJoint* end_joint = getJoint(shared_data->mJointStateIndices[0]);
 		LLQuaternion end_local_rot = end_rot * ~end_joint->getParent()->getWorldRotation();
 
 		if (weight == 1.f)
@@ -1150,7 +1193,13 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
 		//reset old joint rots
 		for (joint_num = 0; joint_num <= shared_data->mChainLength; joint_num++)
 		{
-			getJoint(shared_data->mJointStateIndices[joint_num])->setRotation(old_rots[joint_num]);
+			LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+			if (!cur_joint)
+			{
+				return;
+			}
+
+			cur_joint->setRotation(old_rots[joint_num]);
 		}
 	}
 	// simple positional constraint (pelvis only)
@@ -1775,7 +1824,15 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
 				constraintp->mJointStateIndices[i] = -1;
 				for (U32 j = 0; j < mJointMotionList->getNumJointMotions(); j++)
 				{
-					if(getJoint(j) == joint)
+					LLJoint* constraint_joint = getJoint(j);
+					
+					if ( !constraint_joint )
+					{
+						llwarns << "Invalid joint " << j << llendl;
+						return FALSE;
+					}
+					
+					if(constraint_joint == joint)
 					{
 						constraintp->mJointStateIndices[i] = (S32)j;
 						break;
diff --git a/indra/llcharacter/llkeyframemotion.h b/indra/llcharacter/llkeyframemotion.h
index 1fe9af40b361c5ccf762c7e1c24757622aec9315..b1422b2b903c742a0d4e13d1fd816666f0a3e9e1 100644
--- a/indra/llcharacter/llkeyframemotion.h
+++ b/indra/llcharacter/llkeyframemotion.h
@@ -70,7 +70,7 @@ class LLKeyframeMotion :
 private:
 	// private helper functions to wrap some asserts
 	LLPointer<LLJointState>& getJointState(U32 index);
-	LLJoint* getJoint(U32 index);
+	LLJoint* getJoint(U32 index );
 	
 public:
 	//-------------------------------------------------------------------------