diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index baf34b42ff3851eeced747cbaca07cbfbea54722..b41695fd3419b86ddaea79b976987f0f3d580197 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -1823,17 +1823,25 @@ void LLInventoryModel::addCategory(LLViewerInventoryCategory* category)
 void LLInventoryModel::addItem(LLViewerInventoryItem* item)
 {
 	//llinfos << "LLInventoryModel::addItem()" << llendl;
+
+	
+	// This can happen if assettype enums change.  This can be a backwards compatibility issue 
+	// in some viewer prototypes prior to when the AT_LINK enum changed from 23 to 24.
+	if ((item->getType() == LLAssetType::AT_NONE)
+		|| LLAssetType::lookup(item->getType()) == LLAssetType::badLookup())
+	{
+		llwarns << "Got bad asset type for item ( name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ), ignoring." << llendl;
+		return;
+	}
 	if(item)
 	{
 		// This condition means that we tried to add a link without the baseobj being in memory.
 		// The item will show up as a broken link.
 		if (item->getIsBrokenLink())
 		{
-			llwarns << "Add link item without baseobj present ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " )  parent: " << item->getParentUUID() << llendl;
-//			llassert_always(FALSE); // DO NOT MERGE THIS IN.  This is an AVP debugging line.  If this line triggers, it means that you just loaded in a broken link.  Unless that happens because you actually deleted a baseobj without deleting the link, it's indicative of a serious problem (likely with your inventory) and should be diagnosed.
+			llinfos << "Adding broken link ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " )  parent: " << item->getParentUUID() << llendl;
 		}
 		mItemMap[item->getUUID()] = item;
-		//mInventory[item->getUUID()] = item;
 	}
 }
 
@@ -2175,7 +2183,7 @@ bool LLInventoryModel::loadSkeleton(
 						// This can happen if the linked object's baseobj is removed from the cache but the linked object is still in the cache.
 						if (item->getIsBrokenLink())
 						{
-							llinfos << "Attempted to cached link item without baseobj present ( itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ) " << llendl;
+							llinfos << "Attempted to add cached link item without baseobj present ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ).  Ignoring and invalidating " << cat->getName() << " . " << llendl;
 							invalid_categories.insert(cit->second);
 							continue;
 						}
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 7f69ce9641e0a6377d75b03fd0830d7641d439d6..9a71e53441e9f9f8ec32ce8c3633f258ddf03c7f 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -371,7 +371,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
 						// this object was probably moved, check its parent
 						if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
 						{
-							llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << llendl;
+							llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << " for model (Name :" << model_item->getName() << " )" << llendl;
 						}
 
 						LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
@@ -472,7 +472,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
 			if (objectp->getType() <= LLAssetType::AT_NONE ||
 				objectp->getType() >= LLAssetType::AT_COUNT)
 			{
-				lldebugs << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << 
+				llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << 
 					((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() << llendl;
 				return;
 			}
diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp
index 74e0fa077e397542cfbdb25148c4704ec1dd30ef..b744722f4cd5b72a5f16af772e32212f9d8d2793 100644
--- a/indra/newview/lltexlayerparams.cpp
+++ b/indra/newview/lltexlayerparams.cpp
@@ -183,7 +183,6 @@ void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL set_by_user)
 			}
 			mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user);
 			mTexLayer->invalidateMorphMasks();
-			mAvatar->updateMeshTextures();
 		}
 	}
 }
@@ -479,7 +478,6 @@ void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user)
 			if (mTexLayer)
 			{
 				mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user);
-				mAvatar->updateMeshTextures();
 			}
 		}
 
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index a6f20922d91fe3079464cc4fc889310c6bbb6ac0..16bd74f7989a9af73f5a7398bfbec9ea7805a3c7 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -5377,7 +5377,6 @@ void LLVOAvatar::updateSexDependentLayerSets( BOOL set_by_user )
 	invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user );
 	invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, set_by_user );
 	invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, set_by_user );
-	updateMeshTextures();
 }
 
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 7a830707702a5ad41ad24e7b7bdb9059f8a71a79..a2203ba2ea89ba1e2af78eefe34d0028d9114d28 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -757,19 +757,7 @@ void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_b
 		return;
 	}
 
-	LLTexLayerSet* layer_set = getLayerSet((ETextureIndex)te);
-	if (layer_set)
-	{
-		invalidateComposite(layer_set, set_by_user);
-	}
-
 	setTEImage(te, image);
-	updateMeshTextures();
-
-	if (gAgent.cameraCustomizeAvatar())
-	{
-		LLVisualParamHint::requestHintUpdates();
-	}
 }
 
 //virtual
@@ -1377,6 +1365,7 @@ void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_u
 		ETextureIndex baked_te = getBakedTE( layerset );
 		setTEImage( baked_te, LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR) );
 		layerset->requestUpload();
+		updateMeshTextures();
 	}
 }
 
@@ -1386,7 +1375,6 @@ void LLVOAvatarSelf::invalidateAll()
 	{
 		invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, TRUE);
 	}
-	updateMeshTextures();
 }
 
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 021fc746488fae5c881ebfb02486e78947325743..a32abf3ab9479a9421c4493871a3701821bf1515 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1640,38 +1640,19 @@ bool LLVOVolume::hasMedia() const
 
 LLVector3 LLVOVolume::getApproximateFaceNormal(U8 face_id)
 {
-	LLVector3 result = LLVector3::zero;
-	
-	LLFace* facep = mDrawable->getFace(face_id);
-	if(facep)
-	{
-		LLStrider<LLVector3> verticesp;
-		LLStrider<LLVector3> normalsp;
-		LLStrider<LLVector2> texCoordsp;
-		LLStrider<U16> indicesp;
-		S32 index_offset;
-		index_offset = facep->getGeometry(verticesp,normalsp,texCoordsp, indicesp);
-		
-		if(index_offset != -1 && (normalsp.get() != NULL))
+	LLVolume* volume = getVolume();
+	LLVector3 result;
+
+	if (volume && face_id < volume->getNumVolumeFaces())
+	{
+		const LLVolumeFace& face = volume->getVolumeFace(face_id);
+		for (S32 i = 0; i < (S32)face.mVertices.size(); ++i)
 		{
-			U16 count = facep->getGeomCount();
-			U16 i;
-			
-			for(i=0; i < count; i++)
-			{
-				LLVector3 normal = *normalsp++;
-//				llinfos << "adding " << normal << llendl;
-				result += normal;
-			}
+			result += face.mVertices[i].mNormal;
 		}
-	}
-	
-	if(!result.isNull())
-	{
-//		llinfos << "before conversion: " << result << llendl;
+
 		result = volumeDirectionToAgent(result);
-		result.normalize();
-//		llinfos << "after conversion: " << result << llendl;
+		result.normVec();
 	}
 	
 	return result;
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 2b4861ce4fedc80aea35f238e373ef3a5d099ee9..3185ee45bfe1ae2f69526a409e1a4a128ea06727 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -674,8 +674,6 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater
 		avatar->updateSexDependentLayerSets( set_by_user );
 	}	
 	
-	avatar->updateMeshTextures();
-
 //	if( set_by_user )
 //	{
 //		gAgent.sendAgentSetAppearance();
@@ -719,7 +717,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )
 	}
 
 	avatar->updateVisualParams();
-	avatar->updateMeshTextures();
+	avatar->wearableUpdated(type);
 
 //	if( set_by_user )
 //	{
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index f7ba719dc268e3a8f4a0e54dea45edd43e422baa..edc1fb88385a69452c950457361d6453185f4771 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -10,7 +10,7 @@
  help_topic="floater_search"
  save_rect="true"
  single_instance="true"
- title="SEARCH [SECOND_LIFE]"
+ title="FIND"
  width="620">
     <floater.string
      name="search_url">
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index f833e0a1cbb1ede61f9bcf53c09cec8348197f84..c5e129cf2fcca631a53fe9eead4cdd38cc31e595 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -69,7 +69,9 @@
           left="0"
           name="talk"
           top="3"
-          width="100" />
+          width="100"
+          speak_button.tool_tip="Turns microphone on/off"
+          show_button.tool_tip="Shows/hides voice control panel" />
         </layout_panel>
 		 <icon
          auto_resize="false"
@@ -102,7 +104,8 @@
           left="0"
           top="3"
          use_ellipses="true"
-          width="80" />
+          width="80"
+          tool_tip="Shows/hides gestures"/>
         </layout_panel>
 		 <icon
          auto_resize="false"
@@ -133,7 +136,7 @@
              label="Move"
              layout="topleft"
              name="movement_btn"
-             tool_tip="Show/hide movement controls"
+             tool_tip="Shows/hides movement controls"
              top="3"
              width="80">
                 <button.init_callback
@@ -171,7 +174,7 @@
              label="View"
              layout="topleft"
              left="0"
-             tool_tip="Show/hide camera controls"
+             tool_tip="Shows/hides camera controls"
              top="3"
              name="camera_btn"
              width="80">
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index 555fedb1ffbbd8cb2d76e2b82899a7b2eb3c01ec..7128c200380d8385100370f6dc2dd7aa86428e5d 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -50,7 +50,7 @@
      label="Log"
      height="23"
      name="show_nearby_chat"
-     tool_tip="Show/hide nearby chat log">
+     tool_tip="Shows/hides nearby chat log">
         <button.init_callback
            function="Button.SetDockableFloaterToggle"
            parameter="nearby_chat" />