diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index 7a8d5bce03918cef02bbf9cd52323d3eb53604c1..1e8bd0066be10fabaaeeb03376d90b2714ddd41a 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -68,6 +68,9 @@ void LLControlAvatar::matchVolumeTransform()
 #endif
 
 
+    // Avatars seem to 90 degrees off from the rest of the world, this is a fixup.
+    LLQuaternion fix_axes_rot(-F_PI_BY_TWO, LLVector3(0,0,1));
+
     if (mRootVolp)
     {
         if (mRootVolp->isAttachment())
@@ -77,19 +80,15 @@ void LLControlAvatar::matchVolumeTransform()
             {
                 LLViewerJointAttachment *attach = attached_av->getTargetAttachmentPoint(mRootVolp);
                 setPositionAgent(mRootVolp->getRenderPosition());
-                // AXON why doesn't attach joint have a valid world
-                // position? Using the parent as a kludge but not
-                // right.
-                //LLQuaternion fix_axes_rot(-F_PI_BY_TWO, LLVector3(0,0,1));
-                LLVector3 joint_pos = attach->getParent()->getWorldPosition();
-                LLQuaternion joint_rot = attach->getParent()->getWorldRotation();
-                //LLVector3 attach_pos = mRootVolp->mDrawable->getPosition();
-                //attach_pos.rotVec(joint_rot);
-                //LLQuaternion attach_rot = mRootVolp->mDrawable->getRotation();
-                //mRoot->setWorldPosition(joint_pos + attach_pos);
-                //mRoot->setWorldRotation(joint_rot * (attach_rot * ~fix_axes_rot));
-                mRoot->setWorldPosition(joint_pos);
-                mRoot->setWorldRotation(joint_rot);
+				attach->updateWorldPRSParent();
+                LLVector3 joint_pos = attach->getWorldPosition();
+                LLQuaternion joint_rot = attach->getWorldRotation();
+                LLVector3 obj_pos = mRootVolp->mDrawable->getPosition();
+                LLQuaternion obj_rot = mRootVolp->mDrawable->getRotation();
+                obj_pos.rotVec(joint_rot);
+                mRoot->setWorldPosition(obj_pos + joint_pos);
+                mRoot->setWorldRotation(fix_axes_rot * obj_rot * joint_rot);
+                setRotation(mRoot->getRotation());
             }
             else
             {
@@ -99,9 +98,6 @@ void LLControlAvatar::matchVolumeTransform()
         else
         {
             setPositionAgent(mRootVolp->getRenderPosition());
-            //slamPosition();
-        
-            LLQuaternion fix_axes_rot(-F_PI_BY_TWO, LLVector3(0,0,1));
             LLQuaternion obj_rot = mRootVolp->getRotation();
             LLQuaternion result_rot = fix_axes_rot * obj_rot;
             setRotation(result_rot);
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 0140a63e73dc04ee5db9053927135f8cad569f7b..99c68dab10a3697f16fcff405e7c94aac7196028 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -3981,7 +3981,7 @@ const LLVector3 LLViewerObject::getPivotPositionAgent() const
 const LLQuaternion LLViewerObject::getRenderRotation() const
 {
 	LLQuaternion ret;
-	if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED))
+	if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED) && !isAnimatedObject())
 	{
 		return ret;
 	}