diff --git a/indra/llcommon/llerrorlegacy.h b/indra/llcommon/llerrorlegacy.h
index 7a970b1466042575db10403fc3d10df491ca67c3..9920921a58df78bf5ca9cc12e977637acc11ba1b 100644
--- a/indra/llcommon/llerrorlegacy.h
+++ b/indra/llcommon/llerrorlegacy.h
@@ -75,6 +75,10 @@ const int LL_ERR_PRICE_MISMATCH = -23018;
 #define SHOW_ASSERT
 #else // _DEBUG
 
+#ifdef LL_RELEASE_WITH_DEBUG_INFO
+#define SHOW_ASSERT
+#endif // LL_RELEASE_WITH_DEBUG_INFO
+
 #ifdef RELEASE_SHOW_DEBUG
 #define SHOW_DEBUG
 #endif
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 748d8bdfbf090af0c14a23922631cb9911f9b999..61d60fdff96d76cd872e71788cb9ed8a4c7bfcbb 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -274,6 +274,7 @@ class LLUpdateAppearanceOnDestroy: public LLInventoryCallback
 
 struct LLFoundData
 {
+	LLFoundData() {}
 	LLFoundData(const LLUUID& item_id,
 				const LLUUID& asset_id,
 				const std::string& name,
@@ -292,20 +293,94 @@ struct LLFoundData
 };
 
 	
-struct LLWearableHoldingPattern
+class LLWearableHoldingPattern
 {
-	LLWearableHoldingPattern() : mResolved(0) {}
-	~LLWearableHoldingPattern()
-	{
-		for_each(mFoundList.begin(), mFoundList.end(), DeletePointer());
-		mFoundList.clear();
-	}
-	typedef std::list<LLFoundData*> found_list_t;
+public:
+	LLWearableHoldingPattern();
+	~LLWearableHoldingPattern();
+
+	bool pollCompletion();
+	bool isDone();
+	bool isTimedOut();
+	
+	typedef std::list<LLFoundData> found_list_t;
 	found_list_t mFoundList;
+	LLInventoryModel::item_array_t mObjItems;
+	LLInventoryModel::item_array_t mGestItems;
 	S32 mResolved;
-	bool append;
+	LLTimer mWaitTime;
 };
 
+LLWearableHoldingPattern::LLWearableHoldingPattern():
+	mResolved(0)
+{
+}
+
+LLWearableHoldingPattern::~LLWearableHoldingPattern()
+{
+}
+
+bool LLWearableHoldingPattern::isDone()
+{
+	if (mResolved >= (S32)mFoundList.size())
+		return true; // have everything we were waiting for
+	else if (isTimedOut())
+	{
+		llwarns << "Exceeded max wait time, updating appearance based on what has arrived" << llendl;
+		return true;
+	}
+	return false;
+
+}
+
+bool LLWearableHoldingPattern::isTimedOut()
+{
+	static F32 max_wait_time = 15.0;  // give up if wearable fetches haven't completed in max_wait_time seconds.
+	return mWaitTime.getElapsedTimeF32() > max_wait_time; 
+}
+
+bool LLWearableHoldingPattern::pollCompletion()
+{
+	bool done = isDone();
+	llinfos << "polling, done status: " << done << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl;
+	if (done)
+	{
+		// Activate all gestures in this folder
+		if (mGestItems.count() > 0)
+		{
+			llinfos << "Activating " << mGestItems.count() << " gestures" << llendl;
+			
+			LLGestureManager::instance().activateGestures(mGestItems);
+			
+			// Update the inventory item labels to reflect the fact
+			// they are active.
+			LLViewerInventoryCategory* catp =
+				gInventory.getCategory(LLAppearanceManager::instance().getCOF());
+
+			if (catp)
+			{
+				gInventory.updateCategory(catp);
+				gInventory.notifyObservers();
+			}
+		}
+
+		// Update wearables.
+		llinfos << "Updating agent wearables with " << mResolved << " wearable items " << llendl;
+		LLAppearanceManager::instance().updateAgentWearables(this, false);
+		
+		// Update attachments to match those requested.
+		LLVOAvatar* avatar = gAgent.getAvatarObject();
+		if( avatar )
+		{
+			llinfos << "Updating " << mObjItems.count() << " attachments" << llendl;
+			LLAgentWearables::userUpdateAttachments(mObjItems);
+		}
+
+		delete this;
+	}
+	return done;
+}
+
 static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
 {
 	LLInventoryModel::item_array_t new_items;
@@ -336,26 +411,21 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
 static void onWearableAssetFetch(LLWearable* wearable, void* data)
 {
 	LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;
-	bool append = holder->append;
 	
 	if(wearable)
 	{
 		for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
 			 iter != holder->mFoundList.end(); ++iter)
 		{
-			LLFoundData* data = *iter;
-			if(wearable->getAssetID() == data->mAssetID)
+			LLFoundData& data = *iter;
+			if(wearable->getAssetID() == data.mAssetID)
 			{
-				data->mWearable = wearable;
+				data.mWearable = wearable;
 				break;
 			}
 		}
 	}
 	holder->mResolved += 1;
-	if(holder->mResolved >= (S32)holder->mFoundList.size())
-	{
-		LLAppearanceManager::instance().updateAgentWearables(holder, append);
-	}
 }
 
 LLUUID LLAppearanceManager::getCOF()
@@ -662,12 +732,12 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
 		for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
 			 iter != holder->mFoundList.end(); ++iter)
 		{
-			LLFoundData* data = *iter;
-			LLWearable* wearable = data->mWearable;
+			LLFoundData& data = *iter;
+			LLWearable* wearable = data.mWearable;
 			if( wearable && ((S32)wearable->getType() == i) )
 			{
 				LLViewerInventoryItem* item;
-				item = (LLViewerInventoryItem*)gInventory.getItem(data->mItemID);
+				item = (LLViewerInventoryItem*)gInventory.getItem(data.mItemID);
 				if( item && (item->getAssetUUID() == wearable->getAssetID()) )
 				{
 					items.put(item);
@@ -683,8 +753,6 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
 		gAgentWearables.setWearableOutfit(items, wearables, !append);
 	}
 
-	delete holder;
-
 //	dec_busy_count();
 }
 
@@ -706,86 +774,66 @@ void LLAppearanceManager::updateAppearanceFromCOF()
 	LLInventoryModel::item_array_t gest_items;
 	getUserDescendents(current_outfit_id, wear_items, obj_items, gest_items, follow_folder_links);
 	
-	if( !wear_items.count() && !obj_items.count() && !gest_items.count())
+	if(!wear_items.count())
 	{
 		LLNotificationsUtil::add("CouldNotPutOnOutfit");
 		return;
 	}
-		
-	// Processes that take time should show the busy cursor
-	//inc_busy_count(); // BAP this is currently a no-op in llinventorybridge.cpp - do we need it?
-		
-	// Activate all gestures in this folder
-	if (gest_items.count() > 0)
-	{
-		llinfos << "Activating " << gest_items.count() << " gestures" << llendl;
 
-		LLGestureManager::instance().activateGestures(gest_items);
+	LLWearableHoldingPattern* holder = new LLWearableHoldingPattern;
 
-		// Update the inventory item labels to reflect the fact
-		// they are active.
-		LLViewerInventoryCategory* catp = gInventory.getCategory(current_outfit_id);
-		if (catp)
+	holder->mObjItems = obj_items;
+	holder->mGestItems = gest_items;
+		
+	// Note: can't do normal iteration, because if all the
+	// wearables can be resolved immediately, then the
+	// callback will be called (and this object deleted)
+	// before the final getNextData().
+	LLDynamicArray<LLFoundData> found_container;
+	for(S32 i = 0; i  < wear_items.count(); ++i)
+	{
+		LLViewerInventoryItem *item = wear_items.get(i);
+		LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL;
+		if (item && linked_item)
 		{
-			gInventory.updateCategory(catp);
-			gInventory.notifyObservers();
+			LLFoundData found(linked_item->getUUID(),
+							  linked_item->getAssetUUID(),
+							  linked_item->getName(),
+							  linked_item->getType());
+			holder->mFoundList.push_front(found);
+			found_container.put(found);
 		}
-	}
-
-	if(wear_items.count() > 0)
-	{
-		// Note: can't do normal iteration, because if all the
-		// wearables can be resolved immediately, then the
-		// callback will be called (and this object deleted)
-		// before the final getNextData().
-		LLWearableHoldingPattern* holder = new LLWearableHoldingPattern;
-		LLFoundData* found;
-		LLDynamicArray<LLFoundData*> found_container;
-		for(S32 i = 0; i  < wear_items.count(); ++i)
+		else
 		{
-			LLViewerInventoryItem *item = wear_items.get(i);
-			LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL;
-			if (item && linked_item)
+			if (!item)
 			{
-				found = new LLFoundData(linked_item->getUUID(),
-										linked_item->getAssetUUID(),
-										linked_item->getName(),
-										linked_item->getType());
-				holder->mFoundList.push_front(found);
-				found_container.put(found);
+				llwarns << "attempt to wear a null item " << llendl;
 			}
-			else
+			else if (!linked_item)
 			{
-				if (!item)
-				{
-					llwarns << "attempt to wear a null item " << llendl;
-				}
-				else if (!linked_item)
-				{
-					llwarns << "attempt to wear a broken link " << item->getName() << llendl;
-				}
+				llwarns << "attempt to wear a broken link " << item->getName() << llendl;
 			}
 		}
-		for(S32 i = 0; i < found_container.count(); ++i)
-		{
-			holder->append = false;
-			found = found_container.get(i);
+	}
+
+	for(S32 i = 0; i < found_container.count(); ++i)
+	{
+		LLFoundData& found = found_container.get(i);
 				
-			// Fetch the wearables about to be worn.
-			LLWearableList::instance().getAsset(found->mAssetID,
-												found->mName,
-												found->mAssetType,
-												onWearableAssetFetch,
-												(void*)holder);
-		}
+		// Fetch the wearables about to be worn.
+		LLWearableList::instance().getAsset(found.mAssetID,
+											found.mName,
+											found.mAssetType,
+											onWearableAssetFetch,
+											(void*)holder);
+
 	}
 
-	// Update attachments to match those requested.
-	LLVOAvatar* avatar = gAgent.getAvatarObject();
-	if( avatar )
+	if (!holder->pollCompletion())
 	{
-		LLAgentWearables::userUpdateAttachments(obj_items);
+		doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollCompletion,holder));
 	}
+
 }
 
 void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 20745b70e4b23eb6dea73ecfd8a2c8294d1393c1..517face777522a172aa5990765e287789aa7eb11 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -39,7 +39,7 @@
 #include "llcallbacklist.h"
 
 class LLWearable;
-struct LLWearableHoldingPattern;
+class LLWearableHoldingPattern;
 
 class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 {
@@ -168,4 +168,40 @@ void doOnIdle(T callable)
 	gIdleCallbacks.addFunction(&OnIdleCallback<T>::onIdle,cb_functor);
 }
 
+// Shim class and template function to allow arbitrary boost::bind
+// expressions to be run as recurring idle callbacks.
+template <typename T>
+class OnIdleCallbackRepeating
+{
+public:
+	OnIdleCallbackRepeating(T callable):
+		mCallable(callable)
+	{
+	}
+	// Will keep getting called until the callable returns false.
+	static void onIdle(void *data)
+	{
+		OnIdleCallbackRepeating<T>* self = reinterpret_cast<OnIdleCallbackRepeating<T>*>(data);
+		bool done = self->call();
+		if (done)
+		{
+			gIdleCallbacks.deleteFunction(onIdle, data);
+			delete self;
+		}
+	}
+	bool call()
+	{
+		return mCallable();
+	}
+private:
+	T mCallable;
+};
+
+template <typename T>
+void doOnIdleRepeating(T callable)
+{
+	OnIdleCallbackRepeating<T>* cb_functor = new OnIdleCallbackRepeating<T>(callable);
+	gIdleCallbacks.addFunction(&OnIdleCallbackRepeating<T>::onIdle,cb_functor);
+}
+
 #endif
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index ee0426c7dff631c5c90be9b8d1ae5f4740a413a6..8c5208678e763b29c57c62b5ded319901a96bdd5 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -65,6 +65,7 @@
 #include "llvovolume.h"
 #include "lluictrlfactory.h"
 #include "llpluginclassmedia.h"
+#include "llviewertexturelist.h"
 
 //
 // Methods
@@ -406,14 +407,40 @@ void LLPanelFace::getState()
 			LLUUID id;
 			struct f1 : public LLSelectedTEGetFunctor<LLUUID>
 			{
-				LLUUID get(LLViewerObject* object, S32 te)
+				LLUUID get(LLViewerObject* object, S32 te_index)
 				{
-					LLViewerTexture* image = object->getTEImage(te);
-					return image ? image->getID() : LLUUID::null;
+					LLUUID id;
+					
+					LLViewerTexture* image = object->getTEImage(te_index);
+					if (image) id = image->getID();
+					
+					if (!id.isNull() && LLViewerMedia::textureHasMedia(id))
+					{
+						LLTextureEntry *te = object->getTE(te_index);
+						if (te)
+						{
+							LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID()) : NULL ;
+							if(!tex)
+							{
+								tex = LLViewerFetchedTexture::sDefaultImagep;
+							}
+							if (tex)
+							{
+								id = tex->getID();
+							}
+						}
+					}
+					return id;
 				}
 			} func;
 			identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, id );
 
+			if(LLViewerMedia::textureHasMedia(id))
+			{
+				childSetEnabled("textbox autofix",editable);
+				childSetEnabled("button align",editable);
+			}
+			
 			if (identical)
 			{
 				// All selected have the same texture
@@ -444,13 +471,6 @@ void LLPanelFace::getState()
 					}
 				}
 			}
-
-			if(LLViewerMedia::textureHasMedia(id))
-			{
-				childSetEnabled("textbox autofix",editable);
-				childSetEnabled("button align",editable);
-			}
-
 		}
 
 		
diff --git a/indra/newview/llpanellandaudio.cpp b/indra/newview/llpanellandaudio.cpp
index 920fca66f2b1d9a8674305681addff4f8e75c7bd..6a4c9097592b805c67182df247a52d532f0c0538 100644
--- a/indra/newview/llpanellandaudio.cpp
+++ b/indra/newview/llpanellandaudio.cpp
@@ -37,6 +37,7 @@
 // viewer includes
 #include "llmimetypes.h"
 #include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
 #include "lluictrlfactory.h"
 
 // library includes
@@ -83,8 +84,14 @@ BOOL LLPanelLandAudio::postBuild()
 	mCheckSoundLocal = getChild<LLCheckBoxCtrl>("check sound local");
 	childSetCommitCallback("check sound local", onCommitAny, this);
 
-	mRadioVoiceChat = getChild<LLRadioGroup>("parcel_voice_channel");
-	childSetCommitCallback("parcel_voice_channel", onCommitAny, this);
+	mCheckParcelEnableVoice = getChild<LLCheckBoxCtrl>("parcel_enable_voice_channel");
+	childSetCommitCallback("parcel_enable_voice_channel", onCommitAny, this);
+
+	// This one is always disabled so no need for a commit callback
+	mCheckEstateDisabledVoice = getChild<LLCheckBoxCtrl>("parcel_enable_voice_channel_is_estate_disabled");
+
+	mCheckParcelVoiceLocal = getChild<LLCheckBoxCtrl>("parcel_enable_voice_channel_local");
+	childSetCommitCallback("parcel_enable_voice_channel_local", onCommitAny, this);
 
 	mMusicURLEdit = getChild<LLLineEditor>("music_url");
 	childSetCommitCallback("music_url", onCommitAny, this);
@@ -118,19 +125,33 @@ void LLPanelLandAudio::refresh()
 		mMusicUrlCheck->set( parcel->getObscureMusic() );
 		mMusicUrlCheck->setEnabled( can_change_media );
 
-		if(parcel->getParcelFlagAllowVoice())
+		bool allow_voice = parcel->getParcelFlagAllowVoice();
+
+		LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+		if (region && region->isVoiceEnabled())
 		{
-			if(parcel->getParcelFlagUseEstateVoiceChannel())
-				mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatEstate);
-			else
-				mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatPrivate);
+			mCheckEstateDisabledVoice->setVisible(false);
+
+			mCheckParcelEnableVoice->setVisible(true);
+			mCheckParcelEnableVoice->setEnabled( can_change_media );
+			mCheckParcelEnableVoice->set(allow_voice);
+
+			mCheckParcelVoiceLocal->setEnabled( can_change_media && allow_voice );
 		}
 		else
 		{
-			mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatDisable);
+			// Voice disabled at estate level, overrides parcel settings
+			// Replace the parcel voice checkbox with a disabled one
+			// labelled with an explanatory message
+			mCheckEstateDisabledVoice->setVisible(true);
+
+			mCheckParcelEnableVoice->setVisible(false);
+			mCheckParcelEnableVoice->setEnabled(false);
+			mCheckParcelVoiceLocal->setEnabled(false);
 		}
 
-		mRadioVoiceChat->setEnabled( can_change_media );
+		mCheckParcelEnableVoice->set(allow_voice);
+		mCheckParcelVoiceLocal->set(!parcel->getParcelFlagUseEstateVoiceChannel());
 
 		mMusicURLEdit->setText(parcel->getMusicURL());
 		mMusicURLEdit->setEnabled( can_change_media );
@@ -149,30 +170,11 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
 
 	// Extract data from UI
 	BOOL sound_local		= self->mCheckSoundLocal->get();
-	int voice_setting		= self->mRadioVoiceChat->getSelectedIndex();
 	std::string music_url	= self->mMusicURLEdit->getText();
 	U8 obscure_music		= self->mMusicUrlCheck->get();
 
-
-	BOOL voice_enabled;
-	BOOL voice_estate_chan;
-
-	switch(voice_setting)
-	{
-		default:
-		case kRadioVoiceChatEstate:
-			voice_enabled = TRUE;
-			voice_estate_chan = TRUE;
-		break;
-		case kRadioVoiceChatPrivate:
-			voice_enabled = TRUE;
-			voice_estate_chan = FALSE;
-		break;
-		case kRadioVoiceChatDisable:
-			voice_enabled = FALSE;
-			voice_estate_chan = FALSE;
-		break;
-	}
+	BOOL voice_enabled = self->mCheckParcelEnableVoice->get();
+	BOOL voice_estate_chan = !self->mCheckParcelVoiceLocal->get();
 
 	// Remove leading/trailing whitespace (common when copying/pasting)
 	LLStringUtil::trim(music_url);
diff --git a/indra/newview/llpanellandaudio.h b/indra/newview/llpanellandaudio.h
index de5da95fa4398d514735f2d9d4053b47250453c1..19766a40b6436508ee628f381939207a69730bec 100644
--- a/indra/newview/llpanellandaudio.h
+++ b/indra/newview/llpanellandaudio.h
@@ -52,7 +52,9 @@ class LLPanelLandAudio
 
 private:
 	LLCheckBoxCtrl* mCheckSoundLocal;
-	LLRadioGroup*	mRadioVoiceChat;
+	LLCheckBoxCtrl* mCheckParcelEnableVoice;
+	LLCheckBoxCtrl* mCheckEstateDisabledVoice;
+	LLCheckBoxCtrl* mCheckParcelVoiceLocal;	
 	LLLineEditor*	mMusicURLEdit;
 	LLCheckBoxCtrl* mMusicUrlCheck;
 
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index 4a7d784c3ead781ceb90d5bcb5edfe0ca1d10728..84c8b9d5f06f55cf2542a1c909241df0f7d744e3 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -1140,6 +1140,10 @@ LLTexLayerInterface::LLTexLayerInterface(const LLTexLayerInterface &layer, LLWea
 BOOL LLTexLayerInterface::setInfo(const LLTexLayerInfo *info, LLWearable* wearable  ) // This sets mInfo and calls initialization functions
 {
 	//llassert(mInfo == NULL); // nyx says this is probably bogus but needs investigating
+        if (mInfo != NULL) // above llassert(), but softened into a warning
+        {
+                llwarns << "BAD STUFF!  mInfo != NULL" << llendl;
+        }
 	mInfo = info;
 	//mID = info->mID; // No ID
 
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 04d67fe750c3586204cfa5a94eeb0eec65bb9464..d712446d836ac9f1feb704f09cb8852387bb0c9c 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -752,6 +752,11 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
 			new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
 			impl_count_interest_normal++;
 		}
+		else if(pimpl->isParcelMedia())
+		{
+			new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
+			impl_count_interest_normal++;
+		}
 		else
 		{
 			// Look at interest and CPU usage for instances that aren't in any of the above states.
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index e8b435fc8f5fe26ce19926e43ea5528c6af65476..e87dbe5c07fafceb28f0d223bc25ef66db4de43c 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -212,22 +212,15 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
 		else
 		{
 			// Since the texture id is different, we need to generate a new impl
-			LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL;
 
 			// Delete the old one first so they don't fight over the texture.
 			sMediaImpl = NULL;
-
-			sMediaImpl = LLViewerMedia::newMediaImpl(
-				placeholder_texture_id,
-				media_width, 
-				media_height, 
-				media_auto_scale,
-				media_loop);
-			sMediaImpl->setIsParcelMedia(true);
-			sMediaImpl->navigateTo(media_url, mime_type, true);
+			
+			// A new impl will be created below.
 		}
 	}
-	else
+
+	if(!sMediaImpl)
 	{
 		LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL;
 
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index ad993bc05624f3994bc65a5f2f68a81a5ddbcf3c..3f42cba56146d2987ea3aca84a3526fe112cc715 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1560,7 +1560,11 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
 
 void LLViewerFetchedTexture::setDecodePriority(F32 priority)
 {
-	llassert(!mInImageList);
+	//llassert(!mInImageList); // firing a lot, figure out why
+        if (mInImageList) // above llassert() softened to a warning
+        {
+                llwarns << "BAD STUFF!  mInImageList" << llendl;
+        }
 	mDecodePriority = priority;
 }
 
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 6bb547373c49340ea4bfdf4a140cb32fe7c0d703..ee934ab9c5bbd9dd37f34eab34439185e20d07dd 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -502,7 +502,10 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
 	{
 		llerrs << "LLViewerTextureList::addImageToList - Image already in list" << llendl;
 	}
-	llverify((mImageList.insert(image)).second == true);
+	if ((mImageList.insert(image)).second != true)
+	{
+		llwarns << "BAD STUFF!  (mImageList.insert(image)).second != true" << llendl;
+	}
 	image->setInImageList(TRUE) ;
 }
 
@@ -519,7 +522,10 @@ void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
 		}
 		llerrs << "LLViewerTextureList::removeImageFromList - Image not in list" << llendl;
 	}
-	llverify(mImageList.erase(image) == 1);
+	if (mImageList.erase(image) != 1)
+        {
+                llwarns << "BAD STUFF!  mImageList.erase(image) != 1" << llendl;
+        }
 	image->setInImageList(FALSE) ;
 }
 
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index c58c1f00b96872eae1ba4c375106b7a1a14dec8d..61ca783d14aea2b91907a16e49074964eb31786e 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1871,13 +1871,14 @@ Only large parcels can be listed in search.
              layout="topleft"
              left="110"
              name="parcel_enable_voice_channel_is_estate_disabled"
+             top_delta="0"
              width="300" />
             <check_box
              height="16"
              label="Restrict Voice to this parcel"
              layout="topleft"
              left="110"
-             name="parcel_enable_voice_channel_parcel"
+             name="parcel_enable_voice_channel_local"
              width="300" />
         </panel>
         <panel