diff --git a/.hgtags b/.hgtags
index a62c0bddfb79f79c895a0355280fd3c2a4757a2e..07fdce592b07beb8ce6a4e1eefb0dc058e1ce52b 100755
--- a/.hgtags
+++ b/.hgtags
@@ -551,3 +551,4 @@ a3143db58a0f6b005232bf9018e7fef17ff9ec90 6.1.0-release
 ec09daf1899c1c01c4ba0ba950fae572f2a612a8 6.2.2-release
 ab2ec5c5423b277d23fd0511ce50c15123ff2e03 6.2.3-release
 67297f9902857e357570c44722ad84de3aff974e 6.2.4-release
+9777aec6dc4a30a24537297ac040861ce16b82ae 6.3.0-release
diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp
index 0c0ad0d2651aeb77f8e3b301d34d77a5fd4ffed6..6882d2a55374caa719419a55c150d8a6b7aa83e0 100644
--- a/indra/llappearance/llavatarappearance.cpp
+++ b/indra/llappearance/llavatarappearance.cpp
@@ -1482,6 +1482,21 @@ BOOL LLAvatarAppearance::teToColorParams( ETextureIndex te, U32 *param_name )
 			param_name[0] = 1071; //"tattoo_red";
 			param_name[1] = 1072; //"tattoo_green";
 			param_name[2] = 1073; //"tattoo_blue";
+			break;
+		case TEX_HEAD_UNIVERSAL_TATTOO:
+		case TEX_UPPER_UNIVERSAL_TATTOO:
+		case TEX_LOWER_UNIVERSAL_TATTOO:
+		case TEX_SKIRT_TATTOO:
+		case TEX_HAIR_TATTOO:
+		case TEX_EYES_TATTOO:
+		case TEX_LEFT_ARM_TATTOO:
+		case TEX_LEFT_LEG_TATTOO:
+		case TEX_AUX1_TATTOO:
+		case TEX_AUX2_TATTOO:
+		case TEX_AUX3_TATTOO:
+			param_name[0] = 1238; //"tattoo_universal_red";
+			param_name[1] = 1239; //"tattoo_universal_green";
+			param_name[2] = 1240; //"tattoo_universal_blue";
 			break;	
 
 		default:
@@ -1728,8 +1743,8 @@ void LLAvatarAppearance::makeJointAliases(LLAvatarBoneInfo *bone_info)
         mJointAliasMap[*i] = bone_name;
     }
 
-    LLAvatarBoneInfo::bones_t::const_iterator iter;
-    for (iter = bone_info->mChildren.begin(); iter != bone_info->mChildren.end(); ++iter)
+    LLAvatarBoneInfo::child_list_t::const_iterator iter;
+    for (iter = bone_info->mChildList.begin(); iter != bone_info->mChildList.end(); ++iter)
     {
         makeJointAliases( *iter );
     }
diff --git a/indra/llappearance/llavatarappearancedefines.cpp b/indra/llappearance/llavatarappearancedefines.cpp
index b5282d4f6f47350be8543becfaa7ea6794feb186..c72943bb8292a833841fce78ff6d3941936e7b1a 100644
--- a/indra/llappearance/llavatarappearancedefines.cpp
+++ b/indra/llappearance/llavatarappearancedefines.cpp
@@ -26,9 +26,10 @@
 
 #include "linden_common.h"
 #include "llavatarappearancedefines.h"
+#include "indra_constants.h"
 
-const S32 LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH = 512;
-const S32 LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT = 512;
+const S32 LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH = 1024;
+const S32 LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT = 1024;
 const S32 LLAvatarAppearanceDefines::IMPOSTOR_PERIOD = 2;
 
 using namespace LLAvatarAppearanceDefines;
@@ -65,12 +66,30 @@ LLAvatarAppearanceDictionary::Textures::Textures()
 	addEntry(TEX_UPPER_TATTOO,                new TextureEntry("upper_tattoo",     TRUE,  BAKED_NUM_INDICES, "",     LLWearableType::WT_TATTOO));
 	addEntry(TEX_LOWER_TATTOO,                new TextureEntry("lower_tattoo",     TRUE,  BAKED_NUM_INDICES, "",     LLWearableType::WT_TATTOO));
 
+	addEntry(TEX_HEAD_UNIVERSAL_TATTOO,		  new TextureEntry("head_universal_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL));
+	addEntry(TEX_UPPER_UNIVERSAL_TATTOO,	  new TextureEntry("upper_universal_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL));
+	addEntry(TEX_LOWER_UNIVERSAL_TATTOO,      new TextureEntry("lower_universal_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL));
+	addEntry(TEX_SKIRT_TATTOO,				  new TextureEntry("skirt_tattoo",	   TRUE,  BAKED_NUM_INDICES, "",	 LLWearableType::WT_UNIVERSAL));
+	addEntry(TEX_HAIR_TATTOO,				  new TextureEntry("hair_tattoo",	   TRUE,  BAKED_NUM_INDICES, "",	 LLWearableType::WT_UNIVERSAL));
+	addEntry(TEX_EYES_TATTOO,				  new TextureEntry("eyes_tattoo",      TRUE,  BAKED_NUM_INDICES, "",	 LLWearableType::WT_UNIVERSAL));
+	addEntry(TEX_LEFT_ARM_TATTOO,			  new TextureEntry("leftarm_tattoo",   TRUE,  BAKED_NUM_INDICES, "",	 LLWearableType::WT_UNIVERSAL));
+	addEntry(TEX_LEFT_LEG_TATTOO,			  new TextureEntry("leftleg_tattoo",   TRUE,  BAKED_NUM_INDICES, "",	 LLWearableType::WT_UNIVERSAL));
+	addEntry(TEX_AUX1_TATTOO,				  new TextureEntry("aux1_tattoo",      TRUE,  BAKED_NUM_INDICES, "",	 LLWearableType::WT_UNIVERSAL));
+	addEntry(TEX_AUX2_TATTOO,				  new TextureEntry("aux2_tattoo",      TRUE,  BAKED_NUM_INDICES, "",	 LLWearableType::WT_UNIVERSAL));
+	addEntry(TEX_AUX3_TATTOO,				  new TextureEntry("aux3_tattoo",      TRUE,  BAKED_NUM_INDICES, "",	 LLWearableType::WT_UNIVERSAL));
+
+
 	addEntry(TEX_HEAD_BAKED,                  new TextureEntry("head-baked",       FALSE, BAKED_HEAD, "head"));
 	addEntry(TEX_UPPER_BAKED,                 new TextureEntry("upper-baked",      FALSE, BAKED_UPPER, "upper"));
 	addEntry(TEX_LOWER_BAKED,                 new TextureEntry("lower-baked",      FALSE, BAKED_LOWER, "lower"));
 	addEntry(TEX_EYES_BAKED,                  new TextureEntry("eyes-baked",       FALSE, BAKED_EYES, "eyes"));
 	addEntry(TEX_HAIR_BAKED,                  new TextureEntry("hair-baked",       FALSE, BAKED_HAIR, "hair"));
 	addEntry(TEX_SKIRT_BAKED,                 new TextureEntry("skirt-baked",      FALSE, BAKED_SKIRT, "skirt"));
+	addEntry(TEX_LEFT_ARM_BAKED,			  new TextureEntry("leftarm-baked",   FALSE, BAKED_LEFT_ARM, "leftarm"));
+	addEntry(TEX_LEFT_LEG_BAKED,		      new TextureEntry("leftleg-baked",  FALSE, BAKED_LEFT_LEG, "leftleg"));
+	addEntry(TEX_AUX1_BAKED,				  new TextureEntry("aux1-baked",	   FALSE, BAKED_AUX1, "aux1"));
+	addEntry(TEX_AUX2_BAKED,				  new TextureEntry("aux2-baked",	   FALSE, BAKED_AUX2, "aux2"));
+	addEntry(TEX_AUX3_BAKED,				  new TextureEntry("aux3-baked",	   FALSE, BAKED_AUX3, "aux3"));
 }
 
 LLAvatarAppearanceDictionary::BakedTextures::BakedTextures()
@@ -78,35 +97,60 @@ LLAvatarAppearanceDictionary::BakedTextures::BakedTextures()
 	// Baked textures
 	addEntry(BAKED_HEAD,       new BakedEntry(TEX_HEAD_BAKED,  
 											  "head", "a4b9dc38-e13b-4df9-b284-751efb0566ff", 
-											  3, TEX_HEAD_BODYPAINT, TEX_HEAD_TATTOO, TEX_HEAD_ALPHA,
-											  5, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_HAIR, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA));
+											  4, TEX_HEAD_BODYPAINT, TEX_HEAD_TATTOO, TEX_HEAD_ALPHA, TEX_HEAD_UNIVERSAL_TATTOO,
+											  6, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_HAIR, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA, LLWearableType::WT_UNIVERSAL));
 
 	addEntry(BAKED_UPPER,      new BakedEntry(TEX_UPPER_BAKED, 
 											  "upper_body", "5943ff64-d26c-4a90-a8c0-d61f56bd98d4", 
-											  7, TEX_UPPER_SHIRT,TEX_UPPER_BODYPAINT, TEX_UPPER_JACKET,
-											  TEX_UPPER_GLOVES, TEX_UPPER_UNDERSHIRT, TEX_UPPER_TATTOO, TEX_UPPER_ALPHA,
-											  8, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN,	LLWearableType::WT_SHIRT, LLWearableType::WT_JACKET, LLWearableType::WT_GLOVES, LLWearableType::WT_UNDERSHIRT, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA));											  
+											  8, TEX_UPPER_SHIRT,TEX_UPPER_BODYPAINT, TEX_UPPER_JACKET,
+											  TEX_UPPER_GLOVES, TEX_UPPER_UNDERSHIRT, TEX_UPPER_TATTOO, TEX_UPPER_ALPHA, TEX_UPPER_UNIVERSAL_TATTOO,
+											  9, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN,	LLWearableType::WT_SHIRT, LLWearableType::WT_JACKET, LLWearableType::WT_GLOVES, LLWearableType::WT_UNDERSHIRT, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA, LLWearableType::WT_UNIVERSAL));											  
 
 	addEntry(BAKED_LOWER,      new BakedEntry(TEX_LOWER_BAKED, 
 											  "lower_body", "2944ee70-90a7-425d-a5fb-d749c782ed7d",
-											  8, TEX_LOWER_PANTS,TEX_LOWER_BODYPAINT,TEX_LOWER_SHOES, TEX_LOWER_SOCKS,
-											  TEX_LOWER_JACKET, TEX_LOWER_UNDERPANTS, TEX_LOWER_TATTOO, TEX_LOWER_ALPHA,
-											  9, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN,	LLWearableType::WT_PANTS, LLWearableType::WT_SHOES,	 LLWearableType::WT_SOCKS,  LLWearableType::WT_JACKET, LLWearableType::WT_UNDERPANTS, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA));
+											  9, TEX_LOWER_PANTS,TEX_LOWER_BODYPAINT,TEX_LOWER_SHOES, TEX_LOWER_SOCKS,
+											  TEX_LOWER_JACKET, TEX_LOWER_UNDERPANTS, TEX_LOWER_TATTOO, TEX_LOWER_ALPHA, TEX_LOWER_UNIVERSAL_TATTOO,
+											  10, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN,	LLWearableType::WT_PANTS, LLWearableType::WT_SHOES,	 LLWearableType::WT_SOCKS,  LLWearableType::WT_JACKET, LLWearableType::WT_UNDERPANTS, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA, LLWearableType::WT_UNIVERSAL));
 
 	addEntry(BAKED_EYES,       new BakedEntry(TEX_EYES_BAKED,  
 											  "eyes", "27b1bc0f-979f-4b13-95fe-b981c2ba9788",
-											  2, TEX_EYES_IRIS, TEX_EYES_ALPHA,
-											  2, LLWearableType::WT_EYES, LLWearableType::WT_ALPHA));
+											  3, TEX_EYES_IRIS, TEX_EYES_TATTOO, TEX_EYES_ALPHA,
+											  3, LLWearableType::WT_EYES, LLWearableType::WT_UNIVERSAL, LLWearableType::WT_ALPHA));
 
 	addEntry(BAKED_SKIRT,      new BakedEntry(TEX_SKIRT_BAKED,
 											  "skirt", "03e7e8cb-1368-483b-b6f3-74850838ba63", 
-											  1, TEX_SKIRT,
-											  1, LLWearableType::WT_SKIRT));
+											  2, TEX_SKIRT, TEX_SKIRT_TATTOO,
+											  2, LLWearableType::WT_SKIRT, LLWearableType::WT_UNIVERSAL ));
 
 	addEntry(BAKED_HAIR,       new BakedEntry(TEX_HAIR_BAKED,
 											  "hair", "a60e85a9-74e8-48d8-8a2d-8129f28d9b61", 
-											  2, TEX_HAIR, TEX_HAIR_ALPHA,
-											  2, LLWearableType::WT_HAIR, LLWearableType::WT_ALPHA));
+											  3, TEX_HAIR, TEX_HAIR_TATTOO, TEX_HAIR_ALPHA,
+											  3, LLWearableType::WT_HAIR, LLWearableType::WT_UNIVERSAL, LLWearableType::WT_ALPHA));
+
+	addEntry(BAKED_LEFT_ARM, new BakedEntry(TEX_LEFT_ARM_BAKED,
+		"leftarm", "9f39febf-22d7-0087-79d1-e9e8c6c9ed19",
+		1, TEX_LEFT_ARM_TATTOO,
+		1, LLWearableType::WT_UNIVERSAL));
+
+	addEntry(BAKED_LEFT_LEG, new BakedEntry(TEX_LEFT_LEG_BAKED,
+		"leftleg", "054a7a58-8ed5-6386-0add-3b636fb28b78",
+		1, TEX_LEFT_LEG_TATTOO,
+		1, LLWearableType::WT_UNIVERSAL));
+
+	addEntry(BAKED_AUX1, new BakedEntry(TEX_AUX1_BAKED,
+		"aux1", "790c11be-b25c-c17e-b4d2-6a4ad786b752",
+		1, TEX_AUX1_TATTOO,
+		1, LLWearableType::WT_UNIVERSAL));
+
+	addEntry(BAKED_AUX2, new BakedEntry(TEX_AUX2_BAKED,
+		"aux2", "d78c478f-48c7-5928-5864-8d99fb1f521e",
+		1, TEX_AUX2_TATTOO,
+		1, LLWearableType::WT_UNIVERSAL));
+
+	addEntry(BAKED_AUX3, new BakedEntry(TEX_AUX3_BAKED,
+		"aux3", "6a95dd53-edd9-aac8-f6d3-27ed99f3c3eb",
+		1, TEX_AUX3_TATTOO,
+		1, LLWearableType::WT_UNIVERSAL));
 }
 
 LLAvatarAppearanceDictionary::MeshEntries::MeshEntries()
@@ -265,3 +309,113 @@ LLWearableType::EType LLAvatarAppearanceDictionary::getTEWearableType(ETextureIn
 {
 	return getInstance()->getTexture(index)->mWearableType;
 }
+
+// static
+BOOL LLAvatarAppearanceDictionary::isBakedImageId(const LLUUID& id)
+{
+	if ((id == IMG_USE_BAKED_EYES) || (id == IMG_USE_BAKED_HAIR) || (id == IMG_USE_BAKED_HEAD) || (id == IMG_USE_BAKED_LOWER) || (id == IMG_USE_BAKED_SKIRT) || (id == IMG_USE_BAKED_UPPER) 
+		|| (id == IMG_USE_BAKED_LEFTARM) || (id == IMG_USE_BAKED_LEFTLEG) || (id == IMG_USE_BAKED_AUX1) || (id == IMG_USE_BAKED_AUX2) || (id == IMG_USE_BAKED_AUX3) )
+	{
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+// static 
+EBakedTextureIndex LLAvatarAppearanceDictionary::assetIdToBakedTextureIndex(const LLUUID& id)
+{
+	if (id == IMG_USE_BAKED_EYES)
+	{
+		return BAKED_EYES;
+	}
+	else if (id == IMG_USE_BAKED_HAIR)
+	{
+		return BAKED_HAIR;
+	}
+	else if (id == IMG_USE_BAKED_HEAD)
+	{
+		return BAKED_HEAD;
+	}
+	else if (id == IMG_USE_BAKED_LOWER)
+	{
+		return BAKED_LOWER;
+	}
+	else if (id == IMG_USE_BAKED_SKIRT)
+	{
+		return BAKED_SKIRT;
+	}
+	else if (id == IMG_USE_BAKED_UPPER)
+	{
+		return BAKED_UPPER;
+	}
+	else if (id == IMG_USE_BAKED_LEFTARM)
+	{
+		return BAKED_LEFT_ARM;
+	}
+	else if (id == IMG_USE_BAKED_LEFTLEG)
+	{
+		return BAKED_LEFT_LEG;
+	}
+	else if (id == IMG_USE_BAKED_AUX1)
+	{
+		return BAKED_AUX1;
+	}
+	else if (id == IMG_USE_BAKED_AUX2)
+	{
+		return BAKED_AUX2;
+	}
+	else if (id == IMG_USE_BAKED_AUX3)
+	{
+		return BAKED_AUX3;
+	}
+
+	return BAKED_NUM_INDICES;
+}
+
+//static
+LLUUID LLAvatarAppearanceDictionary::localTextureIndexToMagicId(ETextureIndex t)
+{
+	LLUUID id = LLUUID::null;
+
+	switch (t)
+	{
+	case LLAvatarAppearanceDefines::TEX_HEAD_BAKED:
+		id = IMG_USE_BAKED_HEAD;
+		break;
+	case LLAvatarAppearanceDefines::TEX_UPPER_BAKED:
+		id = IMG_USE_BAKED_UPPER;
+		break;
+	case LLAvatarAppearanceDefines::TEX_LOWER_BAKED:
+		id = IMG_USE_BAKED_LOWER;
+		break;
+	case LLAvatarAppearanceDefines::TEX_EYES_BAKED:
+		id = IMG_USE_BAKED_EYES;
+		break;
+	case LLAvatarAppearanceDefines::TEX_SKIRT_BAKED:
+		id = IMG_USE_BAKED_SKIRT;
+		break;
+	case LLAvatarAppearanceDefines::TEX_HAIR_BAKED:
+		id = IMG_USE_BAKED_HAIR;
+		break;
+	case LLAvatarAppearanceDefines::TEX_LEFT_ARM_BAKED:
+		id = IMG_USE_BAKED_LEFTARM;
+		break;
+	case LLAvatarAppearanceDefines::TEX_LEFT_LEG_BAKED:
+		id = IMG_USE_BAKED_LEFTLEG;
+		break;
+	case LLAvatarAppearanceDefines::TEX_AUX1_BAKED:
+		id = IMG_USE_BAKED_AUX1;
+		break;
+	case LLAvatarAppearanceDefines::TEX_AUX2_BAKED:
+		id = IMG_USE_BAKED_AUX2;
+		break;
+	case LLAvatarAppearanceDefines::TEX_AUX3_BAKED:
+		id = IMG_USE_BAKED_AUX3;
+		break;
+	default:
+		break;
+	}
+
+	return id;
+}
diff --git a/indra/llappearance/llavatarappearancedefines.h b/indra/llappearance/llavatarappearancedefines.h
index d6223bb4d24e732ceb01df1627434fd631dcda5f..5663d24293618ac796941c5d7e185a863b1a70d0 100644
--- a/indra/llappearance/llavatarappearancedefines.h
+++ b/indra/llappearance/llavatarappearancedefines.h
@@ -78,6 +78,22 @@ enum ETextureIndex
 	TEX_HEAD_TATTOO,
 	TEX_UPPER_TATTOO,
 	TEX_LOWER_TATTOO,
+	TEX_HEAD_UNIVERSAL_TATTOO,
+	TEX_UPPER_UNIVERSAL_TATTOO,
+	TEX_LOWER_UNIVERSAL_TATTOO,
+	TEX_SKIRT_TATTOO,
+	TEX_HAIR_TATTOO,
+	TEX_EYES_TATTOO,
+	TEX_LEFT_ARM_TATTOO,
+	TEX_LEFT_LEG_TATTOO,
+	TEX_AUX1_TATTOO,
+	TEX_AUX2_TATTOO,
+	TEX_AUX3_TATTOO,
+	TEX_LEFT_ARM_BAKED,		 // Pre-composited
+	TEX_LEFT_LEG_BAKED,     // Pre-composited
+	TEX_AUX1_BAKED,			 // Pre-composited
+	TEX_AUX2_BAKED,			 // Pre-composited
+	TEX_AUX3_BAKED,			 // Pre-composited
 	TEX_NUM_INDICES
 }; 
 
@@ -89,6 +105,11 @@ enum EBakedTextureIndex
 	BAKED_EYES,
 	BAKED_SKIRT,
 	BAKED_HAIR,
+	BAKED_LEFT_ARM,
+	BAKED_LEFT_LEG,
+	BAKED_AUX1,
+	BAKED_AUX2,
+	BAKED_AUX3,
 	BAKED_NUM_INDICES
 };
 
@@ -223,6 +244,10 @@ class LLAvatarAppearanceDictionary : public LLSingleton<LLAvatarAppearanceDictio
 	// Given a texture entry, determine which wearable type owns it.
 	static LLWearableType::EType 		getTEWearableType(ETextureIndex index);
 
+	static BOOL							isBakedImageId(const LLUUID& id);
+	static EBakedTextureIndex			assetIdToBakedTextureIndex(const LLUUID& id);
+	static LLUUID						localTextureIndexToMagicId(ETextureIndex t);
+
 }; // End LLAvatarAppearanceDictionary
 
 } // End namespace LLAvatarAppearanceDefines
diff --git a/indra/llappearance/llwearabletype.cpp b/indra/llappearance/llwearabletype.cpp
index 4daf34eca62df135b74f92952b6bbf3611e2efa2..5b33c829e04e4247432f9d4a4b196fdad3b0fd9c 100644
--- a/indra/llappearance/llwearabletype.cpp
+++ b/indra/llappearance/llwearabletype.cpp
@@ -91,6 +91,7 @@ LLWearableDictionary::LLWearableDictionary()
 	addEntry(LLWearableType::WT_SKIRT,        new WearableEntry("skirt",       "New Skirt",			LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_SKIRT, FALSE, TRUE));
 	addEntry(LLWearableType::WT_ALPHA,        new WearableEntry("alpha",       "New Alpha",			LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_ALPHA, FALSE, TRUE));
 	addEntry(LLWearableType::WT_TATTOO,       new WearableEntry("tattoo",      "New Tattoo",		LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_TATTOO, FALSE, TRUE));
+	addEntry(LLWearableType::WT_UNIVERSAL,    new WearableEntry("universal",   "New Universal",     LLAssetType::AT_CLOTHING,   LLInventoryType::ICONNAME_CLOTHING_UNIVERSAL, FALSE, TRUE));
 
 	addEntry(LLWearableType::WT_PHYSICS,      new WearableEntry("physics",     "New Physics",		LLAssetType::AT_CLOTHING, 	LLInventoryType::ICONNAME_CLOTHING_PHYSICS, TRUE, TRUE));
 
diff --git a/indra/llappearance/llwearabletype.h b/indra/llappearance/llwearabletype.h
index 74eb904c8db639f3f8f07069546e08f3e40499fa..17ff3a22a89899fdf25ede40fadda521b0af6d43 100644
--- a/indra/llappearance/llwearabletype.h
+++ b/indra/llappearance/llwearabletype.h
@@ -54,7 +54,8 @@ class LLWearableType
 		WT_ALPHA	  = 13,
 		WT_TATTOO	  = 14,
 		WT_PHYSICS	  = 15,
-		WT_COUNT	  = 16,
+		WT_UNIVERSAL  = 16,
+		WT_COUNT	  = 17,
 
 		WT_INVALID	  = 255,
 		WT_NONE		  = -1,
diff --git a/indra/llcommon/indra_constants.cpp b/indra/llcommon/indra_constants.cpp
index 601eb45570d33b3b931b9ee4fc3dddb08d2ad9b1..1b48e4daf3a911c94867d11a31587d79a7209083 100644
--- a/indra/llcommon/indra_constants.cpp
+++ b/indra/llcommon/indra_constants.cpp
@@ -71,3 +71,15 @@ const LLUUID TERRAIN_ROCK_DETAIL		("53a2f406-4895-1d13-d541-d2e3b86bc19c"); // V
 
 const LLUUID DEFAULT_WATER_NORMAL		("822ded49-9a6c-f61c-cb89-6df54f42cdf4"); // VIEWER
 
+const LLUUID IMG_USE_BAKED_HEAD  ("5a9f4a74-30f2-821c-b88d-70499d3e7183");
+const LLUUID IMG_USE_BAKED_UPPER ("ae2de45c-d252-50b8-5c6e-19f39ce79317");
+const LLUUID IMG_USE_BAKED_LOWER ("24daea5f-0539-cfcf-047f-fbc40b2786ba");
+const LLUUID IMG_USE_BAKED_EYES  ("52cc6bb6-2ee5-e632-d3ad-50197b1dcb8a");
+const LLUUID IMG_USE_BAKED_SKIRT ("43529ce8-7faa-ad92-165a-bc4078371687");
+const LLUUID IMG_USE_BAKED_HAIR  ("09aac1fb-6bce-0bee-7d44-caac6dbb6c63");
+const LLUUID IMG_USE_BAKED_LEFTARM  ("ff62763f-d60a-9855-890b-0c96f8f8cd98");
+const LLUUID IMG_USE_BAKED_LEFTLEG  ("8e915e25-31d1-cc95-ae08-d58a47488251");
+const LLUUID IMG_USE_BAKED_AUX1  ("9742065b-19b5-297c-858a-29711d539043");
+const LLUUID IMG_USE_BAKED_AUX2  ("03642e83-2bd1-4eb9-34b4-4c47ed586d2d");
+const LLUUID IMG_USE_BAKED_AUX3  ("edd51b77-fc10-ce7a-4b3d-011dfc349e4f");
+
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index 4563e88fd760879f41bf3af4ee3be448a5860b6b..e7b0e0ef8e9f3c962f71c94bfe77a9af04c7d893 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -205,6 +205,18 @@ LL_COMMON_API extern const LLUUID TERRAIN_GRASS_DETAIL;
 LL_COMMON_API extern const LLUUID TERRAIN_MOUNTAIN_DETAIL;
 LL_COMMON_API extern const LLUUID TERRAIN_ROCK_DETAIL;
 
+LL_COMMON_API extern const LLUUID IMG_USE_BAKED_HEAD;
+LL_COMMON_API extern const LLUUID IMG_USE_BAKED_UPPER;
+LL_COMMON_API extern const LLUUID IMG_USE_BAKED_LOWER;
+LL_COMMON_API extern const LLUUID IMG_USE_BAKED_EYES;
+LL_COMMON_API extern const LLUUID IMG_USE_BAKED_SKIRT;
+LL_COMMON_API extern const LLUUID IMG_USE_BAKED_HAIR;
+LL_COMMON_API extern const LLUUID IMG_USE_BAKED_LEFTARM;
+LL_COMMON_API extern const LLUUID IMG_USE_BAKED_LEFTLEG;
+LL_COMMON_API extern const LLUUID IMG_USE_BAKED_AUX1;
+LL_COMMON_API extern const LLUUID IMG_USE_BAKED_AUX2;
+LL_COMMON_API extern const LLUUID IMG_USE_BAKED_AUX3;
+
 LL_COMMON_API extern const LLUUID DEFAULT_WATER_NORMAL;
 
 
diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h
index 72092b1d8b8a818378ab4334645075f1bb447271..b6e7fb047f8f5ea12529aea0826f2f8163261b0e 100644
--- a/indra/llinventory/llinventorytype.h
+++ b/indra/llinventory/llinventorytype.h
@@ -102,6 +102,7 @@ class LLInventoryType
 		ICONNAME_CLOTHING_SKIRT,
 		ICONNAME_CLOTHING_ALPHA,
 		ICONNAME_CLOTHING_TATTOO,
+		ICONNAME_CLOTHING_UNIVERSAL,
 
 		ICONNAME_ANIMATION,
 		ICONNAME_GESTURE,
diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index 27d1bee9bda5b1b918a0287f249d0030d4226cf9..a0987b35d86270d3d86a62da71a7e567e424d40e 100644
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -1040,14 +1040,26 @@ S32 LLPrimitive::packTEField(U8 *cur_ptr, U8 *data_ptr, U8 data_size, U8 last_fa
 			}
 			
 			//assign exception faces to cur_ptr
-			if (exception_faces >= (0x1 << 7))
+			if (exception_faces >= ((U64)0x1 << 7))
 			{
-				if (exception_faces >= (0x1 << 14))
+				if (exception_faces >= ((U64)0x1 << 14))
 				{
-					if (exception_faces >= (0x1 << 21))
+					if (exception_faces >= ((U64)0x1 << 21))
 					{
-						if (exception_faces >= (0x1 << 28))
+						if (exception_faces >= ((U64)0x1 << 28))
 						{
+							if (exception_faces >= ((U64)0x1 << 35))
+							{
+								if (exception_faces >= ((U64)0x1 << 42))
+								{
+									if (exception_faces >= ((U64)0x1 << 49))
+									{
+										*cur_ptr++ = (U8)(((exception_faces >> 49) & 0x7F) | 0x80);
+									}
+									*cur_ptr++ = (U8)(((exception_faces >> 42) & 0x7F) | 0x80);
+								}
+								*cur_ptr++ = (U8)(((exception_faces >> 35) & 0x7F) | 0x80);
+							}
 							*cur_ptr++ = (U8)(((exception_faces >> 28) & 0x7F) | 0x80);
 						}
 						*cur_ptr++ = (U8)(((exception_faces >> 21) & 0x7F) | 0x80);
@@ -1056,6 +1068,7 @@ S32 LLPrimitive::packTEField(U8 *cur_ptr, U8 *data_ptr, U8 data_size, U8 last_fa
 				}
 				*cur_ptr++ = (U8)(((exception_faces >> 7) & 0x7F) | 0x80);
 			}
+
 			
 			*cur_ptr++ = (U8)(exception_faces & 0x7F);
 			
@@ -1115,7 +1128,7 @@ S32 LLPrimitive::unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 dat
 // Includes information about image ID, color, scale S,T, offset S,T and rotation
 BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const
 {
-	const U32 MAX_TES = 32;
+	const U32 MAX_TES = 45;
 
 	U8     image_ids[MAX_TES*16];
 	U8     colors[MAX_TES*4];
@@ -1200,7 +1213,7 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const
 
 BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const
 {
-	const U32 MAX_TES = 32;
+	const U32 MAX_TES = 45;
 
 	U8     image_ids[MAX_TES*16];
 	U8     colors[MAX_TES*4];
@@ -1313,6 +1326,8 @@ S32 LLPrimitive::parseTEMessage(LLMessageSystem* mesgsys, char const* block_name
 		mesgsys->getBinaryDataFast(block_name, _PREHASH_TextureEntry, tec.packed_buffer, 0, block_num, LLTEContents::MAX_TE_BUFFER);
 	}
 
+	
+
 	tec.face_count = llmin((U32)getNumTEs(),(U32)LLTEContents::MAX_TES);
 
 	U8 *cur_ptr = tec.packed_buffer;
@@ -1385,6 +1400,8 @@ S32 LLPrimitive::applyParsedTEMessage(LLTEContents& tec)
 
 		retval |= setTEColor(i, color);
 
+		
+
 	}
 
 	return retval;
@@ -1403,7 +1420,7 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)
 {
 	// use a negative block_num to indicate a single-block read (a non-variable block)
 	S32 retval = 0;
-	const U32 MAX_TES = 32;
+	const U32 MAX_TES = 45;
 
 	// Avoid construction of 32 UUIDs per call
 	static LLUUID image_ids[MAX_TES];
diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h
index 619a9f8ca59dbf9730ff9dee39f54d7a8a64f859..20b5ad8eff9034a010194140b39944429ba492d2 100644
--- a/indra/llprimitive/llprimitive.h
+++ b/indra/llprimitive/llprimitive.h
@@ -321,7 +321,7 @@ class LLExtendedMeshParams : public LLNetworkData
 // - Vir
 struct LLTEContents
 {
-	static const U32 MAX_TES = 32;
+	static const U32 MAX_TES = 45;
 
 	U8     image_data[MAX_TES*16];
 	U8	  colors[MAX_TES*4];
diff --git a/indra/newview/character/aux_base.tga b/indra/newview/character/aux_base.tga
new file mode 100644
index 0000000000000000000000000000000000000000..dbcaaaf2b192d7dcc184e46e83c8815a26cd80ea
Binary files /dev/null and b/indra/newview/character/aux_base.tga differ
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index df30f46002d072811a8b3e8c46e90df9ed1789d2..2cdd86267ee3b243c7e9e7b6c6b0c55a3bd1f2a6 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -8947,6 +8947,66 @@
       <texture
          local_texture="hair_alpha" />
     </layer>
+    <layer
+       name="hair_tattoo">
+      <texture
+         local_texture="hair_tattoo" />
+      <param
+       id="1211"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_hair_red"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="255, 0, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1212"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_hair_green"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 255, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1213"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_hair_blue"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 0, 255, 255" />
+        </param_color>
+      </param>
+
+    </layer>
+
 
   </layer_set>
   <!-- =========================================================== -->
@@ -10024,7 +10084,65 @@ render_pass="bump">
       </param>
 
     </layer>
+    <layer
+      name="head_universal_tattoo">
+      <texture
+         local_texture="head_universal_tattoo" />
+      <param
+       id="1229"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_head_universal_red"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="255, 0, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1230"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_head_universal_green"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 255, 0, 255" />
+        </param_color>
+      </param>
 
+      <param
+       id="1231"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_head_universal_blue"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 0, 255, 255" />
+        </param_color>
+      </param>
+
+    </layer>
 
   </layer_set>
 
@@ -10201,7 +10319,65 @@ render_pass="bump">
       </param>
 
     </layer>
+    <layer
+     name="upper_universal_tattoo">
+      <texture
+         local_texture="upper_universal_tattoo" />
+      <param
+       id="1232"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_upper_universal_red"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="255, 0, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1233"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_upper_universal_green"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 255, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1234"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_upper_universal_blue"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 0, 255, 255" />
+        </param_color>
+      </param>
 
+    </layer>
 
     <layer
      name="upper_undershirt bump"
@@ -11453,7 +11629,65 @@ render_pass="bump">
       </param>
 
     </layer>
+    <layer
+    name="lower_universal_tattoo">
+      <texture
+         local_texture="lower_universal_tattoo" />
+      <param
+       id="1235"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_lower_universal_red"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="255, 0, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1236"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_lower_universal_green"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 255, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1237"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_lower_universal_blue"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
 
+          <value
+           color="0, 0, 255, 255" />
+        </param_color>
+      </param>
+
+    </layer>
     <layer
      name="lower_underpants bump"
      render_pass="bump"
@@ -12235,6 +12469,66 @@ render_pass="bump">
       <texture
          local_texture="eyes_alpha" />
     </layer>
+    <layer
+       name="eyes_tattoo">
+      <texture
+         local_texture="eyes_tattoo" />
+      <param
+       id="924"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_eyes_red"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="255, 0, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="925"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_eyes_green"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 255, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="926"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_eyes_blue"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 0, 255, 255" />
+        </param_color>
+      </param>
+
+    </layer>
+
 
   </layer_set>
 
@@ -12395,25 +12689,466 @@ render_pass="bump">
       </param>
 
       <param
-       id="862"
-       group="0"
-       wearable="skirt"
-       edit_group="skirt"
-       edit_group_order="7"
-       name="Slit Right"
-       label_min="Open Right"
-       label_max="Closed Right"
+       id="862"
+       group="0"
+       wearable="skirt"
+       edit_group="skirt"
+       edit_group_order="7"
+       name="Slit Right"
+       label_min="Open Right"
+       label_max="Closed Right"
+       value_min="0"
+       value_max="1"
+       value_default="1"
+       camera_distance="1.3"
+       camera_elevation="-.5"
+       camera_angle="-30">
+        <param_alpha
+         tga_file="skirt_slit_right_alpha.tga"
+         multiply_blend="true"
+         domain="0" />
+      </param>
+    </layer>
+    <layer
+       name="skirt_tattoo">
+      <texture
+         local_texture="skirt_tattoo" />
+      <param
+       id="1208"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_skirt_red"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="255, 0, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1209"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_skirt_green"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 255, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1210"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_skirt_blue"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 0, 255, 255" />
+        </param_color>
+      </param>
+
+    </layer>
+
+  </layer_set>
+
+  <!-- =========================================================== -->
+  <layer_set
+   body_region="leftarm"
+   width="512"
+   height="512"
+   clear_alpha="false">
+	  <layer
+     name="base"
+	 write_all_channels="true"
+	 fixed_color = "128,128,128,255">
+		  <texture
+		   tga_file="aux_base.tga" />
+	  </layer>
+	  
+    <layer
+       name="leftarm_tattoo">
+      <texture
+         local_texture="leftarm_tattoo" />
+      <param
+       id="1214"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_leftarm_red"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="255, 0, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1215"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_leftarm_green"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 255, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1216"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_leftarm_blue"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 0, 255, 255" />
+        </param_color>
+      </param>
+
+    </layer>
+
+  </layer_set>
+
+  <!-- =========================================================== -->
+  <layer_set
+   body_region="leftleg"
+   width="512"
+   height="512"
+   clear_alpha="false">
+	  <layer
+     name="base"
+	 write_all_channels="true"
+	 fixed_color = "128,128,128,255">
+		  <texture
+		   tga_file="aux_base.tga" />
+	  </layer>
+    <layer
+       name="leftleg_tattoo">
+      <texture
+         local_texture="leftleg_tattoo" />
+      <param
+       id="1217"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_leftleg_red"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="255, 0, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1218"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_leftleg_green"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 255, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1219"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_leftleg_blue"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 0, 255, 255" />
+        </param_color>
+      </param>
+
+    </layer>
+
+  </layer_set>
+
+  <!-- =========================================================== -->
+  <layer_set
+   body_region="aux1"
+   width="512"
+   height="512"
+   clear_alpha="false">
+
+	  <layer
+     name="base"
+	 write_all_channels="true"
+	 fixed_color = "128,128,128,255">
+		  <texture
+		   tga_file="aux_base.tga" />
+	  </layer>
+	  
+    <layer
+       name="aux1_tattoo">
+      <texture
+         local_texture="aux1_tattoo" />
+      <param
+       id="1220"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_aux1_red"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="255, 0, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1221"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_aux1_green"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 255, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1222"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_aux1_blue"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 0, 255, 255" />
+        </param_color>
+      </param>
+
+    </layer>
+
+  </layer_set>
+
+  <!-- =========================================================== -->
+  <layer_set
+   body_region="aux2"
+   width="512"
+   height="512"
+   clear_alpha="false">
+
+	  <layer
+     name="base"
+	 write_all_channels="true"
+	 fixed_color = "128,128,128,255">
+		  <texture
+		   tga_file="aux_base.tga" />
+	  </layer>
+	  
+    <layer
+       name="aux2_tattoo">
+      <texture
+         local_texture="aux2_tattoo" />
+      <param
+       id="1223"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_aux2_red"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="255, 0, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1224"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_aux2_green"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 255, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1225"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_aux2_blue"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 0, 255, 255" />
+        </param_color>
+      </param>
+
+    </layer>
+
+  </layer_set>
+
+  <!-- =========================================================== -->
+  <layer_set
+   body_region="aux3"
+   width="512"
+   height="512"
+   clear_alpha="false">
+
+	  <layer
+     name="base"
+	 write_all_channels="true"
+	 fixed_color = "128,128,128,255">
+		  <texture
+		   tga_file="aux_base.tga" />
+	  </layer>
+	  
+    <layer
+       name="aux3_tattoo">
+      <texture
+         local_texture="aux3_tattoo" />
+      <param
+       id="1226"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_aux3_red"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="255, 0, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1227"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_aux3_green"
+       value_min="0"
+       value_max="1"
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 255, 0, 255" />
+        </param_color>
+      </param>
+
+      <param
+       id="1228"
+       group="1"
+       edit_group="colorpicker_driven"
+       wearable="universal"
+       name="tattoo_aux3_blue"
        value_min="0"
        value_max="1"
-       value_default="1"
-       camera_distance="1.3"
-       camera_elevation="-.5"
-       camera_angle="-30">
-        <param_alpha
-         tga_file="skirt_slit_right_alpha.tga"
-         multiply_blend="true"
-         domain="0" />
+       value_default="1">
+        <param_color>
+          <value
+           color="0, 0, 0, 255" />
+
+          <value
+           color="0, 0, 255, 255" />
+        </param_color>
       </param>
+
     </layer>
 
   </layer_set>
@@ -15934,7 +16669,277 @@ render_pass="bump">
       </param_driver>
     </param>
 
+    <param
+     id="1238"
+     group="2"
+     wearable="universal"
+     edit_group="colorpicker"
+     name="tattoo_universal_red"
+     value_min="0"
+     value_max="1"
+     value_default="1">
+      <param_driver>
+        <driven
+         id="1229"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1232"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1235"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1208"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1211"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="924"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1214"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1217"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1220"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1223"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1226"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+        
+      </param_driver>
+    </param>
+
+    <param
+     id="1239"
+     group="2"
+     wearable="universal"
+     edit_group="colorpicker"
+     name="tattoo_universal_green"
+     value_min="0"
+     value_max="1"
+     value_default="1">
+      <param_driver>
+        <driven
+         id="1230"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1233"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1236"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1209"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1212"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="925"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1215"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1218"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1221"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1224"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1227"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+      </param_driver>
+    </param>
+
+    <param
+     id="1240"
+     group="2"
+     wearable="universal"
+     edit_group="colorpicker"
+     name="tattoo_universal_blue"
+     value_min="0"
+     value_max="1"
+     value_default="1">
+      <param_driver>
+        <driven
+         id="1231"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1234"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1237"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1210"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1213"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="926"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1216"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1219"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1222"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1225"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+        <driven
+         id="1228"
+         min1="0"
+         max1="1"
+         max2="1"
+         min2="1" />
+
+      </param_driver>
+    </param>
   <!-- ==PHYSICS PARAMETERS======================================= -->
+    
 
    <param
      id="1100"
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index d3693fbbd4e9c6b8a4544a58f672f76dd9e3e545..483cb819c15dc9ff2fae6910a43634d209d016de 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -24,6 +24,7 @@
  * $/LicenseInfo$
  */
 
+
 #include "llviewerprecompiledheaders.h"
 
 #include "llagent.h" 
@@ -4715,10 +4716,12 @@ LLTeleportRequestViaLocation::LLTeleportRequestViaLocation(const LLVector3d &pPo
 	: LLTeleportRequest(),
 	mPosGlobal(pPosGlobal)
 {
+    LL_INFOS("Teleport") << "LLTeleportRequestViaLocation created" << LL_ENDL;
 }
 
 LLTeleportRequestViaLocation::~LLTeleportRequestViaLocation()
 {
+    LL_INFOS("Teleport") << "~LLTeleportRequestViaLocation" << LL_ENDL;
 }
 
 bool LLTeleportRequestViaLocation::canRestartTeleport()
@@ -4751,6 +4754,7 @@ LLTeleportRequestViaLocationLookAt::LLTeleportRequestViaLocationLookAt(const LLV
 
 LLTeleportRequestViaLocationLookAt::~LLTeleportRequestViaLocationLookAt()
 {
+    LL_INFOS("Teleport") << "~LLTeleportRequestViaLocationLookAt" << LL_ENDL;
 }
 
 bool LLTeleportRequestViaLocationLookAt::canRestartTeleport()
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 2b865a1ae2118265c215d6dbe09536118a38d94f..b9fd4177c1368cff7d9c37f0ccf987ac836fb523 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -1536,6 +1536,12 @@ void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, con
 {
 	if (type == LLWearableType::WT_INVALID || type == LLWearableType::WT_NONE) return;
 
+	if (type == LLWearableType::WT_UNIVERSAL && !gAgent.getRegion()->bakesOnMeshEnabled())
+	{
+		LL_WARNS("Inventory") << "Can't create WT_UNIVERSAL type " << LL_ENDL;
+		return;
+	}
+
 	LLViewerWearable* wearable = LLWearableList::instance().createNewWearable(type, gAgentAvatarp);
 	LLAssetType::EType asset_type = wearable->getAssetType();
 	LLPointer<LLInventoryCallback> cb;
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index f9b4df679bffc003050f4b9d9f2402a995d3fea1..1e8c57ac6ad422746216af8d38b2a121b529eb6a 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -125,7 +125,7 @@ BOOL LLViewerDynamicTexture::render()
 //-----------------------------------------------------------------------------
 void LLViewerDynamicTexture::preRender(BOOL clear_depth)
 {
-	//only images up to 512x512 are supported
+	//only images up to 1024*1024 are supported
 	llassert(mFullHeight <= 512);
 	llassert(mFullWidth <= 512);
 
diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp
index 323d19b68a7101f30c0fa957bf9370ab9a082977..3bf5117c268c6f122c659e9154dc565bf90e41a9 100644
--- a/indra/newview/llinventoryicon.cpp
+++ b/indra/newview/llinventoryicon.cpp
@@ -84,6 +84,7 @@ LLIconDictionary::LLIconDictionary()
 	addEntry(LLInventoryType::ICONNAME_CLOTHING_SKIRT, 			new IconEntry("Inv_Skirt"));
 	addEntry(LLInventoryType::ICONNAME_CLOTHING_ALPHA, 			new IconEntry("Inv_Alpha"));
 	addEntry(LLInventoryType::ICONNAME_CLOTHING_TATTOO, 		new IconEntry("Inv_Tattoo"));
+	addEntry(LLInventoryType::ICONNAME_CLOTHING_UNIVERSAL,      new IconEntry("Inv_Universal"));
 	addEntry(LLInventoryType::ICONNAME_ANIMATION, 				new IconEntry("Inv_Animation"));
 	addEntry(LLInventoryType::ICONNAME_GESTURE, 				new IconEntry("Inv_Gesture"));
 
@@ -173,14 +174,8 @@ const std::string& LLInventoryIcon::getIconName(LLAssetType::EType asset_type,
 			break;
 		case LLAssetType::AT_MESH:
 			idx = LLInventoryType::ICONNAME_MESH;
-            break;
-        case LLAssetType::AT_SETTINGS:
-            // TODO: distinguish between Sky and Water settings.
-            idx = assignSettingsIcon(misc_flag);
-            break;
 		case LLAssetType::AT_UNKNOWN:
 			idx = LLInventoryType::ICONNAME_UNKNOWN;
-			break;
 		default:
 			break;
 	}
@@ -200,9 +195,3 @@ LLInventoryType::EIconName LLInventoryIcon::assignWearableIcon(U32 misc_flag)
 	const LLWearableType::EType wearable_type = LLWearableType::inventoryFlagsToWearableType(misc_flag);
 	return LLWearableType::getIconName(wearable_type);
 }
-
-LLInventoryType::EIconName LLInventoryIcon::assignSettingsIcon(U32 misc_flag)
-{
-    LLSettingsType::type_e settings_type = LLSettingsType::fromInventoryFlags(misc_flag);
-    return LLSettingsType::getIconName(settings_type);
-}
diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp
index 47b6da708c6efbc32d9b2b694fa5b0f150ac7ad2..871374ebf1580e9c62b6cc584f3c22b1b6966ff8 100644
--- a/indra/newview/lllocalbitmaps.cpp
+++ b/indra/newview/lllocalbitmaps.cpp
@@ -381,6 +381,7 @@ void LLLocalBitmap::replaceIDs(LLUUID old_id, LLUUID new_id)
 	updateUserLayers(old_id, new_id, LLWearableType::WT_SKIRT);
 	updateUserLayers(old_id, new_id, LLWearableType::WT_SOCKS);
 	updateUserLayers(old_id, new_id, LLWearableType::WT_TATTOO);
+	updateUserLayers(old_id, new_id, LLWearableType::WT_UNIVERSAL);
 	updateUserLayers(old_id, new_id, LLWearableType::WT_UNDERPANTS);
 	updateUserLayers(old_id, new_id, LLWearableType::WT_UNDERSHIRT);
 }
@@ -512,7 +513,7 @@ void LLLocalBitmap::updateUserVolumes(LLUUID old_id, LLUUID new_id, U32 channel)
 	{
 		LLVOVolume* volobjp = (*old_texture->getVolumeList(channel))[volume_iter];
 		switch (channel)
-		{
+	{
 			case LLRender::LIGHT_TEX:
 			{
 				if (volobjp->getLightTextureID() == old_id)
@@ -526,19 +527,19 @@ void LLLocalBitmap::updateUserVolumes(LLUUID old_id, LLUUID new_id, U32 channel)
 				LLViewerObject* object = (LLViewerObject*)volobjp;
 
 				if (object)
-				{
-					if (object->isSculpted() && object->getVolume() &&
-						object->getVolume()->getParams().getSculptID() == old_id)
-					{
-						LLSculptParams* old_params = (LLSculptParams*)object->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
-						LLSculptParams new_params(*old_params);
-						new_params.setSculptTexture(new_id, (*old_params).getSculptType());
-						object->setParameterEntry(LLNetworkData::PARAMS_SCULPT, new_params, TRUE);
-					}
-				}
+		{
+			if (object->isSculpted() && object->getVolume() &&
+				object->getVolume()->getParams().getSculptID() == old_id)
+			{
+				LLSculptParams* old_params = (LLSculptParams*)object->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+				LLSculptParams new_params(*old_params);
+				new_params.setSculptTexture(new_id, (*old_params).getSculptType());
+				object->setParameterEntry(LLNetworkData::PARAMS_SCULPT, new_params, TRUE);
 			}
 		}
 	}
+		}
+	}
 }
 
 void LLLocalBitmap::updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableType::EType type)
@@ -746,7 +747,7 @@ LLAvatarAppearanceDefines::ETextureIndex LLLocalBitmap::getTexIndex(
 
 		case LLWearableType::WT_TATTOO:
 		{
-			switch(baked_texind)
+			switch (baked_texind)
 			{
 				case LLAvatarAppearanceDefines::BAKED_HEAD:
 				{
@@ -764,6 +765,75 @@ LLAvatarAppearanceDefines::ETextureIndex LLLocalBitmap::getTexIndex(
 					result = LLAvatarAppearanceDefines::TEX_UPPER_TATTOO;
 					break;
 				}
+				default:
+				{
+					break;
+				}
+			}
+			break;
+			
+		}
+		case LLWearableType::WT_UNIVERSAL:
+		{
+			switch (baked_texind)
+			{
+				
+				case LLAvatarAppearanceDefines::BAKED_SKIRT:
+				{
+					result = LLAvatarAppearanceDefines::TEX_SKIRT_TATTOO;
+					break;
+				}
+				case LLAvatarAppearanceDefines::BAKED_EYES:
+				{
+					result = LLAvatarAppearanceDefines::TEX_EYES_TATTOO;
+					break;
+				}
+				case LLAvatarAppearanceDefines::BAKED_HAIR:
+				{
+					result = LLAvatarAppearanceDefines::TEX_HAIR_TATTOO;
+					break;
+				}
+				case LLAvatarAppearanceDefines::BAKED_LEFT_ARM:
+				{
+					result = LLAvatarAppearanceDefines::TEX_LEFT_ARM_TATTOO;
+					break;
+				}
+				case LLAvatarAppearanceDefines::BAKED_LEFT_LEG:
+				{
+					result = LLAvatarAppearanceDefines::TEX_LEFT_LEG_TATTOO;
+					break;
+				}
+				case LLAvatarAppearanceDefines::BAKED_AUX1:
+				{
+					result = LLAvatarAppearanceDefines::TEX_AUX1_TATTOO;
+					break;
+				}
+				case LLAvatarAppearanceDefines::BAKED_AUX2:
+				{
+					result = LLAvatarAppearanceDefines::TEX_AUX2_TATTOO;
+					break;
+				}
+				case LLAvatarAppearanceDefines::BAKED_AUX3:
+				{
+					result = LLAvatarAppearanceDefines::TEX_AUX3_TATTOO;
+					break;
+				}
+				case LLAvatarAppearanceDefines::BAKED_UPPER:
+				{
+					result = LLAvatarAppearanceDefines::TEX_UPPER_UNIVERSAL_TATTOO;
+					break;
+				}
+				case LLAvatarAppearanceDefines::BAKED_LOWER:
+				{
+					result = LLAvatarAppearanceDefines::TEX_LOWER_UNIVERSAL_TATTOO;
+					break;
+				}
+				case LLAvatarAppearanceDefines::BAKED_HEAD:
+				{
+					result = LLAvatarAppearanceDefines::TEX_HEAD_UNIVERSAL_TATTOO;
+					break;
+				}
+
 
 				default:
 				{
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index 3a8378f8dfd00dda5bb7cb5069298f22ee842d03..6573be0aafcb4a5f48677acedc6266211778a283 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -97,6 +97,7 @@ enum ESubpart {
         SUBPART_SKIRT,
         SUBPART_ALPHA,
         SUBPART_TATTOO,
+		SUBPART_UNIVERSAL,
         SUBPART_PHYSICS_BREASTS_UPDOWN,
         SUBPART_PHYSICS_BREASTS_INOUT,
         SUBPART_PHYSICS_BREASTS_LEFTRIGHT,
@@ -241,7 +242,8 @@ LLEditWearableDictionary::Wearables::Wearables()
         addEntry(LLWearableType::WT_SKIRT,              new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text", texture_vec_t{TEX_SKIRT}, texture_vec_t{TEX_SKIRT}, subpart_vec_t{SUBPART_SKIRT}));
         addEntry(LLWearableType::WT_ALPHA,              new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text", texture_vec_t(), texture_vec_t{TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA}, subpart_vec_t{SUBPART_ALPHA}));
         addEntry(LLWearableType::WT_TATTOO,     new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text", texture_vec_t{TEX_HEAD_TATTOO}, texture_vec_t{TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO}, subpart_vec_t{SUBPART_TATTOO}));
-        addEntry(LLWearableType::WT_PHYSICS,    new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text", texture_vec_t(), texture_vec_t(), subpart_vec_t{SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BREASTS_LEFTRIGHT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, SUBPART_PHYSICS_BUTT_LEFTRIGHT, SUBPART_PHYSICS_ADVANCED}));
+		addEntry(LLWearableType::WT_UNIVERSAL, new WearableEntry(LLWearableType::WT_UNIVERSAL, "edit_universal_title", "universal_desc_text", texture_vec_t{ TEX_HEAD_UNIVERSAL_TATTOO }, texture_vec_t{ TEX_HEAD_UNIVERSAL_TATTOO, TEX_UPPER_UNIVERSAL_TATTOO, TEX_LOWER_UNIVERSAL_TATTOO, TEX_SKIRT_TATTOO, TEX_HAIR_TATTOO, TEX_EYES_TATTOO, TEX_LEFT_ARM_TATTOO, TEX_LEFT_LEG_TATTOO, TEX_AUX1_TATTOO, TEX_AUX2_TATTOO, TEX_AUX3_TATTOO }, subpart_vec_t{ SUBPART_UNIVERSAL }));
+		addEntry(LLWearableType::WT_PHYSICS,    new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text", texture_vec_t(), texture_vec_t(), subpart_vec_t{SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BREASTS_LEFTRIGHT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, SUBPART_PHYSICS_BUTT_LEFTRIGHT, SUBPART_PHYSICS_ADVANCED}));
 }
 
 LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType type,
@@ -294,7 +296,9 @@ LLEditWearableDictionary::Subparts::Subparts()
         addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
         addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
         addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
-        addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE));
+		addEntry(SUBPART_UNIVERSAL, new SubpartEntry(SUBPART_UNIVERSAL, "mPelvis", "universal", "universal_main_param_list", "universal_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f), SEX_BOTH));
+
+		addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE));
         addEntry(SUBPART_PHYSICS_BREASTS_INOUT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_INOUT, "mTorso", "physics_breasts_inout", "physics_breasts_inout_param_list", "physics_breasts_inout_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE));
         addEntry(SUBPART_PHYSICS_BREASTS_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_LEFTRIGHT, "mTorso", "physics_breasts_leftright", "physics_breasts_leftright_param_list", "physics_breasts_leftright_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE));
         addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown", "physics_belly_updown_param_list", "physics_belly_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
@@ -335,6 +339,7 @@ LLEditWearableDictionary::ColorSwatchCtrls::ColorSwatchCtrls()
         addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Color/Tint" ));
         addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Color/Tint" ));
         addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry(TEX_HEAD_TATTOO, "Color/Tint" ));
+		addEntry (TEX_HEAD_UNIVERSAL_TATTOO, new PickerControlEntry(TEX_HEAD_UNIVERSAL_TATTOO, "Color/Tint"));
 }
 
 LLEditWearableDictionary::TextureCtrls::TextureCtrls()
@@ -362,6 +367,17 @@ LLEditWearableDictionary::TextureCtrls::TextureCtrls()
         addEntry ( TEX_LOWER_TATTOO, new PickerControlEntry (TEX_LOWER_TATTOO, "Lower Tattoo", LLUUID::null, TRUE ));
         addEntry ( TEX_UPPER_TATTOO, new PickerControlEntry (TEX_UPPER_TATTOO, "Upper Tattoo", LLUUID::null, TRUE ));
         addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry (TEX_HEAD_TATTOO, "Head Tattoo", LLUUID::null, TRUE ));
+		addEntry ( TEX_LOWER_UNIVERSAL_TATTOO, new PickerControlEntry( TEX_LOWER_UNIVERSAL_TATTOO, "Lower Universal Tattoo", LLUUID::null, TRUE));
+		addEntry ( TEX_UPPER_UNIVERSAL_TATTOO, new PickerControlEntry( TEX_UPPER_UNIVERSAL_TATTOO, "Upper Universal Tattoo", LLUUID::null, TRUE));
+		addEntry ( TEX_HEAD_UNIVERSAL_TATTOO, new PickerControlEntry( TEX_HEAD_UNIVERSAL_TATTOO, "Head Universal Tattoo", LLUUID::null, TRUE));
+		addEntry ( TEX_SKIRT_TATTOO, new PickerControlEntry(TEX_SKIRT_TATTOO, "Skirt Tattoo", LLUUID::null, TRUE));
+		addEntry ( TEX_HAIR_TATTOO, new PickerControlEntry(TEX_HAIR_TATTOO, "Hair Tattoo", LLUUID::null, TRUE));
+		addEntry ( TEX_EYES_TATTOO, new PickerControlEntry(TEX_EYES_TATTOO, "Eyes Tattoo", LLUUID::null, TRUE));
+		addEntry (TEX_LEFT_ARM_TATTOO, new PickerControlEntry(TEX_LEFT_ARM_TATTOO, "Left Arm Tattoo", LLUUID::null, TRUE));
+		addEntry (TEX_LEFT_LEG_TATTOO, new PickerControlEntry(TEX_LEFT_LEG_TATTOO, "Left Leg Tattoo", LLUUID::null, TRUE));
+		addEntry (TEX_AUX1_TATTOO, new PickerControlEntry(TEX_AUX1_TATTOO, "Aux1 Tattoo", LLUUID::null, TRUE));
+		addEntry (TEX_AUX2_TATTOO, new PickerControlEntry(TEX_AUX2_TATTOO, "Aux2 Tattoo", LLUUID::null, TRUE));
+		addEntry (TEX_AUX3_TATTOO, new PickerControlEntry(TEX_AUX3_TATTOO, "Aux3 Tattoo", LLUUID::null, TRUE));
 }
 
 LLEditWearableDictionary::PickerControlEntry::PickerControlEntry(ETextureIndex tex_index,
@@ -739,6 +755,7 @@ BOOL LLPanelEditWearable::postBuild()
         mPanelSkirt = getChild<LLPanel>("edit_skirt_panel");
         mPanelAlpha = getChild<LLPanel>("edit_alpha_panel");
         mPanelTattoo = getChild<LLPanel>("edit_tattoo_panel");
+		mPanelUniversal = getChild<LLPanel>("edit_universal_panel");
         mPanelPhysics = getChild<LLPanel>("edit_physics_panel");
 
         mTxtAvatarHeight = mPanelShape->getChild<LLTextBox>("avatar_height");
@@ -1442,6 +1459,10 @@ LLPanel* LLPanelEditWearable::getPanel(LLWearableType::EType type)
                 case LLWearableType::WT_TATTOO:
                         return mPanelTattoo;
                         break;
+				
+				case LLWearableType::WT_UNIVERSAL:
+					return mPanelUniversal;
+					break;
 
                 case LLWearableType::WT_PHYSICS:
                         return mPanelPhysics;
diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h
index 81acc31863d42b356d1ba8f5942ab47e348baf28..43d6a3595fdc7eaca0e2f6934cf1b771c35b33fe 100644
--- a/indra/newview/llpaneleditwearable.h
+++ b/indra/newview/llpaneleditwearable.h
@@ -167,6 +167,7 @@ class LLPanelEditWearable : public LLPanel
 	LLPanel *mPanelSkirt;
 	LLPanel *mPanelAlpha;
 	LLPanel *mPanelTattoo;
+	LLPanel *mPanelUniversal;
 	LLPanel *mPanelPhysics;
 
 	typedef std::map<std::string, LLAvatarAppearanceDefines::ETextureIndex> string_texture_index_map_t;
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 8b31c5aa9041241f3677c7666d383a70190e1fa4..c686aab82178f50b4a3794e612bf4b96864ade80 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -1014,43 +1014,77 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 			}
 
 			updateAlphaControls();
-			
-				if(texture_ctrl)
+
+			if (texture_ctrl)
 				{
 				if (identical_diffuse)
 				{
-					texture_ctrl->setTentative( FALSE );
-					texture_ctrl->setEnabled( editable );
-					texture_ctrl->setImageAssetID( id );
+					texture_ctrl->setTentative(FALSE);
+					texture_ctrl->setEnabled(editable);
+					texture_ctrl->setImageAssetID(id);
 					getChildView("combobox alphamode")->setEnabled(editable && mIsAlpha && transparency <= 0.f);
 					getChildView("label alphamode")->setEnabled(editable && mIsAlpha);
 					getChildView("maskcutoff")->setEnabled(editable && mIsAlpha);
 					getChildView("label maskcutoff")->setEnabled(editable && mIsAlpha);
+
+					bool allAttachments = true;
+					for (LLObjectSelection::iterator iter = LLSelectMgr::getInstance()->getSelection()->begin();
+						iter != LLSelectMgr::getInstance()->getSelection()->end();iter++)
+					{
+						LLSelectNode* node = *iter;
+						LLViewerObject* object = node->getObject();
+						if (!object->isAttachment())
+						{
+							allAttachments = false;
+							break;
+						}
+					}
+
+					texture_ctrl->setBakeTextureEnabled(allAttachments);
+					
 				}
 				else if (id.isNull())
 					{
 						// None selected
-						texture_ctrl->setTentative( FALSE );
-						texture_ctrl->setEnabled( FALSE );
-						texture_ctrl->setImageAssetID( LLUUID::null );
-					getChildView("combobox alphamode")->setEnabled( FALSE );
-					getChildView("label alphamode")->setEnabled( FALSE );
-					getChildView("maskcutoff")->setEnabled( FALSE);
-					getChildView("label maskcutoff")->setEnabled( FALSE );
+					texture_ctrl->setTentative(FALSE);
+					texture_ctrl->setEnabled(FALSE);
+					texture_ctrl->setImageAssetID(LLUUID::null);
+					getChildView("combobox alphamode")->setEnabled(FALSE);
+					getChildView("label alphamode")->setEnabled(FALSE);
+					getChildView("maskcutoff")->setEnabled(FALSE);
+					getChildView("label maskcutoff")->setEnabled(FALSE);
+
+					texture_ctrl->setBakeTextureEnabled(false);
 					}
 					else
 					{
 						// Tentative: multiple selected with different textures
-						texture_ctrl->setTentative( TRUE );
-						texture_ctrl->setEnabled( editable );
-						texture_ctrl->setImageAssetID( id );
+					texture_ctrl->setTentative(TRUE);
+					texture_ctrl->setEnabled(editable);
+					texture_ctrl->setImageAssetID(id);
 					getChildView("combobox alphamode")->setEnabled(editable && mIsAlpha && transparency <= 0.f);
 					getChildView("label alphamode")->setEnabled(editable && mIsAlpha);
 					getChildView("maskcutoff")->setEnabled(editable && mIsAlpha);
 					getChildView("label maskcutoff")->setEnabled(editable && mIsAlpha);
+
+					bool allAttachments = true;
+					for (LLObjectSelection::iterator iter = LLSelectMgr::getInstance()->getSelection()->begin();
+						iter != LLSelectMgr::getInstance()->getSelection()->end();iter++)
+					{
+						LLSelectNode* node = *iter;
+						LLViewerObject* object = node->getObject();
+						if (!object->isAttachment())
+						{
+							allAttachments = false;
+							break;
 				}
 			}
 
+					texture_ctrl->setBakeTextureEnabled(allAttachments);
+				}
+				
+			}
+
 			if (shinytexture_ctrl)
 			{
 				shinytexture_ctrl->setTentative( !identical_spec );
@@ -2640,6 +2674,16 @@ void LLPanelFace::LLSelectedTE::getTexId(LLUUID& id, bool& identical)
 	{
 		LLUUID get(LLViewerObject* object, S32 te_index)
 		{
+			LLTextureEntry *te = object->getTE(te_index);
+			if (te)
+			{
+				if ((te->getID() == IMG_USE_BAKED_EYES) || (te->getID() == IMG_USE_BAKED_HAIR) || (te->getID() == IMG_USE_BAKED_HEAD) || (te->getID() == IMG_USE_BAKED_LOWER) || (te->getID() == IMG_USE_BAKED_SKIRT) || (te->getID() == IMG_USE_BAKED_UPPER)
+					|| (te->getID() == IMG_USE_BAKED_LEFTARM) || (te->getID() == IMG_USE_BAKED_LEFTLEG) || (te->getID() == IMG_USE_BAKED_AUX1) || (te->getID() == IMG_USE_BAKED_AUX2) || (te->getID() == IMG_USE_BAKED_AUX3))
+				{
+					return te->getID();
+				}
+			}
+
 			LLUUID id;
 			LLViewerTexture* image = object->getTEImage(te_index);
 			if (image)
@@ -2649,7 +2693,6 @@ void LLPanelFace::LLSelectedTE::getTexId(LLUUID& id, bool& identical)
 
 			if (!id.isNull() && LLViewerMedia::textureHasMedia(id))
 			{
-				LLTextureEntry *te = object->getTE(te_index);
 				if (te)
 				{
 					LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID(), TEX_LIST_STANDARD) : NULL;
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index c5bae9c52ea28bfee1ca653e6f958cb69fc970c6..1d87aa6f5d5a5ccd82e467a30055725de10515e6 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -467,6 +467,7 @@ BOOL LLPanelOutfitEdit::postBuild()
 	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("alpha"), new LLFindActualWearablesOfType(LLWearableType::WT_ALPHA)));
 	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("tattoo"), new LLFindActualWearablesOfType(LLWearableType::WT_TATTOO)));
 	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("physics"), new LLFindActualWearablesOfType(LLWearableType::WT_PHYSICS)));
+	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("universal"), new LLFindActualWearablesOfType(LLWearableType::WT_UNIVERSAL)));
 
 	mCurrentOutfitName = getChild<LLTextBox>("curr_outfit_name"); 
 	mStatus = getChild<LLTextBox>("status");
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
index 2cc8b65001bc2f8a60cc28c548d8d40fb46136e2..3c6efac0e7be200d437c61ef957ec59da1386cc1 100644
--- a/indra/newview/llpaneloutfitedit.h
+++ b/indra/newview/llpaneloutfitedit.h
@@ -98,6 +98,7 @@ class LLPanelOutfitEdit : public LLPanel
 		LVIT_ALPHA,
 		LVIT_TATTOO,
 		LVIT_PHYSICS,
+		LVIT_UNIVERSAL,
 		NUM_LIST_VIEW_ITEM_TYPES
 	} EListViewItemType; 
 
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index 49934415080b2c29270ecc22bb61baf3544fd509..eba12b405eb24b9fbe4b0e4fbed40c7d3d00dcfe 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -383,6 +383,29 @@ void LLPanelVolume::getState( )
         }
     }
     getChildView("Animated Mesh Checkbox Ctrl")->setEnabled(enabled_animated_object_box);
+	
+	//refresh any bakes
+	if (root_volobjp)
+	{
+		root_volobjp->refreshBakeTexture();
+
+		LLViewerObject::const_child_list_t& child_list = root_volobjp->getChildren();
+		for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+			iter != child_list.end(); ++iter)
+		{
+			LLViewerObject* objectp = *iter;
+			if (objectp)
+			{
+				objectp->refreshBakeTexture();
+			}
+		}
+
+		if (gAgentAvatarp)
+		{
+			gAgentAvatarp->updateMeshVisibility();
+		}
+	}
+	
 
 	// Flexible properties
 	BOOL is_flexible = volobjp && volobjp->isFlexible();
@@ -953,6 +976,28 @@ void LLPanelVolume::onCommitAnimatedMeshCheckbox(LLUICtrl *, void*)
     {
         volobjp->setExtendedMeshFlags(new_flags);
     }
+
+	//refresh any bakes
+	if (volobjp)
+	{
+		volobjp->refreshBakeTexture();
+
+		LLViewerObject::const_child_list_t& child_list = volobjp->getChildren();
+		for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+			iter != child_list.end(); ++iter)
+		{
+			LLViewerObject* objectp = *iter;
+			if (objectp)
+			{
+				objectp->refreshBakeTexture();
+			}
+		}
+
+		if (gAgentAvatarp)
+		{
+			gAgentAvatarp->updateMeshVisibility();
+		}
+	}
 }
 
 void LLPanelVolume::onCommitIsFlexible(LLUICtrl *, void*)
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 74022cee01e5fbb7586203f1ceb83ef84156048b..816515426a1690cf0cdbf8274f853b73fb0343b5 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -96,6 +96,7 @@
 #include "llviewershadermgr.h"
 #include "llpanelface.h"
 #include "llglheaders.h"
+#include "llinventoryobserver.h"
 
 LLViewerObject* getSelectedParentObject(LLViewerObject *object) ;
 //
@@ -1656,6 +1657,7 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
 				// * Can just apply the texture and be done with it.
 				objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
 			}
+
 			return true;
 		}
 	};
@@ -1855,6 +1857,7 @@ BOOL LLSelectMgr::selectionRevertTextures()
 					else
 					{
 						object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
+
 					}
 				}
 			}
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 25c481cdf5a963cd2cf49033f2d58c3df032fcf8..801d0f0893c2806ce399ef99d1cb2e6716d5e775 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -32,6 +32,7 @@
 #include "llrender.h"
 #include "llagent.h"
 #include "llviewertexturelist.h"
+#include "llselectmgr.h"
 #include "llcheckboxctrl.h"
 #include "llcombobox.h"
 #include "llbutton.h"
@@ -70,6 +71,8 @@
 #include "lllocalbitmaps.h"
 #include "llerror.h"
 
+#include "llavatarappearancedefines.h"
+
 static const S32 LOCAL_TRACKING_ID_COLUMN = 1;
 
 //static const char CURRENT_IMAGE_NAME[] = "Current Texture";
@@ -114,7 +117,8 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
 	mOnFloaterCommitCallback(NULL),
 	mOnFloaterCloseCallback(NULL),
 	mSetImageAssetIDCallback(NULL),
-	mOnUpdateImageStatsCallback(NULL)
+	mOnUpdateImageStatsCallback(NULL),
+	mBakeTextureEnabled(FALSE)
 {
 	buildFromFile("floater_texture_ctrl.xml");
 	mCanApplyImmediately = can_apply_immediately;
@@ -132,26 +136,47 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
 		mNoCopyTextureSelected = FALSE;
 		mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
 		mImageAssetID = image_id; 
-		LLUUID item_id = findItemID(mImageAssetID, FALSE);
-		if (item_id.isNull())
+
+		if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID))
 		{
-			mInventoryPanel->getRootFolder()->clearSelection();
+			if ( mBakeTextureEnabled && mModeSelector->getSelectedIndex() != 2)
+			{
+				mModeSelector->setSelectedIndex(2, 0);
+				onModeSelect(0,this);
+			}
 		}
 		else
 		{
-			LLInventoryItem* itemp = gInventory.getItem(image_id);
-			if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
+			if (mModeSelector->getSelectedIndex() == 2)
 			{
-				// no copy texture
-				getChild<LLUICtrl>("apply_immediate_check")->setValue(FALSE);
-				mNoCopyTextureSelected = TRUE;
+				mModeSelector->setSelectedIndex(0, 0);
+				onModeSelect(0,this);
+			}
+			
+			LLUUID item_id = findItemID(mImageAssetID, FALSE);
+			if (item_id.isNull())
+			{
+				mInventoryPanel->getRootFolder()->clearSelection();
+			}
+			else
+			{
+				LLInventoryItem* itemp = gInventory.getItem(image_id);
+				if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
+				{
+					// no copy texture
+					getChild<LLUICtrl>("apply_immediate_check")->setValue(FALSE);
+					mNoCopyTextureSelected = TRUE;
+				}
 			}
-		}
 
-		if (set_selection)
-		{
-			mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
+			if (set_selection)
+			{
+				mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
+			}
 		}
+		
+
+		
 	}
 }
 
@@ -337,6 +362,10 @@ BOOL LLFloaterTexturePicker::postBuild()
 
 	mInventoryPanel = getChild<LLInventoryPanel>("inventory panel");
 
+	mModeSelector = getChild<LLRadioGroup>("mode_selection");
+	mModeSelector->setCommitCallback(onModeSelect, this);
+	mModeSelector->setSelectedIndex(0, 0);
+
 	if(mInventoryPanel)
 	{
 		U32 filter_types = 0x0;
@@ -368,10 +397,6 @@ BOOL LLFloaterTexturePicker::postBuild()
 		}
 	}
 
-	mModeSelector = getChild<LLRadioGroup>("mode_selection");
-	mModeSelector->setCommitCallback(onModeSelect, this);
-	mModeSelector->setSelectedIndex(0, 0);
-
 	childSetAction("l_add_btn", LLFloaterTexturePicker::onBtnAdd, this);
 	childSetAction("l_rem_btn", LLFloaterTexturePicker::onBtnRemove, this);
 	childSetAction("l_upl_btn", LLFloaterTexturePicker::onBtnUpload, this);
@@ -400,14 +425,72 @@ BOOL LLFloaterTexturePicker::postBuild()
 
 	LLToolPipette::getInstance()->setToolSelectCallback(boost::bind(&LLFloaterTexturePicker::onTextureSelect, this, _1));
 	
+	getChild<LLComboBox>("l_bake_use_texture_combo_box")->setCommitCallback(onBakeTextureSelect, this);
+	getChild<LLCheckBoxCtrl>("hide_base_mesh_region")->setCommitCallback(onHideBaseMeshRegionCheck, this);
+
+	setBakeTextureEnabled(FALSE);
 	return TRUE;
 }
 
 // virtual
 void LLFloaterTexturePicker::draw()
 {
-    static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f);
-    drawConeToOwner(mContextConeOpacity, max_opacity, mOwner);
+	if (mOwner)
+	{
+        static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f);
+        drawConeToOwner(mContextConeOpacity, max_opacity, mOwner);
+
+		// draw cone of context pointing back to texture swatch	
+		LLRect owner_rect;
+		mOwner->localRectToOtherView(mOwner->getLocalRect(), &owner_rect, this);
+		LLRect local_rect = getLocalRect();
+		if (gFocusMgr.childHasKeyboardFocus(this) && mOwner->isInVisibleChain() && mContextConeOpacity > 0.001f)
+		{
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+			LLGLEnable(GL_CULL_FACE);
+			gGL.begin(LLRender::QUADS);
+			{
+				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
+				gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop);
+				gGL.vertex2i(owner_rect.mRight, owner_rect.mTop);
+				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
+				gGL.vertex2i(local_rect.mRight, local_rect.mTop);
+				gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
+
+				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
+				gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
+				gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
+				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
+				gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom);
+				gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop);
+
+				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
+				gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
+				gGL.vertex2i(local_rect.mRight, local_rect.mTop);
+				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
+				gGL.vertex2i(owner_rect.mRight, owner_rect.mTop);
+				gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom);
+
+
+				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
+				gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
+				gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
+				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
+				gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom);
+				gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom);
+			}
+			gGL.end();
+		}
+	}
+
+	if (gFocusMgr.childHasMouseCapture(getDragHandle()))
+	{
+		mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME));
+	}
+	else
+	{
+		mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME));
+	}
 
 	updateImageStats();
 
@@ -423,7 +506,24 @@ void LLFloaterTexturePicker::draw()
 		mTexturep = NULL;
 		if(mImageAssetID.notNull())
 		{
-			mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID);
+			LLPointer<LLViewerFetchedTexture> texture = NULL;
+
+			if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID))
+			{
+				LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
+				if (obj)
+				{
+					LLViewerTexture* viewerTexture = obj->getBakedTextureForMagicId(mImageAssetID);
+					texture = viewerTexture ? dynamic_cast<LLViewerFetchedTexture*>(viewerTexture) : NULL;
+				}
+			}
+
+			if (texture.isNull())
+			{
+				texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID);
+			}
+
+			mTexturep = texture;
 			mTexturep->setBoostLevel(LLGLTexture::BOOST_PREVIEW);
 		}
 
@@ -717,10 +817,69 @@ void LLFloaterTexturePicker::onModeSelect(LLUICtrl* ctrl, void *userdata)
 	/*self->getChild<LLCheckBox>("show_folders_check")->setVisible(mode);
 	  no idea under which conditions the above is even shown, needs testing. */
 
-	self->getChild<LLButton>("l_add_btn")->setVisible(!mode);
-	self->getChild<LLButton>("l_rem_btn")->setVisible(!mode);
-	self->getChild<LLButton>("l_upl_btn")->setVisible(!mode);
-	self->getChild<LLScrollListCtrl>("l_name_list")->setVisible(!mode);
+	self->getChild<LLButton>("l_add_btn")->setVisible(mode == 1);
+	self->getChild<LLButton>("l_rem_btn")->setVisible(mode == 1);
+	self->getChild<LLButton>("l_upl_btn")->setVisible(mode == 1);
+	self->getChild<LLScrollListCtrl>("l_name_list")->setVisible(mode == 1);
+
+	self->getChild<LLComboBox>("l_bake_use_texture_combo_box")->setVisible(mode == 2);
+	self->getChild<LLCheckBoxCtrl>("hide_base_mesh_region")->setVisible(false);// mode == 2);
+
+	if (mode == 2)
+	{
+		self->stopUsingPipette();
+
+		S8 val = -1;
+
+		LLUUID imageID = self->mImageAssetID;
+		if (imageID == IMG_USE_BAKED_HEAD)
+		{
+			val = 0;
+		}
+		else if (imageID == IMG_USE_BAKED_UPPER)
+		{
+			val = 1;
+		}
+		else if (imageID == IMG_USE_BAKED_LOWER)
+		{
+			val = 2;
+		}
+		else if (imageID == IMG_USE_BAKED_EYES)
+		{
+			val = 3;
+		}
+		else if (imageID == IMG_USE_BAKED_SKIRT)
+		{
+			val = 4;
+		}
+		else if (imageID == IMG_USE_BAKED_HAIR)
+		{
+			val = 5;
+		}
+		else if (imageID == IMG_USE_BAKED_LEFTARM)
+		{
+			val = 6;
+		}
+		else if (imageID == IMG_USE_BAKED_LEFTLEG)
+		{
+			val = 7;
+		}
+		else if (imageID == IMG_USE_BAKED_AUX1)
+		{
+			val = 8;
+		}
+		else if (imageID == IMG_USE_BAKED_AUX2)
+		{
+			val = 9;
+		}
+		else if (imageID == IMG_USE_BAKED_AUX3)
+		{
+			val = 10;
+		}
+
+
+		self->getChild<LLComboBox>("l_bake_use_texture_combo_box")->setSelectedByValue(val, TRUE);
+	}
 }
 
 // static
@@ -841,6 +1000,86 @@ void LLFloaterTexturePicker::onApplyImmediateCheck(LLUICtrl* ctrl, void *user_da
 	picker->commitIfImmediateSet();
 }
 
+//static
+void LLFloaterTexturePicker::onBakeTextureSelect(LLUICtrl* ctrl, void *user_data)
+{
+	LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)user_data;
+	LLComboBox* combo_box = (LLComboBox*)ctrl;
+
+	S8 type = combo_box->getValue().asInteger();
+	
+	LLUUID imageID = self->mDefaultImageAssetID;
+	if (type == 0)
+	{
+		imageID = IMG_USE_BAKED_HEAD;
+	}
+	else if (type == 1)
+	{
+		imageID = IMG_USE_BAKED_UPPER;
+	}
+	else if (type == 2)
+	{
+		imageID = IMG_USE_BAKED_LOWER;
+	}
+	else if (type == 3)
+	{
+		imageID = IMG_USE_BAKED_EYES;
+	}
+	else if (type == 4)
+	{
+		imageID = IMG_USE_BAKED_SKIRT;
+	}
+	else if (type == 5)
+	{
+		imageID = IMG_USE_BAKED_HAIR;
+	}
+	else if (type == 6)
+	{
+		imageID = IMG_USE_BAKED_LEFTARM;
+	}
+	else if (type == 7)
+	{
+		imageID = IMG_USE_BAKED_LEFTLEG;
+	}
+	else if (type == 8)
+	{
+		imageID = IMG_USE_BAKED_AUX1;
+	}
+	else if (type == 9)
+	{
+		imageID = IMG_USE_BAKED_AUX2;
+	}
+	else if (type == 10)
+	{
+		imageID = IMG_USE_BAKED_AUX3;
+	}
+
+	self->setImageID(imageID);
+	self->mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
+
+	if (!self->mPreviewSettingChanged)
+	{
+		self->mCanPreview = gSavedSettings.getBOOL("TextureLivePreview");
+	}
+	else
+	{
+		self->mPreviewSettingChanged = false;
+	}
+
+	if (self->mCanPreview)
+	{
+		// only commit intentional selections, not implicit ones
+		self->commitIfImmediateSet();
+	}
+}
+
+//static
+void LLFloaterTexturePicker::onHideBaseMeshRegionCheck(LLUICtrl* ctrl, void *user_data)
+{
+	//LLFloaterTexturePicker* picker = (LLFloaterTexturePicker*)user_data;
+	//LLCheckBoxCtrl* check_box = (LLCheckBoxCtrl*)ctrl;
+}
+
 void LLFloaterTexturePicker::updateFilterPermMask()
 {
 	//mInventoryPanel->setFilterPermMask( getFilterPermMask() );  Commented out due to no-copy texture loss.
@@ -896,6 +1135,28 @@ void LLFloaterTexturePicker::setLocalTextureEnabled(BOOL enabled)
 	mModeSelector->setIndexEnabled(1,enabled);
 }
 
+void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled)
+{
+	BOOL changed = (enabled != mBakeTextureEnabled);
+
+	mBakeTextureEnabled = enabled;
+	mModeSelector->setIndexEnabled(2, enabled);
+
+	if (!mBakeTextureEnabled && (mModeSelector->getSelectedIndex() == 2))
+	{
+		mModeSelector->setSelectedIndex(0, 0);
+	}
+	
+	if (changed && mBakeTextureEnabled && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID))
+	{
+		if (mModeSelector->getSelectedIndex() != 2)
+		{
+			mModeSelector->setSelectedIndex(2, 0);
+		}
+	}
+	onModeSelect(0, this);
+}
+
 void LLFloaterTexturePicker::onTextureSelect( const LLTextureEntry& te )
 {
 	LLUUID inventory_item_id = findItemID(te.getID(), TRUE);
@@ -945,7 +1206,8 @@ LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p)
 	mImageAssetID(p.image_id),
 	mDefaultImageAssetID(p.default_image_id),
 	mDefaultImageName(p.default_image_name),
-	mFallbackImage(p.fallback_image)
+	mFallbackImage(p.fallback_image),
+	mBakeTextureEnabled(FALSE)
 {
 
 	// Default of defaults is white image for diff tex
@@ -1041,6 +1303,10 @@ void LLTextureCtrl::setVisible( BOOL visible )
 void LLTextureCtrl::setEnabled( BOOL enabled )
 {
 	LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get();
+	if( floaterp )
+	{
+		floaterp->setActive(enabled);
+	}
 	if( enabled )
 	{
 		std::string tooltip;
@@ -1055,11 +1321,6 @@ void LLTextureCtrl::setEnabled( BOOL enabled )
 		closeDependentFloater();
 	}
 
-	if( floaterp )
-	{
-		floaterp->setActive(enabled);
-	}
-
 	mCaption->setEnabled( enabled );
 
 	LLView::setEnabled( enabled );
@@ -1137,6 +1398,10 @@ void LLTextureCtrl::showPicker(BOOL take_focus)
 		{
 			texture_floaterp->setSetImageAssetIDCallback(boost::bind(&LLTextureCtrl::setImageAssetID, this, _1));
 		}
+		if (texture_floaterp)
+		{
+			texture_floaterp->setBakeTextureEnabled(mBakeTextureEnabled);
+		}
 
 		LLFloater* root_floater = gFloaterView->getParentFloater(this);
 		if (root_floater)
@@ -1312,6 +1577,16 @@ void LLTextureCtrl::setImageAssetID( const LLUUID& asset_id )
 	}
 }
 
+void LLTextureCtrl::setBakeTextureEnabled(BOOL enabled)
+{
+	mBakeTextureEnabled = enabled;
+	LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get();
+	if (floaterp)
+	{
+		floaterp->setBakeTextureEnabled(enabled);
+	}
+}
+
 BOOL LLTextureCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask,
 					  BOOL drop, EDragAndDropType cargo_type, void *cargo_data,
 					  EAcceptance *accept,
@@ -1366,7 +1641,23 @@ void LLTextureCtrl::draw()
 	}
 	else if (!mImageAssetID.isNull())
 	{
-		LLPointer<LLViewerFetchedTexture> texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES,LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+		LLPointer<LLViewerFetchedTexture> texture = NULL;
+
+		if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID))
+		{
+			LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
+			if (obj)
+			{
+				LLViewerTexture* viewerTexture = obj->getBakedTextureForMagicId(mImageAssetID);
+				texture = viewerTexture ? dynamic_cast<LLViewerFetchedTexture*>(viewerTexture) : NULL;
+			}
+			
+		}
+
+		if (texture.isNull())
+		{
+			texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+		}
 		
 		texture->setBoostLevel(LLGLTexture::BOOST_PREVIEW);
 		texture->forceToSaveRawImage(0) ;
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 6bcf9c3a7522ec7bc403db126562f0ce184d50db..b2a34a37c4809fa2746cd0343aa8b8884c6e2ff4 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -201,6 +201,8 @@ class LLTextureCtrl
 
 	LLViewerFetchedTexture* getTexture() { return mTexturep; }
 
+	void setBakeTextureEnabled(BOOL enabled);
+
 private:
 	BOOL allowDrop(LLInventoryItem* item);
 	BOOL doDrop(LLInventoryItem* item);
@@ -237,6 +239,7 @@ class LLTextureCtrl
 	BOOL					 	mShowLoadingPlaceholder;
 	std::string				 	mLoadingPlaceholderString;
 	S32						 	mLabelWidth;
+	BOOL						mBakeTextureEnabled;
 };
 
 //////////////////////////////////////////////////////////////////////////////////////////
@@ -326,7 +329,11 @@ class LLFloaterTexturePicker : public LLFloater
 	static void		onBtnUpload(void* userdata);
 	static void		onLocalScrollCommit(LLUICtrl* ctrl, void* userdata);
 
+	static void		onBakeTextureSelect(LLUICtrl* ctrl, void *userdata);
+	static void		onHideBaseMeshRegionCheck(LLUICtrl* ctrl, void *userdata);
+
 	void 			setLocalTextureEnabled(BOOL enabled);
+	void 			setBakeTextureEnabled(BOOL enabled);
 
 protected:
 	LLPointer<LLViewerTexture> mTexturep;
@@ -368,11 +375,14 @@ class LLFloaterTexturePicker : public LLFloater
 	bool mCanPreview;
 	bool mPreviewSettingChanged;
 
+
 	texture_selected_callback mTextureSelectedCallback;
 	floater_close_callback mOnFloaterCloseCallback;
 	floater_commit_callback mOnFloaterCommitCallback;
 	set_image_asset_id_callback mSetImageAssetIDCallback;
 	set_on_update_image_stats_callback mOnUpdateImageStatsCallback;
+
+	BOOL mBakeTextureEnabled;
 };
 
 #endif  // LL_LLTEXTURECTRL_H
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index e4d3d73a3e960452820938cdc36bb85aaa051a85..5aee2c33346023fb4958369b447b03c606f053c3 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -139,6 +139,7 @@ LLLocalizedInventoryItemsDictionary::LLLocalizedInventoryItemsDictionary()
 	mInventoryItemsDict["New Skirt"]		= LLTrans::getString("New Skirt");
 	mInventoryItemsDict["New Alpha"]		= LLTrans::getString("New Alpha");
 	mInventoryItemsDict["New Tattoo"]		= LLTrans::getString("New Tattoo");
+	mInventoryItemsDict["New Universal"]    = LLTrans::getString("New Universal");
 	mInventoryItemsDict["New Physics"]		= LLTrans::getString("New Physics");
 	mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable");
 
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index ec1095813bffb671cde002a9846e1e183384b01d..1353a27982337372ab8773a0511c78e608af297f 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -4707,13 +4707,76 @@ void LLViewerObject::sendTEUpdate() const
 	msg->sendReliable( regionp->getHost() );
 }
 
+LLViewerTexture* LLViewerObject::getBakedTextureForMagicId(const LLUUID& id)
+{
+	if (!LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(id))
+	{
+		return NULL;
+	}
+
+	LLViewerObject *root = getRootEdit();
+	if (root && root->isAnimatedObject())
+	{
+		return LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+	}
+
+	LLVOAvatar* avatar = getAvatar();
+	if (avatar)
+	{
+		LLAvatarAppearanceDefines::EBakedTextureIndex texIndex = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::assetIdToBakedTextureIndex(id);
+		LLViewerTexture* bakedTexture = avatar->getBakedTexture(texIndex);
+		if (bakedTexture == NULL || bakedTexture->isMissingAsset())
+		{
+			return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+		}
+		else
+		{
+			return bakedTexture;
+		}
+	}
+	else
+	{
+		return LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+	}
+
+}
+
+void LLViewerObject::updateAvatarMeshVisibility(const LLUUID& id, const LLUUID& old_id)
+{
+	if (id == old_id)
+	{
+		return;
+	}
+
+	if (!LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(old_id) && !LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(id))
+	{
+		return;
+	}
+
+	LLVOAvatar* avatar = getAvatar();
+	if (avatar)
+	{
+		avatar->updateMeshVisibility();
+	}
+}
+
 void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)
 {
+	LLUUID old_image_id;
+	if (getTE(te))
+	{
+		old_image_id = getTE(te)->getID();
+	}
+		
 	LLPrimitive::setTE(te, texture_entry);
 
 		const LLUUID& image_id = getTE(te)->getID();
-		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+	LLViewerTexture* bakedTexture = getBakedTextureForMagicId(image_id);
+	mTEImages[te] = bakedTexture ? bakedTexture : LLViewerTextureManager::getFetchedTexture(image_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+
 	
+	updateAvatarMeshVisibility(image_id,old_image_id);
+
 	if (getTE(te)->getMaterialParams().notNull())
 	{
 		const LLUUID& norm_id = getTE(te)->getMaterialParams()->getNormalID();
@@ -4724,12 +4787,31 @@ void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)
 	}
 }
 
+void LLViewerObject::refreshBakeTexture()
+{
+	for (int face_index = 0; face_index < getNumTEs(); face_index++)
+	{
+		LLTextureEntry* tex_entry = getTE(face_index);
+		if (tex_entry && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(tex_entry->getID()))
+		{
+			const LLUUID& image_id = tex_entry->getID();
+			LLViewerTexture* bakedTexture = getBakedTextureForMagicId(image_id);
+			changeTEImage(face_index, bakedTexture);
+		}
+	}
+}
+
 void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep)
 {
 	if (mTEImages[te] != imagep)
 	{
-		mTEImages[te] = imagep;
+		LLUUID old_image_id = getTE(te) ? getTE(te)->getID() : LLUUID::null;
+		
 		LLPrimitive::setTETexture(te, imagep->getID());
+
+		LLViewerTexture* baked_texture = getBakedTextureForMagicId(imagep->getID());
+		mTEImages[te] = baked_texture ? baked_texture : imagep;
+		updateAvatarMeshVisibility(imagep->getID(), old_image_id);
 		setChanged(TEXTURE);
 		if (mDrawable.notNull())
 		{
@@ -4740,13 +4822,16 @@ void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep)
 
 S32 LLViewerObject::setTETextureCore(const U8 te, LLViewerTexture *image)
 {
+	LLUUID old_image_id = getTE(te)->getID();
 	const LLUUID& uuid = image->getID();
 	S32 retval = 0;
 	if (uuid != getTE(te)->getID() ||
 		uuid == LLUUID::null)
 	{
 		retval = LLPrimitive::setTETexture(te, uuid);
-		mTEImages[te] = image;
+		LLViewerTexture* baked_texture = getBakedTextureForMagicId(uuid);
+		mTEImages[te] = baked_texture ? baked_texture : image;
+		updateAvatarMeshVisibility(uuid,old_image_id);
 		setChanged(TEXTURE);
 		if (mDrawable.notNull())
 		{
@@ -4837,7 +4922,7 @@ S32 LLViewerObject::setTETexture(const U8 te, const LLUUID& uuid)
 	// Invalid host == get from the agent's sim
 	LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(
 		uuid, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, LLHost());
-	return setTETextureCore(te,image);
+		return setTETextureCore(te, image);
 }
 
 S32 LLViewerObject::setTENormalMap(const U8 te, const LLUUID& uuid)
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 8b1535851e4b1dc3918692695ef54c7ccf90db9e..873b300489bc8c609e96880f13075a91e2b4fd01 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -587,6 +587,10 @@ class LLViewerObject
 	friend class LLViewerObjectList;
 	friend class LLViewerMediaList;
 
+public:
+	LLViewerTexture* getBakedTextureForMagicId(const LLUUID& id);
+	void updateAvatarMeshVisibility(const LLUUID& id, const LLUUID& old_id);
+	void refreshBakeTexture();
 public:
 	static void unpackVector3(LLDataPackerBinaryBuffer* dp, LLVector3& value, std::string name);
 	static void unpackUUID(LLDataPackerBinaryBuffer* dp, LLUUID& value, std::string name);
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 4c9e57f0b40a85d0fe5f78bb23f1803a331268cf..4b05ec6e2bdd43922ea831bc8ceab597abbc2f9f 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -3240,6 +3240,12 @@ bool LLViewerRegion::meshUploadEnabled() const
 		mSimulatorFeatures["MeshUploadEnabled"].asBoolean());
 }
 
+bool LLViewerRegion::bakesOnMeshEnabled() const
+{
+	return (mSimulatorFeatures.has("BakesOnMeshEnabled") &&
+		mSimulatorFeatures["BakesOnMeshEnabled"].asBoolean());
+}
+
 bool LLViewerRegion::meshRezEnabled() const
 {
 	return (mSimulatorFeatures.has("MeshRezEnabled") &&
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 0e39e9b284e6c7cb3b9e837ab45c95fc426e41c9..1b226ac2c69e2e0b0aab63a14675945f37202618 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -305,6 +305,8 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	bool meshRezEnabled() const;
 	bool meshUploadEnabled() const;
 
+	bool bakesOnMeshEnabled() const;
+
 	// has region received its simulator features list? Requires an additional query after caps received.
     void requestSimulatorFeatures();
 	void setSimulatorFeaturesReceived(bool);
diff --git a/indra/newview/llviewertexlayer.cpp b/indra/newview/llviewertexlayer.cpp
index 66e5742911e85d03128fa23328f2b638d5dc94c0..7f7d190b92f7f773d39c48055dbd833eb174619a 100644
--- a/indra/newview/llviewertexlayer.cpp
+++ b/indra/newview/llviewertexlayer.cpp
@@ -58,6 +58,8 @@ LLViewerTexLayerSetBuffer::LLViewerTexLayerSetBuffer(LLTexLayerSet* const owner,
 	mNeedsUpdate(TRUE),
 	mNumLowresUpdates(0)
 {
+	mGLTexturep->setNeedsAlphaAndPickMask(FALSE);
+
 	LLViewerTexLayerSetBuffer::sGLByteCount += getSize();
 	mNeedsUpdateTimer.start();
 }
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 22fde86870f11eb46caab540774b1dfb92738da4..5584efeb7b1e077ad677b4cea74b74e0204cb028 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -751,8 +751,8 @@ std::string LLVOAvatar::avString() const
     }
     else
     {
-        std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus());
-        return " Avatar '" + getFullname() + "' " + viz_string + " ";
+	std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus());
+	return " Avatar '" + getFullname() + "' " + viz_string + " ";
     }
 }
 
@@ -829,7 +829,8 @@ BOOL LLVOAvatar::isFullyBaked()
 	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
 	{
 		if (!isTextureDefined(mBakedTextureDatas[i].mTextureIndex)
-			&& ( (i != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT) ) )
+			&& ((i != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT))
+			&& (i != BAKED_LEFT_ARM) && (i != BAKED_LEFT_LEG) && (i != BAKED_AUX1) && (i != BAKED_AUX2) && (i != BAKED_AUX3))
 		{
 			return FALSE;
 		}
@@ -1322,7 +1323,7 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
     if (dist_vec(zero_pos, mPelvisp->getWorldPosition())<0.001)
     {
         // Don't use pelvis until av initialized
-        pos.load3(getRenderPosition().mV);
+	pos.load3(getRenderPosition().mV);
     }
     else
     {
@@ -1336,16 +1337,16 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
 	//displayed, can give inaccurate boxes due to joints stuck at (0,0,0).
     if ((box_detail>=1) && !isControlAvatar())
     {
-        for (polymesh_map_t::iterator i = mPolyMeshes.begin(); i != mPolyMeshes.end(); ++i)
-        {
-            LLPolyMesh* mesh = i->second;
-            for (S32 joint_num = 0; joint_num < mesh->mJointRenderData.size(); joint_num++)
-            {
-                LLVector4a trans;
-                trans.load3( mesh->mJointRenderData[joint_num]->mWorldMatrix->getTranslation().mV);
-                update_min_max(newMin, newMax, trans);
-            }
-        }
+	for (polymesh_map_t::iterator i = mPolyMeshes.begin(); i != mPolyMeshes.end(); ++i)
+	{
+		LLPolyMesh* mesh = i->second;
+		for (S32 joint_num = 0; joint_num < mesh->mJointRenderData.size(); joint_num++)
+		{
+			LLVector4a trans;
+			trans.load3( mesh->mJointRenderData[joint_num]->mWorldMatrix->getTranslation().mV);
+			update_min_max(newMin, newMax, trans);
+		}
+	}
 
     }
 
@@ -1362,22 +1363,22 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
     {
         float max_attachment_span = get_default_max_prim_scale() * 5.0f;
 	
-        for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-             iter != mAttachmentPoints.end();
-             ++iter)
-        {
-            LLViewerJointAttachment* attachment = iter->second;
+	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
+		 iter != mAttachmentPoints.end();
+		 ++iter)
+	{
+		LLViewerJointAttachment* attachment = iter->second;
 
-            if (attachment->getValid())
-            {
-                for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
-                     attachment_iter != attachment->mAttachedObjects.end();
-                     ++attachment_iter)
-                {
+		if (attachment->getValid())
+		{
+			for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+				 attachment_iter != attachment->mAttachedObjects.end();
+				 ++attachment_iter)
+			{
                     // 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())
-                    {
+				const LLViewerObject* attached_object = (*attachment_iter);
+				if (attached_object && !attached_object->isHUDAttachment())
+				{
                         const LLVOVolume *vol = dynamic_cast<const LLVOVolume*>(attached_object);
                         if (vol && vol->isAnimatedObject())
                         {
@@ -1399,33 +1400,33 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
                         {
                             continue;
                         }
-                        LLDrawable* drawable = attached_object->mDrawable;
-                        if (drawable && !drawable->isState(LLDrawable::RIGGED))
-                        {
-                            LLSpatialBridge* bridge = drawable->getSpatialBridge();
-                            if (bridge)
-                            {
-                                const LLVector4a* ext = bridge->getSpatialExtents();
-                                LLVector4a distance;
-                                distance.setSub(ext[1], ext[0]);
-                                LLVector4a max_span(max_attachment_span);
+					LLDrawable* drawable = attached_object->mDrawable;
+					if (drawable && !drawable->isState(LLDrawable::RIGGED))
+					{
+						LLSpatialBridge* bridge = drawable->getSpatialBridge();
+						if (bridge)
+						{
+							const LLVector4a* ext = bridge->getSpatialExtents();
+							LLVector4a distance;
+							distance.setSub(ext[1], ext[0]);
+							LLVector4a max_span(max_attachment_span);
 
-                                S32 lt = distance.lessThan(max_span).getGatheredBits() & 0x7;
+							S32 lt = distance.lessThan(max_span).getGatheredBits() & 0x7;
 						
-                                // Only add the prim to spatial extents calculations if it isn't a megaprim.
-                                // max_attachment_span calculated at the start of the function 
-                                // (currently 5 times our max prim size) 
-                                if (lt == 0x7)
-                                {
-                                    update_min_max(newMin,newMax,ext[0]);
-                                    update_min_max(newMin,newMax,ext[1]);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
+							// Only add the prim to spatial extents calculations if it isn't a megaprim.
+							// max_attachment_span calculated at the start of the function 
+							// (currently 5 times our max prim size) 
+							if (lt == 0x7)
+							{
+								update_min_max(newMin,newMax,ext[0]);
+								update_min_max(newMin,newMax,ext[1]);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
     }
 
     // Stretch bounding box by rigged mesh joint boxes
@@ -1949,7 +1950,7 @@ void LLVOAvatar::buildCharacter()
     // Currently disabled for control avatars (animated objects), enabled for all others.
     if (mEnableDefaultMotions)
     {
-        startDefaultMotions();
+	startDefaultMotions();
     }
 
 	//-------------------------------------------------------------------------
@@ -2066,8 +2067,8 @@ void LLVOAvatar::resetSkeleton(bool reset_animations)
     // Reset tweakable params to preserved state
     if (mLastProcessedAppearance)
     {
-        bool slam_params = true;
-        applyParsedAppearanceMessage(*mLastProcessedAppearance, slam_params);
+    bool slam_params = true;
+    applyParsedAppearanceMessage(*mLastProcessedAppearance, slam_params);
     }
     updateVisualParams();
 
@@ -2119,15 +2120,15 @@ void LLVOAvatar::releaseMeshData()
 		LLFace* facep = mDrawable->getFace(0);
 		if (facep)
 		{
-            facep->setSize(0, 0);
-            for(S32 i = mNumInitFaces ; i < mDrawable->getNumFaces(); i++)
-            {
-                facep = mDrawable->getFace(i);
+		facep->setSize(0, 0);
+		for(S32 i = mNumInitFaces ; i < mDrawable->getNumFaces(); i++)
+		{
+			facep = mDrawable->getFace(i);
 				if (facep)
 				{
-                    facep->setSize(0, 0);
-                }
-            }
+			facep->setSize(0, 0);
+		}
+	}
 		}
 	}
 	
@@ -2385,6 +2386,7 @@ LLViewerFetchedTexture *LLVOAvatar::getBakedTextureImage(const U8 te, const LLUU
 		{
 			result->setIsMissingAsset(false);
 		}
+		
 	}
 	return result;
 }
@@ -2770,13 +2772,13 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
 
     if (mDrawable.notNull())
     {
-        mDrawable->movePartition();
-        
-        //force a move if sitting on an active object
-        if (getParent() && ((LLViewerObject*) getParent())->mDrawable->isActive())
-        {
-            gPipeline.markMoved(mDrawable, TRUE);
-        }
+	mDrawable->movePartition();
+	
+	//force a move if sitting on an active object
+	if (getParent() && ((LLViewerObject*) getParent())->mDrawable->isActive())
+	{
+		gPipeline.markMoved(mDrawable, TRUE);
+	}
     }
 }
 
@@ -2950,7 +2952,7 @@ void LLVOAvatar::idleUpdateLoadingEffect()
 void LLVOAvatar::idleUpdateWindEffect()
 {
 	// update wind effect
-	if ((LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH))
+	if ((LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH))
 	{
 		F32 hover_strength = 0.f;
 		F32 time_delta = mRippleTimer.getElapsedTimeF32() - mRippleTimeLast;
@@ -3539,66 +3541,67 @@ bool LLVOAvatar::isInMuteList()
 
 void LLVOAvatar::updateAppearanceMessageDebugText()
 {
-    S32 central_bake_version = -1;
-    if (getRegion())
-    {
-        central_bake_version = getRegion()->getCentralBakeVersion();
-    }
-    bool all_baked_downloaded = allBakedTexturesCompletelyDownloaded();
-    bool all_local_downloaded = allLocalTexturesCompletelyDownloaded();
-    std::string debug_line = llformat("%s%s - mLocal: %d, mEdit: %d, mUSB: %d, CBV: %d",
-                                      isSelf() ? (all_local_downloaded ? "L" : "l") : "-",
-                                      all_baked_downloaded ? "B" : "b",
-                                      mUseLocalAppearance, mIsEditingAppearance,
-                                      1, central_bake_version);
-    std::string origin_string = bakedTextureOriginInfo();
-    debug_line += " [" + origin_string + "]";
-    S32 curr_cof_version = LLAppearanceMgr::instance().getCOFVersion();
-    S32 last_request_cof_version = mLastUpdateRequestCOFVersion;
-    S32 last_received_cof_version = mLastUpdateReceivedCOFVersion;
-    if (isSelf())
-    {
-        debug_line += llformat(" - cof: %d req: %d rcv:%d",
-                               curr_cof_version, last_request_cof_version, last_received_cof_version);
-        if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure"))
+		S32 central_bake_version = -1;
+		if (getRegion())
+		{
+			central_bake_version = getRegion()->getCentralBakeVersion();
+		}
+		bool all_baked_downloaded = allBakedTexturesCompletelyDownloaded();
+		bool all_local_downloaded = allLocalTexturesCompletelyDownloaded();
+		std::string debug_line = llformat("%s%s - mLocal: %d, mEdit: %d, mUSB: %d, CBV: %d",
+										  isSelf() ? (all_local_downloaded ? "L" : "l") : "-",
+										  all_baked_downloaded ? "B" : "b",
+										  mUseLocalAppearance, mIsEditingAppearance,
+										  1, central_bake_version);
+		std::string origin_string = bakedTextureOriginInfo();
+		debug_line += " [" + origin_string + "]";
+		S32 curr_cof_version = LLAppearanceMgr::instance().getCOFVersion();
+		S32 last_request_cof_version = mLastUpdateRequestCOFVersion;
+		S32 last_received_cof_version = mLastUpdateReceivedCOFVersion;
+		if (isSelf())
+		{
+			debug_line += llformat(" - cof: %d req: %d rcv:%d",
+								   curr_cof_version, last_request_cof_version, last_received_cof_version);
+			if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure"))
+			{
+				debug_line += " FORCING ERRS";
+			}
+		}
+		else
+		{
+			debug_line += llformat(" - cof rcv:%d", last_received_cof_version);
+		}
+		debug_line += llformat(" bsz-z: %.3f", mBodySize[2]);
+        if (mAvatarOffset[2] != 0.0f)
         {
-            debug_line += " FORCING ERRS";
+            debug_line += llformat("avofs-z: %.3f", mAvatarOffset[2]);
         }
-    }
-    else
-    {
-        debug_line += llformat(" - cof rcv:%d", last_received_cof_version);
-    }
-    debug_line += llformat(" bsz-z: %.3f", mBodySize[2]);
-    if (mAvatarOffset[2] != 0.0f)
-    {
-        debug_line += llformat("avofs-z: %.3f", mAvatarOffset[2]);
-    }
-    bool hover_enabled = getRegion() && getRegion()->avatarHoverHeightEnabled();
-    debug_line += hover_enabled ? " H" : " h";
-    const LLVector3& hover_offset = getHoverOffset();
-    if (hover_offset[2] != 0.0)
-    {
-        debug_line += llformat(" hov_z: %.3f", hover_offset[2]);
+		bool hover_enabled = getRegion() && getRegion()->avatarHoverHeightEnabled();
+		debug_line += hover_enabled ? " H" : " h";
+		const LLVector3& hover_offset = getHoverOffset();
+		if (hover_offset[2] != 0.0)
+		{
+			debug_line += llformat(" hov_z: %.3f", hover_offset[2]);
         debug_line += llformat(" %s", (isSitting() ? "S" : "T"));
-        debug_line += llformat("%s", (isMotionActive(ANIM_AGENT_SIT_GROUND_CONSTRAINED) ? "G" : "-"));
-    }
-    LLVector3 ankle_right_pos_agent = mFootRightp->getWorldPosition();
-    LLVector3 normal;
-    LLVector3 ankle_right_ground_agent = ankle_right_pos_agent;
-    resolveHeightAgent(ankle_right_pos_agent, ankle_right_ground_agent, normal);
-    F32 rightElev = llmax(-0.2f, ankle_right_pos_agent.mV[VZ] - ankle_right_ground_agent.mV[VZ]);
-    debug_line += llformat(" relev %.3f", rightElev);
+			debug_line += llformat("%s", (isMotionActive(ANIM_AGENT_SIT_GROUND_CONSTRAINED) ? "G" : "-"));
+		}
+
+        LLVector3 ankle_right_pos_agent = mFootRightp->getWorldPosition();
+		LLVector3 normal;
+        LLVector3 ankle_right_ground_agent = ankle_right_pos_agent;
+        resolveHeightAgent(ankle_right_pos_agent, ankle_right_ground_agent, normal);
+        F32 rightElev = llmax(-0.2f, ankle_right_pos_agent.mV[VZ] - ankle_right_ground_agent.mV[VZ]);
+        debug_line += llformat(" relev %.3f", rightElev);
 
-    LLVector3 root_pos = mRoot->getPosition();
-    LLVector3 pelvis_pos = mPelvisp->getPosition();
-    debug_line += llformat(" rp %.3f pp %.3f", root_pos[2], pelvis_pos[2]);
+        LLVector3 root_pos = mRoot->getPosition();
+        LLVector3 pelvis_pos = mPelvisp->getPosition();
+        debug_line += llformat(" rp %.3f pp %.3f", root_pos[2], pelvis_pos[2]);
 
     S32 is_visible = (S32) isVisible();
     S32 is_m_visible = (S32) mVisible;
     debug_line += llformat(" v %d/%d", is_visible, is_m_visible);
 
-    addDebugText(debug_line);
+		addDebugText(debug_line);
 }
 
 LLViewerInventoryItem* getObjectInventoryItem(LLViewerObject *vobj, LLUUID asset_id)
@@ -3610,7 +3613,7 @@ LLViewerInventoryItem* getObjectInventoryItem(LLViewerObject *vobj, LLUUID asset
         if (vobj->getInventorySerial()<=0)
         {
             vobj->requestInventory(); 
-        }
+	}
         item = vobj->getInventoryItemByAsset(asset_id);
     }
     return item;
@@ -3628,23 +3631,23 @@ LLViewerInventoryItem* recursiveGetObjectInventoryItem(LLViewerObject *vobj, LLU
             LLViewerObject *childp = *it;
             item = getObjectInventoryItem(childp, asset_id);
             if (item)
-            {
+	{
                 break;
             }
         }
-    }
+	}
     return item;
 }
 
 void LLVOAvatar::updateAnimationDebugText()
 {
-    for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin();
-         iter != mMotionController.getActiveMotions().end(); ++iter)
-    {
-        LLMotion* motionp = *iter;
-        if (motionp->getMinPixelArea() < getPixelArea())
-        {
-            std::string output;
+		for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin();
+			 iter != mMotionController.getActiveMotions().end(); ++iter)
+		{
+			LLMotion* motionp = *iter;
+			if (motionp->getMinPixelArea() < getPixelArea())
+			{
+				std::string output;
             std::string motion_name = motionp->getName();
             if (motion_name.empty())
             {
@@ -3661,73 +3664,73 @@ void LLVOAvatar::updateAnimationDebugText()
                 }
             }
             if (motion_name.empty())
-            {
-                std::string name;
-                if (gAgent.isGodlikeWithoutAdminMenuFakery() || isSelf())
-                {
-                    name = motionp->getID().asString();
-                    LLVOAvatar::AnimSourceIterator anim_it = mAnimationSources.begin();
-                    for (; anim_it != mAnimationSources.end(); ++anim_it)
-                    {
-                        if (anim_it->second == motionp->getID())
-                        {
-                            LLViewerObject* object = gObjectList.findObject(anim_it->first);
-                            if (!object)
-                            {
-                                break;
-                            }
-                            if (object->isAvatar())
-                            {
-                                if (mMotionController.mIsSelf)
-                                {
-                                    // Searching inventory by asset id is really long
-                                    // so just mark as inventory
-                                    // Also item is likely to be named by LLPreviewAnim
-                                    name += "(inventory)";
-                                }
-                            }
-                            else
-                            {
-                                LLViewerInventoryItem* item = NULL;
-                                if (!object->isInventoryDirty())
-                                {
-                                    item = object->getInventoryItemByAsset(motionp->getID());
-                                }
-                                if (item)
-                                {
-                                    name = item->getName();
-                                }
-                                else if (object->isAttachment())
-                                {
-                                    name += "(" + getAttachmentItemName() + ")";
-                                }
-                                else
-                                {
-                                    // in-world object, name or content unknown
-                                    name += "(in-world)";
-                                }
-                            }
-                            break;
-                        }
-                    }
-                }
-                else
-                {
-                    name = LLUUID::null.asString();
-                }
-                output = llformat("%s - %d",
-                                  name.c_str(),
-                                  (U32)motionp->getPriority());
-            }
-            else
-            {
-                output = llformat("%s - %d",
+				{
+					std::string name;
+					if (gAgent.isGodlikeWithoutAdminMenuFakery() || isSelf())
+					{
+						name = motionp->getID().asString();
+						LLVOAvatar::AnimSourceIterator anim_it = mAnimationSources.begin();
+						for (; anim_it != mAnimationSources.end(); ++anim_it)
+						{
+							if (anim_it->second == motionp->getID())
+							{
+								LLViewerObject* object = gObjectList.findObject(anim_it->first);
+								if (!object)
+								{
+									break;
+								}
+								if (object->isAvatar())
+								{
+									if (mMotionController.mIsSelf)
+									{
+										// Searching inventory by asset id is really long
+										// so just mark as inventory
+										// Also item is likely to be named by LLPreviewAnim
+										name += "(inventory)";
+									}
+								}
+								else
+								{
+									LLViewerInventoryItem* item = NULL;
+									if (!object->isInventoryDirty())
+									{
+										item = object->getInventoryItemByAsset(motionp->getID());
+									}
+									if (item)
+									{
+										name = item->getName();
+									}
+									else if (object->isAttachment())
+									{
+										name += "(" + getAttachmentItemName() + ")";
+									}
+									else
+									{
+										// in-world object, name or content unknown
+										name += "(in-world)";
+									}
+								}
+								break;
+							}
+						}
+					}
+					else
+					{
+						name = LLUUID::null.asString();
+					}
+					output = llformat("%s - %d",
+							  name.c_str(),
+							  (U32)motionp->getPriority());
+				}
+				else
+				{
+					output = llformat("%s - %d",
                                   motion_name.c_str(),
-                                  (U32)motionp->getPriority());
-            }
-            addDebugText(output);
-        }
-    }
+							  (U32)motionp->getPriority());
+				}
+				addDebugText(output);
+			}
+		}
 }
 
 void LLVOAvatar::updateDebugText()
@@ -3760,7 +3763,7 @@ void LLVOAvatar::updateDebugText()
 	{
 		setDebugText(mDebugText);
 	}
-    mDebugText.clear();
+	mDebugText.clear();
 }
 
 //------------------------------------------------------------------------
@@ -3774,7 +3777,7 @@ void LLVOAvatar::updateFootstepSounds()
     {
         return;
     }
-    
+	
 	//-------------------------------------------------------------------------
 	// Find the ground under each foot, these are used for a variety
 	// of things that follow
@@ -3799,7 +3802,7 @@ void LLVOAvatar::updateFootstepSounds()
 		if (!mInAir)
 		{
 			if ((leftElev < 0.0f) || (rightElev < 0.0f))
-			{
+	{
 				ankle_left_pos_agent = mFootLeftp->getWorldPosition();
 				ankle_right_pos_agent = mFootRightp->getWorldPosition();
 				leftElev = ankle_left_pos_agent.mV[VZ] - ankle_left_ground_agent.mV[VZ];
@@ -3828,10 +3831,10 @@ void LLVOAvatar::updateFootstepSounds()
 
 		// did right foot hit the ground?
 		if ( onGroundRight && !mWasOnGroundRight )
-		{
+	{
 			foot_pos_agent = ankle_right_pos_agent;
 			playSound = TRUE;
-		}
+	}
 
 		mWasOnGroundLeft = onGroundLeft;
 		mWasOnGroundRight = onGroundRight;
@@ -3920,153 +3923,153 @@ void LLVOAvatar::computeUpdatePeriod()
 //------------------------------------------------------------------------
 void LLVOAvatar::updateOrientation(LLAgent& agent, F32 speed, F32 delta_time)
 {
-    LLQuaternion iQ;
-    LLVector3 upDir( 0.0f, 0.0f, 1.0f );
+			LLQuaternion iQ;
+			LLVector3 upDir( 0.0f, 0.0f, 1.0f );
 			
-    // Compute a forward direction vector derived from the primitive rotation
-    // and the velocity vector.  When walking or jumping, don't let body deviate
-    // more than 90 from the view, if necessary, flip the velocity vector.
+			// Compute a forward direction vector derived from the primitive rotation
+			// and the velocity vector.  When walking or jumping, don't let body deviate
+			// more than 90 from the view, if necessary, flip the velocity vector.
 
-    LLVector3 primDir;
-    if (isSelf())
-    {
-        primDir = agent.getAtAxis() - projected_vec(agent.getAtAxis(), agent.getReferenceUpVector());
-        primDir.normalize();
-    }
-    else
-    {
-        primDir = getRotation().getMatrix3().getFwdRow();
-    }
-    LLVector3 velDir = getVelocity();
-    velDir.normalize();
-    if ( mSignaledAnimations.find(ANIM_AGENT_WALK) != mSignaledAnimations.end())
-    {
-        F32 vpD = velDir * primDir;
-        if (vpD < -0.5f)
-        {
-            velDir *= -1.0f;
-        }
-    }
-    LLVector3 fwdDir = lerp(primDir, velDir, clamp_rescale(speed, 0.5f, 2.0f, 0.0f, 1.0f));
-    if (isSelf() && gAgentCamera.cameraMouselook())
-    {
-        // make sure fwdDir stays in same general direction as primdir
-        if (gAgent.getFlying())
-        {
-            fwdDir = LLViewerCamera::getInstance()->getAtAxis();
-        }
-        else
-        {
-            LLVector3 at_axis = LLViewerCamera::getInstance()->getAtAxis();
-            LLVector3 up_vector = gAgent.getReferenceUpVector();
-            at_axis -= up_vector * (at_axis * up_vector);
-            at_axis.normalize();
+			LLVector3 primDir;
+			if (isSelf())
+			{
+				primDir = agent.getAtAxis() - projected_vec(agent.getAtAxis(), agent.getReferenceUpVector());
+				primDir.normalize();
+			}
+			else
+			{
+				primDir = getRotation().getMatrix3().getFwdRow();
+			}
+			LLVector3 velDir = getVelocity();
+			velDir.normalize();
+			if ( mSignaledAnimations.find(ANIM_AGENT_WALK) != mSignaledAnimations.end())
+			{
+				F32 vpD = velDir * primDir;
+				if (vpD < -0.5f)
+				{
+					velDir *= -1.0f;
+				}
+			}
+			LLVector3 fwdDir = lerp(primDir, velDir, clamp_rescale(speed, 0.5f, 2.0f, 0.0f, 1.0f));
+			if (isSelf() && gAgentCamera.cameraMouselook())
+			{
+				// make sure fwdDir stays in same general direction as primdir
+				if (gAgent.getFlying())
+				{
+					fwdDir = LLViewerCamera::getInstance()->getAtAxis();
+				}
+				else
+				{
+					LLVector3 at_axis = LLViewerCamera::getInstance()->getAtAxis();
+					LLVector3 up_vector = gAgent.getReferenceUpVector();
+					at_axis -= up_vector * (at_axis * up_vector);
+					at_axis.normalize();
 					
-            F32 dot = fwdDir * at_axis;
-            if (dot < 0.f)
-            {
-                fwdDir -= 2.f * at_axis * dot;
-                fwdDir.normalize();
-            }
-        }
-    }
+					F32 dot = fwdDir * at_axis;
+					if (dot < 0.f)
+					{
+						fwdDir -= 2.f * at_axis * dot;
+						fwdDir.normalize();
+					}
+				}
+			}
 
-    LLQuaternion root_rotation = mRoot->getWorldMatrix().quaternion();
-    F32 root_roll, root_pitch, root_yaw;
-    root_rotation.getEulerAngles(&root_roll, &root_pitch, &root_yaw);
+			LLQuaternion root_rotation = mRoot->getWorldMatrix().quaternion();
+			F32 root_roll, root_pitch, root_yaw;
+			root_rotation.getEulerAngles(&root_roll, &root_pitch, &root_yaw);
 
-    // When moving very slow, the pelvis is allowed to deviate from the
+			// When moving very slow, the pelvis is allowed to deviate from the
     // forward direction to allow it to hold its position while the torso
-    // and head turn.  Once in motion, it must conform however.
-    BOOL self_in_mouselook = isSelf() && gAgentCamera.cameraMouselook();
+			// and head turn.  Once in motion, it must conform however.
+			BOOL self_in_mouselook = isSelf() && gAgentCamera.cameraMouselook();
 
-    LLVector3 pelvisDir( mRoot->getWorldMatrix().getFwdRow4().mV );
+			LLVector3 pelvisDir( mRoot->getWorldMatrix().getFwdRow4().mV );
 
-    static LLCachedControl<F32> s_pelvis_rot_threshold_slow(gSavedSettings, "AvatarRotateThresholdSlow", 60.0);
-    static LLCachedControl<F32> s_pelvis_rot_threshold_fast(gSavedSettings, "AvatarRotateThresholdFast", 2.0);
+			static LLCachedControl<F32> s_pelvis_rot_threshold_slow(gSavedSettings, "AvatarRotateThresholdSlow", 60.0);
+			static LLCachedControl<F32> s_pelvis_rot_threshold_fast(gSavedSettings, "AvatarRotateThresholdFast", 2.0);
 
-    F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, s_pelvis_rot_threshold_slow, s_pelvis_rot_threshold_fast);
+			F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, s_pelvis_rot_threshold_slow, s_pelvis_rot_threshold_fast);
 						
-    if (self_in_mouselook)
-    {
-        pelvis_rot_threshold *= MOUSELOOK_PELVIS_FOLLOW_FACTOR;
-    }
-    pelvis_rot_threshold *= DEG_TO_RAD;
+			if (self_in_mouselook)
+			{
+				pelvis_rot_threshold *= MOUSELOOK_PELVIS_FOLLOW_FACTOR;
+			}
+			pelvis_rot_threshold *= DEG_TO_RAD;
 
-    F32 angle = angle_between( pelvisDir, fwdDir );
+			F32 angle = angle_between( pelvisDir, fwdDir );
 
-    // The avatar's root is allowed to have a yaw that deviates widely
-    // from the forward direction, but if roll or pitch are off even
-    // a little bit we need to correct the rotation.
-    if(root_roll < 1.f * DEG_TO_RAD
-       && root_pitch < 5.f * DEG_TO_RAD)
-    {
-        // smaller correction vector means pelvis follows prim direction more closely
-        if (!mTurning && angle > pelvis_rot_threshold*0.75f)
-        {
-            mTurning = TRUE;
-        }
+			// The avatar's root is allowed to have a yaw that deviates widely
+			// from the forward direction, but if roll or pitch are off even
+			// a little bit we need to correct the rotation.
+			if(root_roll < 1.f * DEG_TO_RAD
+			   && root_pitch < 5.f * DEG_TO_RAD)
+			{
+				// smaller correction vector means pelvis follows prim direction more closely
+				if (!mTurning && angle > pelvis_rot_threshold*0.75f)
+				{
+					mTurning = TRUE;
+				}
 
-        // use tighter threshold when turning
-        if (mTurning)
-        {
-            pelvis_rot_threshold *= 0.4f;
-        }
+				// use tighter threshold when turning
+				if (mTurning)
+				{
+					pelvis_rot_threshold *= 0.4f;
+				}
 
-        // am I done turning?
-        if (angle < pelvis_rot_threshold)
-        {
-            mTurning = FALSE;
-        }
+				// am I done turning?
+				if (angle < pelvis_rot_threshold)
+				{
+					mTurning = FALSE;
+				}
 
-        LLVector3 correction_vector = (pelvisDir - fwdDir) * clamp_rescale(angle, pelvis_rot_threshold*0.75f, pelvis_rot_threshold, 1.0f, 0.0f);
-        fwdDir += correction_vector;
-    }
-    else
-    {
-        mTurning = FALSE;
-    }
+				LLVector3 correction_vector = (pelvisDir - fwdDir) * clamp_rescale(angle, pelvis_rot_threshold*0.75f, pelvis_rot_threshold, 1.0f, 0.0f);
+				fwdDir += correction_vector;
+			}
+			else
+			{
+				mTurning = FALSE;
+			}
 
-    // Now compute the full world space rotation for the whole body (wQv)
-    LLVector3 leftDir = upDir % fwdDir;
-    leftDir.normalize();
-    fwdDir = leftDir % upDir;
-    LLQuaternion wQv( fwdDir, leftDir, upDir );
+			// Now compute the full world space rotation for the whole body (wQv)
+			LLVector3 leftDir = upDir % fwdDir;
+			leftDir.normalize();
+			fwdDir = leftDir % upDir;
+			LLQuaternion wQv( fwdDir, leftDir, upDir );
 
-    if (isSelf() && mTurning)
-    {
-        if ((fwdDir % pelvisDir) * upDir > 0.f)
-        {
-            gAgent.setControlFlags(AGENT_CONTROL_TURN_RIGHT);
-        }
-        else
-        {
-            gAgent.setControlFlags(AGENT_CONTROL_TURN_LEFT);
-        }
-    }
+			if (isSelf() && mTurning)
+			{
+				if ((fwdDir % pelvisDir) * upDir > 0.f)
+				{
+					gAgent.setControlFlags(AGENT_CONTROL_TURN_RIGHT);
+				}
+				else
+				{
+					gAgent.setControlFlags(AGENT_CONTROL_TURN_LEFT);
+				}
+			}
 
-    // Set the root rotation, but do so incrementally so that it
-    // lags in time by some fixed amount.
-    //F32 u = LLSmoothInterpolation::getInterpolant(PELVIS_LAG);
-    F32 pelvis_lag_time = 0.f;
-    if (self_in_mouselook)
-    {
-        pelvis_lag_time = PELVIS_LAG_MOUSELOOK;
-    }
-    else if (mInAir)
-    {
-        pelvis_lag_time = PELVIS_LAG_FLYING;
-        // increase pelvis lag time when moving slowly
-        pelvis_lag_time *= clamp_rescale(mSpeedAccum, 0.f, 15.f, 3.f, 1.f);
-    }
-    else
-    {
-        pelvis_lag_time = PELVIS_LAG_WALKING;
-    }
+			// Set the root rotation, but do so incrementally so that it
+			// lags in time by some fixed amount.
+			//F32 u = LLSmoothInterpolation::getInterpolant(PELVIS_LAG);
+			F32 pelvis_lag_time = 0.f;
+			if (self_in_mouselook)
+			{
+				pelvis_lag_time = PELVIS_LAG_MOUSELOOK;
+			}
+			else if (mInAir)
+			{
+				pelvis_lag_time = PELVIS_LAG_FLYING;
+				// increase pelvis lag time when moving slowly
+				pelvis_lag_time *= clamp_rescale(mSpeedAccum, 0.f, 15.f, 3.f, 1.f);
+			}
+			else
+			{
+				pelvis_lag_time = PELVIS_LAG_WALKING;
+			}
 
     F32 u = llclamp((delta_time / pelvis_lag_time), 0.0f, 1.0f);	
 
-    mRoot->setWorldRotation( slerp(u, mRoot->getWorldRotation(), wQv) );
+			mRoot->setWorldRotation( slerp(u, mRoot->getWorldRotation(), wQv) );
 }
 
 //------------------------------------------------------------------------
@@ -4128,7 +4131,7 @@ void LLVOAvatar::updateRootPositionAndRotation(LLAgent& agent, F32 speed, bool w
 			mRoot->setWorldPosition( getPositionAgent() ); // first frame
 			mRoot->setWorldRotation( getRotation() );
 		}
-	
+			
 		//--------------------------------------------------------------------
 		// dont' let dT get larger than 1/5th of a second
 		//--------------------------------------------------------------------
@@ -4366,7 +4369,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 	mRoot->updateWorldMatrixChildren();
 
 	// System avatar mesh vertices need to be reskinned.
-    mNeedsSkin = TRUE;
+	mNeedsSkin = TRUE;
 
 	return TRUE;
 }
@@ -4651,7 +4654,7 @@ U32 LLVOAvatar::renderSkinned()
 		}
 	}
 
-	if (LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) <= 0)
+	if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) <= 0)
 	{
 		if (mNeedsSkin)
 		{
@@ -4880,14 +4883,14 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)
 			first_pass = FALSE;
 		}
 		if (isTextureVisible(TEX_HAIR_BAKED))
-        {
-            LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR);
-            if (hair_mesh)
-            {
-                num_indices += hair_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy);
-            }
-            first_pass = FALSE;
-        }
+		{
+			LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR);
+			if (hair_mesh)
+			{
+				num_indices += hair_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy);
+			}
+			first_pass = FALSE;
+		}
 		if (LLPipeline::sImpostorRender)
 		{
 			gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
@@ -4995,22 +4998,22 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color, S32 diffuse_channel)
 		gGL.flush();
 	}
 	{
-		LLGLEnable test(GL_ALPHA_TEST);
-		gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);
+	LLGLEnable test(GL_ALPHA_TEST);
+	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);
 
-		gGL.color4ubv(color.mV);
-		gGL.getTexUnit(diffuse_channel)->bind(&mImpostor);
-		gGL.begin(LLRender::QUADS);
-		gGL.texCoord2f(0,0);
-		gGL.vertex3fv((pos+left-up).mV);
-		gGL.texCoord2f(1,0);
-		gGL.vertex3fv((pos-left-up).mV);
-		gGL.texCoord2f(1,1);
-		gGL.vertex3fv((pos-left+up).mV);
-		gGL.texCoord2f(0,1);
-		gGL.vertex3fv((pos+left+up).mV);
-		gGL.end();
-		gGL.flush();
+	gGL.color4ubv(color.mV);
+	gGL.getTexUnit(diffuse_channel)->bind(&mImpostor);
+	gGL.begin(LLRender::QUADS);
+	gGL.texCoord2f(0,0);
+	gGL.vertex3fv((pos+left-up).mV);
+	gGL.texCoord2f(1,0);
+	gGL.vertex3fv((pos-left-up).mV);
+	gGL.texCoord2f(1,1);
+	gGL.vertex3fv((pos-left+up).mV);
+	gGL.texCoord2f(0,1);
+	gGL.vertex3fv((pos+left+up).mV);
+	gGL.end();
+	gGL.flush();
 	}
 
 	return 6;
@@ -5510,8 +5513,8 @@ void LLVOAvatar::processAnimationStateChanges()
 		stopMotion(ANIM_AGENT_WALK_ADJUST);
         if (mEnableDefaultMotions)
         {
-            startMotion(ANIM_AGENT_FLY_ADJUST);
-        }
+		startMotion(ANIM_AGENT_FLY_ADJUST);
+	}
 	}
 	else
 	{
@@ -5523,7 +5526,7 @@ void LLVOAvatar::processAnimationStateChanges()
 	{
         if (mEnableDefaultMotions)
         {
-            startMotion(ANIM_AGENT_TARGET);
+		startMotion(ANIM_AGENT_TARGET);
         }
 		stopMotion(ANIM_AGENT_BODY_NOISE);
 	}
@@ -5532,8 +5535,8 @@ void LLVOAvatar::processAnimationStateChanges()
 		stopMotion(ANIM_AGENT_TARGET);
         if (mEnableDefaultMotions)
         {
-            startMotion(ANIM_AGENT_BODY_NOISE);
-        }
+		startMotion(ANIM_AGENT_BODY_NOISE);
+	}
 	}
 	
 	// clear all current animations
@@ -5901,10 +5904,10 @@ bool LLVOAvatar::getRiggedMeshID(LLViewerObject* pVO, LLUUID& mesh_id)
 			if (pSkinData 
 				&& pSkinData->mJointNames.size() > JOINT_COUNT_REQUIRED_FOR_FULLRIG	// full rig
 				&& pSkinData->mAlternateBindMatrix.size() > 0 )
-            {				
-                mesh_id = pSkinData->mMeshID;
-                return true;
-            }
+					{				
+						mesh_id = pSkinData->mMeshID;
+						return true;
+					}
 		}
 	}
 	return false;
@@ -5913,14 +5916,14 @@ bool LLVOAvatar::getRiggedMeshID(LLViewerObject* pVO, LLUUID& mesh_id)
 bool LLVOAvatar::jointIsRiggedTo(const LLJoint *joint) const
 {
     if (joint)
-    {
+	{
         const LLJointRiggingInfoTab& tab = mJointRiggingInfoTab;
         S32 joint_num = joint->getJointNum();
         if (joint_num < tab.size() && tab[joint_num].isRiggedTo())
-        {
-            return true;
+            {
+                return true;
+            }
         }
-    }
     return false;
 }
 
@@ -5929,25 +5932,25 @@ void LLVOAvatar::clearAttachmentOverrides()
     LLScopedContextString str("clearAttachmentOverrides " + getFullname());
 
     for (S32 i=0; i<LL_CHARACTER_MAX_ANIMATED_JOINTS; i++)
-    {
+	{
         LLJoint *pJoint = getJoint(i);
         if (pJoint)
         {
 			pJoint->clearAttachmentPosOverrides();
 			pJoint->clearAttachmentScaleOverrides();
         }
-    }
+	}
 
     if (mPelvisFixups.count()>0)
     {
         mPelvisFixups.clear();
         LLJoint* pJointPelvis = getJoint("mPelvis");
         if (pJointPelvis)
-        {
+	{
 			pJointPelvis->setPosition( LLVector3( 0.0f, 0.0f, 0.0f) );
         }
         postPelvisSetRecalc();	
-    }
+	}
 
     mActiveOverrideMeshes.clear();
     onActiveOverrideMeshesChanged();
@@ -5968,7 +5971,7 @@ void LLVOAvatar::rebuildAttachmentOverrides()
     // Handle the case that we're resetting the skeleton of an animated object.
     LLControlAvatar *control_av = dynamic_cast<LLControlAvatar*>(this);
     if (control_av)
-    {
+	{
         LLVOVolume *volp = control_av->mRootVolp;
         if (volp)
         {
@@ -6105,9 +6108,9 @@ void LLVOAvatar::updateAttachmentOverrides()
                 if (scale_overrides_by_joint[joint_num] != joint->m_attachmentScaleOverrides)
                 {
                     mismatched = true;
-                }
             }
         }
+    }
         if (pelvis_fixups != mPelvisFixups)
         {
             mismatched = true;
@@ -6126,10 +6129,10 @@ void LLVOAvatar::updateAttachmentOverrides()
 void LLVOAvatar::addAttachmentOverridesForObject(LLViewerObject *vo, std::set<LLUUID>* meshes_seen, bool recursive)
 {
     if (vo->getAvatar() != this && vo->getAvatarAncestor() != this)
-    {
+	{
 		LL_WARNS("Avatar") << "called with invalid avatar" << LL_ENDL;
         return;
-    }
+	}
 
     LLScopedContextString str("addAttachmentOverridesForObject " + getFullname());
     
@@ -6139,14 +6142,14 @@ void LLVOAvatar::addAttachmentOverridesForObject(LLViewerObject *vo, std::set<LL
 	// Process all children
     if (recursive)
     {
-        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;
+	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;
             addAttachmentOverridesForObject(childp, meshes_seen, true);
         }
-    }
+	}
 
 	LLVOVolume *vobj = dynamic_cast<LLVOVolume*>(vo);
 	bool pelvisGotSet = false;
@@ -6407,7 +6410,7 @@ void LLVOAvatar::removeAttachmentOverridesForObject(const LLUUID& mesh_id)
 	LLJoint* pJointPelvis = getJoint("mPelvis");
     const std::string av_string = avString();
     for (S32 joint_num = 0; joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS; joint_num++)
-    {
+	{
         LLJoint *pJoint = getJoint(joint_num);
 		if ( pJoint )
 		{			
@@ -7017,6 +7020,22 @@ const LLViewerJointAttachment *LLVOAvatar::attachObject(LLViewerObject *viewer_o
 		LLSelectMgr::getInstance()->updatePointAt();
 	}
 
+	viewer_object->refreshBakeTexture();
+
+
+	LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren();
+	for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+		iter != child_list.end(); ++iter)
+	{
+		LLViewerObject* objectp = *iter;
+		if (objectp)
+		{
+			objectp->refreshBakeTexture();
+		}
+	}
+
+	updateMeshVisibility();
+
 	return attachment;
 }
 
@@ -7220,7 +7239,6 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO )
 //-----------------------------------------------------------------------------
 BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)
 {
-
 	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
 		 iter != mAttachmentPoints.end();
 		 ++iter)
@@ -7231,12 +7249,28 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)
 		{
             updateVisualComplexity();
             bool is_animated_object = viewer_object->isAnimatedObject();
-			cleanupAttachedMesh( viewer_object );
+			cleanupAttachedMesh(viewer_object);
+
 			attachment->removeObject(viewer_object);
             if (!is_animated_object)
             {
                 updateAttachmentOverrides();
             }
+			viewer_object->refreshBakeTexture();
+		
+			LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren();
+			for (LLViewerObject::child_list_t::const_iterator iter1 = child_list.begin();
+				iter1 != child_list.end(); ++iter1)
+			{
+				LLViewerObject* objectp = *iter1;
+				if (objectp)
+            {
+					objectp->refreshBakeTexture();
+				}
+            }
+
+			updateMeshVisibility();
+
 			LL_DEBUGS() << "Detaching object " << viewer_object->mID << " from " << attachment->getName() << LL_ENDL;
 			return TRUE;
 		}
@@ -7372,7 +7406,7 @@ void LLVOAvatar::getOffObject()
 
     if (mEnableDefaultMotions)
     {
-        startMotion(ANIM_AGENT_BODY_NOISE);
+	startMotion(ANIM_AGENT_BODY_NOISE);
     }
 
 	if (isSelf())
@@ -7838,8 +7872,8 @@ bool LLVOAvatar::isTooComplex() const
         // yes, this leaves them vulnerable to griefing objects... their choice
         too_complex = (   max_render_cost > 0
                           && (mVisualComplexity > max_render_cost
-                                 || (max_attachment_area > 0.0f && mAttachmentSurfaceArea > max_attachment_area)
-                              ));
+                           || (max_attachment_area > 0.0f && mAttachmentSurfaceArea > max_attachment_area)
+                           ));
 	}
 
 	return too_complex;
@@ -7872,6 +7906,115 @@ void LLVOAvatar::debugColorizeSubMeshes(U32 i, const LLColor4& color)
 	}
 }
 
+
+//-----------------------------------------------------------------------------
+// updateMeshVisibility()
+// Hide the mesh joints if attachments are using baked textures
+//-----------------------------------------------------------------------------
+void LLVOAvatar::updateMeshVisibility()
+{
+	bool bake_flag[BAKED_NUM_INDICES];
+	memset(bake_flag, 0, BAKED_NUM_INDICES*sizeof(bool));
+
+	for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
+		iter != mAttachmentPoints.end();
+		++iter)
+	{
+		LLViewerJointAttachment* attachment = iter->second;
+		if (attachment)
+		{
+			for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+				attachment_iter != attachment->mAttachedObjects.end();
+				++attachment_iter)
+			{
+				LLViewerObject *objectp = (*attachment_iter);
+				if (objectp)
+				{
+					for (int face_index = 0; face_index < objectp->getNumTEs(); face_index++)
+					{
+						LLTextureEntry* tex_entry = objectp->getTE(face_index);
+						bake_flag[BAKED_HEAD] |= (tex_entry->getID() == IMG_USE_BAKED_HEAD);
+						bake_flag[BAKED_EYES] |= (tex_entry->getID() == IMG_USE_BAKED_EYES);
+						bake_flag[BAKED_HAIR] |= (tex_entry->getID() == IMG_USE_BAKED_HAIR);
+						bake_flag[BAKED_LOWER] |= (tex_entry->getID() == IMG_USE_BAKED_LOWER);
+						bake_flag[BAKED_UPPER] |= (tex_entry->getID() == IMG_USE_BAKED_UPPER);
+						bake_flag[BAKED_SKIRT] |= (tex_entry->getID() == IMG_USE_BAKED_SKIRT);
+						bake_flag[BAKED_LEFT_ARM] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTARM);
+						bake_flag[BAKED_LEFT_LEG] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTLEG);
+						bake_flag[BAKED_AUX1] |= (tex_entry->getID() == IMG_USE_BAKED_AUX1);
+						bake_flag[BAKED_AUX2] |= (tex_entry->getID() == IMG_USE_BAKED_AUX2);
+						bake_flag[BAKED_AUX3] |= (tex_entry->getID() == IMG_USE_BAKED_AUX3);
+					}
+				}
+
+				LLViewerObject::const_child_list_t& child_list = objectp->getChildren();
+				for (LLViewerObject::child_list_t::const_iterator iter1 = child_list.begin();
+					iter1 != child_list.end(); ++iter1)
+				{
+					LLViewerObject* objectchild = *iter1;
+					if (objectchild)
+					{
+						for (int face_index = 0; face_index < objectchild->getNumTEs(); face_index++)
+						{
+							LLTextureEntry* tex_entry = objectchild->getTE(face_index);
+							bake_flag[BAKED_HEAD] |= (tex_entry->getID() == IMG_USE_BAKED_HEAD);
+							bake_flag[BAKED_EYES] |= (tex_entry->getID() == IMG_USE_BAKED_EYES);
+							bake_flag[BAKED_HAIR] |= (tex_entry->getID() == IMG_USE_BAKED_HAIR);
+							bake_flag[BAKED_LOWER] |= (tex_entry->getID() == IMG_USE_BAKED_LOWER);
+							bake_flag[BAKED_UPPER] |= (tex_entry->getID() == IMG_USE_BAKED_UPPER);
+							bake_flag[BAKED_SKIRT] |= (tex_entry->getID() == IMG_USE_BAKED_SKIRT);
+							bake_flag[BAKED_LEFT_ARM] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTARM);
+							bake_flag[BAKED_LEFT_LEG] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTLEG);
+							bake_flag[BAKED_AUX1] |= (tex_entry->getID() == IMG_USE_BAKED_AUX1);
+							bake_flag[BAKED_AUX2] |= (tex_entry->getID() == IMG_USE_BAKED_AUX2);
+							bake_flag[BAKED_AUX3] |= (tex_entry->getID() == IMG_USE_BAKED_AUX3);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	//LL_INFOS() << "head " << bake_flag[BAKED_HEAD] << "eyes " << bake_flag[BAKED_EYES] << "hair " << bake_flag[BAKED_HAIR] << "lower " << bake_flag[BAKED_LOWER] << "upper " << bake_flag[BAKED_UPPER] << "skirt " << bake_flag[BAKED_SKIRT] << LL_ENDL;
+
+	for (S32 i = 0; i < mMeshLOD.size(); i++)
+	{
+		LLAvatarJoint* joint = mMeshLOD[i];
+		if (i == MESH_ID_HAIR)
+		{
+			joint->setVisible(!bake_flag[BAKED_HAIR], TRUE);
+		}
+		else if (i == MESH_ID_HEAD)
+		{
+			joint->setVisible(!bake_flag[BAKED_HEAD], TRUE);
+		}
+		else if (i == MESH_ID_SKIRT)
+		{
+			joint->setVisible(!bake_flag[BAKED_SKIRT], TRUE);
+		}
+		else if (i == MESH_ID_UPPER_BODY)
+		{
+			joint->setVisible(!bake_flag[BAKED_UPPER], TRUE);
+		}
+		else if (i == MESH_ID_LOWER_BODY)
+		{
+			joint->setVisible(!bake_flag[BAKED_LOWER], TRUE);
+		}
+		else if (i == MESH_ID_EYEBALL_LEFT)
+		{
+			joint->setVisible(!bake_flag[BAKED_EYES], TRUE);
+		}
+		else if (i == MESH_ID_EYEBALL_RIGHT)
+		{
+			joint->setVisible(!bake_flag[BAKED_EYES], TRUE);
+		}
+		else if (i == MESH_ID_EYELASH)
+		{
+			joint->setVisible(!bake_flag[BAKED_HEAD], TRUE);
+		}
+	}
+}
+
 //-----------------------------------------------------------------------------
 // updateMeshTextures()
 // Uses the current TE values to set the meshes' and layersets' textures.
@@ -8089,6 +8232,39 @@ void LLVOAvatar::updateMeshTextures()
 		removeMissingBakedTextures();	// May call back into this function if anything is removed
 		call_remove_missing = true;
 	}
+
+	//refresh bakes on any attached objects
+	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)
+		{
+			LLViewerObject* attached_object = (*attachment_iter);
+			if (attached_object && !attached_object->isDead())
+			{
+				attached_object->refreshBakeTexture();
+
+				LLViewerObject::const_child_list_t& child_list = attached_object->getChildren();
+				for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+					iter != child_list.end(); ++iter)
+				{
+					LLViewerObject* objectp = *iter;
+					if (objectp && !objectp->isDead())
+					{
+						objectp->refreshBakeTexture();
+					}
+				}
+			}
+		}
+	}
+
+	
+
 }
 
 // virtual
@@ -8732,7 +8908,7 @@ void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& conte
 	{
 		if (!isTextureDefined(mBakedTextureDatas[baked_index].mTextureIndex) 
 			&& mBakedTextureDatas[baked_index].mLastTextureID != IMG_DEFAULT
-			&& baked_index != BAKED_SKIRT)
+			&& baked_index != BAKED_SKIRT && baked_index != BAKED_LEFT_ARM && baked_index != BAKED_LEFT_LEG && baked_index != BAKED_AUX1 && baked_index != BAKED_AUX2 && baked_index != BAKED_AUX3)
 		{
 			LL_DEBUGS("Avatar") << avString() << " baked_index " << (S32) baked_index << " using mLastTextureID " << mBakedTextureDatas[baked_index].mLastTextureID << LL_ENDL;
 			setTEImage(mBakedTextureDatas[baked_index].mTextureIndex, 
@@ -8865,6 +9041,39 @@ void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& conte
 	}
 
 	updateMeshTextures();
+	updateMeshVisibility();
+
+}
+
+LLViewerTexture* LLVOAvatar::getBakedTexture(const U8 te)
+{
+	if (te < 0 || te >= BAKED_NUM_INDICES)
+	{
+		return NULL;
+	}
+
+	BOOL is_layer_baked = isTextureDefined(mBakedTextureDatas[te].mTextureIndex);
+	
+	LLViewerTexLayerSet* layerset = NULL;
+	layerset = getTexLayerSet(te);
+	
+
+	if (!isEditingAppearance() && is_layer_baked)
+	{
+		LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getImage(mBakedTextureDatas[te].mTextureIndex, 0), TRUE);
+		return baked_img;
+	}
+	else if (layerset && isEditingAppearance())
+	{
+		layerset->createComposite();
+		layerset->setUpdatesEnabled(TRUE);
+
+		return layerset->getViewerComposite();
+	}
+
+	return NULL;
+
+	
 }
 
 // static
@@ -9100,6 +9309,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )
 			}
 		}
 	}
+
 	dirtyMesh();
 }
 
@@ -9766,7 +9976,7 @@ void LLVOAvatar::updateImpostors()
 		iter != instances_copy.end(); ++iter)
 	{
 		LLVOAvatar* avatar = (LLVOAvatar*) *iter;
-		if (avatar && !avatar->isDead() && avatar->isVisible()
+		if (!avatar->isDead() && avatar->isVisible()
 			&& (
                 (avatar->isImpostor() || LLVOAvatar::AV_DO_NOT_RENDER == avatar->getVisualMuteSettings()) && avatar->needsImpostorUpdate())
             )
@@ -9972,122 +10182,122 @@ void LLVOAvatar::accountRenderComplexityForObject(
     hud_complexity_list_t& hud_complexity_list)
 {
     if (attached_object && !attached_object->isHUDAttachment())
-    {
+		{
         mAttachmentVisibleTriangleCount += attached_object->recursiveGetTriangleCount();
         mAttachmentEstTriangleCount += attached_object->recursiveGetEstTrianglesMax();
         mAttachmentSurfaceArea += attached_object->recursiveGetScaledSurfaceArea();
 
-        textures.clear();
-        const LLDrawable* drawable = attached_object->mDrawable;
-        if (drawable)
-        {
-            const LLVOVolume* volume = drawable->getVOVolume();
-            if (volume)
-            {
-                F32 attachment_total_cost = 0;
-                F32 attachment_volume_cost = 0;
-                F32 attachment_texture_cost = 0;
-                F32 attachment_children_cost = 0;
+					textures.clear();
+					const LLDrawable* drawable = attached_object->mDrawable;
+					if (drawable)
+					{
+						const LLVOVolume* volume = drawable->getVOVolume();
+						if (volume)
+						{
+                            F32 attachment_total_cost = 0;
+                            F32 attachment_volume_cost = 0;
+                            F32 attachment_texture_cost = 0;
+                            F32 attachment_children_cost = 0;
                 const F32 animated_object_attachment_surcharge = 1000;
 
                 if (attached_object->isAnimatedObject())
                 {
                     attachment_volume_cost += animated_object_attachment_surcharge;
                 }
-                attachment_volume_cost += volume->getRenderCost(textures);
+							attachment_volume_cost += volume->getRenderCost(textures);
 
-                const_child_list_t children = volume->getChildren();
-                for (const_child_list_t::const_iterator child_iter = children.begin();
-                     child_iter != children.end();
-                     ++child_iter)
-                {
-                    LLViewerObject* child_obj = *child_iter;
-                    LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj );
-                    if (child)
-                    {
-                        attachment_children_cost += child->getRenderCost(textures);
-                    }
-                }
+							const_child_list_t children = volume->getChildren();
+							for (const_child_list_t::const_iterator child_iter = children.begin();
+								  child_iter != children.end();
+								  ++child_iter)
+							{
+								LLViewerObject* child_obj = *child_iter;
+								LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj );
+								if (child)
+								{
+									attachment_children_cost += child->getRenderCost(textures);
+								}
+							}
 
-                for (LLVOVolume::texture_cost_t::iterator volume_texture = textures.begin();
-                     volume_texture != textures.end();
-                     ++volume_texture)
+							for (LLVOVolume::texture_cost_t::iterator volume_texture = textures.begin();
+								 volume_texture != textures.end();
+								 ++volume_texture)
+							{
+								// add the cost of each individual texture in the linkset
+								attachment_texture_cost += volume_texture->second;
+							}
+                            attachment_total_cost = attachment_volume_cost + attachment_texture_cost + attachment_children_cost;
+                            LL_DEBUGS("ARCdetail") << "Attachment costs " << attached_object->getAttachmentItemID()
+                                                   << " total: " << attachment_total_cost
+                                                   << ", volume: " << attachment_volume_cost
+                                                   << ", textures: " << attachment_texture_cost
+                                                   << ", " << volume->numChildren()
+                                                   << " children: " << attachment_children_cost
+                                                   << LL_ENDL;
+                            // Limit attachment complexity to avoid signed integer flipping of the wearer's ACI
+                            cost += (U32)llclamp(attachment_total_cost, MIN_ATTACHMENT_COMPLEXITY, max_attachment_complexity);
+						}
+					}
+				}
+                if (isSelf()
+                    && attached_object
+                    && attached_object->isHUDAttachment()
+                    && !attached_object->isTempAttachment()
+                    && attached_object->mDrawable)
                 {
-                    // add the cost of each individual texture in the linkset
-                    attachment_texture_cost += volume_texture->second;
-                }
-                attachment_total_cost = attachment_volume_cost + attachment_texture_cost + attachment_children_cost;
-                LL_DEBUGS("ARCdetail") << "Attachment costs " << attached_object->getAttachmentItemID()
-                                       << " total: " << attachment_total_cost
-                                       << ", volume: " << attachment_volume_cost
-                                       << ", textures: " << attachment_texture_cost
-                                       << ", " << volume->numChildren()
-                                       << " children: " << attachment_children_cost
-                                       << LL_ENDL;
-                // Limit attachment complexity to avoid signed integer flipping of the wearer's ACI
-                cost += (U32)llclamp(attachment_total_cost, MIN_ATTACHMENT_COMPLEXITY, max_attachment_complexity);
-            }
-        }
-    }
-    if (isSelf()
-        && attached_object
-        && attached_object->isHUDAttachment()
-        && !attached_object->isTempAttachment()
-        && attached_object->mDrawable)
-    {
-        textures.clear();
+                    textures.clear();
 
         mAttachmentSurfaceArea += attached_object->recursiveGetScaledSurfaceArea();
 
-        const LLVOVolume* volume = attached_object->mDrawable->getVOVolume();
-        if (volume)
-        {
-            LLHUDComplexity hud_object_complexity;
-            hud_object_complexity.objectName = attached_object->getAttachmentItemName();
-            hud_object_complexity.objectId = attached_object->getAttachmentItemID();
-            std::string joint_name;
-            gAgentAvatarp->getAttachedPointName(attached_object->getAttachmentItemID(), joint_name);
-            hud_object_complexity.jointName = joint_name;
-            // get cost and individual textures
-            hud_object_complexity.objectsCost += volume->getRenderCost(textures);
-            hud_object_complexity.objectsCount++;
-
-            LLViewerObject::const_child_list_t& child_list = attached_object->getChildren();
-            for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
-                 iter != child_list.end(); ++iter)
-            {
-                LLViewerObject* childp = *iter;
-                const LLVOVolume* chld_volume = dynamic_cast<LLVOVolume*>(childp);
-                if (chld_volume)
-                {
-                    // get cost and individual textures
-                    hud_object_complexity.objectsCost += chld_volume->getRenderCost(textures);
-                    hud_object_complexity.objectsCount++;
-                }
-            }
+                    const LLVOVolume* volume = attached_object->mDrawable->getVOVolume();
+                    if (volume)
+                    {
+                        LLHUDComplexity hud_object_complexity;
+                        hud_object_complexity.objectName = attached_object->getAttachmentItemName();
+                        hud_object_complexity.objectId = attached_object->getAttachmentItemID();
+                        std::string joint_name;
+                        gAgentAvatarp->getAttachedPointName(attached_object->getAttachmentItemID(), joint_name);
+                        hud_object_complexity.jointName = joint_name;
+                        // get cost and individual textures
+                        hud_object_complexity.objectsCost += volume->getRenderCost(textures);
+                        hud_object_complexity.objectsCount++;
+
+                        LLViewerObject::const_child_list_t& child_list = attached_object->getChildren();
+                        for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+                            iter != child_list.end(); ++iter)
+                        {
+                            LLViewerObject* childp = *iter;
+                            const LLVOVolume* chld_volume = dynamic_cast<LLVOVolume*>(childp);
+                            if (chld_volume)
+                            {
+                                // get cost and individual textures
+                                hud_object_complexity.objectsCost += chld_volume->getRenderCost(textures);
+                                hud_object_complexity.objectsCount++;
+                            }
+                        }
 
-            hud_object_complexity.texturesCount += textures.size();
+                        hud_object_complexity.texturesCount += textures.size();
 
-            for (LLVOVolume::texture_cost_t::iterator volume_texture = textures.begin();
-                 volume_texture != textures.end();
-                 ++volume_texture)
-            {
-                // add the cost of each individual texture (ignores duplicates)
-                hud_object_complexity.texturesCost += volume_texture->second;
-                LLViewerFetchedTexture *tex = LLViewerTextureManager::getFetchedTexture(volume_texture->first);
-                if (tex)
-                {
-                    // Note: Texture memory might be incorect since texture might be still loading.
-                    hud_object_complexity.texturesMemoryTotal += tex->getTextureMemory();
-                    if (tex->getOriginalHeight() * tex->getOriginalWidth() >= HUD_OVERSIZED_TEXTURE_DATA_SIZE)
-                    {
-                        hud_object_complexity.largeTexturesCount++;
+                        for (LLVOVolume::texture_cost_t::iterator volume_texture = textures.begin();
+                            volume_texture != textures.end();
+                            ++volume_texture)
+                        {
+                            // add the cost of each individual texture (ignores duplicates)
+                            hud_object_complexity.texturesCost += volume_texture->second;
+                            LLViewerFetchedTexture *tex = LLViewerTextureManager::getFetchedTexture(volume_texture->first);
+                            if (tex)
+                            {
+                                // Note: Texture memory might be incorect since texture might be still loading.
+                                hud_object_complexity.texturesMemoryTotal += tex->getTextureMemory();
+                                if (tex->getOriginalHeight() * tex->getOriginalWidth() >= HUD_OVERSIZED_TEXTURE_DATA_SIZE)
+                                {
+                                    hud_object_complexity.largeTexturesCount++;
+                                }
+                            }
+                        }
+                        hud_complexity_list.push_back(hud_object_complexity);
                     }
                 }
-            }
-            hud_complexity_list.push_back(hud_object_complexity);
-        }
-    }
 }
 
 // Calculations for mVisualComplexity value
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index b603381e6df26fdc6041b3d63477caad57dab80a..00dccc5d1215c66a7503f61109583bb79b96c403 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -617,6 +617,7 @@ class LLVOAvatar :
 public:
 	/*virtual*/ LLTexLayerSet*	createTexLayerSet(); // Return LLViewerTexLayerSet
 	void			releaseComponentTextures(); // ! BACKWARDS COMPATIBILITY !
+
 protected:
 	static void		onBakedTextureMasksLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
 	static void		onInitialBakedTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
@@ -701,6 +702,9 @@ class LLVOAvatar :
 	void 			updateSexDependentLayerSets();
 	virtual void	dirtyMesh(); // Dirty the avatar mesh
 	void 			updateMeshData();
+	void			updateMeshVisibility();
+	LLViewerTexture*		getBakedTexture(const U8 te);
+
 protected:
 	void 			releaseMeshData();
 	virtual void restoreMeshData();
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index e3747eaec826dfc14c253789a2338259e02313f5..c060529a9920d7235d194411476c010a090719fd 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -85,6 +85,7 @@
 #include "llviewerinventory.h"
 #include "llcallstack.h"
 #include "llsculptidsize.h"
+#include "llavatarappearancedefines.h"
 
 const F32 FORCE_SIMPLE_RENDER_AREA = 512.f;
 const F32 FORCE_CULL_AREA = 8.f;
@@ -2445,7 +2446,13 @@ S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialPa
 					case LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE:
 					case LLMaterial::DIFFUSE_ALPHA_MODE_MASK:
 						{ //all of them modes available only for 32 bit textures
-							if(GL_RGBA != img_diffuse->getPrimaryFormat())
+							LLTextureEntry* tex_entry = getTE(te);
+							bool bIsBakedImageId = false;
+							if (tex_entry && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(tex_entry->getID()))
+							{
+								bIsBakedImageId = true;
+							}
+							if (GL_RGBA != img_diffuse->getPrimaryFormat() && !bIsBakedImageId)
 							{
 								bSetDiffuseNone = true;
 							}
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index ee2270c3236fa0faac9a3a741f6f4d88d21511ea..e7bbee5efd9b9f3d1edda598b32de3c42b02f781 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -455,6 +455,7 @@ clothing_to_string_map_t init_clothing_string_map()
 	w_map.insert(std::make_pair(LLWearableType::WT_SKIRT, "skirt_not_worn"));
 	w_map.insert(std::make_pair(LLWearableType::WT_ALPHA, "alpha_not_worn"));
 	w_map.insert(std::make_pair(LLWearableType::WT_TATTOO, "tattoo_not_worn"));
+	w_map.insert(std::make_pair(LLWearableType::WT_UNIVERSAL, "universal_not_worn"));
 	w_map.insert(std::make_pair(LLWearableType::WT_PHYSICS, "physics_not_worn"));
 	return w_map;
 }
diff --git a/indra/newview/skins/default/textures/icons/Inv_Universal.png b/indra/newview/skins/default/textures/icons/Inv_Universal.png
new file mode 100644
index 0000000000000000000000000000000000000000..470febb9b53579fc03f35445f2fc61b72f83192e
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Inv_Universal.png differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 4dc9a8ddf57ef4bbe0ba1e732ab7548ea98c2325..1c83cd88b6152c43250dac301e03373247529fe1 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -317,6 +317,7 @@ with the same filename but different name
   <texture name="Inv_SysClosed" file_name="icons/Inv_SysClosed.png" preload="false" />
   <texture name="Inv_SysOpen" file_name="icons/Inv_SysOpen.png" preload="false" />
   <texture name="Inv_Tattoo" file_name="icons/Inv_Tattoo.png" preload="false" />
+  <texture name="Inv_Universal" file_name="icons/Inv_Universal.png" preload="false" />
   <texture name="Inv_Physics" file_name="icons/Inv_Physics.png" preload="false" />
   <texture name="Inv_Texture" file_name="icons/Inv_Texture.png" preload="false" />
   <texture name="Inv_TrashClosed" file_name="icons/Inv_TrashClosed.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index 90e2bb092318f682ec4d7fcd4c2936bd12adee88..21425b21be8aaabd04bdcc1a41104d903d31907e 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -52,7 +52,7 @@
      control_name="mode_selection"
      height="20"
      layout="topleft"
-     left="18"
+     left="0"
      top_pad="80"
      name="mode_selection"
      follows="left|top">
@@ -74,6 +74,15 @@
          name="local"
          value="1"
          width="75" />
+       <radio_item
+         label="Bake"
+         left_pad="0"
+         layout="topleft"
+         top_delta="0"
+         height="16"
+         name="bake"
+         value="2"
+         width="50" />
     </radio_group>
 	<!-- -->
 	
@@ -226,7 +235,81 @@
         <column name="unit_name" label="Name" dynamicwidth="true" />
         <column name="unit_id_HIDDEN" label="ID" width="0" />
     </scroll_list>
+
+<!-- middle: bake mode -->
+  <combo_box
+         left="180"
+         top="30"
+			   height="19"
+			   top_delta="15"
+			   layout="topleft"
+			   follows="left|top"
+			   name="l_bake_use_texture_combo_box"
+			   tool_tip="Choose the bake texture"
+			   width="118"
+         visible="false">
+        <combo_box.item
+         label="None"
+         name="None"
+         value="-1" />
+        <combo_box.item
+         label="BAKED_HEAD"
+         name="BAKED_HEAD"
+         value="0" />
+        <combo_box.item
+         label="BAKED_UPPER"
+         name="BAKED_UPPER"
+         value="1" />
+        <combo_box.item
+         label="BAKED_LOWER"
+         name="BAKED_LOWER"
+         value="2" />
+        <combo_box.item
+         label="BAKED_EYES"
+         name="BAKED_EYES"
+         value="3" />
+        <combo_box.item
+         label="BAKED_SKIRT"
+         name="BAKED_SKIRT"
+         value="4" />
+        <combo_box.item
+         label="BAKED_HAIR"
+         name="BAKED_HAIR"
+         value="5" />
+        <combo_box.item
+          label="BAKED_LEFTARM"
+          name="BAKED_LEFTARM"
+          value="6" />
+        <combo_box.item
+          label="BAKED_LEFTLEG"
+          name="BAKED_LEFTLEG"
+          value="7" />
+        <combo_box.item
+         label="BAKED_AUX1"
+         name="BAKED_AUX1"
+         value="8" />
+        <combo_box.item
+           label="BAKED_AUX2"
+           name="BAKED_AUX2"
+           value="9" />
+        <combo_box.item
+         label="BAKED_AUX3"
+         name="BAKED_AUX3"
+         value="10" />
+  </combo_box>
+  <check_box
+     follows="left|top"
+     height="20"
+     initial_value="false"
+     label="Hide Base Mesh Region"
      
+layout="topleft"
+     name="hide_base_mesh_region"
+     left_delta="0"
+     top_pad="10"
+     top_delta="0"
+     width="120" 
+     visible="false"/>
 <!-- bottom static -->
     <button
      follows="bottom"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 33ecb4477a7e907527e4097c48b580b1f345f1dd..9aa84c1bac4e5746e0403b234d8ad71d7d8618d0 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -267,6 +267,14 @@
              function="Inventory.DoCreate"
              parameter="tattoo" />
         </menu_item_call>
+        <menu_item_call
+         label="New Universal"
+         layout="topleft"
+         name="New Universal">
+        <menu_item_call.on_click
+         function="Inventory.DoCreate"
+         parameter="universal" />
+      </menu_item_call>
         <menu_item_call
          label="New Physics"
          layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
index 0caae9f2ef35cd8235c9991290768eb1c04d3e9e..331e64984b2b0bbebcc51fc29c929e950e8eb820 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
@@ -1,250 +1,258 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <menu
-        layout="topleft"
-        left="0"
-        mouse_opaque="false"
-        can_tear_off="false"
-        name="menu_inventory_add"
-        visible="false">
-    <menu
-            create_jump_keys="true"
-            label="Upload"
-            layout="topleft"
-            name="upload"
-            tear_off="true">
-        <menu_item_call
-                label="Image (L$[COST])..."
-                layout="topleft"
-                name="Upload Image"
-                shortcut="control|U">
-            <menu_item_call.on_click
-                    function="File.UploadImage"
-                    parameter="" />
-            <menu_item_call.on_enable
-                    function="File.EnableUpload" />
-        </menu_item_call>
-        <menu_item_call
-                label="Sound (L$[COST])..."
-                layout="topleft"
-                name="Upload Sound">
-            <menu_item_call.on_click
-                    function="File.UploadSound"
-                    parameter="" />
-            <menu_item_call.on_enable
-                    function="File.EnableUpload" />
-        </menu_item_call>
-        <menu_item_call
-                label="Animation (L$[COST])..."
-                layout="topleft"
-                name="Upload Animation">
-            <menu_item_call.on_click
-                    function="File.UploadAnim"
-                    parameter="" />
-            <menu_item_call.on_enable
-                    function="File.EnableUpload" />
-        </menu_item_call>
-        <menu_item_call
-                label="Model..."
-                layout="topleft"
-                name="Upload Model">
-            <menu_item_call.on_click
-                    function="File.UploadModel"
-                    parameter="" />
-            <menu_item_call.on_enable
-                    function="File.EnableUploadModel" />
-            <menu_item_call.on_visible
-                    function="File.VisibleUploadModel"/>
-        </menu_item_call>
-        <menu_item_call
-                label="Bulk (L$[COST] per file)..."
-                layout="topleft"
-                name="Bulk Upload">
-            <menu_item_call.on_click
-                    function="File.UploadBulk"
-                    parameter="" />
-        </menu_item_call>
-    </menu>
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ can_tear_off="false"
+ name="menu_inventory_add"
+ visible="false">
+            <menu
+             create_jump_keys="true"
+             label="Upload"
+             layout="topleft"
+             name="upload"
+             tear_off="true">
+                <menu_item_call
+                 label="Image (L$[COST])..."
+                 layout="topleft"
+                 name="Upload Image"
+                 shortcut="control|U">
+                    <menu_item_call.on_click
+                     function="File.UploadImage"
+                     parameter="" />
+                    <menu_item_call.on_enable
+                     function="File.EnableUpload" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Sound (L$[COST])..."
+                 layout="topleft"
+                 name="Upload Sound">
+                    <menu_item_call.on_click
+                     function="File.UploadSound"
+                     parameter="" />
+                    <menu_item_call.on_enable
+                     function="File.EnableUpload" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Animation (L$[COST])..."
+                 layout="topleft"
+                 name="Upload Animation">
+                    <menu_item_call.on_click
+                     function="File.UploadAnim"
+                     parameter="" />
+                    <menu_item_call.on_enable
+                     function="File.EnableUpload" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Model..."
+                 layout="topleft"
+                 name="Upload Model">
+                <menu_item_call.on_click
+                 function="File.UploadModel"
+                 parameter="" />
+                <menu_item_call.on_enable
+                 function="File.EnableUploadModel" />
+                <menu_item_call.on_visible
+                function="File.VisibleUploadModel"/>
+                </menu_item_call>
+                <menu_item_call
+                 label="Bulk (L$[COST] per file)..."
+                 layout="topleft"
+                 name="Bulk Upload">
+                    <menu_item_call.on_click
+                     function="File.UploadBulk"
+                     parameter="" />
+                </menu_item_call>
+            </menu>
 
-    <menu_item_call
-            label="New Folder"
-            layout="topleft"
-            name="New Folder">
-        <menu_item_call.on_click
-                function="Inventory.DoCreate"
-                parameter="category" />
-    </menu_item_call>
-    <menu_item_call
-            label="New Script"
-            layout="topleft"
-            name="New Script">
-        <menu_item_call.on_click
-                function="Inventory.DoCreate"
-                parameter="lsl" />
-    </menu_item_call>
-    <menu_item_call
-            label="New Notecard"
-            layout="topleft"
-            name="New Note">
-        <menu_item_call.on_click
-                function="Inventory.DoCreate"
-                parameter="notecard" />
-    </menu_item_call>
-    <menu_item_call
-            label="New Gesture"
-            layout="topleft"
-            name="New Gesture">
-        <menu_item_call.on_click
-                function="Inventory.DoCreate"
-                parameter="gesture" />
-    </menu_item_call>
-    <menu
-            height="175"
-            label="New Clothes"
-            layout="topleft"
-            left_delta="0"
-            mouse_opaque="false"
-            name="New Clothes"
-            top_pad="514"
-            width="125">
-        <menu_item_call
-                label="New Shirt"
-                layout="topleft"
-                name="New Shirt">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="shirt" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Pants"
-                layout="topleft"
-                name="New Pants">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="pants" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Shoes"
-                layout="topleft"
-                name="New Shoes">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="shoes" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Socks"
-                layout="topleft"
-                name="New Socks">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="socks" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Jacket"
-                layout="topleft"
-                name="New Jacket">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="jacket" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Skirt"
-                layout="topleft"
-                name="New Skirt">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="skirt" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Gloves"
-                layout="topleft"
-                name="New Gloves">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="gloves" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Undershirt"
-                layout="topleft"
-                name="New Undershirt">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="undershirt" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Underpants"
-                layout="topleft"
-                name="New Underpants">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="underpants" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Alpha"
-                layout="topleft"
-                name="New Alpha">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="alpha" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Tattoo"
-                layout="topleft"
-                name="New Tattoo">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="tattoo" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Physics"
-                layout="topleft"
-                name="New Physics">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="physics" />
-        </menu_item_call>
-    </menu>
-    <menu
-            height="85"
-            label="New Body Parts"
-            layout="topleft"
-            left_delta="0"
-            mouse_opaque="false"
-            name="New Body Parts"
-            top_pad="514"
-            width="118">
-        <menu_item_call
-                label="New Shape"
-                layout="topleft"
-                name="New Shape">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="shape" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Skin"
-                layout="topleft"
-                name="New Skin">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="skin" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Hair"
-                layout="topleft"
-                name="New Hair">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="hair" />
-        </menu_item_call>
-        <menu_item_call
-                label="New Eyes"
-                layout="topleft"
-                name="New Eyes">
-            <menu_item_call.on_click
-                    function="Inventory.DoCreate"
-                    parameter="eyes" />
-        </menu_item_call>
-    </menu>
+            <menu_item_call
+             label="New Folder"
+             layout="topleft"
+             name="New Folder">
+                <menu_item_call.on_click
+                 function="Inventory.DoCreate"
+                 parameter="category" />
+            </menu_item_call>
+            <menu_item_call
+             label="New Script"
+             layout="topleft"
+             name="New Script">
+                <menu_item_call.on_click
+                 function="Inventory.DoCreate"
+                 parameter="lsl" />
+            </menu_item_call>
+            <menu_item_call
+             label="New Notecard"
+             layout="topleft"
+             name="New Note">
+                <menu_item_call.on_click
+                 function="Inventory.DoCreate"
+                 parameter="notecard" />
+            </menu_item_call>
+            <menu_item_call
+             label="New Gesture"
+             layout="topleft"
+             name="New Gesture">
+                <menu_item_call.on_click
+                 function="Inventory.DoCreate"
+                 parameter="gesture" />
+            </menu_item_call>
+            <menu
+             height="175"
+             label="New Clothes"
+             layout="topleft"
+             left_delta="0"
+             mouse_opaque="false"
+             name="New Clothes"
+             top_pad="514"
+             width="125">
+                <menu_item_call
+                 label="New Shirt"
+                 layout="topleft"
+                 name="New Shirt">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="shirt" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Pants"
+                 layout="topleft"
+                 name="New Pants">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="pants" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Shoes"
+                 layout="topleft"
+                 name="New Shoes">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="shoes" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Socks"
+                 layout="topleft"
+                 name="New Socks">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="socks" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Jacket"
+                 layout="topleft"
+                 name="New Jacket">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="jacket" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Skirt"
+                 layout="topleft"
+                 name="New Skirt">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="skirt" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Gloves"
+                 layout="topleft"
+                 name="New Gloves">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="gloves" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Undershirt"
+                 layout="topleft"
+                 name="New Undershirt">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="undershirt" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Underpants"
+                 layout="topleft"
+                 name="New Underpants">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="underpants" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Alpha"
+                 layout="topleft"
+                 name="New Alpha">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="alpha" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Tattoo"
+                 layout="topleft"
+                 name="New Tattoo">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="tattoo" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Universal"
+                 layout="topleft"
+                 name="New Universal">
+                <menu_item_call.on_click
+                 function="Inventory.DoCreate"
+                 parameter="universal" />
+              </menu_item_call>
+                <menu_item_call
+                 label="New Physics"
+                 layout="topleft"
+                 name="New Physics">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="physics" />
+                </menu_item_call>
+            </menu>
+            <menu
+             height="85"
+             label="New Body Parts"
+             layout="topleft"
+             left_delta="0"
+             mouse_opaque="false"
+             name="New Body Parts"
+             top_pad="514"
+             width="118">
+                <menu_item_call
+                 label="New Shape"
+                 layout="topleft"
+                 name="New Shape">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="shape" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Skin"
+                 layout="topleft"
+                 name="New Skin">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="skin" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Hair"
+                 layout="topleft"
+                 name="New Hair">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="hair" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Eyes"
+                 layout="topleft"
+                 name="New Eyes">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="eyes" />
+                </menu_item_call>
+            </menu>
     <menu
             label="New Settings"
             layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
index 7faa4f3d71f1b9aff2af82e18aa77a7bb33070a2..61cb74f2304c9de6a139ae8191e5973463e25307 100644
--- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
@@ -175,6 +175,14 @@
                      function="Gear.Create"
                      parameter="tattoo" />
                 </menu_item_call>
+              <menu_item_call
+                 label="New Universal"
+                 layout="topleft"
+                 name="New Universal">
+                <menu_item_call.on_click
+                 function="Gear.Create"
+                 parameter="universal" />
+              </menu_item_call>
             </menu>
             <menu
              height="85"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index d9b06347ca532d39b31acbe805f3259c80889e6c..8b5c30b8f9626456c61fe20f3490a7780923c8f8 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -714,107 +714,108 @@
                  function="World.EnableEnvSettings" 
                  parameter="region" />
             </menu_item_check>
-            <menu_item_separator/>
-            <menu_item_call
-             label="My Environments..."
-             name="my_environs">
-                <menu_item_call.on_click
-                 function="World.EnvSettings"
-                 parameter="my_environs" />
-            </menu_item_call>
-            <menu_item_call
-             label="Personal Lighting..."
-             name="adjustment_tool">
-                <menu_item_call.on_click
-                 function="World.EnvSettings"
-                 parameter="adjust_tool" />
-            </menu_item_call>
-            <menu_item_separator/>
-            <menu_item_check
-             label="Pause Clouds"
-             name="pause_clouds">
-                <menu_item_check.on_click
-                 function="World.EnvSettings"
-                 parameter="pause_clouds" />
-                <menu_item_check.on_check
-                 function="World.EnableEnvSettings" 
-                 parameter="pause_clouds" />
-            </menu_item_check>
-            
-        </menu>
+        <menu_item_separator/>
 	    
-<!--   
+<menu_item_call
+   
+label="My Environments..."
+	    name="my_environs">
+	     <menu_item_call.on_click
+	     function="World.EnvSettings"
+	     parameter="my_environs" />
+	     	
+</menu_item_call>
+	     	<menu_item_call
+	     	 label="Personal Lighting..."
+	     	 name="adjustment_tool">
+	     	 	<menu_item_call.on_click
+	     	 	 function="World.EnvSettings"
+                 parameter="adjust_tool" />
+	     	</menu_item_call>
+	     	
+<menu_item_separator/>
+	     	
+<menu_item_check
+	     	label="Pause Clouds"
+	     	 name="pause_clouds">
+	     	 	<menu_item_check.on_click
+	     	 	 function="World.EnvSettings"
+	     	 	 parameter="pause_clouds" />
+	     	 	 	<menu_item_check.on_check
+	     	 	 	function="World.EnableEnvSettings" 
+	     	 	 	parameter="pause_clouds" />
+	     	 	</menu_item_check>
+	     	 		     	 	 </menu>
+	     	 	 <!--   
 	    <menu
 	     create_jump_keys="true"
 	     label="Environment Editor"
 	     name="Environment Editor"
 	     tear_off="true">
-	     	
-	     	<menu_item_call
+	     	 	 		     	<menu_item_call
 	     	 label="Environment Settings..."
 	     	 name="Environment Settings">
-	     	 	<menu_item_call.on_click
+<menu_item_call.on_click
 	     	 	 function="World.EnvSettings"
                  parameter="editor"/>
 	     	</menu_item_call>
 	     		     	<menu_item_separator/>
-
-	     	<menu
+	     	 	 		     	<menu
 	     	 name="Water Presets"
 	     	 label="Water Presets">
 	     	 	<menu_item_call
 	     	 	 label="New preset..."
 	     	 	 name="new_water_preset">
 	     	 	 	<menu_item_call.on_click
-	     	 	 	function="World.EnvPreset"
+function="World.EnvPreset"
 	     	 	 	parameter="new_water"/>
-	     	 	</menu_item_call>
-	     	 	<menu_item_call
+</menu_item_call>
+<menu_item_call
 	     	 	 label="Edit preset..."
 	     	 	 name="edit_water_preset">
-	     	 	 	<menu_item_call.on_click
-	     	 	 	function="World.EnvPreset"
+<menu_item_call.on_click
+function="World.EnvPreset"
 	     	 	 	parameter="edit_water"/>
-	     	 	</menu_item_call>
-	     	</menu>
-
-	     	<menu
-	     	 name="Sky Presets"
+</menu_item_call>
+</menu>
+	     	
+<menu
+name="Sky Presets"
 	     	 label="Sky Presets">
-	     	 	<menu_item_call
-	     	 	 label="New preset..."
+<menu_item_call
+label="New preset..."
 	     	 	 name="new_sky_preset">
-	     	 	 	<menu_item_call.on_click
-	     	 	 	function="World.EnvPreset"
+<menu_item_call.on_click
+function="World.EnvPreset"
 	     	 	 	parameter="new_sky"/>
-	     	 	</menu_item_call>
-	     	 	<menu_item_call
-	     	 	 label="Edit preset..."
+</menu_item_call>
+<menu_item_call
+label="Edit preset..."
 	     	 	 name="edit_sky_preset">
-	     	 	 	<menu_item_call.on_click
-	     	 	 	function="World.EnvPreset"
+<menu_item_call.on_click
+function="World.EnvPreset"
 	     	 	 	parameter="edit_sky"/>
-	     	 	</menu_item_call>
-	     	</menu>
-	     		     	<menu
-	     	 name="Day Presets"
+</menu_item_call>
+</menu>
+<menu
+name="Day Presets"
 	     	 label="Day Presets">
-	     	 	<menu_item_call
-	     	 	 label="New preset..."
+<menu_item_call
+label="New preset..."
 	     	 	 name="new_day_preset">
-	     	 	 	<menu_item_call.on_click
-	     	 	 	function="World.EnvPreset"
+<menu_item_call.on_click
+function="World.EnvPreset"
 	     	 	 	parameter="new_day_cycle"/>
-	     	 	</menu_item_call>
-	     	 	<menu_item_call
-	     	 	 label="Edit preset..."
+</menu_item_call>
+<menu_item_call
+label="Edit preset..."
 	     	 	 name="edit_day_preset">
-	     	 	 	<menu_item_call.on_click
-	     	 	 	function="World.EnvPreset"
+<menu_item_call.on_click
+function="World.EnvPreset"
 	     	 	 	parameter="edit_day_cycle"/>
-	     	 	</menu_item_call>
-	     	</menu>
-	    </menu>
+</menu_item_call>
+</menu>
+</menu>
 -->    
     
     </menu>
@@ -2951,8 +2952,8 @@
                  function="ToggleControl"
                  parameter="TextureDisable" />
             </menu_item_check>
-          <menu_item_check
-             label="Disable Ambient"
+            <menu_item_check
+              label="Disable Ambient"
              name="Disable Ambient">
             <menu_item_check.on_check
              function="CheckControl"
@@ -4036,6 +4037,16 @@
                  function="Edit.EnableTakeOff"
                  parameter="tattoo" />
             </menu_item_call>
+            <menu_item_call
+             label="Universal"
+             name="Universal">
+              <menu_item_call.on_click
+               function="Edit.TakeOff"
+               parameter="tattoo" />
+              <menu_item_call.on_enable
+               function="Edit.EnableTakeOff"
+               parameter="universal" />
+            </menu_item_call>
             <menu_item_call
              label="Physics"
              name="Physics">
diff --git a/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml
index 97f1a1a6589bbd8b5de6e3a56f254ea92a617095..8fa85dce5f2d4dcb72d17965873c5eac2685f4b2 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml
@@ -1,85 +1,98 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
- <panel
-     background_visible="true"
-	 follows="all"
-	 height="400"
-	 layout="topleft"
-	 left="0"
-	 name="edit_tattoo_panel"
-	 top_pad="10"
-	 width="333" >
-	 <panel
-	  border="false"
-      bg_alpha_color="DkGray2"
-      bg_opaque_color="DkGray2"
-      background_visible="true"
-      background_opaque="true"
-	  follows="all"
-	  height="400" 
-	  left="10" 
-	  layout="topleft" 
-	  name="avatar_tattoo_color_panel"
-	  top="0"
-	  width="313" >
-       <texture_picker
-        can_apply_immediately="true"
-        default_image_name="Default"
-        follows="left|top"
-        height="115"
-        label="Head Tattoo"
-        layout="topleft"
-        left="20"
-        name="Head Tattoo"
-        tool_tip="Click to choose a picture"
-        top="10"
-        width="115" >
-         <texture_picker.commit_callback
-             function="TexturePicker.Commit" />
-       </texture_picker>
-       <texture_picker
-        can_apply_immediately="true"
-        default_image_name="Default"
-        follows="left|top"
-        height="115"
-        label="Upper Tattoo"
-        layout="topleft"
-        left_pad="30"
-        name="Upper Tattoo"
-        tool_tip="Click to choose a picture"
-        top="10"
-        width="115" >
-         <texture_picker.commit_callback
-             function="TexturePicker.Commit" />
-       </texture_picker>
-       <texture_picker
-        can_apply_immediately="true"
-        default_image_name="Default"
-        follows="left|top"
-        height="115"
-        label="Lower Tattoo"
-        layout="topleft"
-        left="20"
-        name="Lower Tattoo"
-        tool_tip="Click to choose a picture"
-        top_pad="10"
-        width="115" >
-         <texture_picker.commit_callback
-             function="TexturePicker.Commit" />
-       </texture_picker>
-       <color_swatch
-        can_apply_immediately="true"
-        follows="left|top"
-        height="115"
-        label="Color/Tint"
-        layout="topleft"
-        left_pad="30"
-        name="Color/Tint"
-        tool_tip="Click to open color picker"
-        top_delta="0"
-        width="115" >
-         <color_swatch.commit_callback
-             function="ColorSwatch.Commit" />
-       </color_swatch>
-	 </panel>
+<panel
+    background_visible="true"
+  follows="all"
+  height="400"
+  layout="topleft"
+  left="0"
+  name="edit_tattoo_panel"
+  top_pad="10"
+  width="333" >
+  <scroll_container
+     color="DkGray2"
+     follows="all"
+     height="400"
+     layout="topleft"
+     left="9"
+     name="avatar_tattoo_scroll"
+     opaque="true"
+     top_pad="10"
+     width="314">
+    <panel
+     border="false"
+       bg_alpha_color="DkGray2"
+       bg_opaque_color="DkGray2"
+       background_visible="true"
+       background_opaque="true"
+     follows="all"
+     height="800"
+     left="10"
+     layout="topleft"
+     name="avatar_tattoo_color_panel"
+     top="0"
+     width="313" >
+      <texture_picker
+       can_apply_immediately="true"
+       default_image_name="Default"
+       follows="left|top"
+       height="115"
+       label="Head Tattoo"
+       layout="topleft"
+       left="20"
+       name="Head Tattoo"
+       tool_tip="Click to choose a picture"
+       top="10"
+       width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+      <texture_picker
+       can_apply_immediately="true"
+       default_image_name="Default"
+       follows="left|top"
+       height="115"
+       label="Upper Tattoo"
+       layout="topleft"
+       left_pad="30"
+       name="Upper Tattoo"
+       tool_tip="Click to choose a picture"
+       top="10"
+       width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+      <texture_picker
+       can_apply_immediately="true"
+       default_image_name="Default"
+       follows="left|top"
+       height="115"
+       label="Lower Tattoo"
+       layout="topleft"
+       left="20"
+       name="Lower Tattoo"
+       tool_tip="Click to choose a picture"
+       top_pad="10"
+       width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+      
+
+      <color_swatch
+       can_apply_immediately="true"
+       follows="left|top"
+       height="115"
+       label="Color/Tint"
+       layout="topleft"
+       left_pad="30"
+       name="Color/Tint"
+       tool_tip="Click to open color picker"
+       top_delta="0"
+       width="115" >
+        <color_swatch.commit_callback
+            function="ColorSwatch.Commit" />
+      </color_swatch>
+    </panel>
+  </scroll_container>
 </panel>
 
diff --git a/indra/newview/skins/default/xui/en/panel_edit_universal.xml b/indra/newview/skins/default/xui/en/panel_edit_universal.xml
new file mode 100644
index 0000000000000000000000000000000000000000..11cabdfe6ee342cd292a31ea8ed523ea1cbadbd8
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_universal.xml
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+    background_visible="true"
+  follows="all"
+  height="400"
+  layout="topleft"
+  left="0"
+  name="edit_universal_panel"
+  top_pad="10"
+  width="333" >
+  <scroll_container
+     color="DkGray2"
+     follows="all"
+     height="380"
+     layout="topleft"
+     left="9"
+     name="avatar_universal_scroll"
+     opaque="true"
+     top_pad="10"
+     width="323">
+    <panel
+     border="false"
+       bg_alpha_color="DkGray2"
+       bg_opaque_color="DkGray2"
+       background_visible="true"
+       background_opaque="true"
+     follows="all"
+     height="800"
+     left="10"
+     layout="topleft"
+     name="avatar_universal_color_panel"
+     top="0"
+     width="313" >
+      <texture_picker
+       can_apply_immediately="true"
+       default_image_name="Default"
+       follows="left|top"
+       height="115"
+       label="Head Tattoo"
+       layout="topleft"
+       left="20"
+       top_pad="10"
+       name="Head Universal Tattoo"
+       tool_tip="Click to choose a picture"
+       
+       width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+      <texture_picker
+       can_apply_immediately="true"
+       default_image_name="Default"
+       follows="left|top"
+       height="115"
+       label="Upper Tattoo"
+       layout="topleft"
+       left_pad="30"
+       top_delta="0"
+       name="Upper Universal Tattoo"
+       tool_tip="Click to choose a picture"
+       
+       width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+      <texture_picker
+       can_apply_immediately="true"
+       default_image_name="Default"
+       follows="left|top"
+       height="115"
+       label="Lower Tattoo"
+       layout="topleft"
+       left="20"
+       top_pad="10"
+       name="Lower Universal Tattoo"
+       tool_tip="Click to choose a picture"
+       
+       width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+
+      <texture_picker
+         can_apply_immediately="true"
+         default_image_name="Default"
+         follows="left|top"
+         height="115"
+         label="Skirt Tattoo"
+         layout="topleft"
+         left_pad="30"
+         top_delta="0"
+         name="Skirt Tattoo"
+         tool_tip="Click to choose a picture"
+         
+         width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+      
+      <texture_picker
+       can_apply_immediately="true"
+       default_image_name="Default"
+       follows="left|top"
+       height="115"
+       label="Hair Tattoo"
+       layout="topleft"
+       left="20"
+       top_pad="10"
+       name="Hair Tattoo"
+       tool_tip="Click to choose a picture"
+       
+       width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+      <texture_picker
+       can_apply_immediately="true"
+       default_image_name="Default"
+       follows="left|top"
+       height="115"
+       label="Eyes Tattoo"
+       layout="topleft"
+       left_pad="30"
+       top_delta="0"
+       name="Eyes Tattoo"
+       tool_tip="Click to choose a picture"
+       
+       width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+      <texture_picker
+       can_apply_immediately="true"
+       default_image_name="Default"
+       follows="left|top"
+       height="115"
+       label="Left Arm Tattoo"
+       layout="topleft"
+       left="20"
+       top_pad="10"
+       name="Left Arm Tattoo"
+       tool_tip="Click to choose a picture"
+       
+       width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+      <texture_picker
+       can_apply_immediately="true"
+       default_image_name="Default"
+       follows="left|top"
+       height="115"
+       label="Left Leg Tattoo"
+       layout="topleft"
+       left_pad="30"
+       top_delta="0"
+       name="Left Leg Tattoo"
+       tool_tip="Click to choose a picture"
+       
+       width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+      <texture_picker
+       can_apply_immediately="true"
+       default_image_name="Default"
+       follows="left|top"
+       height="115"
+       label="Aux1 Tattoo"
+       layout="topleft"
+       left="20"
+       top_pad="10"
+       name="Aux1 Tattoo"
+       tool_tip="Click to choose a picture"
+       
+       width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+      <texture_picker
+       can_apply_immediately="true"
+       default_image_name="Default"
+       follows="left|top"
+       height="115"
+       label="Aux2 Tattoo"
+       layout="topleft"
+       left_pad="30"
+       top_delta="0"
+       name="Aux2 Tattoo"
+       tool_tip="Click to choose a picture"
+       
+       width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+      <texture_picker
+       can_apply_immediately="true"
+       default_image_name="Default"
+       follows="left|top"
+       height="115"
+       label="Aux3 Tattoo"
+       layout="topleft"
+       left="20"
+       top_pad="10"
+       name="Aux3 Tattoo"
+       tool_tip="Click to choose a picture"
+       
+       width="115" >
+        <texture_picker.commit_callback
+            function="TexturePicker.Commit" />
+      </texture_picker>
+      
+      <color_swatch
+       can_apply_immediately="true"
+       follows="left|top"
+       height="115"
+       label="Color/Tint"
+       layout="topleft"
+       left_pad="30"
+       top_delta="0"
+       name="Color/Tint"
+       tool_tip="Click to open color picker"
+       
+       width="115" >
+        <color_swatch.commit_callback
+            function="ColorSwatch.Commit" />
+      </color_swatch>
+    </panel>
+  </scroll_container>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
index f34b9132189318f140e331877f2089df1f05ffef..dc1553e6a30757a83cbdde600761d6f6ff840c74 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
@@ -71,6 +71,10 @@
      name="edit_tattoo_title">
         Editing Tattoo
     </string>
+  <string
+   name="edit_universal_title">
+    Editing Universal
+  </string>
     <string
      name="edit_physics_title">
         Editing Physics
@@ -135,6 +139,10 @@
      name="tattoo_desc_text">
         Tattoo:
     </string>
+  <string
+     name="universal_desc_text">
+    Universal:
+  </string>
     <string
      name="physics_desc_text">
         Physics:
@@ -418,6 +426,16 @@
          top="8"
          visible="false"
          width="333" />
+      <panel
+         filename="panel_edit_universal.xml"
+         follows="all"
+         height="425"
+         layout="topleft"
+         left="0"
+         name="edit_universal_panel"
+         top="8"
+         visible="false"
+         width="333" />
         <panel
          filename="panel_edit_physics.xml"
          follows="all"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index f6bc35be3ba1349cbcff1c4d9c98e597c57d4e09..62bdc89369c3a9d810ae5c0e4d84678c41548ee7 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -410,7 +410,7 @@ http://secondlife.com/support for help fixing this problem.
 	<string name="favorite">favorite</string>
 	<string name="symbolic link">link</string>
 	<string name="symbolic folder link">folder link</string>
-	<string name="settings blob">settings</string>
+  <string name="settings blob">settings</string>
 	<string name="mesh">mesh</string>
 
 	<!-- llvoavatar. Displayed in the avatar chat bubble -->
@@ -536,7 +536,8 @@ http://secondlife.com/support for help fixing this problem.
 	<string name="ManageEstateSilently">Manage your estates silently</string>
 	<string name="ChangeYourDefaultAnimations">Change your default animations</string>
 	<string name="ForceSitAvatar">Force your avatar to sit</string>
-	<string name="ChangeEnvSettings">Change your environment settings</string>
+	
+<string name="ChangeEnvSettings">Change your environment settings</string>
 	
 	<string name="NotConnected">Not Connected</string>
 	<string name="AgentNameSubst">(You)</string> <!-- Substitution for agent name -->
@@ -2227,6 +2228,7 @@ For AI Character: Get the closest navigable point to the point provided.
 	<string name="skirt">Skirt</string>
 	<string name="alpha">Alpha</string>
 	<string name="tattoo">Tattoo</string>
+  <string name="universal">Universal</string>
   <string name="physics">Physics</string>
   <string name="invalid">invalid</string>
   <string name="none">none</string>
@@ -2243,6 +2245,7 @@ For AI Character: Get the closest navigable point to the point provided.
 	<string name="skirt_not_worn">Skirt not worn</string>
 	<string name="alpha_not_worn">Alpha not worn</string>
 	<string name="tattoo_not_worn">Tattoo not worn</string>
+  <string name="universal_not_worn">Universal not worn</string>
   <string name="physics_not_worn">Physics not worn</string>
 	<string name="invalid_not_worn">invalid</string>
 
@@ -2262,6 +2265,7 @@ For AI Character: Get the closest navigable point to the point provided.
 	<string name="create_new_skirt">Create new skirt</string>
 	<string name="create_new_alpha">Create new alpha</string>
 	<string name="create_new_tattoo">Create new tattoo</string>
+  <string name="create_new_universal">Create new universal</string>
   <string name="create_new_physics">Create new physics</string>
 	<string name="create_new_invalid">invalid</string>
 
@@ -2790,7 +2794,8 @@ If you continue to receive this message, please contact Second Life support for
 	<!-- Environment settings -->
 	<string name="LocalSettings">Local Settings</string>
 	<string name="RegionSettings">Region Settings</string>
-	<string name="NoEnvironmentSettings">This Region does not support environmental settings.</string>
+
+<string name="NoEnvironmentSettings">This Region does not support environmental settings.</string>
 
 	<string name="EnvironmentSun">Sun</string>
 	<string name="EnvironmentMoon">Moon</string>
@@ -3835,6 +3840,7 @@ Abuse Report</string>
   <string name="New Skirt">New Skirt</string>
   <string name="New Alpha">New Alpha</string>
   <string name="New Tattoo">New Tattoo</string>
+  <string name="New Universal">New Universal</string>
   <string name="New Physics">New Physics</string>
   <string name="Invalid Wearable">Invalid Wearable</string>
   <string name="New Gesture">New Gesture</string>
@@ -3879,7 +3885,8 @@ Abuse Report</string>
   <string name="Female - Shrug">Female - Shrug</string>
   <string name="Female - Stick tougue out">Female - Stick tongue out</string>
   <string name="Female - Wow">Female - Wow</string>
-  <!-- settings -->
+
+<!-- settings -->
   <string name="New Daycycle">New Daycycle</string>
   <string name="New Water">New Water</string>
   <string name="New Sky">New Sky</string>
@@ -4240,7 +4247,8 @@ Try enclosing path to the editor with double quotes.
   <string name="ExperiencePermissionShort10">Control Camera</string>
   <string name="ExperiencePermissionShort11">Teleport</string>
   <string name="ExperiencePermissionShort12">Permission</string>
-  <string name="ExperiencePermissionShort16">Sit</string>
+
+<string name="ExperiencePermissionShort16">Sit</string>
   <string name="ExperiencePermissionShort17">Environment</string>
 
   <!-- Conversation log messages -->