diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 2e53cf2da00095b9434c282f9a59f2b31c9a2c20..b82da4c5ab9e95383a2681b3ae0d16e2a2cae44a 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2862,6 +2862,28 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+  <key>DefaultBlankNormalTexture</key>
+  <map>
+    <key>Comment</key>
+    <string>Texture used as 'Blank' in texture picker for normal maps. (UUID texture reference)</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>String</string>
+    <key>Value</key>
+    <string>5b53359e-59dd-d8a2-04c3-9e65134da47a</string>
+  </map>
+  <key>DefaultBlankSpecularTexture</key>
+  <map>
+    <key>Comment</key>
+    <string>Texture used as 'Blank' in texture picker for specular maps. (UUID texture reference)</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>String</string>
+    <key>Value</key>
+    <string>cd35472f-71fa-9b9c-8e73-a2c324f5751a</string>
+  </map>
 	<key>DefaultFemaleAvatar</key>
 	<map>
 	  <key>Comment</key>
@@ -2884,8 +2906,29 @@
 	  <key>Value</key>
 	  <string>Male Shape &amp; Outfit</string>
 	</map>
-
-    <key>DefaultObjectTexture</key>
+  <key>DefaultObjectNormalTexture</key>
+  <map>
+    <key>Comment</key>
+    <string>Texture used as 'Default' in texture picker for normal map. (UUID texture reference)</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>String</string>
+    <key>Value</key>
+    <string>2d9dd1d8-9d57-3cfb-f965-f7613e702d8e</string>
+  </map>
+  <key>DefaultObjectSpecularTexture</key>
+  <map>
+    <key>Comment</key>
+    <string>Texture used as 'Default' in texture picker for specular map. (UUID texture reference)</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>String</string>
+    <key>Value</key>
+    <string>e0491381-964c-0d68-1caa-91ab2f4c6d6a</string>
+  </map>
+  <key>DefaultObjectTexture</key>
     <map>
       <key>Comment</key>
       <string>Texture used as 'Default' in texture picker. (UUID texture reference)</string>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 9ac80dd6c0d00c6e2d21559f46fc38bedef06605..bb81b197ccd7e603ecece4cfe4ec1562d501046a 100755
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -598,7 +598,8 @@ static void settings_to_globals()
 static void settings_modify()
 {
 	LLRenderTarget::sUseFBO				= gSavedSettings.getBOOL("RenderDeferred");
-	LLPipeline::sRenderDeferred			= gSavedSettings.getBOOL("RenderDeferred");
+	LLPipeline::sRenderBump				= gSavedSettings.getBOOL("RenderObjectBump");
+	LLPipeline::sRenderDeferred		= LLPipeline::sRenderBump && gSavedSettings.getBOOL("RenderDeferred");
 	LLVOAvatar::sUseImpostors			= gSavedSettings.getBOOL("RenderUseImpostors");
 	LLVOSurfacePatch::sLODFactor		= gSavedSettings.getF32("RenderTerrainLODFactor");
 	LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4]
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index b2f76e2114e1fcecce0bacfa0b2669f0aa02f52a..c9029bfcb06989066bad12656b51d895a341a639 100755
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -157,7 +157,8 @@ BOOL	LLPanelFace::postBuild()
 	mShinyTextureCtrl = getChild<LLTextureCtrl>("shinytexture control");
 	if(mShinyTextureCtrl)
 	{
-		mShinyTextureCtrl->setDefaultImageAssetID(LLUUID( gSavedSettings.getString( "DefaultObjectTexture" )));
+		mShinyTextureCtrl->setDefaultImageAssetID(LLUUID( gSavedSettings.getString( "DefaultObjectSpecularTexture" )));
+		mShinyTextureCtrl->setBlankImageAssetID(LLUUID( gSavedSettings.getString( "DefaultBlankSpecularTexture" )));
 		mShinyTextureCtrl->setCommitCallback( boost::bind(&LLPanelFace::onCommitSpecularTexture, this, _2) );
 		mShinyTextureCtrl->setOnCancelCallback( boost::bind(&LLPanelFace::onCancelSpecularTexture, this, _2) );
 		mShinyTextureCtrl->setOnSelectCallback( boost::bind(&LLPanelFace::onSelectSpecularTexture, this, _2) );
@@ -172,7 +173,8 @@ BOOL	LLPanelFace::postBuild()
 	mBumpyTextureCtrl = getChild<LLTextureCtrl>("bumpytexture control");
 	if(mBumpyTextureCtrl)
 	{
-		mBumpyTextureCtrl->setDefaultImageAssetID(LLUUID( gSavedSettings.getString( "DefaultObjectTexture" )));
+		mBumpyTextureCtrl->setDefaultImageAssetID(LLUUID( gSavedSettings.getString( "DefaultObjectNormalTexture" )));
+		mBumpyTextureCtrl->setBlankImageAssetID(LLUUID( gSavedSettings.getString( "DefaultBlankNormalTexture" )));
 		mBumpyTextureCtrl->setCommitCallback( boost::bind(&LLPanelFace::onCommitNormalTexture, this, _2) );
 		mBumpyTextureCtrl->setOnCancelCallback( boost::bind(&LLPanelFace::onCancelNormalTexture, this, _2) );
 		mBumpyTextureCtrl->setOnSelectCallback( boost::bind(&LLPanelFace::onSelectNormalTexture, this, _2) );
@@ -741,23 +743,23 @@ void LLPanelFace::updateUI()
 			} func2;
 			LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func2, image_format );
             
-            mIsAlpha = FALSE;
-            switch (image_format)
-            {
-                case GL_RGBA:
-                case GL_ALPHA:
-                {
-                    mIsAlpha = TRUE;
-                }
-                break;
-
-                case GL_RGB: break;
-                default:
-                {
-                    llwarns << "Unexpected tex format in LLPanelFace...resorting to no alpha" << llendl;
-                }
-                break;
-            }
+         mIsAlpha = FALSE;
+         switch (image_format)
+         {
+               case GL_RGBA:
+               case GL_ALPHA:
+               {
+                  mIsAlpha = TRUE;
+               }
+               break;
+
+               case GL_RGB: break;
+               default:
+               {
+                  llwarns << "Unexpected tex format in LLPanelFace...resorting to no alpha" << llendl;
+               }
+               break;
+         }
 
 			if(LLViewerMedia::textureHasMedia(id))
 			{
@@ -768,15 +770,15 @@ void LLPanelFace::updateUI()
 			struct alpha_get : public LLSelectedTEGetFunctor<U8>
 			{
 				U8 get(LLViewerObject* object, S32 te_index)
-			{
+				{
 					U8 ret = 1;
 					
 					LLMaterial* mat = object->getTE(te_index)->getMaterialParams().get();
 
 					if (mat)
-				{
+					{
 						ret = mat->getDiffuseAlphaMode();
-				}
+					}
 									
 					return ret;
 				}
@@ -808,7 +810,7 @@ void LLPanelFace::updateUI()
 			
 			if(texture_ctrl && !texture_ctrl->isPickerShown())
 			{
-                if (identical_diffuse)
+				if (identical_diffuse)
 				{
 					texture_ctrl->setTentative( FALSE );
 					texture_ctrl->setEnabled( editable );
@@ -818,7 +820,7 @@ void LLPanelFace::updateUI()
 					getChildView("maskcutoff")->setEnabled(editable && mIsAlpha);
 					getChildView("label maskcutoff")->setEnabled(editable && mIsAlpha);
 				}
-                else if (id.isNull())
+				else if (id.isNull())
 				{
 					// None selected
 					texture_ctrl->setTentative( FALSE );
@@ -835,54 +837,54 @@ void LLPanelFace::updateUI()
 					texture_ctrl->setTentative( TRUE );
 					texture_ctrl->setEnabled( editable );
 					texture_ctrl->setImageAssetID( id );
-                    getChildView("combobox alphamode")->setEnabled(editable && mIsAlpha);
-                    getChildView("label alphamode")->setEnabled(editable && mIsAlpha);
-                    getChildView("maskcutoff")->setEnabled(editable && mIsAlpha);
-                    getChildView("label maskcutoff")->setEnabled(editable && mIsAlpha);
-                }
-            }
+					getChildView("combobox alphamode")->setEnabled(editable && mIsAlpha);
+					getChildView("label alphamode")->setEnabled(editable && mIsAlpha);
+					getChildView("maskcutoff")->setEnabled(editable && mIsAlpha);
+					getChildView("label maskcutoff")->setEnabled(editable && mIsAlpha);
+				}
+			}
             
-            if (shinytexture_ctrl && !shinytexture_ctrl->isPickerShown())
+         if (shinytexture_ctrl && !shinytexture_ctrl->isPickerShown())
+         {
+				if (identical_spec)
+				{
+					shinytexture_ctrl->setTentative( FALSE );
+					shinytexture_ctrl->setEnabled( editable );
+					shinytexture_ctrl->setImageAssetID( specmap_id );
+            }
+            else if (specmap_id.isNull())
+				{
+               shinytexture_ctrl->setTentative( FALSE );
+               shinytexture_ctrl->setEnabled( FALSE );
+					shinytexture_ctrl->setImageAssetID( LLUUID::null );
+            }
+            else
             {
-                if (identical_spec)
-                {
-                    shinytexture_ctrl->setTentative( FALSE );
-                    shinytexture_ctrl->setEnabled( editable );
-                    shinytexture_ctrl->setImageAssetID( specmap_id );
-                }
-                else if (specmap_id.isNull())
-                {
-                    shinytexture_ctrl->setTentative( FALSE );
-                    shinytexture_ctrl->setEnabled( FALSE );
-                    shinytexture_ctrl->setImageAssetID( LLUUID::null );
-                }
-                else
-                {
 					shinytexture_ctrl->setTentative( TRUE );
 					shinytexture_ctrl->setEnabled( editable );
-                    shinytexture_ctrl->setImageAssetID( specmap_id );
-                }
-            }
+					shinytexture_ctrl->setImageAssetID( specmap_id );
+				}
+         }
 
-            if (bumpytexture_ctrl && !bumpytexture_ctrl->isPickerShown())
-            {
-                if (identical_norm)
+         if (bumpytexture_ctrl && !bumpytexture_ctrl->isPickerShown())
+         {
+				if (identical_norm)
+				{
+					bumpytexture_ctrl->setTentative( FALSE );
+					bumpytexture_ctrl->setEnabled( editable );
+					bumpytexture_ctrl->setImageAssetID( normmap_id );
+				}
+				else if (normmap_id.isNull())
 				{
-                    bumpytexture_ctrl->setTentative( FALSE );
-                    bumpytexture_ctrl->setEnabled( editable );
-                    bumpytexture_ctrl->setImageAssetID( normmap_id );
-                }
-                else if (normmap_id.isNull())
-                {
-                    bumpytexture_ctrl->setTentative( FALSE );
-                    bumpytexture_ctrl->setEnabled( FALSE );
+					bumpytexture_ctrl->setTentative( FALSE );
+					bumpytexture_ctrl->setEnabled( FALSE );
 					bumpytexture_ctrl->setImageAssetID( LLUUID::null );
 				}
-                else
-                {
+            else
+            {
 					bumpytexture_ctrl->setTentative( TRUE );
 					bumpytexture_ctrl->setEnabled( editable );
-                    bumpytexture_ctrl->setImageAssetID( normmap_id );
+					bumpytexture_ctrl->setImageAssetID( normmap_id );
 				}
 			}
 		}
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index e2d0fdf3576579558378b1d947ad45019ccd992f..5be342e3d0b34c2863e0aec75835faa99206e8a4 100755
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -144,7 +144,7 @@ class LLFloaterTexturePicker : public LLFloater
 	static void		onBtnCancel( void* userdata );
 		   void		onBtnPipette( );
 	//static void		onBtnRevert( void* userdata );
-	static void		onBtnWhite( void* userdata );
+	static void		onBtnBlank( void* userdata );
 	static void		onBtnNone( void* userdata );
 	static void		onBtnClear( void* userdata );
 		   void		onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
@@ -426,7 +426,7 @@ BOOL LLFloaterTexturePicker::postBuild()
 
 	childSetAction("Default",LLFloaterTexturePicker::onBtnSetToDefault,this);
 	childSetAction("None", LLFloaterTexturePicker::onBtnNone,this);
-	childSetAction("Blank", LLFloaterTexturePicker::onBtnWhite,this);
+	childSetAction("Blank", LLFloaterTexturePicker::onBtnBlank,this);
 
 
 	childSetCommitCallback("show_folders_check", onShowFolders, this);
@@ -581,7 +581,7 @@ void LLFloaterTexturePicker::draw()
 		}
 
 		getChildView("Default")->setEnabled(mImageAssetID != mOwner->getDefaultImageAssetID());
-		getChildView("Blank")->setEnabled(mImageAssetID != mWhiteImageAssetID );
+		getChildView("Blank")->setEnabled(mImageAssetID != mOwner->getBlankImageAssetID());
 		getChildView("None")->setEnabled(mOwner->getAllowNoTexture() && !mImageAssetID.isNull() );
 
 		LLFloater::draw();
@@ -721,11 +721,11 @@ void LLFloaterTexturePicker::onBtnSetToDefault(void* userdata)
 }
 
 // static
-void LLFloaterTexturePicker::onBtnWhite(void* userdata)
+void LLFloaterTexturePicker::onBtnBlank(void* userdata)
 {
 	LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
 	self->setCanApply(true, true);
-	self->setImageID( self->mWhiteImageAssetID );
+	self->setImageID( self->mOwner->getBlankImageAssetID() );
 	self->commitIfImmediateSet();
 }
 
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 3fd024082e9b41ca9a83064f93bc8542a762707b..a7ef1b3f788f722d1c45e7c18657b968fd14efa3 100755
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -146,6 +146,9 @@ class LLTextureCtrl
 
 	const std::string&	getDefaultImageName() const					{ return mDefaultImageName; }
 
+	void			setBlankImageAssetID( const LLUUID& id )	{ mBlankImageAssetID = id; }
+	const LLUUID&	getBlankImageAssetID() const { return mBlankImageAssetID; }
+
 	void			setCaption(const std::string& caption);
 	void			setCanApplyImmediately(BOOL b);
 
@@ -202,6 +205,7 @@ class LLTextureCtrl
 	LLUUID					 	mImageItemID;
 	LLUUID					 	mImageAssetID;
 	LLUUID					 	mDefaultImageAssetID;
+	LLUUID					 	mBlankImageAssetID;
 	LLUIImagePtr				mFallbackImage;
 	std::string					mDefaultImageName;
 	LLHandle<LLFloater>			mFloaterHandle;
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index a62f73deef0e2b373f14efb8a682473ab8f6fd3d..afbb59e72343e2ea05404adc93d9f097d432e790 100755
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -401,6 +401,25 @@ static bool handleRenderDeferredChanged(const LLSD& newvalue)
 	return true;
 }
 
+// This looks a great deal like handleRenderDeferredChanged because
+// Advanced Lighting (Materials) implies bumps and shiny so disabling
+// bumps should further disable that feature.
+//
+static bool handleRenderBumpChanged(const LLSD& newval)
+{
+	LLRenderTarget::sUseFBO = newval.asBoolean();
+	if (gPipeline.isInit())
+	{
+		gPipeline.updateRenderBump();
+		gPipeline.updateRenderDeferred();
+		gPipeline.releaseGLBuffers();
+		gPipeline.createGLBuffers();
+		gPipeline.resetVertexBuffers();
+		LLViewerShaderMgr::instance()->setShaders();
+	}
+	return true;
+}
+
 static bool handleRenderUseImpostorsChanged(const LLSD& newvalue)
 {
 	LLVOAvatar::sUseImpostors = newvalue.asBoolean();
@@ -629,7 +648,7 @@ void settings_setup_listeners()
 	gSavedSettings.getControl("RenderDebugTextureBind")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
 	gSavedSettings.getControl("RenderAutoMaskAlphaDeferred")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
 	gSavedSettings.getControl("RenderAutoMaskAlphaNonDeferred")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
-	gSavedSettings.getControl("RenderObjectBump")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
+	gSavedSettings.getControl("RenderObjectBump")->getSignal()->connect(boost::bind(&handleRenderBumpChanged, _2));
 	gSavedSettings.getControl("RenderMaxVBOSize")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
 	gSavedSettings.getControl("RenderDeferredNoise")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
 	gSavedSettings.getControl("RenderUseImpostors")->getSignal()->connect(boost::bind(&handleRenderUseImpostorsChanged, _2));
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 42a47c694fe4c186e18e112cf428273ad9dba9b3..f4b445c2ebbda3c5cb4bf3fbb7ebc547335520fd 100755
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -1026,13 +1026,19 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 	return true;
 }
 
+//static
+void LLPipeline::updateRenderBump()
+{
+	sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
+}
+
 //static
 void LLPipeline::updateRenderDeferred()
 {
 	BOOL deferred = ((RenderDeferred && 
 					 LLRenderTarget::sUseFBO &&
 					 LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
-					 LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump") &&
+					 LLPipeline::sRenderBump &&
 					 VertexShaderEnable && 
 					 RenderAvatarVP &&
 					 WindLightUseAtmosShaders) ? TRUE : FALSE) &&
@@ -6992,7 +6998,9 @@ void LLPipeline::doResetVertexBuffers()
 
 	LLVertexBuffer::unbind();	
 	
-	sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
+	updateRenderBump();
+	updateRenderDeferred();
+
 	sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
 	LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
 	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index fbfb2d012ff9895c6c4e0ab9260419655ebbceeb..9b7d1d642c228162a1ab5cc076c06eb8ef2661a2 100755
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -395,6 +395,7 @@ class LLPipeline
 	static void toggleRenderHighlights(void* data);
 	static BOOL getRenderHighlights(void* data);
 
+	static void updateRenderBump();
 	static void updateRenderDeferred();
 	static void refreshCachedSettings();