diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index e74c8509ce4702f456f7fcdc9bdf65f9c9495978..0dedfae7da923ad380096de5a833a9a9bef5b9a0 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -65,6 +65,20 @@
 #include "llpluginclassmedia.h"
 #include "llviewertexturelist.h"
 
+//
+// Constant definitions for comboboxes
+// Must match the commbobox definitions in panel_tools_texture.xml
+//
+const U32 MATMEDIA_MATERIAL = 0;	// Material
+const U32 MATMEDIA_MEDIA = 1;		// Media
+const U32 MATTYPE_DIFFUSE = 0;		// Diffuse material texture
+const U32 MATTYPE_NORMAL = 1;		// Normal map
+const U32 MATTYPE_SPECULAR = 2;		// Specular map
+const U32 ALPHAMODE_NONE = 0;		// No alpha mask applied
+const U32 ALPHAMODE_MASK = 2;		// Alpha masking mode
+const U32 BUMPY_TEXTURE = 18;		// use supplied normal map
+const U32 SHINY_TEXTURE = 4;		// use supplied specular map
+
 //
 // Methods
 //
@@ -75,6 +89,7 @@ BOOL	LLPanelFace::postBuild()
 	childSetCommitCallback("combobox mattype",&LLPanelFace::onCommitMaterialType,this);
 	childSetCommitCallback("combobox shininess",&LLPanelFace::onCommitShiny,this);
 	childSetCommitCallback("combobox bumpiness",&LLPanelFace::onCommitBump,this);
+	childSetCommitCallback("combobox alphamode",&LLPanelFace::onCommitAlphaMode,this);
 	childSetCommitCallback("TexScaleU",&LLPanelFace::onCommitTextureInfo, this);
 	childSetCommitCallback("TexScaleV",&LLPanelFace::onCommitTextureInfo, this);
 	childSetCommitCallback("TexRot",&LLPanelFace::onCommitTextureInfo, this);
@@ -492,30 +507,33 @@ void LLPanelFace::getState()
 		BOOL editable = objectp->permModify() && !objectp->isPermanentEnforced();
 
 		// only turn on auto-adjust button if there is a media renderer and the media is loaded
-		getChildView("textbox autofix")->setEnabled(editable);
 		getChildView("button align")->setEnabled(editable);
 
-		LLCtrlSelectionInterface* combobox_matmedia =
-		      childGetSelectionInterface("combobox matmedia");
+		LLComboBox* combobox_matmedia = getChild<LLComboBox>("combobox matmedia");
 		if (combobox_matmedia)
 		{
-			combobox_matmedia->selectNthItem(0);
+			if (combobox_matmedia->getCurrentIndex() < MATMEDIA_MATERIAL)
+			{
+				combobox_matmedia->selectNthItem(MATMEDIA_MATERIAL);
+			}
 		}
 		else
 		{
-			llwarns << "failed childGetSelectionInterface for 'combobox matmedia'" << llendl;
+			llwarns << "failed getChild for 'combobox matmedia'" << llendl;
 		}
 		getChildView("combobox matmedia")->setEnabled(editable);
 
-		LLCtrlSelectionInterface* combobox_mattype =
-		      childGetSelectionInterface("combobox mattype");
+		LLComboBox* combobox_mattype = getChild<LLComboBox>("combobox mattype");
 		if (combobox_mattype)
 		{
-			combobox_mattype->selectNthItem(0);
+			if (combobox_mattype->getCurrentIndex() < MATTYPE_DIFFUSE)
+			{
+				combobox_mattype->selectNthItem(MATTYPE_DIFFUSE);
+			}
 		}
 		else
 		{
-			llwarns << "failed childGetSelectionInterface for 'combobox mattype'" << llendl;
+			llwarns << "failed getChild for 'combobox mattype'" << llendl;
 		}
 		getChildView("combobox mattype")->setEnabled(editable);
 		onCommitMaterialsMedia(NULL, this);
@@ -565,12 +583,41 @@ void LLPanelFace::getState()
 			} func;
 			identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, id );
 
+			BOOL is_alpha = FALSE;
+			struct f2 : public LLSelectedTEGetFunctor<BOOL>
+			{
+				BOOL get(LLViewerObject* object, S32 te_index)
+				{
+					BOOL is_alpha = FALSE;
+					
+					LLViewerTexture* image = object->getTEImage(te_index);
+					if (image) is_alpha = image->getIsAlphaMask();
+					return is_alpha;
+				}
+			} func2;
+			identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func2, is_alpha );
+
 			if(LLViewerMedia::textureHasMedia(id))
 			{
-				getChildView("textbox autofix")->setEnabled(editable);
 				getChildView("button align")->setEnabled(editable);
 			}
 			
+			if (!is_alpha)
+			{
+				// Selected texture has no alpha, force alpha mode None
+				LLCtrlSelectionInterface* combobox_alphamode =
+				      childGetSelectionInterface("combobox alphamode");
+				if (combobox_alphamode)
+				{
+					combobox_alphamode->selectNthItem(ALPHAMODE_NONE);
+				}
+				else
+				{
+					llwarns << "failed childGetSelectionInterface for 'combobox alphamode'" << llendl;
+				}
+				onCommitAlphaMode(getChild<LLComboBox>("combobox alpha"),this);
+			}
+			
 			if (identical)
 			{
 				// All selected have the same texture
@@ -579,6 +626,10 @@ void LLPanelFace::getState()
 					texture_ctrl->setTentative( FALSE );
 					texture_ctrl->setEnabled( editable );
 					texture_ctrl->setImageAssetID( id );
+					getChildView("combobox alphamode")->setEnabled(editable && is_alpha);
+					getChildView("label alphamode")->setEnabled(editable && is_alpha);
+					getChildView("maskcutoff")->setEnabled(editable && is_alpha);
+					getChildView("label maskcutoff")->setEnabled(editable && is_alpha);
 				}
 			}
 			else
@@ -591,6 +642,10 @@ void LLPanelFace::getState()
 						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 );
 					}
 					else
 					{
@@ -598,6 +653,10 @@ void LLPanelFace::getState()
 						texture_ctrl->setTentative( TRUE );
 						texture_ctrl->setEnabled( editable );
 						texture_ctrl->setImageAssetID( id );
+						getChildView("combobox alphamode")->setEnabled(editable && is_alpha);
+						getChildView("label alphamode")->setEnabled(editable && is_alpha);
+						getChildView("maskcutoff")->setEnabled(editable && is_alpha);
+						getChildView("label maskcutoff")->setEnabled(editable && is_alpha);
 					}
 				}
 			}
@@ -803,6 +862,15 @@ void LLPanelFace::getState()
 			getChildView("combobox shininess")->setEnabled(editable);
 			getChild<LLUICtrl>("combobox shininess")->setTentative(!identical);
 			getChildView("label shininess")->setEnabled(editable);
+			getChildView("glossiness")->setEnabled(editable);
+			getChild<LLUICtrl>("glossiness")->setTentative(!identical);
+			getChildView("label glossiness")->setEnabled(editable);
+			getChildView("environment")->setEnabled(editable);
+			getChild<LLUICtrl>("environment")->setTentative(!identical);
+			getChildView("label environment")->setEnabled(editable);
+			getChildView("shinycolorswatch")->setEnabled(editable);
+			getChild<LLUICtrl>("shinycolorswatch")->setTentative(!identical);
+			getChildView("label shinycolor")->setEnabled(editable);
 		}
 
 		{
@@ -955,12 +1023,9 @@ void LLPanelFace::getState()
 		getChildView("label shininess")->setEnabled(FALSE);
 		getChildView("label bumpiness")->setEnabled(FALSE);
 
-		getChildView("textbox autofix")->setEnabled(FALSE);
-
 		getChildView("button align")->setEnabled(FALSE);
 		//getChildView("has media")->setEnabled(FALSE);
 		//getChildView("media info set")->setEnabled(FALSE);
-		
 
 		// Set variable values for numeric expressions
 		LLCalc* calcp = LLCalc::getInstance();
@@ -1016,30 +1081,50 @@ void LLPanelFace::onSelectColor(const LLSD& data)
 void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)
 {
 	LLPanelFace* self = (LLPanelFace*) userdata;
-	LLComboBox* mComboMaterialsMedia = self->getChild<LLComboBox>("combobox matmedia");
-	if (!mComboMaterialsMedia)
+	LLComboBox* comboMaterialsMedia = self->getChild<LLComboBox>("combobox matmedia");
+	if (!comboMaterialsMedia)
 	{
 		return;
 	}
-	U32 materials_media = mComboMaterialsMedia->getCurrentIndex();
-	LLComboBox* mComboMaterialType = self->getChild<LLComboBox>("combobox mattype");
-	if (!mComboMaterialType)
+	U32 materials_media = comboMaterialsMedia->getCurrentIndex();
+	LLComboBox* comboMaterialType = self->getChild<LLComboBox>("combobox mattype");
+	if (!comboMaterialType)
 	{
 		return;
 	}
-	U32 material_type = mComboMaterialType->getCurrentIndex();
-	bool show_media = (materials_media == 1);
-	bool show_texture = (!show_media) && (material_type == 0);
-	bool show_bumpiness = (!show_media) && (material_type == 1);
-	bool show_shininess = (!show_media) && (material_type == 2);
+	U32 material_type = comboMaterialType->getCurrentIndex();
+	bool show_media = (materials_media == MATMEDIA_MEDIA);
+	bool show_texture = (!show_media) && (material_type == MATTYPE_DIFFUSE);
+	bool show_bumpiness = (!show_media) && (material_type == MATTYPE_NORMAL);
+	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR);
 	self->getChildView("combobox mattype")->setVisible(!show_media);
 	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);
 	self->getChildView("texture control")->setVisible(show_texture);
+	self->getChildView("label alphamode")->setVisible(show_texture);
+	self->getChildView("combobox alphamode")->setVisible(show_texture);
+	self->getChildView("label maskcutoff")->setVisible(false);
+	self->getChildView("maskcutoff")->setVisible(false);
+	if (show_texture)
+	{
+		onCommitAlphaMode(ctrl, userdata);
+	}
+	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);
+	if (show_shininess)
+	{
+		onCommitShiny(ctrl, userdata);
+	}
+	self->getChildView("bumpytexture control")->setVisible(show_bumpiness);
 	self->getChildView("combobox bumpiness")->setVisible(show_bumpiness);
 	self->getChildView("label bumpiness")->setVisible(show_bumpiness);
 }
@@ -1068,9 +1153,37 @@ void LLPanelFace::onCommitTexGen(LLUICtrl* ctrl, void* userdata)
 void LLPanelFace::onCommitShiny(LLUICtrl* ctrl, void* userdata)
 {
 	LLPanelFace* self = (LLPanelFace*) userdata;
+	LLComboBox* comboShiny = self->getChild<LLComboBox>("combobox shininess");
+	if (!comboShiny)
+	{
+		return;
+	}
+	U32 shiny_value = comboShiny->getCurrentIndex();
+	bool show_shinyctrls = (shiny_value == SHINY_TEXTURE); // 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);
 	self->sendShiny();
 }
 
+// static
+void LLPanelFace::onCommitAlphaMode(LLUICtrl* ctrl, void* userdata)
+{
+	LLPanelFace* self = (LLPanelFace*) userdata;
+	LLComboBox* comboAlphaMode = self->getChild<LLComboBox>("combobox alphamode");
+	if (!comboAlphaMode)
+	{
+		return;
+	}
+	U32 alpha_value = comboAlphaMode->getCurrentIndex();
+	bool show_alphactrls = (alpha_value == ALPHAMODE_MASK); // Alpha masking
+	self->getChildView("label maskcutoff")->setVisible(show_alphactrls);
+	self->getChildView("maskcutoff")->setVisible(show_alphactrls);
+}
+
 // static
 void LLPanelFace::onCommitFullbright(LLUICtrl* ctrl, void* userdata)
 {
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index acac2c1bf522317288c7684f6b82f5ea9b631011..56b4034a2d0f2cd65d1c29d8a67c6ac7e4e3e2b7 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -85,6 +85,7 @@ class LLPanelFace : public LLPanel
 	static void		onCommitBump(			LLUICtrl* ctrl, void* userdata);
 	static void		onCommitTexGen(			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);
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 26b2d833513a7098728f0dab3fb69276cbcec256..21cbf9673de651a5b4582a6fa1b4a13256e1ca17 100644
--- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml
+++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
@@ -155,36 +155,36 @@
              follows="left|top"
              height="10"
              layout="topleft"
-             name="label shininess"
              left_pad="10"
+             name="label alphamode"
              text_readonly_color="LabelDisabledColor"
-             top_delta="6"
+             top_delta="0"
              width="90">
-                Shininess
+                Alpha mode
             </text>
             <combo_box
              height="23"
              layout="topleft"
-             left_pad="10"
-             name="combobox shininess"
-             top_delta="-6"
-             width="90">
+             left_delta="0"
+             name="combobox alphamode"
+             top_pad="4"
+             width="120">
                 <combo_box.item
                  label="None"
                  name="None"
                  value="None" />
                 <combo_box.item
-                 label="Low"
-                 name="Low"
-                 value="Low" />
+                 label="Alpha blending"
+                 name="Alpha blending"
+                 value="Alpha blending" />
                 <combo_box.item
-                 label="Medium"
-                 name="Medium"
-                 value="Medium" />
+                 label="Alpha masking"
+                 name="Alpha masking"
+                 value="Alpha masking" />
                 <combo_box.item
-                 label="High"
-                 name="High"
-                 value="High" />
+                 label="Emissive mask"
+                 name="Emissive mask"
+                 value="Emissive mask" />
             </combo_box>
             <text
              type="string"
@@ -192,7 +192,43 @@
              follows="left|top"
              height="10"
              layout="topleft"
-             left_delta="-100"
+             left_delta="0"
+             name="label maskcutoff"
+             text_readonly_color="LabelDisabledColor"
+             top_pad="4"
+             width="90">
+                Mask cutoff
+            </text>
+            <spinner
+             decimal_digits="3"
+             follows="left|top"
+             height="19"
+             initial_value="0"
+             layout="topleft"
+             top_pad="4"
+             left_delta="0"
+             name="maskcutoff"
+             width="80" />
+            <texture_picker
+             can_apply_immediately="true"
+             default_image_name="Default"
+             fallback_image="locked_image.j2c"
+             follows="left|top"
+             height="80"
+             label="Texture       "
+             layout="topleft"
+             left="10"
+             name="bumpytexture control"
+             tool_tip="Click to choose a picture"
+             top_delta="-55"
+             width="64" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_pad="10"
              name="label bumpiness"
              text_readonly_color="LabelDisabledColor"
              top_delta="0"
@@ -278,13 +314,142 @@
                  label="weave"
                  name="weave"
                  value="weave" />
+                <combo_box.item
+                 label="Use texture"
+                 name="Use texture"
+                 value="Use texture" />
+            </combo_box>
+            <texture_picker
+             can_apply_immediately="true"
+             default_image_name="Default"
+             fallback_image="locked_image.j2c"
+             follows="left|top"
+             height="80"
+             label="Texture       "
+             layout="topleft"
+             left="10"
+             name="shinytexture control"
+             tool_tip="Click to choose a picture"
+             top_delta="-14"
+             width="64" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             name="label shininess"
+             left_pad="10"
+             text_readonly_color="LabelDisabledColor"
+             top_delta="6"
+             width="90">
+                Shininess
+            </text>
+            <combo_box
+             height="23"
+             layout="topleft"
+             left_pad="10"
+             name="combobox shininess"
+             top_delta="-6"
+             width="90">
+                <combo_box.item
+                 label="None"
+                 name="None"
+                 value="None" />
+                <combo_box.item
+                 label="Low"
+                 name="Low"
+                 value="Low" />
+                <combo_box.item
+                 label="Medium"
+                 name="Medium"
+                 value="Medium" />
+                <combo_box.item
+                 label="High"
+                 name="High"
+                 value="High" />
+                <combo_box.item
+                 label="Use texture"
+                 name="Use texture"
+                 value="Use texture" />
             </combo_box>
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_delta="-100"
+             name="label glossiness"
+             text_readonly_color="LabelDisabledColor"
+             top_pad="8"
+             width="116">
+                Glossiness
+            </text>
+            <spinner
+             decimal_digits="3"
+             follows="left|top"
+             height="19"
+             initial_value="0"
+             layout="topleft"
+             top_delta="-4"
+             left_pad="10"
+             name="glossiness"
+             width="64" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_delta="-126"
+             name="label environment"
+             text_readonly_color="LabelDisabledColor"
+             top_pad="8"
+             width="116">
+                Environment
+            </text>
+            <spinner
+             decimal_digits="3"
+             follows="left|top"
+             height="19"
+             initial_value="0"
+             layout="topleft"
+             top_delta="-4"
+             left_pad="10"
+             name="environment"
+             width="64" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_delta="-126"
+             name="label shinycolor"
+             text_readonly_color="LabelDisabledColor"
+             top_pad="8"
+             width="116">
+                Color
+            </text>
+            <!-- label is blank because control places it below the box -->
+            <color_swatch
+             can_apply_immediately="true"
+             follows="left|top"
+             height="45"
+             label=""
+             layout="topleft"
+             left_pad="10"
+             name="shinycolorswatch"
+             tool_tip="Click to open color picker"
+             top_delta="-4"
+             width="64" />
             <text
 			 follows="left|top|right"
 			 height="9"
 			 layout="topleft"
 			 left="10"
-			 top_delta="-8"
+			 top_delta="-50"
              use_ellipses="true"
 			 read_only="true"
 			 name="media_info"
@@ -370,14 +535,6 @@
              name="TexScaleU"
              top_pad="5"
              width="265" />
-            <!-- <check_box
-             height="19"
-             label="Flip"
-             layout="topleft"
-             left_pad="5"
-             name="checkbox flip s"
-             top_delta="0"
-             width="70" /> -->
             <spinner
              follows="left|top"
              height="19"
@@ -390,14 +547,6 @@
              max_val="100"
              name="TexScaleV"
              width="265" />
-            <!-- <check_box
-             height="19"
-             label="Flip"
-             layout="topleft"
-             left_pad="5"
-             name="checkbox flip t"
-             top_delta="0"
-             width="70" /> -->
             <spinner
              decimal_digits="1"
              follows="left|top"
@@ -411,16 +560,7 @@
              min_val="0.1"
              name="rptctrl"
              width="265" />
-            <!-- <button
-             follows="left|top"
-             height="19"
-             label="Apply"
-             label_selected="Apply"
-             layout="topleft"
-             left_pad="5"
-             name="button apply"
-             width="75" /> -->
-            <spinner
+           <spinner
              decimal_digits="2"
              follows="left|top"
              height="19"