diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index f81030b0e731b4a93f8d0090c74437c0ebf9d6bb..d0e7c06f3636928f078cf591568896ec2a601214 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -1293,7 +1293,7 @@ namespace LLError
 
 #if LL_WINDOWS
 		// VC80 was optimizing the error away.
-//		#pragma optimize("", off)
+		#pragma optimize("", off)
 #endif
 	void crashAndLoop(const std::string& message)
 	{
@@ -1311,7 +1311,7 @@ namespace LLError
 		exit(EXIT_FAILURE);
 	}
 #if LL_WINDOWS
-//		#pragma optimize("", on)
+		#pragma optimize("", on)
 #endif
 
 	std::string utcTime()
diff --git a/indra/llmath/llrigginginfo.cpp b/indra/llmath/llrigginginfo.cpp
index 885acb7670fcd960f4d24818694a4c80fe6f92ab..0de07950c14bd1b1b0b7574015b337e32cde6675 100644
--- a/indra/llmath/llrigginginfo.cpp
+++ b/indra/llmath/llrigginginfo.cpp
@@ -27,10 +27,6 @@
 #include "llmath.h"
 #include "llrigginginfo.h"
 
-//#if LL_WINDOWS
-//#pragma optimize("", off)
-//#endif
-
 //-----------------------------------------------------------------------------
 // LLJointRiggingInfo
 //-----------------------------------------------------------------------------
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 2654e204c254abd307070b1e0fc88a423e570faa..ba284574c8985bc220c57cc5dfc678c411b53f09 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -6411,101 +6411,6 @@ void LLVolumeFace::fillFromLegacyData(std::vector<LLVolumeFace::VertexData>& v,
 	}
 }
 
-// AXON appendFace/appendFaces not used - referenced by corresponding functions in
-// LLModel but these are not called anywhere.
-void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMatrix4& norm_mat_in)
-{
-	U16 offset = mNumVertices;
-
-	S32 new_count = face.mNumVertices + mNumVertices;
-
-	if (new_count > 65536)
-	{
-		LL_ERRS() << "Cannot append face -- 16-bit overflow will occur." << LL_ENDL;
-	}
-	
-	if (face.mNumVertices == 0)
-	{
-		LL_ERRS() << "Cannot append empty face." << LL_ENDL;
-	}
-
-	U32 old_vsize = mNumVertices*16;
-	U32 new_vsize = new_count * 16;
-	U32 old_tcsize = (mNumVertices*sizeof(LLVector2)+0xF) & ~0xF;
-	U32 new_tcsize = (new_count*sizeof(LLVector2)+0xF) & ~0xF;
-	U32 new_size = new_vsize * 2 + new_tcsize;
-
-	//allocate new buffer space
-	LLVector4a* old_buf = mPositions;
-	mPositions = (LLVector4a*) ll_aligned_malloc<64>(new_size);
-	mNormals = mPositions + new_count;
-	mTexCoords = (LLVector2*) (mNormals+new_count);
-
-	mNumAllocatedVertices = new_count;
-
-	LLVector4a::memcpyNonAliased16((F32*) mPositions, (F32*) old_buf, old_vsize);
-	LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) (old_buf+mNumVertices), old_vsize);
-	LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) (old_buf+mNumVertices*2), old_tcsize);
-	
-	mNumVertices = new_count;
-
-	//get destination address of appended face
-	LLVector4a* dst_pos = mPositions+offset;
-	LLVector2* dst_tc = mTexCoords+offset;
-	LLVector4a* dst_norm = mNormals+offset;
-
-	//get source addresses of appended face
-	const LLVector4a* src_pos = face.mPositions;
-	const LLVector2* src_tc = face.mTexCoords;
-	const LLVector4a* src_norm = face.mNormals;
-
-	//load aligned matrices
-	LLMatrix4a mat, norm_mat;
-	mat.loadu(mat_in);
-	norm_mat.loadu(norm_mat_in);
-
-	for (U32 i = 0; i < face.mNumVertices; ++i)
-	{
-		//transform appended face position and store
-		mat.affineTransform(src_pos[i], dst_pos[i]);
-
-		//transform appended face normal and store
-		norm_mat.rotate(src_norm[i], dst_norm[i]);
-		dst_norm[i].normalize3fast();
-
-		//copy appended face texture coordinate
-		dst_tc[i] = src_tc[i];
-
-		if (offset == 0 && i == 0)
-		{ //initialize bounding box
-			// VFExtents change
-			mExtents[0] = mExtents[1] = dst_pos[i];
-		}
-		else
-		{
-			//stretch bounding box
-			// VFExtents change
-			update_min_max(mExtents[0], mExtents[1], dst_pos[i]);
-		}
-	}
-    LL_DEBUGS("RiggedBox") << "appendFace got extents " << mExtents[0] << ", " << mExtents[1] << " from dst_pos " << LL_ENDL;
-
-
-	new_count = mNumIndices + face.mNumIndices;
-
-	//allocate new index buffer
-	mIndices = (U16*) ll_aligned_realloc_16(mIndices, (new_count*sizeof(U16)+0xF) & ~0xF, (mNumIndices*sizeof(U16)+0xF) & ~0xF);
-	
-	//get destination address into new index buffer
-	U16* dst_idx = mIndices+mNumIndices;
-	mNumIndices = new_count;
-
-	for (U32 i = 0; i < face.mNumIndices; ++i)
-	{ //copy indices, offsetting by old vertex count
-		dst_idx[i] = face.mIndices[i]+offset;
-	}
-}
-
 BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
 {
 	LL_CHECK_MEMORY
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index f92b43e77dddb64656426e3f0d396860cd486f78..1d6d35c4324895c873c802a99b29230031870aa5 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -872,8 +872,6 @@ class LLVolumeFace
 	BOOL create(LLVolume* volume, BOOL partial_build = FALSE);
 	void createTangents();
 	
-	void appendFace(const LLVolumeFace& face, LLMatrix4& transform, LLMatrix4& normal_tranform);
-
 	void resizeVertices(S32 num_verts);
 	void allocateTangents(S32 num_verts);
 	void allocateWeights(S32 num_verts);
diff --git a/indra/llmath/v3math.cpp b/indra/llmath/v3math.cpp
index e7107dee16420cc5fe8696872902a24c3cb3175a..b04c67d92631fac6535c0f161631487c66c66e1f 100644
--- a/indra/llmath/v3math.cpp
+++ b/indra/llmath/v3math.cpp
@@ -369,3 +369,39 @@ BOOL LLVector3::parseVector3(const std::string& buf, LLVector3* value)
 
 	return FALSE;
 }
+
+// Displacement from query point to nearest neighbor point on bounding box.
+// Returns zero vector for points within or on the box.
+LLVector3 point_to_box_offset(LLVector3& pos, const LLVector3* box)
+{
+    LLVector3 offset;
+    for (S32 k=0; k<3; k++)
+    {
+        offset[k] = 0;
+        if (pos[k] < box[0][k])
+        {
+            offset[k] = pos[k] - box[0][k];
+        }
+        else if (pos[k] > box[1][k])
+        {
+            offset[k] = pos[k] - box[1][k];
+        }
+    }
+    return offset;
+}
+
+bool box_valid_and_non_zero(const LLVector3* box)
+{
+    if (!box[0].isFinite() || !box[1].isFinite())
+    {
+        return false;
+    }
+    LLVector3 zero_vec;
+    zero_vec.clear();
+    if ((box[0] != zero_vec) || (box[1] != zero_vec))
+    {
+        return true;
+    }
+    return false;
+}
+
diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h
index f3fbce4843e16d7a0cd2606df2b408891a95b8d1..6f857d70617167ade434c4235e76860124b15465 100644
--- a/indra/llmath/v3math.h
+++ b/indra/llmath/v3math.h
@@ -163,6 +163,8 @@ LLVector3 inverse_projected_vec(const LLVector3 &a, const LLVector3 &b); // Retu
 LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b (same as projected_vec)
 LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b); // Returns component of vector a not parallel to vector b (same as projected_vec)
 LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vector that is a linear interpolation between a and b
+LLVector3 point_to_box_offset(LLVector3& pos, const LLVector3* box); // Displacement from query point to nearest point on bounding box.
+bool box_valid_and_non_zero(const LLVector3* box);
 
 inline LLVector3::LLVector3(void)
 {
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 2a55838a4bd5d1d71745115ca1ccb2e63415c195..a0e835c57733760f841d3fb04e0a44f2a799f423 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -401,40 +401,6 @@ void LLModel::setVolumeFaceData(
 	LLVector4a::memcpyNonAliased16((F32*) face.mIndices, (F32*) ind.get(), size);
 }
 
-void LLModel::appendFaces(LLModel *model, LLMatrix4 &transform, LLMatrix4& norm_mat)
-{
-	if (mVolumeFaces.empty())
-	{
-		setNumVolumeFaces(1);
-	}
-
-	LLVolumeFace& face = mVolumeFaces[mVolumeFaces.size()-1];
-
-
-	for (S32 i = 0; i < model->getNumFaces(); ++i)
-	{
-		face.appendFace(model->getVolumeFace(i), transform, norm_mat);
-	}
-
-}
-
-void LLModel::appendFace(const LLVolumeFace& src_face, std::string src_material, LLMatrix4& mat, LLMatrix4& norm_mat)
-{
-	S32 rindex = getNumVolumeFaces()-1; 
-	if (rindex == -1 || 
-		mVolumeFaces[rindex].mNumVertices + src_face.mNumVertices >= 65536)
-	{ //empty or overflow will occur, append new face
-		LLVolumeFace cur_face;
-		cur_face.appendFace(src_face, mat, norm_mat);
-		addFace(cur_face);
-		mMaterialList.push_back(src_material);
-	}
-	else
-	{ //append to existing end face
-		mVolumeFaces.rbegin()->appendFace(src_face, mat, norm_mat);
-	}
-}
-
 void LLModel::addFace(const LLVolumeFace& face)
 {
 	if (face.mNumVertices == 0)
diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h
index d7f006753fa52848d0d4453b909013b62ba674f5..cf3288489a86399a349fa125d18824ded39819aa 100644
--- a/indra/llprimitive/llmodel.h
+++ b/indra/llprimitive/llmodel.h
@@ -158,9 +158,6 @@ class LLModel : public LLVolume
 	EModelStatus getStatus() const {return mStatus;}
 	static std::string getStatusString(U32 status) ;
 
-	void appendFaces(LLModel* model, LLMatrix4& transform, LLMatrix4& normal_transform);
-	void appendFace(const LLVolumeFace& src_face, std::string src_material, LLMatrix4& mat, LLMatrix4& norm_mat);
-
 	void setNumVolumeFaces(S32 count);
 	void setVolumeFaceData(
 		S32 f, 
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index 8291df7705266ffc3aeaa5c2d1ccfe5a5ccbc45e..36e728f26d6f5af90e98816632ee74773060341e 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -34,10 +34,6 @@
 #include "llmeshrepository.h"
 #include "llviewerregion.h"
 
-#if LL_WINDOWS
-	#pragma optimize("", off)
-#endif
-
 LLControlAvatar::LLControlAvatar(const LLUUID& id, const LLPCode pcode, LLViewerRegion* regionp) :
     LLVOAvatar(id, pcode, regionp),
     mPlaying(false),
@@ -68,41 +64,6 @@ void LLControlAvatar::initInstance()
 	hideSkirt();
 }
 
-// AXON move to math
-bool box_valid_and_non_zero(const LLVector3* box)
-{
-    if (!box[0].isFinite() || !box[1].isFinite())
-    {
-        return false;
-    }
-    LLVector3 zero_vec;
-    zero_vec.clear();
-    if ((box[0] != zero_vec) || (box[1] != zero_vec))
-    {
-        return true;
-    }
-    return false;
-}
-
-// AXON move to math
-LLVector3 point_to_box_offset(LLVector3& pos, const LLVector3* box)
-{
-    LLVector3 offset;
-    for (S32 k=0; k<3; k++)
-    {
-        offset[k] = 0;
-        if (pos[k] < box[0][k])
-        {
-            offset[k] = pos[k] - box[0][k];
-        }
-        else if (pos[k] > box[1][k])
-        {
-            offset[k] = pos[k] - box[1][k];
-        }
-    }
-    return offset;
-}
-
 void LLControlAvatar::matchVolumeTransform()
 {
     if (mRootVolp)
@@ -157,11 +118,11 @@ void LLControlAvatar::matchVolumeTransform()
                     F32 target_dist = (offset_dist - MAX_LEGAL_OFFSET);
                     pos_box_offset *= target_dist/offset_dist;
                 }
-                LL_DEBUGS("FixBox") << getFullname() << " fixup needed for offset " 
-                                    << pos_box_offset[0] << "," << pos_box_offset[1] << "," << pos_box_offset[2] 
-                                    << " current fixup "
-                                    << mPositionConstraintFixup[0] << "," << mPositionConstraintFixup[1] << "," << mPositionConstraintFixup[2] 
-                                    << " dist " << offset_dist << LL_ENDL;
+                //LL_DEBUGS("FixBox") << getFullname() << " fixup needed for offset " 
+                //                    << pos_box_offset[0] << "," << pos_box_offset[1] << "," << pos_box_offset[2] 
+                //                    << " current fixup "
+                //                    << mPositionConstraintFixup[0] << "," << mPositionConstraintFixup[1] << "," << mPositionConstraintFixup[2] 
+                //                    << " dist " << offset_dist << LL_ENDL;
             }
 
             mPositionConstraintFixup = pos_box_offset;
@@ -380,6 +341,12 @@ void LLControlAvatar::updateDebugText()
         addDebugText(llformat("flags %s", animated_object_flag_string.c_str()));
         addDebugText(llformat("tris %d (est %.1f, streaming %.1f), verts %d", total_tris, est_tris, est_streaming_tris, total_verts));
         addDebugText(llformat("pxarea %s rank %d", LLStringOps::getReadableNumber(getPixelArea()).c_str(), getVisibilityRank()));
+        if (mPositionConstraintFixup.length() > 0.0f)
+        {
+            addDebugText(llformat("pos fix (%.1f %.1f %.1f)", 
+                                  mPositionConstraintFixup[0], mPositionConstraintFixup[1], mPositionConstraintFixup[2]));
+        }
+        
 #if 0
         std::string region_name = "no region";
         if (mRootVolp->getRegion())
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index df8f5c5ff4c198427bc93e7a48b43eece7779e84..cb3903b1d0219e8baef179c269de385f4b77ed5a 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -652,7 +652,6 @@ class LLMeshRepository
 
 extern LLMeshRepository gMeshRepo;
 
-// AXON make sure this is consistent with the final simulator-side values.
 const F32 ANIMATED_OBJECT_BASE_COST = 15.0f;
 const F32 ANIMATED_OBJECT_COST_PER_KTRI = 1.5f;
 
diff --git a/indra/newview/llskinningutil.cpp b/indra/newview/llskinningutil.cpp
index db9877f302609c4ff256d4368871db51c0b63359..0878cee1a307c3f47f1151ad288991c7afd760bc 100644
--- a/indra/newview/llskinningutil.cpp
+++ b/indra/newview/llskinningutil.cpp
@@ -34,10 +34,6 @@
 #include "llvolume.h"
 #include "llrigginginfo.h"
 
-//#if LL_WINDOWS
-//#pragma optimize("", off)
-//#endif
-
 void LLSkinningUtil::initClass()
 {
 }
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 6896632597499823641c77b4edb32578513d12c7..728155382f26a8f39a4b3ccdc34c668bd1006bb3 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -1346,7 +1346,7 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
                      attachment_iter != attachment->mAttachedObjects.end();
                      ++attachment_iter)
                 {
-                    // AXON is this right? Don't we need to look at children of attached_object as well?
+                    // AXON Don't we need to look at children of attached_object as well?
                     const LLViewerObject* attached_object = (*attachment_iter);
                     if (attached_object && !attached_object->isHUDAttachment())
                     {
@@ -1389,10 +1389,11 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
     {
         // AXON try to cache unless something has changed about attached rigged meshes.
         // Needs more logic based on volume states.
+
         //if (mRiggingInfoTab.needsUpdate())
         {
             updateRiggingInfo();
-            mJointRiggingInfoTab.setNeedsUpdate(false);
+            //mJointRiggingInfoTab.setNeedsUpdate(false);
         }
         for (S32 joint_num = 0; joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS; joint_num++)
         {
@@ -1403,12 +1404,6 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
                 rig_info = &mJointRiggingInfoTab[joint_num];
             }
 
-            // FIXME TEMP HACK FOR TESTING
-            //if (joint)
-            //{
-            //    rig_info.setIsRiggedTo(true);
-            //}
-
             if (joint && rig_info && rig_info->isRiggedTo())
             {
                 LLViewerJointAttachment *as_joint_attach = dynamic_cast<LLViewerJointAttachment*>(joint);
@@ -1574,7 +1569,7 @@ void LLVOAvatar::renderBones()
         }
         else
         {
-            if (jointIsRiggedTo(jointp->getName()))
+            if (jointIsRiggedTo(jointp))
             {
                 occ_color = RIGGED_COLOR_OCCLUDED;
                 visible_color = RIGGED_COLOR_VISIBLE;
@@ -2702,7 +2697,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
 			{
 				ext[0].load3(mLastAnimExtents[0].mV);
                 ext[1].load3(mLastAnimExtents[1].mV);
-                // AXON just do this once per frame
+                // Expensive. Just call this once per frame, in updateSpatialExtents();
                 //calculateSpatialExtents(ext[0], ext[1]);
 				LLVector4a diff;
 				diff.setSub(ext[1], mImpostorExtents[1]);
@@ -5827,73 +5822,17 @@ bool LLVOAvatar::getRiggedMeshID(LLViewerObject* pVO, LLUUID& mesh_id)
 	return false;
 }
 
-// AXON update to use LLRiggingInfo
-bool LLVOAvatar::jointIsRiggedTo(const std::string& joint_name)
+bool LLVOAvatar::jointIsRiggedTo(const LLJoint *joint) const
 {
-    LLJoint *joint = getJoint(joint_name);
     if (joint)
     {
-        LLJointRiggingInfoTab& tab = mJointRiggingInfoTab;
+        const LLJointRiggingInfoTab& tab = mJointRiggingInfoTab;
         S32 joint_num = joint->getJointNum();
         if (joint_num < tab.size() && tab[joint_num].isRiggedTo())
         {
             return true;
         }
     }
-    return false;
-#if 0
-	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-		 iter != mAttachmentPoints.end();
-		 ++iter)
-	{
-		LLViewerJointAttachment* attachment = iter->second;
-        for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
-             attachment_iter != attachment->mAttachedObjects.end();
-             ++attachment_iter)
-        {
-            const LLViewerObject* attached_object = (*attachment_iter);
-            if (attached_object && jointIsRiggedTo(joint_name, attached_object))
-            {
-                return true;
-            }
-        }
-	}
-    return false;
-#endif
-}
-
-// AXON update to use LLRiggingInfo
-bool LLVOAvatar::jointIsRiggedTo(const std::string& joint_name, const LLViewerObject *vo)
-{
-	// Process all children
-	LLViewerObject::const_child_list_t& children = vo->getChildren();
-	for (LLViewerObject::const_child_list_t::const_iterator it = children.begin();
-		 it != children.end(); ++it)
-	{
-		LLViewerObject *childp = *it;
-        if (jointIsRiggedTo(joint_name,childp))
-        {
-            return true;
-        }
-	}
-
-	const LLVOVolume *vobj = dynamic_cast<const LLVOVolume*>(vo);
-	if (!vobj)
-	{
-		return false;
-	}
-
-	const LLMeshSkinInfo* pSkinData = vobj->getSkinInfo();
-
-	if ( vobj && vobj->isAttachment() && vobj->isMesh() && pSkinData )
-	{
-        if (std::find(pSkinData->mJointNames.begin(), pSkinData->mJointNames.end(), joint_name) !=
-            pSkinData->mJointNames.end())
-        {
-            return true;
-        }
-    }
-
     return false;
 }
 
@@ -9554,10 +9493,9 @@ void showRigInfoTabExtents(LLVOAvatar *avatar, LLJointRiggingInfoTab& tab, S32&
     }
 }
 
-// AXON move to member
-void getAssociatedVolumes(LLVOAvatar *av, std::vector<LLVOVolume*>& volumes)
+void LLVOAvatar::getAssociatedVolumes(std::vector<LLVOVolume*>& volumes)
 {
-	for ( LLVOAvatar::attachment_map_t::iterator iter = av->mAttachmentPoints.begin(); iter != av->mAttachmentPoints.end(); ++iter )
+	for ( LLVOAvatar::attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter )
 	{
 		LLViewerJointAttachment* attachment = iter->second;
 		LLViewerJointAttachment::attachedobjs_vec_t::iterator attach_end = attachment->mAttachedObjects.end();
@@ -9584,7 +9522,7 @@ void getAssociatedVolumes(LLVOAvatar *av, std::vector<LLVOVolume*>& volumes)
             }
         }
 	}
-    LLControlAvatar *control_av = dynamic_cast<LLControlAvatar*>(av);
+    LLControlAvatar *control_av = dynamic_cast<LLControlAvatar*>(this);
     if (control_av)
     {
         LLVOVolume *volp = control_av->mRootVolp;
@@ -9612,7 +9550,7 @@ void LLVOAvatar::updateRiggingInfo()
     LL_DEBUGS("RigSpammish") << getFullname() << " updating rig tab" << LL_ENDL;
     mJointRiggingInfoTab.clear();
     std::vector<LLVOVolume*> volumes;
-    getAssociatedVolumes(this, volumes);
+    getAssociatedVolumes(volumes);
     for (std::vector<LLVOVolume*>::iterator it = volumes.begin(); it != volumes.end(); ++it)
     {
         LLVOVolume *vol = *it;
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index d80f0ad713f7cab764ec33c02197ed012aea2c95..25c89f96d753e252aa9ec1538693f2620fd56d7f 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -208,8 +208,7 @@ class LLVOAvatar :
 	void 					addAttachmentOverridesForObject(LLViewerObject *vo, std::set<LLUUID>* meshes_seen = NULL, bool recursive = true);
 	void					removeAttachmentOverridesForObject(const LLUUID& mesh_id);
 	void					removeAttachmentOverridesForObject(LLViewerObject *vo);
-    bool					jointIsRiggedTo(const std::string& joint_name);
-    bool					jointIsRiggedTo(const std::string& joint_name, const LLViewerObject *vo);
+    bool					jointIsRiggedTo(const LLJoint *joint) const;
 	void					clearAttachmentOverrides();
 	void					rebuildAttachmentOverrides();
     void					updateAttachmentOverrides();
@@ -217,6 +216,8 @@ class LLVOAvatar :
     void                    getAttachmentOverrideNames(std::set<std::string>& pos_names, 
                                                        std::set<std::string>& scale_names) const;
 
+    void 					getAssociatedVolumes(std::vector<LLVOVolume*>& volumes);
+
     // virtual
     void 					updateRiggingInfo();