Index: release/scripts/startup/bl_ui/properties_material.py
===================================================================
--- release/scripts/startup/bl_ui/properties_material.py	(revision 36300)
+++ release/scripts/startup/bl_ui/properties_material.py	(working copy)
@@ -330,6 +330,7 @@
             col = split.column()
             sub = col.column()
             sub.active = not mat.use_shadeless
+            sub.prop(mat, "emit_color", text="")
             sub.prop(mat, "emit")
             sub.prop(mat, "ambient")
             sub = col.column()
Index: source/blender/render/intern/source/shadeoutput.c
===================================================================
--- source/blender/render/intern/source/shadeoutput.c	(revision 36300)
+++ source/blender/render/intern/source/shadeoutput.c	(working copy)
@@ -1698,14 +1698,14 @@
 	}
 
 	if( (ma->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))== MA_VERTEXCOL ) {	// vertexcolor light
-		shr->emit[0]= shi->r*(shi->emit+shi->vcol[0]);
-		shr->emit[1]= shi->g*(shi->emit+shi->vcol[1]);
-		shr->emit[2]= shi->b*(shi->emit+shi->vcol[2]);
+		shr->emit[0]= shi->emit * shi->vcol[0];
+		shr->emit[1]= shi->emit * shi->vcol[1];
+		shr->emit[2]= shi->emit * shi->vcol[2];
 	}
 	else {
-		shr->emit[0]= shi->r*shi->emit;
-		shr->emit[1]= shi->g*shi->emit;
-		shr->emit[2]= shi->b*shi->emit;
+		shr->emit[0]= shi->emit * shi->emitr;
+		shr->emit[1]= shi->emit * shi->emitg;
+		shr->emit[2]= shi->emit * shi->emitb;
 	}
 	
 	/* AO pass */
Index: source/blender/render/extern/include/RE_shader_ext.h
===================================================================
--- source/blender/render/extern/include/RE_shader_ext.h	(revision 36300)
+++ source/blender/render/extern/include/RE_shader_ext.h	(working copy)
@@ -123,11 +123,12 @@
 	float co[3], view[3], camera_co[3];
 	
 	/* copy from material, keep synced so we can do memcopy */
-	/* current size: 23*4 */
+	/* current size: 26*4 */
 	float r, g, b;
 	float specr, specg, specb;
 	float mirr, mirg, mirb;
 	float ambr, ambb, ambg;
+	float emitr, emitg, emitb;
 	
 	float amb, emit, ang, spectra, ray_mirror;
 	float alpha, refl, spec, zoffs, add;
Index: source/blender/blenkernel/intern/material.c
===================================================================
--- source/blender/blenkernel/intern/material.c	(revision 36300)
+++ source/blender/blenkernel/intern/material.c	(working copy)
@@ -111,6 +111,7 @@
 	ma->r= ma->g= ma->b= ma->ref= 0.8;
 	ma->specr= ma->specg= ma->specb= 1.0;
 	ma->mirr= ma->mirg= ma->mirb= 1.0;
+	ma->emitr= ma->emitg= ma->emitb= 1.0;
 	ma->spectra= 1.0;
 	ma->amb= 1.0;
 	ma->alpha= 1.0;
Index: source/blender/makesdna/DNA_material_types.h
===================================================================
--- source/blender/makesdna/DNA_material_types.h	(revision 36300)
+++ source/blender/makesdna/DNA_material_types.h	(working copy)
@@ -79,11 +79,13 @@
 	struct AnimData *adt;	/* animation data (must be immediately after id for utilities to use it) */ 
 	
 	short material_type, flag;	
+	int pad4a;
 	/* note, keep this below synced with render_types.h */
 	float r, g, b;
 	float specr, specg, specb;
 	float mirr, mirg, mirb;
 	float ambr, ambb, ambg;
+	float emitr, emitg, emitb;
 	float amb, emit, ang, spectra, ray_mirror;
 	float alpha, ref, spec, zoffs, add;
 	float translucency;
@@ -138,7 +140,7 @@
 	struct ColorBand *ramp_spec;
 	char rampin_col, rampin_spec;
 	char rampblend_col, rampblend_spec;
-	short ramp_show, pad3;
+	short ramp_show, pad2a;
 	float rampfac_col, rampfac_spec;
 
 	struct MTex *mtex[18];		/* MAX_MTEX */
@@ -150,7 +152,7 @@
 	/* dynamic properties */
 	float friction, fh, reflect;
 	float fhdist, xyfrict;
-	short dynamode, pad2;
+	short dynamode, pad2b;
 
 	/* subsurface scattering */
 	float sss_radius[3], sss_col[3];
@@ -161,7 +163,7 @@
 
 	int mapto_textured;	/* render-time cache to optimise texture lookups */
 	short shadowonly_flag;		/* "shadowsonly" type */
-	short pad;
+	short pad2c;
 
 	ListBase gpumaterial;		/* runtime */
 } Material;
Index: source/blender/gpu/intern/gpu_draw.c
===================================================================
--- source/blender/gpu/intern/gpu_draw.c	(revision 36300)
+++ source/blender/gpu/intern/gpu_draw.c	(working copy)
@@ -881,6 +881,7 @@
 typedef struct GPUMaterialFixed {
 	float diff[4];
 	float spec[4];
+	float emit[4];
 	int hard;
 } GPUMaterialFixed; 
 
@@ -918,9 +919,12 @@
 		}	
 	}
 	else {
-		mul_v3_v3fl(smat->diff, &bmat->r, bmat->ref + bmat->emit);
+		mul_v3_v3fl(smat->diff, &bmat->r, bmat->ref);
 		smat->diff[3]= 1.0; /* caller may set this to bmat->alpha */
 
+		mul_v3_v3fl(smat->emit, &bmat->emitr, bmat->emit);
+		smat->emit[3]= 1.0; /* caller may set this to bmat->alpha */
+
 		if(bmat->shade_flag & MA_OBCOLOR)
 			mul_v3_v3(smat->diff, ob->col);
 		
@@ -930,6 +934,7 @@
 
 		if(gamma) {
 			linearrgb_to_srgb_v3_v3(smat->diff, smat->diff);
+			linearrgb_to_srgb_v3_v3(smat->emit, smat->emit);
 			linearrgb_to_srgb_v3_v3(smat->spec, smat->spec);
 		}	
 	}
@@ -1049,17 +1054,21 @@
 
 	/* no GPU_begin_object_materials, use default material */
 	if(!GMS.matbuf) {
-		float diff[4], spec[4];
+		float diff[4], emit[4], spec[4];
 
 		memset(&GMS, 0, sizeof(GMS));
 
-		mul_v3_v3fl(diff, &defmaterial.r, defmaterial.ref + defmaterial.emit);
+		mul_v3_v3fl(diff, &defmaterial.r, defmaterial.ref);
 		diff[3]= 1.0;
 
+		mul_v3_v3fl(emit, &defmaterial.emitr, defmaterial.emit);
+		diff[3]= 1.0;
+
 		mul_v3_v3fl(spec, &defmaterial.specr, defmaterial.spec);
 		spec[3]= 1.0;
 
 		glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff);
+		glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emit);
 		glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
 		glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 35); /* blender default */
 
@@ -1106,6 +1115,7 @@
 		else {
 			/* or do fixed function opengl material */
 			glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, GMS.matbuf[nr].diff);
+			glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, GMS.matbuf[nr].emit);
 			glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, GMS.matbuf[nr].spec);
 			glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, GMS.matbuf[nr].hard);
 		}
@@ -1318,15 +1328,16 @@
 void GPU_state_init(void)
 {
 	/* also called when doing opengl rendering and in the game engine */
-	float mat_ambient[] = { 0.0, 0.0, 0.0, 0.0 };
-	float mat_specular[] = { 0.5, 0.5, 0.5, 1.0 };
+	float mat_zero[] = { 0.0, 0.0, 0.0, 1.0 };
+	float mat_half[] = { 0.5, 0.5, 0.5, 1.0 };
 	int a, x, y;
 	GLubyte pat[32*32];
 	const GLubyte *patc= pat;
 	
-	glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
-	glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_specular);
-	glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+	glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_zero);
+	glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_half);
+	glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_zero);
+	glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_half);
 	glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 35);
 
 	GPU_default_lights();
Index: source/blender/gpu/intern/gpu_material.c
===================================================================
--- source/blender/gpu/intern/gpu_material.c	(revision 36300)
+++ source/blender/gpu/intern/gpu_material.c	(working copy)
@@ -1249,6 +1249,7 @@
 
 	GPU_link(mat, "set_rgb", GPU_uniform(&ma->r), &shi->rgb);
 	GPU_link(mat, "set_rgb", GPU_uniform(&ma->specr), &shi->specrgb);
+	GPU_link(mat, "set_rgb", GPU_uniform(&ma->emitr), &shi->emitrgb);
 	GPU_link(mat, "shade_norm", GPU_builtin(GPU_VIEW_NORMAL), &shi->vn);
 	GPU_link(mat, "set_value", GPU_uniform(&ma->alpha), &shi->alpha);
 	GPU_link(mat, "set_value", GPU_uniform(&ma->ref), &shi->refl);
@@ -1288,11 +1289,10 @@
 	else {
 		if(GPU_link_changed(shi->emit) || ma->emit != 0.0f) {
 			if((ma->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))== MA_VERTEXCOL) {
-				GPU_link(mat, "shade_add", shi->emit, shi->vcol, &emit);
-				GPU_link(mat, "shade_mul", emit, shi->rgb, &shr->diff);
+				GPU_link(mat, "shade_mul_value", shi->emit, shi->vcol, &shr->diff);
 			}
 			else
-				GPU_link(mat, "shade_mul_value", shi->emit, shi->rgb, &shr->diff);
+				GPU_link(mat, "shade_mul_value", shi->emit, shi->emitrgb, &shr->diff);
 		}
 		else
 			GPU_link(mat, "set_rgb_zero", &shr->diff);
Index: source/blender/gpu/GPU_material.h
===================================================================
--- source/blender/gpu/GPU_material.h	(revision 36300)
+++ source/blender/gpu/GPU_material.h	(working copy)
@@ -142,7 +142,7 @@
 	GPUMaterial *gpumat;
 	struct Material *mat;
 
-	GPUNodeLink *rgb, *specrgb, *vn, *view, *vcol, *ref;
+	GPUNodeLink *rgb, *specrgb, *emitrgb, *vn, *view, *vcol, *ref;
 	GPUNodeLink *alpha, *refl, *spec, *emit, *har, *amb;
 } GPUShadeInput;
 
Index: source/blender/makesrna/intern/rna_material.c
===================================================================
--- source/blender/makesrna/intern/rna_material.c	(revision 36300)
+++ source/blender/makesrna/intern/rna_material.c	(working copy)
@@ -1631,6 +1631,12 @@
 	RNA_def_property_ui_text(prop, "Emit", "Amount of light to emit");
 	RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 
+	prop= RNA_def_property(srna, "emit_color", PROP_FLOAT, PROP_COLOR);
+	RNA_def_property_float_sdna(prop, NULL, "emitr");
+	RNA_def_property_array(prop, 3);
+	RNA_def_property_ui_text(prop, "Emission Color", "");
+	RNA_def_property_update(prop, 0, "rna_Material_draw_update");
+
 	prop= RNA_def_property(srna, "translucency", PROP_FLOAT, PROP_FACTOR);
 	RNA_def_property_range(prop, 0, 1);
 	RNA_def_property_ui_text(prop, "Translucency", "Amount of diffuse shading on the back side");
@@ -1693,7 +1699,7 @@
 	
 	prop= RNA_def_property(srna, "use_vertex_color_light", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_VERTEXCOL);
-	RNA_def_property_ui_text(prop, "Vertex Color Light", "Add vertex colors as additional lighting");
+	RNA_def_property_ui_text(prop, "Vertex Color Light", "Replaces emission color with vertex colors");
 	RNA_def_property_update(prop, 0, "rna_Material_update");
 
 	prop= RNA_def_property(srna, "use_vertex_color_paint", PROP_BOOLEAN, PROP_NONE);
