diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp
index a3c95fa8c913e63f9c8ab62735d76de4429550d4..d08788e2d11b76990b3ebac4eae1e32e562ea54c 100755
--- a/indra/llcharacter/llbvhloader.cpp
+++ b/indra/llcharacter/llbvhloader.cpp
@@ -127,6 +127,25 @@ LLBVHLoader::LLBVHLoader(const char* buffer, ELoadStatus &loadStatus, S32 &error
 {
 	reset();
 	errorLine = 0;
+	mStatus = loadTranslationTable("anim.ini");
+	loadStatus = mStatus;
+	LL_INFOS("BVH") << "Load Status 00 : " << loadStatus << LL_ENDL;
+	if (mStatus == E_ST_NO_XLT_FILE)
+	{
+		LL_WARNS("BVH") << "NOTE: No translation table found." << LL_ENDL;
+		loadStatus = mStatus;
+		return;
+	}
+	else
+	{
+		if (mStatus != E_ST_OK)
+		{
+			LL_WARNS("BVH") << "ERROR: [line: " << getLineNumber() << "] " << mStatus << LL_ENDL;
+			errorLine = getLineNumber();
+			loadStatus = mStatus;
+			return;
+		}
+	}
     
     // Recognize all names we've been told are legal.
     std::map<std::string, std::string>::iterator iter;
@@ -168,6 +187,292 @@ LLBVHLoader::~LLBVHLoader()
 	mJoints.clear();
 }
 
+//------------------------------------------------------------------------
+// LLBVHLoader::loadTranslationTable()
+//------------------------------------------------------------------------
+ELoadStatus LLBVHLoader::loadTranslationTable(const char *fileName)
+{
+	//--------------------------------------------------------------------
+	// open file
+	//--------------------------------------------------------------------
+	std::string path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,fileName);
+
+	LLAPRFile infile ;
+	infile.open(path, LL_APR_R);
+	apr_file_t *fp = infile.getFileHandle();
+	if (!fp)
+		return E_ST_NO_XLT_FILE;
+
+	LL_INFOS("BVH") << "NOTE: Loading translation table: " << fileName << LL_ENDL;
+
+	//--------------------------------------------------------------------
+	// register file to be closed on function exit
+	//--------------------------------------------------------------------
+	
+	//--------------------------------------------------------------------
+	// load header
+	//--------------------------------------------------------------------
+	if ( ! getLine(fp) )
+		return E_ST_EOF;
+	if ( strncmp(mLine, "Translations 1.0", 16) )
+		return E_ST_NO_XLT_HEADER;
+
+	//--------------------------------------------------------------------
+	// load data one line at a time
+	//--------------------------------------------------------------------
+	BOOL loadingGlobals = FALSE;
+	while ( getLine(fp) )
+	{
+		//----------------------------------------------------------------
+		// check the 1st token on the line to determine if it's empty or a comment
+		//----------------------------------------------------------------
+		char token[128]; /* Flawfinder: ignore */
+		if ( sscanf(mLine, " %127s", token) != 1 )	/* Flawfinder: ignore */
+			continue;
+
+		if (token[0] == '#')
+			continue;
+
+		//----------------------------------------------------------------
+		// check if a [jointName] or [GLOBALS] was specified.
+		//----------------------------------------------------------------
+		if (token[0] == '[')
+		{
+			char name[128]; /* Flawfinder: ignore */
+			if ( sscanf(mLine, " [%127[^]]", name) != 1 )
+				return E_ST_NO_XLT_NAME;
+
+			if (strcmp(name, "GLOBALS")==0)
+			{
+				loadingGlobals = TRUE;
+				continue;
+			}
+		}
+
+		//----------------------------------------------------------------
+		// check for optional emote 
+		//----------------------------------------------------------------
+		if (loadingGlobals && LLStringUtil::compareInsensitive(token, "emote")==0)
+		{
+			char emote_str[1024];	/* Flawfinder: ignore */
+			if ( sscanf(mLine, " %*s = %1023s", emote_str) != 1 )	/* Flawfinder: ignore */
+				return E_ST_NO_XLT_EMOTE;
+
+			mEmoteName.assign( emote_str );
+//			LL_INFOS() << "NOTE: Emote: " << mEmoteName.c_str() << LL_ENDL;
+			continue;
+		}
+
+
+		//----------------------------------------------------------------
+		// check for global priority setting
+		//----------------------------------------------------------------
+		if (loadingGlobals && LLStringUtil::compareInsensitive(token, "priority")==0)
+		{
+			S32 priority;
+			if ( sscanf(mLine, " %*s = %d", &priority) != 1 )
+				return E_ST_NO_XLT_PRIORITY;
+
+			mPriority = priority;
+//			LL_INFOS() << "NOTE: Priority: " << mPriority << LL_ENDL;
+			continue;
+		}
+
+		//----------------------------------------------------------------
+		// check for global loop setting
+		//----------------------------------------------------------------
+		if (loadingGlobals && LLStringUtil::compareInsensitive(token, "loop")==0)
+		{
+			char trueFalse[128];		/* Flawfinder: ignore */
+			trueFalse[0] = '\0';
+			
+			F32 loop_in = 0.f;
+			F32 loop_out = 1.f;
+
+			if ( sscanf(mLine, " %*s = %f %f", &loop_in, &loop_out) == 2 )
+			{
+				mLoop = TRUE;
+			}
+			else if ( sscanf(mLine, " %*s = %127s", trueFalse) == 1 )	/* Flawfinder: ignore */	
+			{
+				mLoop = (LLStringUtil::compareInsensitive(trueFalse, "true")==0);
+			}
+			else
+			{
+				return E_ST_NO_XLT_LOOP;
+			}
+
+			mLoopInPoint = loop_in * mDuration;
+			mLoopOutPoint = loop_out * mDuration;
+
+			continue;
+		}
+
+		//----------------------------------------------------------------
+		// check for global easeIn setting
+		//----------------------------------------------------------------
+		if (loadingGlobals && LLStringUtil::compareInsensitive(token, "easein")==0)
+		{
+			F32 duration;
+			char type[128];	/* Flawfinder: ignore */
+			if ( sscanf(mLine, " %*s = %f %127s", &duration, type) != 2 )	/* Flawfinder: ignore */
+				return E_ST_NO_XLT_EASEIN;
+
+			mEaseIn = duration;
+			continue;
+		}
+
+		//----------------------------------------------------------------
+		// check for global easeOut setting
+		//----------------------------------------------------------------
+		if (loadingGlobals && LLStringUtil::compareInsensitive(token, "easeout")==0)
+		{
+			F32 duration;
+			char type[128];		/* Flawfinder: ignore */
+			if ( sscanf(mLine, " %*s = %f %127s", &duration, type) != 2 )	/* Flawfinder: ignore */
+				return E_ST_NO_XLT_EASEOUT;
+
+			mEaseOut = duration;
+			continue;
+		}
+
+		//----------------------------------------------------------------
+		// check for global handMorph setting
+		//----------------------------------------------------------------
+		if (loadingGlobals && LLStringUtil::compareInsensitive(token, "hand")==0)
+		{
+			S32 handMorph;
+			if (sscanf(mLine, " %*s = %d", &handMorph) != 1)
+				return E_ST_NO_XLT_HAND;
+
+			mHand = handMorph;
+			continue;
+		}
+
+		if (loadingGlobals && LLStringUtil::compareInsensitive(token, "constraint")==0)
+		{
+			Constraint constraint;
+
+			// try reading optional target direction
+			if(sscanf( /* Flawfinder: ignore */
+				mLine,
+				" %*s = %d %f %f %f %f %15s %f %f %f %15s %f %f %f %f %f %f", 
+				&constraint.mChainLength,
+				&constraint.mEaseInStart,
+				&constraint.mEaseInStop,
+				&constraint.mEaseOutStart,
+				&constraint.mEaseOutStop,
+				constraint.mSourceJointName,
+				&constraint.mSourceOffset.mV[VX],
+				&constraint.mSourceOffset.mV[VY],
+				&constraint.mSourceOffset.mV[VZ],
+				constraint.mTargetJointName,
+				&constraint.mTargetOffset.mV[VX],
+				&constraint.mTargetOffset.mV[VY],
+				&constraint.mTargetOffset.mV[VZ],
+				&constraint.mTargetDir.mV[VX],
+				&constraint.mTargetDir.mV[VY],
+				&constraint.mTargetDir.mV[VZ]) != 16)
+			{
+				if(sscanf( /* Flawfinder: ignore */
+					mLine,
+					" %*s = %d %f %f %f %f %15s %f %f %f %15s %f %f %f", 
+					&constraint.mChainLength,
+					&constraint.mEaseInStart,
+					&constraint.mEaseInStop,
+					&constraint.mEaseOutStart,
+					&constraint.mEaseOutStop,
+					constraint.mSourceJointName,
+					&constraint.mSourceOffset.mV[VX],
+					&constraint.mSourceOffset.mV[VY],
+					&constraint.mSourceOffset.mV[VZ],
+					constraint.mTargetJointName,
+					&constraint.mTargetOffset.mV[VX],
+					&constraint.mTargetOffset.mV[VY],
+					&constraint.mTargetOffset.mV[VZ]) != 13)
+				{
+					return E_ST_NO_CONSTRAINT;
+				}
+			}
+			else
+			{
+				// normalize direction
+				if (!constraint.mTargetDir.isExactlyZero())
+				{
+					constraint.mTargetDir.normVec();
+				}
+
+			}
+			
+			constraint.mConstraintType = CONSTRAINT_TYPE_POINT;
+			mConstraints.push_back(constraint);
+			continue;
+		}
+
+		if (loadingGlobals && LLStringUtil::compareInsensitive(token, "planar_constraint")==0)
+		{
+			Constraint constraint;
+
+			// try reading optional target direction
+			if(sscanf( /* Flawfinder: ignore */
+				mLine,
+				" %*s = %d %f %f %f %f %15s %f %f %f %15s %f %f %f %f %f %f", 
+				&constraint.mChainLength,
+				&constraint.mEaseInStart,
+				&constraint.mEaseInStop,
+				&constraint.mEaseOutStart,
+				&constraint.mEaseOutStop,
+				constraint.mSourceJointName,
+				&constraint.mSourceOffset.mV[VX],
+				&constraint.mSourceOffset.mV[VY],
+				&constraint.mSourceOffset.mV[VZ],
+				constraint.mTargetJointName,
+				&constraint.mTargetOffset.mV[VX],
+				&constraint.mTargetOffset.mV[VY],
+				&constraint.mTargetOffset.mV[VZ],
+				&constraint.mTargetDir.mV[VX],
+				&constraint.mTargetDir.mV[VY],
+				&constraint.mTargetDir.mV[VZ]) != 16)
+			{
+				if(sscanf( /* Flawfinder: ignore */
+					mLine,
+					" %*s = %d %f %f %f %f %15s %f %f %f %15s %f %f %f", 
+					&constraint.mChainLength,
+					&constraint.mEaseInStart,
+					&constraint.mEaseInStop,
+					&constraint.mEaseOutStart,
+					&constraint.mEaseOutStop,
+					constraint.mSourceJointName,
+					&constraint.mSourceOffset.mV[VX],
+					&constraint.mSourceOffset.mV[VY],
+					&constraint.mSourceOffset.mV[VZ],
+					constraint.mTargetJointName,
+					&constraint.mTargetOffset.mV[VX],
+					&constraint.mTargetOffset.mV[VY],
+					&constraint.mTargetOffset.mV[VZ]) != 13)
+				{
+					return E_ST_NO_CONSTRAINT;
+				}
+			}
+			else
+			{
+				// normalize direction
+				if (!constraint.mTargetDir.isExactlyZero())
+				{
+					constraint.mTargetDir.normVec();
+				}
+
+			}
+			
+			constraint.mConstraintType = CONSTRAINT_TYPE_PLANE;
+			mConstraints.push_back(constraint);
+			continue;
+		}
+	}
+
+	infile.close() ;
+	return E_ST_OK;
+}
 void LLBVHLoader::makeTranslation(std::string alias_name, std::string joint_name)
 {
     //Translation &newTrans = (foomap.insert(value_type(alias_name, Translation()))).first();
@@ -926,7 +1231,9 @@ void LLBVHLoader::reset()
 	mInitialized = FALSE;
 
 	mEmoteName = "";
-    mTranslations.clear();
+	mLineNumber = 0;
+	mTranslations.clear();
+	mConstraints.clear();
 }
 
 //------------------------------------------------------------------------
@@ -1156,7 +1463,29 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)
 		}
 	}
 
-	dp.packS32(0, "num_constraints");
+	S32 num_constraints = (S32)mConstraints.size();
+	dp.packS32(num_constraints, "num_constraints");
+
+	for (ConstraintVector::iterator constraint_it = mConstraints.begin();
+		constraint_it != mConstraints.end();
+		constraint_it++)
+		{
+			U8 byte = constraint_it->mChainLength;
+			dp.packU8(byte, "chain_length");
+			
+			byte = constraint_it->mConstraintType;
+			dp.packU8(byte, "constraint_type");
+			dp.packBinaryDataFixed((U8*)constraint_it->mSourceJointName, 16, "source_volume");
+			dp.packVector3(constraint_it->mSourceOffset, "source_offset");
+			dp.packBinaryDataFixed((U8*)constraint_it->mTargetJointName, 16, "target_volume");
+			dp.packVector3(constraint_it->mTargetOffset, "target_offset");
+			dp.packVector3(constraint_it->mTargetDir, "target_dir");
+			dp.packF32(constraint_it->mEaseInStart,	"ease_in_start");
+			dp.packF32(constraint_it->mEaseInStop,	"ease_in_stop");
+			dp.packF32(constraint_it->mEaseOutStart,	"ease_out_start");
+			dp.packF32(constraint_it->mEaseOutStop,	"ease_out_stop");
+		}
+
 	
 	return TRUE;
 }
diff --git a/indra/llcharacter/llbvhloader.h b/indra/llcharacter/llbvhloader.h
index 01a7c8ad16776cd8b98f479c08057e8e12aa395f..47fe4090472bb4da83702239725a40909026bba6 100755
--- a/indra/llcharacter/llbvhloader.h
+++ b/indra/llcharacter/llbvhloader.h
@@ -32,7 +32,6 @@
 #include "llmath.h"
 #include "llapr.h"
 #include "llbvhconsts.h"
-#include <deque>
 
 const S32 BVH_PARSER_LINE_SIZE = 2048;
 class LLDataPacker;
@@ -228,8 +227,6 @@ class LLBVHLoader
 	friend class LLKeyframeMotion;
 public:
 	// Constructor
-//	LLBVHLoader(const char* buffer);
-    LLBVHLoader(const char* buffer, ELoadStatus &loadStatus, S32 &errorLine);
     LLBVHLoader(const char* buffer, ELoadStatus &loadStatus, S32 &errorLine, std::map<std::string, std::string>& joint_alias_map );
 	~LLBVHLoader();
 
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 3c6b1c7903fbbe9bc4dbb6ef5b0e7cf280514c7c..a006611a45dd94aa114e37ef894ed0b75924e90e 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1600,6 +1600,7 @@ set_source_files_properties(${viewer_XUI_FILES}
 list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES})
 
 set(viewer_APPSETTINGS_FILES
+    app_settings/anim.ini
     app_settings/cmd_line.xml
     app_settings/commands.xml
     app_settings/grass.xml
diff --git a/indra/newview/app_settings/anim.ini b/indra/newview/app_settings/anim.ini
new file mode 100755
index 0000000000000000000000000000000000000000..c24d2749ef90981257d4bf43c05d5426c022f86c
--- /dev/null
+++ b/indra/newview/app_settings/anim.ini
@@ -0,0 +1,2 @@
+Translations 1.0
+
diff --git a/indra/newview/character/avatar_skeleton.xml b/indra/newview/character/avatar_skeleton.xml
index 47182620d2b920b07878569a2fca57857ee379bb..f3e845171fee74621e40e5ed28329e1061a60b60 100755
--- a/indra/newview/character/avatar_skeleton.xml
+++ b/indra/newview/character/avatar_skeleton.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
 <linden_skeleton version="1.0" num_bones="53" num_collision_volumes="29">
-<bone name="mPelvis" pos="0.000 0.000 1.067" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 1.067015" aliases="hip pelvis">
+<bone name="mPelvis" pos="0.000 0.000 1.067" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 1.067015" aliases="hip avatar_mPelvis">
   <bone name="mTail_1" pos="0.000 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.25 0.000000 0.000000">
     <bone name="mTail_2" pos="-0.2500 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-.25000000 0.000000 0.000000">
       <bone name="mTail_3" pos="-0.2500 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.2500000 0.000000 0.000000">
@@ -11,12 +11,12 @@
   </bone>
 	<collision_volume name="PELVIS" pos = "-0.01 0 -0.02" rot="0.000000 8.00000 0.000000" scale="0.12 0.16 0.17"/>
 	<collision_volume name="BUTT" pos = "-0.06 0 -0.1" rot="0.000000 0.00000 0.000000" scale="0.1 0.1 0.1"/>
-	<bone name="mTorso" pos="0.000 0.000 0.084" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 0.084073" aliases="abdomen">
+	<bone name="mTorso" pos="0.000 0.000 0.084" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 0.084073" aliases="abdomen avatar_mTorso">
 		<collision_volume name="BELLY" pos = "0.028 0 0.04" rot="0.000000 8.00000 0.000000" scale="0.09 0.13 0.15"/>
 		<collision_volume name="LOWER_BACK" pos = "0.0 0.0 0.023" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15"/>
 		<collision_volume name="LEFT_HANDLE" pos = "0.0 0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05"/>
 		<collision_volume name="RIGHT_HANDLE" pos = "0.0 -0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05"/>
-		<bone name="mChest" pos="-0.015 0.000 0.205" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.015368 0.000000 0.204877" aliases="chest">
+		<bone name="mChest" pos="-0.015 0.000 0.205" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.015368 0.000000 0.204877" aliases="chest avatar_mChest">
             <bone name="mRightWingShoulder" pos="-0.07 -0.082 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.07 -0.082 0.165">
               <bone name="mRightWingElbow" pos="-0.085 -0.115 0" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.085 -0.115 0">
                 <bone name="mRightWingWrist" pos="0.000 -0.231 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -.231 -0.000000">
@@ -37,11 +37,11 @@
 			<collision_volume name="UPPER_BACK" pos = "0.0 0.0 0.017" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15"/>
 			<collision_volume name="LEFT_PEC" pos = "0.119 0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05"/>
 			<collision_volume name="RIGHT_PEC" pos = "0.119 -0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05"/>
-			<bone name="mNeck" pos="-0.010 0.000 0.251" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.009507 0.000000 0.251108" aliases="neck">
+			<bone name="mNeck" pos="-0.010 0.000 0.251" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.009507 0.000000 0.251108" aliases="neck avatar_mNeck">
 				<collision_volume name="NECK" pos = "0.0 0 0.02" rot="0.000000 0.000000 0.000000" scale="0.05 0.06 0.08"/>
-				<bone name="mHead" pos="0.000 -0.000 0.076" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.000000 0.075630" aliases="head">
+				<bone name="mHead" pos="0.000 -0.000 0.076" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.000000 0.075630" aliases="head avatar_mHead">
 					<collision_volume name="HEAD" pos = "0.02 0 0.07" rot="0.000000 0.000000 0.000000" scale="0.11 0.09 0.12"/>
-					<bone name="mSkull" pos="0.000 0.000 0.079" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 0.079000" aliases="figureHair">
+					<bone name="mSkull" pos="0.000 0.000 0.079" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 0.079000" aliases="figureHair avatar_mSkull">
 					</bone>
 					<bone name="mEyeRight" pos="0.098 -0.036 0.079" rot="0.000000 0.000000 -0.000000" scale="1.000 1.000 1.000" pivot="0.098466 -0.036000 0.079000">
 					</bone>
@@ -49,25 +49,25 @@
 					</bone>
 				</bone>
 			</bone>
-			<bone name="mCollarLeft" pos="-0.021 0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.020927 0.084665 0.165396" aliases="lCollar">
+			<bone name="mCollarLeft" pos="-0.021 0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.020927 0.084665 0.165396" aliases="lCollar avatar_mCollarLeft">
 				<collision_volume name="L_CLAVICLE" pos = "0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05"/>
-				<bone name="mShoulderLeft" pos="0.000 0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.079000 -0.000000" aliases="lShldr">
+				<bone name="mShoulderLeft" pos="0.000 0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.079000 -0.000000" aliases="lShldr avatar_mShoulderLeft">
 					<collision_volume name="L_UPPER_ARM" pos = "0.0 0.12 0.01" rot="-5.000000 0.00000 0.000000" scale="0.05 0.17 0.05"/>
-					<bone name="mElbowLeft" pos="0.000 0.248 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.248000 0.000000" aliases="lForeArm">
+					<bone name="mElbowLeft" pos="0.000 0.248 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.248000 0.000000" aliases="lForeArm avatar_mElbowLeft">
 						<collision_volume name="L_LOWER_ARM" pos = "0.0 0.1 0.0" rot="-3.000000 0.00000 0.000000" scale="0.04 0.14 0.04"/>
-						<bone name="mWristLeft" pos="-0.000 0.205 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000000 0.204846 0.000000" aliases="lHand">
+						<bone name="mWristLeft" pos="-0.000 0.205 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000000 0.204846 0.000000" aliases="lHand avatar_mWristLeft">
 							<collision_volume name="L_HAND" pos = "0.01 0.05 0.0" rot="-3.000000 0.00000 -10.000000" scale="0.05 0.08 0.03"/>
 						</bone>
 					</bone>
 				</bone>
 			</bone>
-			<bone name="mCollarRight" pos="-0.021 -0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.020927 -0.085000 0.165396" aliases="rCollar">
+			<bone name="mCollarRight" pos="-0.021 -0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.020927 -0.085000 0.165396" aliases="rCollar avatar_mCollarRight">
 				<collision_volume name="R_CLAVICLE" pos = "0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05"/>
-				<bone name="mShoulderRight" pos="0.000 -0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.079418 -0.000000" aliases="rShldr">
+				<bone name="mShoulderRight" pos="0.000 -0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.079418 -0.000000" aliases="rShldr avatar_mShoulderRight">
 					<collision_volume name="R_UPPER_ARM" pos = "0.0 -0.12 0.01" rot="5.000000 0.00000 0.000000" scale="0.05 0.17 0.05"/>
-					<bone name="mElbowRight" pos="0.000 -0.248 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.248000 -0.000000" aliases="rForeArm">
+					<bone name="mElbowRight" pos="0.000 -0.248 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.248000 -0.000000" aliases="rForeArm avatar_mElbowRight">
 						<collision_volume name="R_LOWER_ARM" pos = "0.0 -0.1 0.0" rot="3.000000 0.00000 0.000000" scale="0.04 0.14 0.04"/>
-						<bone name="mWristRight" pos="0.000 -0.205 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000000 -0.205000 -0.000000" aliases="rHand">
+						<bone name="mWristRight" pos="0.000 -0.205 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000000 -0.205000 -0.000000" aliases="rHand avatar_mWristRight">
 							<collision_volume name="R_HAND" pos = "0.01 -0.05 0.0" rot="3.000000 0.00000 10.000000" scale="0.05 0.08 0.03"/>
 						</bone>
 					</bone>
@@ -75,26 +75,26 @@
 			</bone>
 		</bone>
 	</bone>
-	<bone name="mHipRight" pos="0.034 -0.129 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.033620 -0.128806 -0.041086" aliases="rThigh">
+	<bone name="mHipRight" pos="0.034 -0.129 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.033620 -0.128806 -0.041086" aliases="rThigh avatar_mHipRight">
 		<collision_volume name="R_UPPER_LEG" pos = "-0.02 0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32"/>
-		<bone name="mKneeRight" pos="-0.001 0.049 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000780 0.048635 -0.490922" aliases="rShin">
+		<bone name="mKneeRight" pos="-0.001 0.049 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000780 0.048635 -0.490922" aliases="rShin avatar_mKneeRight">
 			<collision_volume name="R_LOWER_LEG" pos = "-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25"/>
 			<bone name="mAnkleRight" pos="-0.029 0.000 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.028869 0.000000 -0.468494">
 				<collision_volume name="R_FOOT"  pos = "0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05"/>
-				<bone name="mFootRight" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.111956 -0.000000 -0.060637" aliases="rFoot">
+				<bone name="mFootRight" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.111956 -0.000000 -0.060637" aliases="rFoot avatar_mFootRight">
 					<bone name="mToeRight" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.105399 -0.010408 -0.000104">
 					</bone>
 				</bone>
 			</bone>
 		</bone>
 	</bone>
-	<bone name="mHipLeft" pos="0.034 0.127 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.033757 0.126765 -0.040998" aliases="lThigh">
+	<bone name="mHipLeft" pos="0.034 0.127 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.033757 0.126765 -0.040998" aliases="lThigh avatar_mHipLeft">
 		<collision_volume name="L_UPPER_LEG" pos = "-0.02 -0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32"/>
-		<bone name="mKneeLeft" pos="-0.001 -0.046 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000887 -0.045568 -0.491053" aliases="lShin">
+		<bone name="mKneeLeft" pos="-0.001 -0.046 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000887 -0.045568 -0.491053" aliases="lShin avatar_mKneeLeft">
 			<collision_volume name="L_LOWER_LEG" pos = "-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25"/>
 			<bone name="mAnkleLeft" pos="-0.029 0.001 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.028887 0.001378 -0.468449">
 				<collision_volume name="L_FOOT" pos = "0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05"/>
-				<bone name="mFootLeft" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.111956 -0.000000 -0.060620" aliases="lFoot">
+				<bone name="mFootLeft" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.111956 -0.000000 -0.060620" aliases="lFoot avatar_mFootLeft">
 					<bone name="mToeLeft" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.105387 0.008270 0.000871">
 					</bone>
 				</bone>
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index b6924e5904f9fc214cf7c5ff74f26f8c1770bebe..3b482e1bc0e8d91d3ff171408b87d1e537c7bfea 100755
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -937,27 +937,6 @@ std::string LLVOAvatar::rezStatusToString(S32 rez_status)
 	return "unknown";
 }
 
-void LLVOAvatar::getLegalJointNames(std::deque<std::string>& legal_joint_names,
-                                    bool include_collision_volumes)
-{
-    LLAvatarAppearance::joint_alias_map_t alias_map = getJointAliases();
-
-    std::map<std::string, std::string>::iterator iter;
-
-    for (iter = alias_map.begin(); iter != alias_map.end(); ++iter)
-    {
-        legal_joint_names.push_back(iter->first);
-    }
-    
-    if (include_collision_volumes)
-    {
-        for (S32 i = 0; i < mNumCollisionVolumes; i++)
-        {
-            legal_joint_names.push_back(mCollisionVolumes[i].getName());
-        }
-    }
-}
-
 // static
 void LLVOAvatar::dumpBakedStatus()
 {
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 29f70fca185811325484927c8c54414480b0bdb9..002359ebac864fd4d7a094cfd949b552e3b9d558 100755
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -147,8 +147,6 @@ class LLVOAvatar :
 	void 						collectBakedTextureUUIDs(std::set<LLUUID>& ids) const;
 	void 						collectTextureUUIDs(std::set<LLUUID>& ids);
 	void						releaseOldTextures();
-    void                        getLegalJointNames(std::deque<std::string>& legal_joint_names,
-                                                   bool include_collision_volumes);
 	/*virtual*/ void   	 	 	updateTextures();
 	LLViewerFetchedTexture*		getBakedTextureImage(const U8 te, const LLUUID& uuid);
 	/*virtual*/ S32    	 	 	setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim.