diff --git a/indra/llprimitive/lltextureentry.cpp b/indra/llprimitive/lltextureentry.cpp
index 597f0784904f9362dcdb369d1a0e4a4ef5148299..ca57f1edbd466ff809ca17cec425fa6b56bdc847 100755
--- a/indra/llprimitive/lltextureentry.cpp
+++ b/indra/llprimitive/lltextureentry.cpp
@@ -539,28 +539,21 @@ S32 LLTextureEntry::setGlow(F32 glow)
 
 S32 LLTextureEntry::setMaterialID(const LLMaterialID& pMaterialID)
 {
-	if ( (mMaterialID != pMaterialID) || (mMaterialUpdatePending && !mSelected) )
+	if (mMaterialID != pMaterialID)
 	{
-		if (mSelected)
+		mMaterialID = pMaterialID;
+		
+	}
+	if (mMaterialID.isNull())
 		{
-			mMaterialUpdatePending = true;
-			mMaterialID = pMaterialID;
-			return TEM_CHANGE_NONE;
+		setMaterialParams(NULL);
 		}
-
-		mMaterialUpdatePending = false;
-		mMaterialID = pMaterialID;
 		return TEM_CHANGE_TEXTURE;
 	}
-	return TEM_CHANGE_NONE;
-}
 
 S32 LLTextureEntry::setMaterialParams(const LLMaterialPtr pMaterialParams)
 {
-	if (mSelected)
-	{
-		mMaterialUpdatePending = true;
-	}
+
 	mMaterial = pMaterialParams;
 	return TEM_CHANGE_TEXTURE;
 }
diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp
index f217ff160ec945dc1fad80aced3585720b1303e0..59e5d05736a283b37f762efe02d88f9814e4261f 100644
--- a/indra/newview/llmaterialmgr.cpp
+++ b/indra/newview/llmaterialmgr.cpp
@@ -217,6 +217,51 @@ boost::signals2::connection LLMaterialMgr::get(const LLUUID& region_id, const LL
 	return connection;
 }
 
+boost::signals2::connection LLMaterialMgr::getTE(const LLUUID& region_id, const LLMaterialID& material_id, U32 te, LLMaterialMgr::get_callback_te_t::slot_type cb)
+{
+	boost::signals2::connection connection;
+
+	material_map_t::const_iterator itMaterial = mMaterials.find(material_id);
+	if (itMaterial != mMaterials.end())
+	{
+		LL_DEBUGS("Materials") << "region " << region_id << " found materialid " << material_id << LL_ENDL;
+		get_callback_te_t signal;
+		signal.connect(cb);
+		signal(material_id, itMaterial->second, te);
+		connection = boost::signals2::connection();
+	}
+	else
+	{
+		if (!isGetPending(region_id, material_id))
+		{
+			get_queue_t::iterator itQueue = mGetQueue.find(region_id);
+			if (mGetQueue.end() == itQueue)
+			{
+				LL_DEBUGS("Materials") << "mGetQueue inserting region "<<region_id << LL_ENDL;
+				std::pair<get_queue_t::iterator, bool> ret = mGetQueue.insert(std::pair<LLUUID, material_queue_t>(region_id, material_queue_t()));
+				itQueue = ret.first;
+			}
+			LL_DEBUGS("Materials") << "adding material id " << material_id << LL_ENDL;
+			itQueue->second.insert(material_id);
+			markGetPending(region_id, material_id);
+		}
+
+		TEMaterialPair te_mat_pair;
+		te_mat_pair.te = te;
+		te_mat_pair.materialID = material_id;
+
+		get_callback_te_map_t::iterator itCallback = mGetTECallbacks.find(te_mat_pair);
+		if (itCallback == mGetTECallbacks.end())
+		{
+			std::pair<get_callback_te_map_t::iterator, bool> ret = mGetTECallbacks.insert(std::pair<TEMaterialPair, get_callback_te_t*>(te_mat_pair, new get_callback_te_t()));
+			itCallback = ret.first;
+		}
+		connection = itCallback->second->connect(cb);
+	}
+
+	return connection;
+}
+
 bool LLMaterialMgr::isGetAllPending(const LLUUID& region_id) const
 {
 	getall_pending_map_t::const_iterator itPending = mGetAllPending.find(region_id);
@@ -301,6 +346,22 @@ const LLMaterialPtr LLMaterialMgr::setMaterial(const LLUUID& region_id, const LL
 		mGetCallbacks.erase(itCallback);
 	}
 
+	TEMaterialPair te_mat_pair;
+	te_mat_pair.materialID = material_id;
+
+	U32 i = 0;
+	while (i < LLTEContents::MAX_TES)
+	{
+		te_mat_pair.te = i++;
+		get_callback_te_map_t::iterator itCallbackTE = mGetTECallbacks.find(te_mat_pair);
+		if (itCallbackTE != mGetTECallbacks.end())
+		{
+			(*itCallbackTE->second)(material_id, itMaterial->second, te_mat_pair.te);
+			delete itCallbackTE->second;
+			mGetTECallbacks.erase(itCallbackTE);
+		}
+	}
+
 	return itMaterial->second;
 }
 
diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h
index a6a7a5d1d79a499694efa5360c4a8a4013354334..922b16f1cfb572c8c12d304e9197afb4b1cb4396 100644
--- a/indra/newview/llmaterialmgr.h
+++ b/indra/newview/llmaterialmgr.h
@@ -44,9 +44,11 @@ class LLMaterialMgr : public LLSingleton<LLMaterialMgr>
 	typedef std::map<LLMaterialID, LLMaterialPtr> material_map_t;
 
 	typedef boost::signals2::signal<void (const LLMaterialID&, const LLMaterialPtr)> get_callback_t;
+	typedef boost::signals2::signal<void (const LLMaterialID&, const LLMaterialPtr, U32 te)> get_callback_te_t;
 
 	const LLMaterialPtr         get(const LLUUID& region_id, const LLMaterialID& material_id);
 	boost::signals2::connection get(const LLUUID& region_id, const LLMaterialID& material_id, get_callback_t::slot_type cb);
+	boost::signals2::connection getTE(const LLUUID& region_id, const LLMaterialID& material_id, U32 te, get_callback_te_t::slot_type cb);
 
 	typedef boost::signals2::signal<void (const LLUUID&, const material_map_t&)> getall_callback_t;
 	void                        getAll(const LLUUID& region_id);
@@ -80,6 +82,26 @@ class LLMaterialMgr : public LLSingleton<LLMaterialMgr>
 	typedef std::map<LLMaterialID, get_callback_t*> get_callback_map_t;
 	get_callback_map_t mGetCallbacks;
 
+	// struct for TE-specific material ID query
+	struct TEMaterialPair
+	{
+		U32 te;
+		LLMaterialID materialID;
+	};
+
+	// needed for std::map compliance only
+	//
+	friend inline bool operator<(
+		const struct LLMaterialMgr::TEMaterialPair& lhs,
+		const struct LLMaterialMgr::TEMaterialPair& rhs)
+	{
+		return (lhs.materialID < rhs.materialID) ? TRUE :
+				 (lhs.te			  < rhs.te)			  ? TRUE : FALSE;
+	}
+
+	typedef std::map<TEMaterialPair, get_callback_te_t*> get_callback_te_map_t;
+	get_callback_te_map_t mGetTECallbacks;
+
 	typedef std::set<LLUUID> getall_queue_t;
 	getall_queue_t        mGetAllQueue;
 	getall_queue_t        mGetAllRequested;
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index d108a260bc31068795eccdfcf1902f169d538a56..b2f76e2114e1fcecce0bacfa0b2669f0aa02f52a 100755
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -596,6 +596,11 @@ void LLPanelFace::sendTextureInfo()
 }
 
 void LLPanelFace::getState()
+{
+	updateUI();
+}
+
+void LLPanelFace::updateUI()
 { //set state of UI to match state of texture entry(ies)  (calls setEnabled, setValue, etc, but NOT setVisible)
 	LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
 
@@ -636,12 +641,12 @@ void LLPanelFace::getState()
 		}
 		getChildView("combobox mattype")->setEnabled(editable);
 
-		onCommitMaterialsMedia(NULL, this);
+		updateVisibility();
 
 		bool identical;
-        bool identical_diffuse;
-        bool identical_norm;
-        bool identical_spec;
+      bool identical_diffuse;
+      bool identical_norm;
+      bool identical_spec;
         
 		LLTextureCtrl*	texture_ctrl = getChild<LLTextureCtrl>("texture control");
 		LLTextureCtrl*	shinytexture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
@@ -798,7 +803,7 @@ void LLPanelFace::getState()
 					llwarns << "failed childGetSelectionInterface for 'combobox alphamode'" << llendl;
 				}
 
-				updateAlphaControls(getChild<LLComboBox>("combobox alphamode"),this);
+				updateAlphaControls();
 			}
 			
 			if(texture_ctrl && !texture_ctrl->isPickerShown())
@@ -1587,7 +1592,7 @@ void LLPanelFace::getState()
 					llwarns << "failed childGetSelectionInterface for 'combobox alphamode'" << llendl;
 				}
 				getChild<LLUICtrl>("maskcutoff")->setValue(material->getAlphaMaskCutoff());
-				updateAlphaControls(getChild<LLComboBox>("combobox alphamode"),this);
+				updateAlphaControls();
 
 				LLTextureEntry::e_texgen selected_texgen = LLTextureEntry::TEX_GEN_DEFAULT;
 				bool identical_texgen = true;		
@@ -1607,7 +1612,7 @@ void LLPanelFace::getState()
 				F32 offset_x, offset_y, repeat_x, repeat_y, rot;
 				LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
 				texture_ctrl->setImageAssetID(material->getSpecularID());
-				LLComboBox* combobox_shininess = getChild<LLComboBox>("combobox shininess");
+
 				if (!material->getSpecularID().isNull())
 				{
 					material->getSpecularOffset(offset_x,offset_y);
@@ -1628,7 +1633,7 @@ void LLPanelFace::getState()
 					getChild<LLUICtrl>("glossiness")->setValue(material->getSpecularLightExponent());
 					getChild<LLUICtrl>("environment")->setValue(material->getEnvironmentIntensity());
 				}
-				updateShinyControls(combobox_shininess,this, !material->getSpecularID().isNull(), true);
+				updateShinyControls(!material->getSpecularID().isNull(), true);
 
 				// Assert desired colorswatch color to match material AFTER updateShinyControls
 				// to avoid getting overwritten with the default on some UI state changes.
@@ -1642,7 +1647,7 @@ void LLPanelFace::getState()
 				// Bumpy (normal)
 				texture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
 				texture_ctrl->setImageAssetID(material->getNormalID());
-				LLComboBox* combobox_bumpiness = getChild<LLComboBox>("combobox bumpiness");
+
 				if (!material->getNormalID().isNull())
 				{
 					material->getNormalOffset(offset_x,offset_y);
@@ -1661,7 +1666,7 @@ void LLPanelFace::getState()
 					getChild<LLUICtrl>("bumpyOffsetU")->setValue(offset_x);
 					getChild<LLUICtrl>("bumpyOffsetV")->setValue(offset_y);
 				}
-				updateBumpyControls(combobox_bumpiness,this, !material->getNormalID().isNull(), true);
+				updateBumpyControls(!material->getNormalID().isNull(), true);
 			}
 
 		}
@@ -1702,12 +1707,11 @@ void LLPanelFace::getState()
 		getChildView("tex gen")->setEnabled(FALSE);
 		getChildView("label shininess")->setEnabled(FALSE);
 		getChildView("label bumpiness")->setEnabled(FALSE);
-
 		getChildView("button align")->setEnabled(FALSE);
 		//getChildView("has media")->setEnabled(FALSE);
 		//getChildView("media info set")->setEnabled(FALSE);
 
-		onCommitMaterialsMedia(NULL,this);
+		updateVisibility();
 
 		// Set variable values for numeric expressions
 		LLCalc* calcp = LLCalc::getInstance();
@@ -1904,10 +1908,16 @@ void LLPanelFace::onSelectColor(const LLSD& data)
 void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)
 {
 	LLPanelFace* self = (LLPanelFace*) userdata;
-	LLComboBox* combo_matmedia = self->getChild<LLComboBox>("combobox matmedia");
-	LLComboBox* combo_mattype = self->getChild<LLComboBox>("combobox mattype");
-	LLComboBox* combo_shininess = self->getChild<LLComboBox>("combobox shininess");
-	LLComboBox* combo_bumpiness = self->getChild<LLComboBox>("combobox bumpiness");
+	self->updateUI();
+}
+
+// static
+void LLPanelFace::updateVisibility()
+{	
+	LLComboBox* combo_matmedia = getChild<LLComboBox>("combobox matmedia");
+	LLComboBox* combo_mattype = getChild<LLComboBox>("combobox mattype");
+	LLComboBox* combo_shininess = getChild<LLComboBox>("combobox shininess");
+	LLComboBox* combo_bumpiness = getChild<LLComboBox>("combobox bumpiness");
 	if (!combo_mattype || !combo_matmedia || !combo_shininess || !combo_bumpiness)
 	{
 		LL_WARNS("Materials") << "Combo box not found...exiting." << LL_ENDL;
@@ -1919,93 +1929,66 @@ void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)
 	bool show_texture = (show_media || ((material_type == MATTYPE_DIFFUSE) && combo_matmedia->getEnabled()));
 	bool show_bumpiness = (!show_media) && (material_type == MATTYPE_NORMAL) && combo_matmedia->getEnabled();
 	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled();
-	self->getChildView("combobox mattype")->setVisible(!show_media);
-	self->getChildView("rptctrl")->setVisible(true);
+	getChildView("combobox mattype")->setVisible(!show_media);
+	getChildView("rptctrl")->setVisible(true);
 
 	// Media controls
-	self->getChildView("media_info")->setVisible(show_media);
-	self->getChildView("add_media")->setVisible(show_media);
-	self->getChildView("delete_media")->setVisible(show_media);
-	self->getChildView("button align")->setVisible(show_media);
+	getChildView("media_info")->setVisible(show_media);
+	getChildView("add_media")->setVisible(show_media);
+	getChildView("delete_media")->setVisible(show_media);
+	getChildView("button align")->setVisible(show_media);
 
 	// Diffuse texture controls
-	self->getChildView("texture control")->setVisible(show_texture && !show_media);
-	self->getChildView("label alphamode")->setVisible(show_texture && !show_media);
-	self->getChildView("combobox alphamode")->setVisible(show_texture && !show_media);
-	self->getChildView("label maskcutoff")->setVisible(false);
-	self->getChildView("maskcutoff")->setVisible(false);
+	getChildView("texture control")->setVisible(show_texture && !show_media);
+	getChildView("label alphamode")->setVisible(show_texture && !show_media);
+	getChildView("combobox alphamode")->setVisible(show_texture && !show_media);
+	getChildView("label maskcutoff")->setVisible(false);
+	getChildView("maskcutoff")->setVisible(false);
 	if (show_texture && !show_media)
 	{
-		updateAlphaControls(ctrl, userdata);
+		updateAlphaControls();
 	}
-	self->getChildView("TexScaleU")->setVisible(show_texture);
-	self->getChildView("TexScaleV")->setVisible(show_texture);
-	self->getChildView("TexRot")->setVisible(show_texture);
-	self->getChildView("TexOffsetU")->setVisible(show_texture);
-	self->getChildView("TexOffsetV")->setVisible(show_texture);
+	getChildView("TexScaleU")->setVisible(show_texture);
+	getChildView("TexScaleV")->setVisible(show_texture);
+	getChildView("TexRot")->setVisible(show_texture);
+	getChildView("TexOffsetU")->setVisible(show_texture);
+	getChildView("TexOffsetV")->setVisible(show_texture);
 
 	// Specular map controls
-	self->getChildView("shinytexture control")->setVisible(show_shininess);
-	self->getChildView("combobox shininess")->setVisible(show_shininess);
-	self->getChildView("label shininess")->setVisible(show_shininess);
-	self->getChildView("label glossiness")->setVisible(false);
-	self->getChildView("glossiness")->setVisible(false);
-	self->getChildView("label environment")->setVisible(false);
-	self->getChildView("environment")->setVisible(false);
-	self->getChildView("label shinycolor")->setVisible(false);
-	self->getChildView("shinycolorswatch")->setVisible(false);
+	getChildView("shinytexture control")->setVisible(show_shininess);
+	getChildView("combobox shininess")->setVisible(show_shininess);
+	getChildView("label shininess")->setVisible(show_shininess);
+	getChildView("label glossiness")->setVisible(false);
+	getChildView("glossiness")->setVisible(false);
+	getChildView("label environment")->setVisible(false);
+	getChildView("environment")->setVisible(false);
+	getChildView("label shinycolor")->setVisible(false);
+	getChildView("shinycolorswatch")->setVisible(false);
 	if (show_shininess)
 	{
-		updateShinyControls(ctrl, userdata);
+		updateShinyControls();
 	}
-	self->getChildView("shinyScaleU")->setVisible(show_shininess);
-	self->getChildView("shinyScaleV")->setVisible(show_shininess);
-	self->getChildView("shinyRot")->setVisible(show_shininess);
-	self->getChildView("shinyOffsetU")->setVisible(show_shininess);
-	self->getChildView("shinyOffsetV")->setVisible(show_shininess);
+	getChildView("shinyScaleU")->setVisible(show_shininess);
+	getChildView("shinyScaleV")->setVisible(show_shininess);
+	getChildView("shinyRot")->setVisible(show_shininess);
+	getChildView("shinyOffsetU")->setVisible(show_shininess);
+	getChildView("shinyOffsetV")->setVisible(show_shininess);
 
 	// Normal map controls
 	if (show_bumpiness)
 	{
-		updateBumpyControls(ctrl, userdata);
+		updateBumpyControls();
 	}
-	self->getChildView("bumpytexture control")->setVisible(show_bumpiness);
-	self->getChildView("combobox bumpiness")->setVisible(show_bumpiness);
-	self->getChildView("label bumpiness")->setVisible(show_bumpiness);
-	self->getChildView("bumpyScaleU")->setVisible(show_bumpiness);
-	self->getChildView("bumpyScaleV")->setVisible(show_bumpiness);
-	self->getChildView("bumpyRot")->setVisible(show_bumpiness);
-	self->getChildView("bumpyOffsetU")->setVisible(show_bumpiness);
-	self->getChildView("bumpyOffsetV")->setVisible(show_bumpiness);
-
-	// Enable texture scale/rotation/offset parameters if there's one
-	// present to set for
-	bool texParmsEnable = show_texture ||
-		(show_shininess && (combo_shininess->getCurrentIndex() == SHINY_TEXTURE)) ||
-		(show_bumpiness && (combo_bumpiness->getCurrentIndex() == BUMPY_TEXTURE));
-	self->getChildView("tex gen")->setEnabled(texParmsEnable);
-	self->getChildView("combobox texgen")->setEnabled(texParmsEnable);
-	self->getChildView("rptctrl")->setEnabled(texParmsEnable);
-	self->getChildView("TexScaleU")->setEnabled(texParmsEnable);
-	self->getChildView("TexScaleV")->setEnabled(texParmsEnable);
-	self->getChildView("TexRot")->setEnabled(texParmsEnable);
-	self->getChildView("TexOffsetU")->setEnabled(texParmsEnable);
-	self->getChildView("TexOffsetV")->setEnabled(texParmsEnable);
-	self->getChildView("shinyScaleU")->setEnabled(texParmsEnable);
-	self->getChildView("shinyScaleV")->setEnabled(texParmsEnable);
-	self->getChildView("shinyRot")->setEnabled(texParmsEnable);
-	self->getChildView("shinyOffsetU")->setEnabled(texParmsEnable);
-	self->getChildView("shinyOffsetV")->setEnabled(texParmsEnable);
-	self->getChildView("bumpyScaleU")->setEnabled(texParmsEnable);
-	self->getChildView("bumpyScaleV")->setEnabled(texParmsEnable);
-	self->getChildView("bumpyRot")->setEnabled(texParmsEnable);
-	self->getChildView("bumpyOffsetU")->setEnabled(texParmsEnable);
-	self->getChildView("bumpyOffsetV")->setEnabled(texParmsEnable);
-	self->getChildView("checkbox planar align")->setEnabled(texParmsEnable);
-
-	// Needed to handle transitions to/from media mode
-	// NORSPEC-84
-	updateAlphaControls(ctrl,userdata);
+	getChildView("bumpytexture control")->setVisible(show_bumpiness);
+	getChildView("combobox bumpiness")->setVisible(show_bumpiness);
+	getChildView("label bumpiness")->setVisible(show_bumpiness);
+	getChildView("bumpyScaleU")->setVisible(show_bumpiness);
+	getChildView("bumpyScaleV")->setVisible(show_bumpiness);
+	getChildView("bumpyRot")->setVisible(show_bumpiness);
+	getChildView("bumpyOffsetU")->setVisible(show_bumpiness);
+	getChildView("bumpyOffsetV")->setVisible(show_bumpiness);
+
+
 }
 
 // static
@@ -2016,7 +1999,7 @@ void LLPanelFace::onCommitMaterialType(LLUICtrl* ctrl, void* userdata)
     // like the texture ctrls for diffuse/norm/spec so that they are correct
     // when switching modes
     //
-    self->getState();
+    self->updateUI();
 }
 
 // static
@@ -2024,10 +2007,7 @@ void LLPanelFace::onCommitBump(LLUICtrl* ctrl, void* userdata)
 {
 	LLPanelFace* self = (LLPanelFace*) userdata;
 	self->sendBump();
-
-	LLComboBox* combo_bumpy = self->getChild<LLComboBox>("combobox bumpiness");
-	
-	updateBumpyControls(combo_bumpy,self, false, true);
+	self->updateBumpyControls(false, true);
 	self->updateMaterial();
 }
 
@@ -2039,13 +2019,12 @@ void LLPanelFace::onCommitTexGen(LLUICtrl* ctrl, void* userdata)
 }
 
 // static
-void LLPanelFace::updateShinyControls(LLUICtrl* ctrl, void* userdata, bool is_setting_texture, bool mess_with_shiny_combobox)
+void LLPanelFace::updateShinyControls(bool is_setting_texture, bool mess_with_shiny_combobox)
 {
-	LLPanelFace* self = (LLPanelFace*) userdata;
-	LLTextureCtrl* texture_ctrl = self->getChild<LLTextureCtrl>("shinytexture control");
+	LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
 	LLUUID shiny_texture_ID = texture_ctrl->getImageAssetID();
 	LL_DEBUGS("Materials") << "Shiny texture selected: " << shiny_texture_ID << LL_ENDL;
-	LLComboBox* comboShiny = self->getChild<LLComboBox>("combobox shininess");
+	LLComboBox* comboShiny = getChild<LLComboBox>("combobox shininess");
 
 	if(mess_with_shiny_combobox)
 	{
@@ -2061,15 +2040,15 @@ void LLPanelFace::updateShinyControls(LLUICtrl* ctrl, void* userdata, bool is_se
 				
 				// NORSPEC-94: Set default specular color to white
 				//
-				LLColorSwatchCtrl*	mShinyColorSwatch = self->getChild<LLColorSwatchCtrl>("shinycolorswatch");
+				LLColorSwatchCtrl*	mShinyColorSwatch = getChild<LLColorSwatchCtrl>("shinycolorswatch");
 				if(mShinyColorSwatch)
 				{
 					LL_DEBUGS("Materials") << "Resetting specular color to default of white" << LL_ENDL;
 					mShinyColorSwatch->setOriginal(LLColor4::white);
 					mShinyColorSwatch->set(LLColor4::white, TRUE);
 				}
-				self->getChild<LLUICtrl>("glossiness")->setValue(LLMaterial::DEFAULT_SPECULAR_LIGHT_EXPONENT);
-				self->getChild<LLUICtrl>("environment")->setValue(0);
+				getChild<LLUICtrl>("glossiness")->setValue(LLMaterial::DEFAULT_SPECULAR_LIGHT_EXPONENT);
+				getChild<LLUICtrl>("environment")->setValue(0);
 			}
 			comboShiny->setSimple(USE_TEXTURE);
 		}
@@ -2084,30 +2063,29 @@ void LLPanelFace::updateShinyControls(LLUICtrl* ctrl, void* userdata, bool is_se
 		}
 	}
 
-	LLComboBox* combo_matmedia = self->getChild<LLComboBox>("combobox matmedia");
-	LLComboBox* combo_mattype = self->getChild<LLComboBox>("combobox mattype");
+	LLComboBox* combo_matmedia = getChild<LLComboBox>("combobox matmedia");
+	LLComboBox* combo_mattype = getChild<LLComboBox>("combobox mattype");
 	U32 materials_media = combo_matmedia->getCurrentIndex();
 	U32 material_type = combo_mattype->getCurrentIndex();
 	bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled();
 	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled();
 	U32 shiny_value = comboShiny->getCurrentIndex();
 	bool show_shinyctrls = (shiny_value == SHINY_TEXTURE) && show_shininess; // Use texture
-	self->getChildView("label glossiness")->setVisible(show_shinyctrls);
-	self->getChildView("glossiness")->setVisible(show_shinyctrls);
-	self->getChildView("label environment")->setVisible(show_shinyctrls);
-	self->getChildView("environment")->setVisible(show_shinyctrls);
-	self->getChildView("label shinycolor")->setVisible(show_shinyctrls);
-	self->getChildView("shinycolorswatch")->setVisible(show_shinyctrls);
+	getChildView("label glossiness")->setVisible(show_shinyctrls);
+	getChildView("glossiness")->setVisible(show_shinyctrls);
+	getChildView("label environment")->setVisible(show_shinyctrls);
+	getChildView("environment")->setVisible(show_shinyctrls);
+	getChildView("label shinycolor")->setVisible(show_shinyctrls);
+	getChildView("shinycolorswatch")->setVisible(show_shinyctrls);
 }
 
 // static
-void LLPanelFace::updateBumpyControls(LLUICtrl* ctrl, void* userdata, bool is_setting_texture, bool mess_with_combobox)
+void LLPanelFace::updateBumpyControls(bool is_setting_texture, bool mess_with_combobox)
 {
-	LLPanelFace* self = (LLPanelFace*) userdata;
-	LLTextureCtrl* texture_ctrl = self->getChild<LLTextureCtrl>("bumpytexture control");
+	LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
 	LLUUID bumpy_texture_ID = texture_ctrl->getImageAssetID();
 	LL_DEBUGS("Materials") << "texture: " << bumpy_texture_ID << (mess_with_combobox ? "" : " do not") << " update combobox" << LL_ENDL;
-	LLComboBox* comboBumpy = self->getChild<LLComboBox>("combobox bumpiness");
+	LLComboBox* comboBumpy = getChild<LLComboBox>("combobox bumpiness");
 	if (!comboBumpy)
 	{
 		return;
@@ -2115,7 +2093,7 @@ void LLPanelFace::updateBumpyControls(LLUICtrl* ctrl, void* userdata, bool is_se
 
 	if (mess_with_combobox)
 	{
-		LLTextureCtrl* texture_ctrl = self->getChild<LLTextureCtrl>("bumpytexture control");
+		LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
 		LLUUID bumpy_texture_ID = texture_ctrl->getImageAssetID();
 		LL_DEBUGS("Materials") << "texture: " << bumpy_texture_ID << (mess_with_combobox ? "" : " do not") << " update combobox" << LL_ENDL;
 
@@ -2144,19 +2122,17 @@ void LLPanelFace::onCommitShiny(LLUICtrl* ctrl, void* userdata)
 {
 	LLPanelFace* self = (LLPanelFace*) userdata;
 	self->sendShiny();	
-	LLComboBox* combo_shiny = self->getChild<LLComboBox>("combobox shininess");
 	// Need 'true' here to insure that the 'Use Texture' choice is removed
 	// when we select something other than a spec texture
 	//
-	updateShinyControls(combo_shiny,self, false, true);
+	self->updateShinyControls(false, true);
 	self->updateMaterial();
 }
 
 // static
-void LLPanelFace::updateAlphaControls(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::updateAlphaControls()
 {
-	LLPanelFace* self = (LLPanelFace*) userdata;
-	LLComboBox* comboAlphaMode = self->getChild<LLComboBox>("combobox alphamode");
+	LLComboBox* comboAlphaMode = getChild<LLComboBox>("combobox alphamode");
 	if (!comboAlphaMode)
 	{
 		return;
@@ -2164,14 +2140,14 @@ void LLPanelFace::updateAlphaControls(LLUICtrl* ctrl, void* userdata)
 	U32 alpha_value = comboAlphaMode->getCurrentIndex();
 	bool show_alphactrls = (alpha_value == ALPHAMODE_MASK); // Alpha masking
     
-    LLComboBox* combobox_matmedia = self->getChild<LLComboBox>("combobox matmedia");
+    LLComboBox* combobox_matmedia = getChild<LLComboBox>("combobox matmedia");
     U32 mat_media = MATMEDIA_MATERIAL;
     if (combobox_matmedia)
     {
         mat_media = combobox_matmedia->getCurrentIndex();
     }
     
-    LLComboBox* combobox_mattype = self->getChild<LLComboBox>("combobox mattype");
+    LLComboBox* combobox_mattype = getChild<LLComboBox>("combobox mattype");
     U32 mat_type = MATTYPE_DIFFUSE;
     if (combobox_mattype)
     {
@@ -2181,15 +2157,15 @@ void LLPanelFace::updateAlphaControls(LLUICtrl* ctrl, void* userdata)
     show_alphactrls = show_alphactrls && (mat_media == MATMEDIA_MATERIAL);
     show_alphactrls = show_alphactrls && (mat_type == MATTYPE_DIFFUSE);
     
-	self->getChildView("label maskcutoff")->setVisible(show_alphactrls);
-	self->getChildView("maskcutoff")->setVisible(show_alphactrls);
+	getChildView("label maskcutoff")->setVisible(show_alphactrls);
+	getChildView("maskcutoff")->setVisible(show_alphactrls);
 }
 
 // static
 void LLPanelFace::onCommitAlphaMode(LLUICtrl* ctrl, void* userdata)
 {
 	LLPanelFace* self = (LLPanelFace*) userdata;
-	updateAlphaControls(ctrl,userdata);
+	self->updateAlphaControls();
 	self->updateMaterial();
 }
 
@@ -2245,46 +2221,40 @@ void LLPanelFace::onSelectTexture(const LLSD& data)
 void LLPanelFace::onCommitSpecularTexture( const LLSD& data )
 {
 	LL_DEBUGS("Materials") << data << LL_ENDL;
-	LLComboBox* combo_shiny = getChild<LLComboBox>("combobox shininess");
-	updateShinyControls(combo_shiny,this, true, true);
+	updateShinyControls(true, true);
 	updateMaterial();
 }
 
 void LLPanelFace::onCommitNormalTexture( const LLSD& data )
 {
 	LL_DEBUGS("Materials") << data << LL_ENDL;
-	LLComboBox* combo_bumpy = getChild<LLComboBox>("combobox bumpiness");
-	updateBumpyControls(combo_bumpy, this, true, true);
+	updateBumpyControls(true, true);
 	updateMaterial();
 }
 
 void LLPanelFace::onCancelSpecularTexture(const LLSD& data)
 {
 	updateMaterial();
-	LLComboBox* combo_shiny = getChild<LLComboBox>("combobox shininess");
-	updateShinyControls(combo_shiny,this, false, true);
+	updateShinyControls(false, true);
 }
 
 void LLPanelFace::onCancelNormalTexture(const LLSD& data)
 {
 	updateMaterial();
-	LLComboBox* combo_bumpy = getChild<LLComboBox>("combobox bumpiness");
-	updateBumpyControls(combo_bumpy,this, false, true);
+	updateBumpyControls(false, true);
 }
 
 void LLPanelFace::onSelectSpecularTexture(const LLSD& data)
 {
 	LL_DEBUGS("Materials") << data << LL_ENDL;
 	updateMaterial();
-	LLComboBox* combo_shiny = getChild<LLComboBox>("combobox shininess");
-	updateShinyControls(combo_shiny,this, true, true);
+	updateShinyControls(true, true);
 }
 
 void LLPanelFace::onSelectNormalTexture(const LLSD& data)
 {
 	LL_DEBUGS("Materials") << data << LL_ENDL;
-	LLComboBox* combo_bumpy = getChild<LLComboBox>("combobox bumpiness");
-	updateBumpyControls(combo_bumpy,this, true, true);
+	updateBumpyControls(true, true);
 	updateMaterial();
 }
 
@@ -2310,9 +2280,10 @@ void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata)
 	
 	gFocusMgr.setKeyboardFocus( NULL );
 
-	//F32 repeats_per_meter = self->mCtrlRepeatsPerMeter->get();
-	F32 repeats_per_meter = (F32)self->getChild<LLUICtrl>("rptctrl")->getValue().asReal();//self->mCtrlRepeatsPerMeter->get();
+	LLUICtrl* repeats_ctrl = self->getChild<LLUICtrl>("rptctrl");
 
+	F32 repeats_per_meter = repeats_ctrl->getValue().asReal();
+	
 	LLComboBox* combo_mattype = self->getChild<LLComboBox>("combobox mattype");
 	
     F32 obj_scale_s = 1.0f;
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index 4e97295b846bda70e4bc514af55a80fe05d31409..88f32e45f8547b31859a1f6f7f4a57c792aa07b1 100755
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -67,7 +67,7 @@ class LLPanelFace : public LLPanel
 	void			sendTexGen();				// applies and sends bump map
 	void			sendShiny();			// applies and sends shininess
 	void			sendFullbright();		// applies and sends full bright
-	void            sendGlow();
+	void        sendGlow();
 	void			sendMedia();
 
 	// this function is to return TRUE if the drag should succeed.
@@ -88,29 +88,49 @@ class LLPanelFace : public LLPanel
 	void 	onCancelColor(const LLSD& data);
 	void 	onSelectColor(const LLSD& data);
 
-	void    updateMaterial();
-	
-	static 	void onCommitTextureInfo( 		LLUICtrl* ctrl, void* userdata);
-	static void		onCommitMaterial(		LLUICtrl* ctrl, void* userdata);
-	static void		onCommitMaterialsMedia(		LLUICtrl* ctrl, void* userdata);
-	static void		onCommitMaterialType(		LLUICtrl* ctrl, void* userdata);
-	static void		onCommitBump(			LLUICtrl* ctrl, void* userdata);
+	// Make UI reflect state of currently selected material (refresh)
+	// and UI mode (e.g. editing normal map v diffuse map)
+	//
+	void updateUI();
+
+	// Callback funcs for individual controls
+	//
+	static void		onCommitTextureInfo( 	LLUICtrl* ctrl, void* userdata);
+	static void		onCommitMaterial(			LLUICtrl* ctrl, void* userdata);
+	static void		onCommitMaterialsMedia(	LLUICtrl* ctrl, void* userdata);
+	static void		onCommitMaterialType(	LLUICtrl* ctrl, void* userdata);
+	static void		onCommitBump(				LLUICtrl* ctrl, void* userdata);
 	static void		onCommitTexGen(			LLUICtrl* ctrl, void* userdata);
-	static void		updateShinyControls(		LLUICtrl* ctrl, void* userdata, bool is_setting_texture = false, bool mess_with_combobox = false);
-	static void		updateBumpyControls(		LLUICtrl* ctrl, void* userdata, bool is_setting_texture = false, bool mess_with_combobox = false);
-	static void		onCommitShiny(			LLUICtrl* ctrl, void* userdata);
-	static void		updateAlphaControls(		LLUICtrl* ctrl, void* userdata);
+	static void		onCommitShiny(				LLUICtrl* ctrl, void* userdata);
 	static void		onCommitAlphaMode(		LLUICtrl* ctrl, void* userdata);
 	static void		onCommitFullbright(		LLUICtrl* ctrl, void* userdata);
-	static void     onCommitGlow(           LLUICtrl* ctrl, void *userdata);
-	static void		onCommitPlanarAlign(	LLUICtrl* ctrl, void* userdata);
-	
+	static void    onCommitGlow(				LLUICtrl* ctrl, void *userdata);
+	static void		onCommitPlanarAlign(		LLUICtrl* ctrl, void* userdata);
 	static void		onCommitRepeatsPerMeter(	LLUICtrl* ctrl, void* userinfo);
 	static void		onClickAutoFix(void*);
-	static F32      valueGlow(LLViewerObject* object, S32 face);
+
+	static F32     valueGlow(LLViewerObject* object, S32 face);
 
 private:
 
+	// Update visibility of controls to match current UI mode
+	// (e.g. materials vs media editing)
+	//
+	// Do NOT call updateUI from within this function.
+	//
+	void updateVisibility();
+
+	// Make material reflect current state of UI (apply edit)
+	//
+	void updateMaterial();
+
+	// Update vis and enabling of specific subsets of controls based on material params
+	// (e.g. hide the spec controls if no spec texture is applied)
+	//
+	void updateShinyControls(bool is_setting_texture = false, bool mess_with_combobox = false);
+	void updateBumpyControls(bool is_setting_texture = false, bool mess_with_combobox = false);
+	void updateAlphaControls();
+
 	/*
 	 * Checks whether the selected texture from the LLFloaterTexturePicker can be applied to the currently selected object.
 	 * If agent selects texture which is not allowed to be applied for the currently selected object,
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index e80ad6976e0540583743ad090e847f6e67721805..3f60b5f642dbf6e820880a404e1927bfc7604a1c 100755
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -2052,7 +2052,7 @@ void LLSelectMgr::selectionRemoveMaterial()
 			{
 			        LL_DEBUGS("Materials") << "Removing material from object " << object->getID() << " face " << face << LL_ENDL;
 				LLMaterialMgr::getInstance()->remove(object->getID(),face);
-				object->setTEMaterialParams(face, NULL);
+				object->setTEMaterialID(face,LLMaterialID::null);
 			}
 			return true;
 		}
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 4e233d479a2ad20a44aa65c2091e594faf3f6d04..f8bc6ef4d316772e28b4f2b63d7bcadf565c8011 100755
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -4393,18 +4393,15 @@ S32 LLViewerObject::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID
 							 << ", material " << pMaterialID
 							 << LL_ENDL;
 		retval = LLPrimitive::setTEMaterialID(te, pMaterialID);
-		if (retval)
+	}
+		// Kitty would like to know if this is necessary?
+		// Since we should get a setTEMaterialParams that does it anyway?
+		//
+		setChanged(TEXTURE);
+		if (mDrawable.notNull())
 		{
-			// Kitty would like to know if this is necessary?
-			// Since we should get a setTEMaterialParams that does it anyway?
-			//
-			setChanged(TEXTURE);
-			if (mDrawable.notNull())
-			{
-				gPipeline.markTextured(mDrawable);
-			}
+			gPipeline.markTextured(mDrawable);
 		}
-	}
 	return retval;
 }
 
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 8e811527eb6deae7a590cf54ce1380f334b65573..1021615255dea63e419cc419854b3bad85e0f0d9 100755
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1991,17 +1991,15 @@ S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID)
 								<< LL_ENDL;
 		
 	LL_DEBUGS("MaterialTEs") << " " << pMaterialID.asString() << LL_ENDL;
-	if (res)
-	{
-		LLMaterialMgr::instance().get(getRegion()->getRegionID(), pMaterialID, boost::bind(&LLVOVolume::setTEMaterialParamsCallback, this, _1, _2, te));			
+	// Use TE-specific version of boost CB hook-up to avoid cross-contaminatin'
+	LLMaterialMgr::instance().getTE(getRegion()->getRegionID(), pMaterialID, te, boost::bind(&LLVOVolume::setTEMaterialParamsCallback, this, _1, _2, _3));			
 		setChanged(TEXTURE);
 		if (!mDrawable.isNull())
 		{
 			gPipeline.markTextured(mDrawable);
 		}
 		mFaceMappingChanged = TRUE;
-	}
-	return res;
+	return TEM_CHANGE_TEXTURE;
 }
 
 S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams)
diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
index a5425062ec01ca79d0ff385f00189df8eb98eec9..5be3ca9d9fc5de933ecd4eac93211dbe125b01eb 100644
--- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml
+++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
@@ -567,7 +567,7 @@
              layout="topleft"
 			 label_width="205"
              left="10"
-             max_val="10"
+             max_val="100"
              min_val="0.1"
              name="rptctrl"
              width="265" />