diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
index bc63d07d726ccda9dee47a148166cd0592cea4be..3df4d333ce0d334e9edac7848a661dda13025a99 100755
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
@@ -31,10 +31,12 @@ uniform vec4 matrixPalette[45];
 mat4 getSkinnedTransform()
 {
 	mat4 ret;
-	int i = int(floor(weight.x));
+	
 	float x = fract(weight.x);
-		
-	ret[0] = mix(matrixPalette[i+0], matrixPalette[i+1], x);
+	int i = int(floor(weight.x));
+		i = min(i, 15);
+		i = max(i, 0);
+	ret[0] = mix(matrixPalette[i+0], matrixPalette[i+1],  x);
 	ret[1] = mix(matrixPalette[i+15],matrixPalette[i+16], x);
 	ret[2] = mix(matrixPalette[i+30],matrixPalette[i+31], x);
 	ret[3] = vec4(0,0,0,1);
diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
index efd0d03965725dcdd8b3fcb42efc68c0c9718690..12996cf0d60b848d3e2f1892f673ad913aae1979 100755
--- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
@@ -34,14 +34,17 @@ mat4 getObjectSkinnedTransform()
 	
 	vec4 w = fract(weight4);
 	vec4 index = floor(weight4);
-	
+
+		 index = min(index, vec4(31.0));
+		 index = max(index, vec4( 0.0));
+
 	float scale = 1.0/(w.x+w.y+w.z+w.w);
 	w *= scale;
-	
-	mat4 mat = matrixPalette[int(index.x)]*w.x;
-	mat += matrixPalette[int(index.y)]*w.y;
-	mat += matrixPalette[int(index.z)]*w.z;
-	mat += matrixPalette[int(index.w)]*w.w;
+
+	mat4 mat  = matrixPalette[int(index.x)]*w.x;
+		 mat += matrixPalette[int(index.y)]*w.y;
+		 mat += matrixPalette[int(index.z)]*w.z;
+		 mat += matrixPalette[int(index.w)]*w.w;
 		
 	return mat;
 }
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 6a504e10c418991f4c537fba978aacf94d87a1fe..076b2524bf57baa41814eb254e629ccbe54c1558 100755
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -5512,7 +5512,10 @@ void LLVOAvatar::addChild(LLViewerObject *childp)
 	LLViewerObject::addChild(childp);
 	if (childp->mDrawable)
 	{
-		attachObject(childp);
+		if (!attachObject(childp))
+		{
+			mPendingAttachment.push_back(childp);
+		}
 	}
 	else
 	{
@@ -5546,7 +5549,21 @@ LLViewerJointAttachment* LLVOAvatar::getTargetAttachmentPoint(LLViewerObject* vi
 	if (!attachment)
 	{
 		llwarns << "Object attachment point invalid: " << attachmentID << llendl;
-		attachment = get_if_there(mAttachmentPoints, 1, (LLViewerJointAttachment*)NULL); // Arbitrary using 1 (chest)
+
+		for (int i = 0; i < 15 && !attachment; i++)
+		{
+			attachment = get_if_there(mAttachmentPoints, i, (LLViewerJointAttachment*)NULL); // Arbitrary using 1 (chest)
+
+			if (attachment)
+			{
+				llwarns << "Object attachment point falling back to : " << i << llendl;
+			}
+		}
+		
+		if (!attachment)
+		{
+			llerrs << "Could not find any object attachment point for: " << attachmentID << llendl;
+		}
 	}
 
 	return attachment;
@@ -5619,7 +5636,10 @@ void LLVOAvatar::lazyAttach()
 	{
 		if (mPendingAttachment[i]->mDrawable)
 		{
-			attachObject(mPendingAttachment[i]);
+			if (!attachObject(mPendingAttachment[i]))
+			{
+				still_pending.push_back(mPendingAttachment[i]);
+			}
 		}
 		else
 		{