diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 3cc44638b164af75eb0f5044a4fe298ca0bb0b21..5a502b61abc9a615d99cdee2f961f382371100ef 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -4376,8 +4376,8 @@ LLViewerTexture* LLViewerObject::getBakedTextureForMagicId(const LLUUID& id)
 	LLVOAvatar* avatar = getAvatar();
 	if (avatar)
 	{
-		LLAvatarAppearanceDefines::ETextureIndex texIndex = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::bakedToLocalTextureIndex(LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::assetIdToBakedTextureIndex(id));
-		LLViewerTexture* bakedTexture = avatar->getBakedTextureImage(texIndex, avatar->getTE(texIndex)->getID());
+		LLAvatarAppearanceDefines::EBakedTextureIndex texIndex = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::assetIdToBakedTextureIndex(id);
+		LLViewerTexture* bakedTexture = avatar->getBakedTexture(texIndex);
 		if (bakedTexture == NULL || bakedTexture->isMissingAsset())
 		{
 			return LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 9e2a69ae65c413828fc06bc82ce205666b9a91c1..6e49a92e973063ce2ed073448d9ee831a86fa838 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -7558,6 +7558,33 @@ void LLVOAvatar::updateMeshTextures()
 		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);
+			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->refreshBakeTexture();
+				}
+			}
+		}
+	}
+
 	
 
 }
@@ -8336,36 +8363,54 @@ void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& conte
 	}
 
 	updateMeshTextures();
+	updateMeshVisibility();
 
-	//refresh bakes on any attached objects
-	for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
-		iter != mAttachmentPoints.end();
-		++iter)
+}
+
+LLViewerTexture* LLVOAvatar::getBakedTexture(const U8 te)
+{
+	if (te < 0 || te >= BAKED_NUM_INDICES)
 	{
-		LLViewerJointAttachment* attachment = iter->second;
+		return NULL;
+	}
 
-		for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
-			attachment_iter != attachment->mAttachedObjects.end();
-			++attachment_iter)
-		{
-			LLViewerObject* attached_object = (*attachment_iter);
-			attached_object->refreshBakeTexture();
+	BOOL is_layer_baked = isTextureDefined(mBakedTextureDatas[te].mTextureIndex);
+	BOOL use_lkg_baked_layer; // lkg = "last known good"
+	
+	LLViewerTexLayerSet* layerset = NULL;
+	layerset = getTexLayerSet(te);
+	BOOL layerset_invalid = layerset && (!layerset->getViewerComposite()->isInitialized() || !layerset->isLocalTextureDataAvailable());
+	use_lkg_baked_layer = (!is_layer_baked && (mBakedTextureDatas[te].mLastTextureID != IMG_DEFAULT_AVATAR) && layerset_invalid);
+	if (use_lkg_baked_layer)
+	{
+		layerset->setUpdatesEnabled(TRUE);
+	}
+	else
+	{
+		use_lkg_baked_layer = (!is_layer_baked && mBakedTextureDatas[te].mLastTextureID != IMG_DEFAULT_AVATAR);
+	}
 
-			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->refreshBakeTexture();
-				}
-			}
-		}
+	if (use_lkg_baked_layer && !isUsingLocalAppearance())
+	{
+		LLViewerFetchedTexture* baked_img = LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[te].mLastTextureID);
+		return baked_img;
 	}
+	else if (!isUsingLocalAppearance() && is_layer_baked)
+	{
+		LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getImage(mBakedTextureDatas[te].mTextureIndex, 0), TRUE);
+		return baked_img;
+	}
+	else if (layerset && isUsingLocalAppearance())
+	{
+		layerset->createComposite();
+		layerset->setUpdatesEnabled(TRUE);
 
-	updateMeshVisibility();
+		return layerset->getViewerComposite();
+	}
+
+	return NULL;
 
+	
 }
 
 // static
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 1b0044201f6c6d4306d9ba789c0ff320b465a5b8..8d45877a9d3afb9a3020a4692d82bece29210467 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -655,6 +655,7 @@ public:
 	virtual void	dirtyMesh(); // Dirty the avatar mesh
 	void 			updateMeshData();
 	void			updateMeshVisibility();
+	LLViewerTexture*		getBakedTexture(const U8 te);
 
 protected:
 	void 			releaseMeshData();