diff --git a/.hgtags b/.hgtags
index 8a6cc7ac28d637c2152c6f4a2e5fecb357f9af3e..1a37fe9952cb446a8687c421ce18d254f2d22601 100644
--- a/.hgtags
+++ b/.hgtags
@@ -339,3 +339,4 @@ f91d003091a61937a044652c4c674447f7dcbb7a 3.3.4-beta1
 eb539c65e6ee26eea2bf373af2d0f4b52dc91289 DRTVWR-177
 a8057e1b9a1246b434a27405be35e030f7d28b0c 3.3.4-beta3
 4281aa899fb2cedb7a9ca7ce91c5c29d4aa69594 DRTVWR-180
+5c08e1d8edd871807153603b690e3ee9dbb548aa DRTVWR-183
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 98246162f08982b279d82800515b901921554455..108ec92f6db6e155ced8338dcc1164f62a2ad70e 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -783,18 +783,6 @@ void LLDrawable::updateTexture()
 
 	if (getVOVolume())
 	{
-		/*if (isActive())
-		{
-			if (isRoot())
-			{
-				mQuietCount = 0;
-			}
-			else
-			{
-				getParent()->mQuietCount = 0;
-			}
-		}*/
-				
 		gPipeline.markRebuild(this, LLDrawable::REBUILD_MATERIAL, TRUE);
 	}
 }
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 2d84c5d7deb58aa4a9e138a8b4a2ec1be0987649..373b1930f5b4e4afd602f417b20187d341667701 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -326,7 +326,20 @@ void LLFace::setTexture(LLViewerTexture* tex)
 
 void LLFace::dirtyTexture()
 {
-	gPipeline.markTextured(getDrawable());
+	LLDrawable* drawablep = getDrawable();
+
+	if (mVObjp.notNull() && mVObjp->getVolume() && 
+		mTexture.notNull() && mTexture->getComponents() == 4)
+	{ //dirty texture on an alpha object should be treated as an LoD update
+		LLVOVolume* vobj = drawablep->getVOVolume();
+		if (vobj)
+		{
+			vobj->mLODChanged = TRUE;
+		}
+		gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_VOLUME, FALSE);
+	}		
+			
+	gPipeline.markTextured(drawablep);
 }
 
 void LLFace::switchTexture(LLViewerTexture* new_texture)
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index c4e7ea44b4022c8537a47d65319630be3b5cc4aa..7ccb6dc8dcccba518521e7e4c0e35cfe6a8223ec 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1879,7 +1879,8 @@ S32 LLVOVolume::setTEColor(const U8 te, const LLColor4& color)
 	}
 	else if (color != tep->getColor())
 	{
-		if (color.mV[3] != tep->getColor().mV[3])
+		F32 old_alpha = tep->getColor().mV[3];
+		if (color.mV[3] != old_alpha)
 		{
 			gPipeline.markTextured(mDrawable);
 		}
@@ -1889,6 +1890,12 @@ S32 LLVOVolume::setTEColor(const U8 te, const LLColor4& color)
 			// These should only happen on updates which are not the initial update.
 			mDrawable->setState(LLDrawable::REBUILD_COLOR);
 			dirtyMesh();
+
+			if (old_alpha >= 1.f || color.mV[3] <= 0.f)
+			{ //treat this alpha change as an LoD update since render batches will need to get rebuilt
+				mLODChanged = TRUE;
+				gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE);
+			}
 		}
 	}
 
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index c4505b4bd8ece1f8b6db8012171b78413898c151..29e782e9dd885fee0c5c72ce45686c8eded16401 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -340,7 +340,8 @@ class LLVOVolume : public LLViewerObject
 	U8 mTexAnimMode;
 private:
 	friend class LLDrawable;
-	
+	friend class LLFace;
+
 	BOOL		mFaceMappingChanged;
 	LLFrameTimer mTextureUpdateTimer;
 	S32			mLOD;