diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 1a7e60656cf5ec2baae01a2dab5cf469a2eebddd..16af098ed5a3fa00f4fbc43dbf8afa3e8b71e32c 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -51,6 +51,7 @@ class LLFastTimer
 		 FTM_RENDER_TERRAIN,
 		 FTM_RENDER_SIMPLE,
 		 FTM_RENDER_FULLBRIGHT,
+		 FTM_RENDER_GLOW,
 		 FTM_RENDER_GRASS,
 		 FTM_RENDER_INVISIBLE,
 		 FTM_RENDER_SHINY,
diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index 007c0a2de3f3083a1255ed80bfaf3085a75f7e73..f7243f369b71fa3a557fcc5441a9657e5192c535 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -87,6 +87,7 @@ class LLRenderPass : public LLDrawPool
 	{
 		PASS_SIMPLE = NUM_POOL_TYPES,
 		PASS_FULLBRIGHT,
+		PASS_GLOW,
 		PASS_INVISIBLE,
 		PASS_SHINY,
 		PASS_BUMP,
diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp
index fcd466bfc48a1f5f3c57149d7cc939def3513fe8..8fc3b9890895f9c6e251bb689e66e613ce006da8 100644
--- a/indra/newview/lldrawpoolsimple.cpp
+++ b/indra/newview/lldrawpoolsimple.cpp
@@ -16,6 +16,37 @@
 #include "llsky.h"
 #include "pipeline.h"
 
+class LLRenderPassGlow : public LLRenderPass
+{
+public:
+	LLRenderPassGlow(): LLRenderPass(LLRenderPass::PASS_GLOW) { }
+	
+	enum
+	{
+		VERTEX_DATA_MASK =	LLVertexBuffer::MAP_VERTEX |
+							LLVertexBuffer::MAP_TEXCOORD
+	};
+
+	virtual U32 getVertexDataMask() { return VERTEX_DATA_MASK; }
+
+	virtual void prerender() { }
+
+	void render(S32 pass = 0)
+	{
+		LLGLEnable blend(GL_BLEND);
+		glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+		renderTexture(LLRenderPass::PASS_GLOW, getVertexDataMask());
+		renderActive(LLRenderPass::PASS_GLOW, getVertexDataMask());
+		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+	}
+
+	void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture = TRUE)
+	{
+		glColor4ubv(params.mGlowColor.mV);
+		LLRenderPass::pushBatch(params, mask, texture);
+	}
+};
+
 LLDrawPoolSimple::LLDrawPoolSimple() :
 	LLRenderPass(POOL_SIMPLE)
 {
@@ -56,7 +87,7 @@ void LLDrawPoolSimple::render(S32 pass)
 		LLRenderPass::renderTexture(LLRenderPass::PASS_GRASS, getVertexDataMask());
 		glAlphaFunc(GL_GREATER, 0.01f);
 	}
-	
+		
 	{
 		LLFastTimer t(LLFastTimer::FTM_RENDER_FULLBRIGHT);
 		U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD | LLVertexBuffer::MAP_COLOR;
@@ -66,11 +97,17 @@ void LLDrawPoolSimple::render(S32 pass)
 		renderActive(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask);
 	}
 
+	{
+		LLFastTimer t(LLFastTimer::FTM_RENDER_GLOW);
+		glDisableClientState(GL_COLOR_ARRAY);
+		LLRenderPassGlow glow;
+		glow.render();
+	}
+
 	{
 		LLFastTimer t(LLFastTimer::FTM_RENDER_INVISIBLE);
 		U32 invisi_mask = LLVertexBuffer::MAP_VERTEX;
 		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-		glDisableClientState(GL_COLOR_ARRAY);
 		glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
 		renderInvisible(invisi_mask);
 		renderActive(LLRenderPass::PASS_INVISIBLE, invisi_mask);
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 77e96fa73bfcb8f77137769fbf9dc714ef42862a..85b8bbebd43c333eb8faac76c3c5a82d0b4affb3 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -143,6 +143,7 @@ static struct ft_display_info ft_display_table[] =
 	{ LLFastTimer::FTM_RENDER_CHARACTERS,	"     Avatars",		&LLColor4::yellow1, 0 },
 	{ LLFastTimer::FTM_RENDER_SIMPLE,		"     Simple",		&LLColor4::yellow2, 0 },
 	{ LLFastTimer::FTM_RENDER_FULLBRIGHT,	"     Fullbright",	&LLColor4::yellow5, 0 },
+	{ LLFastTimer::FTM_RENDER_GLOW,			"     Glow",		&LLColor4::orange1, 0 },
 	{ LLFastTimer::FTM_RENDER_GRASS,		"     Grass",		&LLColor4::yellow6, 0 },
 	{ LLFastTimer::FTM_RENDER_INVISIBLE,	"     Invisible",	&LLColor4::red2, 0 },
 	{ LLFastTimer::FTM_RENDER_SHINY,		"     Shiny",		&LLColor4::yellow3, 0 },
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 10312ba0e6a656a1cd22d6398502f5194bdbd9ad..ea0802985e3a4cabe7dd505284696ea6f8aec12b 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -36,6 +36,7 @@ class LLDrawInfo
 	LLPointer<LLVertexBuffer> mVertexBuffer;
 	LLPointer<LLViewerImage> mTexture;
 	LLPointer<LLCubeMap> mReflectionMap;
+	LLColor4U mGlowColor;
 	const LLMatrix4* mTextureMatrix;
 	U32 mStart;
 	U32 mEnd;
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 615bc1bf4f16c28b9a90c42a62c2d9c2eef18983..6a20aa4a95201fc86d8511cf1d9305a4d4f35805 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -61,7 +61,6 @@
 #include "llvoground.h"
 #include "llvolume.h"
 #include "llvolumemessage.h"
-#include "llvopart.h"
 #include "llvopartgroup.h"
 #include "llvosky.h"
 #include "llvostars.h"
@@ -105,13 +104,15 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco
 	case LL_PCODE_LEGACY_GRASS:
 	  res = new LLVOGrass(id, pcode, regionp); break;
 	case LL_PCODE_LEGACY_PART_SYS:
-	  res = new LLVOPart(id, pcode, regionp); break;
+// 	  llwarns << "Creating old part sys!" << llendl;
+// 	  res = new LLVOPart(id, pcode, regionp); break;
+	  res = NULL; break;
 	case LL_PCODE_LEGACY_TREE:
 	  res = new LLVOTree(id, pcode, regionp); break;
 	case LL_PCODE_TREE_NEW:
-		llwarns << "Creating new tree!" << llendl;
-//		res = new LLVOTree(id, pcode, regionp); break;
-		res = NULL; break;
+// 	  llwarns << "Creating new tree!" << llendl;
+// 	  res = new LLVOTree(id, pcode, regionp); break;
+	  res = NULL; break;
 	case LL_PCODE_LEGACY_TEXT_BUBBLE:
 	  res = new LLVOTextBubble(id, pcode, regionp); break;
 	case LL_VO_CLOUDS:
@@ -404,7 +405,6 @@ void LLViewerObject::initVOClasses()
 	}
 	llinfos << "Viewer Object size: " << sizeof(LLViewerObject) << llendl;
 	LLVOGrass::initClass();
-	LLVOPart::initClass();
 	LLVOWater::initClass();
 	LLVOSky::initClass();
 	LLVOVolume::initClass();
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 2379605803223889d621c2fe2f58cff9f7249c60..2d898a1a5dc01ec4e082f426ac22f326f0843be4 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1132,6 +1132,8 @@ void LLVOVolume::setLightColor(const LLColor3& color)
 		{
 			param_block->setColor(LLColor4(color, param_block->getColor().mV[3]));
 			parameterChanged(LLNetworkData::PARAMS_LIGHT, true);
+			gPipeline.markTextured(mDrawable);
+			mFaceMappingChanged = TRUE;
 		}
 	}
 }
@@ -1892,7 +1894,27 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
 	//LLViewerImage* tex = facep->mAppAngle < FORCE_SIMPLE_RENDER_ANGLE ? NULL : facep->getTexture();
 	LLViewerImage* tex = facep->getTexture();
 
-	if (idx >= 0 && 
+	if (type == LLRenderPass::PASS_GLOW)
+	{
+		U32 start = facep->getGeomIndex();
+		U32 end = start + facep->getGeomCount()-1;
+		U32 offset = facep->getIndicesStart();
+		U32 count = facep->getIndicesCount();
+		LLDrawInfo* draw_info = new LLDrawInfo(start,end,count,offset,tex, 
+			facep->mVertexBuffer, fullbright, bump); 
+		draw_info->mVSize = facep->getVirtualSize();
+		draw_vec.push_back(draw_info);
+		LLVOVolume* volume = (LLVOVolume*) facep->getViewerObject();
+		LLColor3 col = volume->getLightColor();
+		LLColor4 col2 = facep->getRenderColor();
+		draw_info->mGlowColor.setVec((U8) (col.mV[0]*col2.mV[0]*255),
+									(U8) (col.mV[1]*col2.mV[1]*255),
+									(U8) (col.mV[2]*col2.mV[2]*255),
+									196);					
+		draw_info->mTextureMatrix = tex_mat;
+		validate_draw_info(*draw_info);
+	}
+	else if (idx >= 0 && 
 		draw_vec[idx]->mVertexBuffer == facep->mVertexBuffer &&
 		draw_vec[idx]->mEnd == facep->getGeomIndex()-1 &&
 		draw_vec[idx]->mTexture == tex &&
@@ -2197,7 +2219,13 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 				{
 					registerFace(group, facep, LLRenderPass::PASS_BUMP);
 				}
+
+				if (!force_simple && vobj->getIsLight())
+				{
+					registerFace(group, facep, LLRenderPass::PASS_GLOW);
+				}
 				
+
 				++face_iter;
 			}